ほぼ週刊ハマりどころメモ

画像認識と自然言語処理を研究する中でハマったところを共有します.ほぼ自分用のメモ.

「データマイニング・機械学習分野の概要」を読んで参考になったこと[ML]

f:id:Vastee:20190521110439p:plain

神嶌 敏弘さんがご自身のHPで公開している「データマイニング機械学習分野の概要」という資料が,深層学習の歴史と,国際会議の動向を知る上で大変役に立ったため,本記事では,スライドを読んで参考になったことをまとめてみる.

まずは,資料へのリンクを貼らせていただく.

www.kamishima.net

機械学習データマイニング全般というメニューの中から,データマイニング機械学習分野の概要」という資料が見つかるはずだ.変更があった際には,こちらのページに最新版をアップしているようだ.

以降,参考になったことをつらつらと書いてゆく.

P9 データ分析に関わる分野の変遷

統計的機械学習のルーツがルールベールの機械学習にあるという表現が印象に残った.筆者がこれまで見てきた解説資料では,統計的機械学習がルールベース機械学習に塗り変わったかのような線表で分野の変遷が説明されていたのだが,神嶌さんの資料では,ルールベースが枝分かれして現在も細く(?)研究されていることが伝わる表現になっていてとても参考になった.また,ルールベースとニューラルネットが並列に表現されているところも参考になる.

P11 下馬評的予測

「手作業でやっていた規則の生成が,どんどん複雑化して手に負えなくなったら,機械学習が適用されるようになる」という大原則が印象に残った.統計的機械学習がもてはやされる現在,どんなタスクにでもとりあえずdata-drivenな手法を試す人が多い.しかしながら,規則がIF文などによって手作業で書き起こせる程度に収まるのであれば,data-drivenな手法よりも精度も速度も良くなる.しかも,教師データを大量に取得・作成する手間も省けるのだ.本ページの大原則は,機械学習を使ったプロジェクトを検討する際には,心に留めておきたいものだ.

P20 ニューラルネットワークの歴史

ニューラルネットワークの歴史が各年ごとに1行でまとめられていて非常にわかりやすい.1995年にニューラルネットによる公道走行実験が成功していたことは初めて知った.ググってみるとGIGAZINEで記事になっていた.こちらも読んでみると面白い.GIGAZINEには開発者へのインタビューがあるのだが,自動運転車による事故についてのポイントが語られており,20年前にも現在と同じ関心が寄せられていたことが印象深い.

gigazine.net

P28 人工知能についての誤解

本スライドでは,「人工知能というものがあるわけではない」ということを説明するために人工知能と自動車を比べるという内容なのだが,説明が直感的で分かりやすい.スライドでは,○ 自動車:人間の足の走るという機能の代わりをするもの,人工知能:人間の脳の考えるという機能の代わりをするもの という一般大衆が人工知能に対して抱く誤解をまず示している.次に,誤解を解くために,実際の人工知能が「ものではなく,何らかの知的処理を行う人工知能技術+多くの関連技術の集合体」だということが説明されていて,一般の人がもつイメージと実際の差異をうまく表現しているように感じた.これまで筆者も人工知能とは何か?という質問を受けていたが,非情報系の方が抱くイメージと実際の差異をうまく伝えられていなかったので,この分かりやすい説明は非常に参考になった.

P89 関連国際会議の俯瞰図

CV, NLP, DM系など幅広い分野が一枚の図としてまとめられていて参考になる.

P101以降 ML/DM/NN/AI 関連学会

各会議ごとにフォーカスを当てたスライドが用意されていて,こちらも参考になる.最近筆者は,これまで学んでいたCVではなく,NLPで論文投稿をする予定があるのでこうしたまとめ資料は非常にありがたい.

これまで筆者が見てきた中でトップクラスに分かりやすい機械学習概要でした.

以上.

EC2のGPU付インスタンスでCloud9を使う[AWS][Cloud9]

Cloud9を構築する際にデフォルトで選択できるインスタンスはCPUのものしかない.

このため,筆者はGPU付きのインスタンスを別でたてて,そこにCloud9をインストールをしたのだが,色々とハマりポイントがあり,1週間ほどこの作業に費やしてしまったので,備忘録として本記事を作成する.

EC2でGPU付きインスタンスを構築

AWSコンソールでインスタンスをたてる.基本的な方法は,ほかにも紹介記事がたくさんあるので割愛.

注意点①

インスタンスのストレージを250GBくらいに変更しておくこと.

デフォルトの値は8GBであったため,NVIDIAドライバをインストールするとすぐ容量いっぱいになってしまう(一度失敗経験あり).ここでしっかりと設定をしておく.

EBS(ストレージ)をインスタンスにアタッチする

インスタンスを作る目的は,Kaggleのコンペに挑戦することなので,データセット格納用のEBSをアタッチしておく.

本手順は,後でもできるが,構築の際にやっておかないと手順を忘れてしまうことがある.

Cloud9のインストール

以下の手順に沿ってインストールを行う.

vastee.hatenablog.com

以下メモ.

起動後のインスタンスでは,初めにsudo apt updateをかけておくこと.

NodeJSのインストールのために,一旦Mobaextermなどのsshクライアントで,アクセスすることがある.

インスタンスにPython3.6をインストールする

注意点②

Python3.6を入れること

Python3.6じゃないとCloud9上で切り替えることができない.# なぜだろう?原因は特定できていない.

add-apt-repository ppa:jonathonf/python-3.6

apt-get update

sudo apt-get install python3.6 python3.6-dev

wget https://bootstrap.pypa.io/get-pip.py

sudo chown -R ubuntu:ubuntu /usr/local/ # rootしかアクセスできないパーミッションになっているので変更

python3.6 get-pip.py # python get-pip.pyだとデフォルトのpython3.5にインストールされてしまうことがある

vim ~/.bashrc
>> alias python='python3.6'

source ~/.bashrc

python -V
>> Python 3.6.8

pip -V
>> pip 19.1.1 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

以下メモ.

Ubuntu16.04には標準でPython3.5が入っているのだが,これを消そうとするとシステムが壊れるので,気持ち悪いのは我慢して消さずにエイリアス変更で我慢しよう.ちなみに上のadd-apt-repositoryのコマンドを打つと A plain backport of just Python 3.6. System extensions/Python libraries may or may not work. という警告がでてくる.

Cloud9のプリファレンスをPython3に切り替える

うまくいっていることを祈りながらテストする.

テストに使ったスクリプト

import sys
print(sys.version)

所望のPythonバージョンがでてきたら,完了

以下はTensorflowを使うためのオプション. ~~~

Nvidiaドライバをインストール

ひとまずGPUの型を確認する.

lspci | grep -i nvidia
>> 00:1d.0 VGA compatible controller: NVIDIA Corporation GM204GL [Tesla M60] (rev a1)
>> 00:1e.0 VGA compatible controller: NVIDIA Corporation GM204GL [Tesla M60] (rev a1)

Tesla M60 だったので,https://www.nvidia.co.jp/Download/index.aspx?lang=jp からインストーラをダウンロード.

chmod 755 NVIDIA-Linux-x86_64-418.67.run

sudo ./NVIDIA-Linux-x86_64-418.67.run

nvidia-smiが叩けるかを確認.

CUDA10.0をインストール

以下の手順に沿ってインストール

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=debnetwork

nvcc -Vが叩けるか確認.

TensorflowとKerasをインストール(オプション)

sudo apt-get install -y git build-essential libssl-dev language-pack-id

pip install tensorflow-gpu

#### cuDNN7.1をインストール

以下のサイトからインストール.

https://developer.nvidia.com/rdp/cudnn-download#a-collapse751-101

EC2で環境を構築する際にNo space left on deviceになったときの対処法[AWS]

AWSのEC2でKaggle用計算サーバーを構築しようと思い,Nvidiaのドライバをインストールすると,No space left on deviceのエラーがでた.

df コマンドで容量を確認すると,ディスク上のファイル占有率が100%になっていた. これは困った.ディスクを小さくしすぎたか...もう一度インスタンスの立て直しからスタートなのかと途方に暮れながら,ネットで対策を探していると,なんとAWSではいったん立てたインスタンスのディスクのサイズを変更できるとのことなのだ!

早速,ELASTIC BLOCK STORE のボリュームのメニューから,該当のボリュームを選択し,ボリュームの変更のボタンを押し,ディスクを拡張.この間5分.AWS,なんて優秀なんだ.

dev.classmethod.jp

LightsailでCloud9を構築[AWS][Cloud9]

ブラウザで動くCloud9が使いやすいということを知り,好奇心に駆られインストールしてみることにした.

AWS Lightsailでレンタルサーバーを借りる(有料)

まずは,以下のサイトを参考にしてAWS上にレンタルサーバーを借りる.

このとき,私はOS:Ubuntu16.04で月$3.5のプランを選択したので最初の1か月間は無料のキャンペーンが適用された.

qiita.com

サーバーにNode.jsをインストールする(勿論無料)

サーバーを作り終えたら,以下のコンソール画面から静的IPアドレスをアタッチ後,アタッチされたIPアドレスを確認し,Mobaxtermなどのsshクライアントでサーバーのコンソールにアクセスする.

サーバーのコンソール上で,Node.jsをインストールする.

$ sudo apt install -y nodejs npm
$ sudo npm install n -g
$ sudo n stable

Node.jsのインストールは以下のサイトを参考にしました.

qiita.com

AWS Cloud9で新しいIDEをサーバー上に構築(無料)

サーバーにNode.jsをインストールしたら,次はIDEをサーバー上に構築する.

以下のサイトの"Create environment"のボタンを押し,手続き画面を表示.

https://us-east-2.console.aws.amazon.com/cloud9/home/product

そして,IDEの名前を適用に決めて,"Configure Setting"の画面まで進む.

以下のような画面が表示されるはずだ.

f:id:Vastee:20190501161220p:plain

そして/home/ユーザー名/.ssh/authorized_keysにコピーした公開鍵を追記し,Next Stepボタンを押せばCloud9の画面がでるはずだ.

Herokuを試す際に大変役に立ったサイト[Heroku]

自宅のデスクトップPCでスクレイピングのプログラムを回していたら,CPUクーラーの稼働音がうるさくて嫌になったので,サーバー上でプログラムを動かすことを決意.

そして,以下のブログに載っている手順が非常にわかりやすかったので,忘れないようにメモする.

review-of-my-life.blogspot.com

分かりやすさのポイントとしては,Herokuでseleniumを動かしてGoogleのタイトルを出力させるという簡単なタスクを実行することを目標に手順が体系化されて説明されているので,説明を追っているだけでHerokuがどういうサービスなのか,何に応用できそうなのかが理解しやすかった.

以下に追加で調べた項目を書き並べる.

手順"1. Cloud9でPython環境のセットアップ" でAWSのLightsailを利用し,Cloud9を構築したのでメモ.

vastee.hatenablog.com

手順"7. Herokuにディプロイし起動" でheroku loginをサーバーで実行したため,GUIが表示されないということが起きたので,以下の方法で解決.

vastee.hatenablog.com

手順 "10. HerokuにPhantomJSのセットアップと、パスの設定" を実施した際に,Herokuへのpushがうまくいかなかったため,代わりに以下の方法を試し,無事pushが成功したので共有.(もしかすると筆者の読解力不足が招いたエラーかもしれない)

vastee.hatenablog.com

また,Herokuとは直接関係は無いが,GitHubsshを設定する際に苦戦したので,未来の自分のために備忘録として残しておく.

vastee.hatenablog.com

sshでPermission denied (publickey).がでたときの対処法[GitHub]

~/.ssh/configに以下を追記しよう.

Host github.com
      HostName        github.com
      IdentityFile    ~/.ssh/github/github_key
      User            git

注意点:Host githubではなく,Host github.comを入力しよう.(巷のブログでは前者の方で書かれていることが多い)

~/.ssh/configの設定で,デフォルト以外の名前の秘密鍵でも読みに行ってくれる.

ssh-keygenによる鍵生成でデフォルト以外の名前を設定すると,GitHubに公開鍵を登録した後,Permission denied (publickey).がでてよくハマっている人をみかけるので共有.

HerokuにPhantomJSをセットアップ[Heroku]

$ heroku config:add BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git
$ touch .buildpacks
$ echo "https://github.com/heroku/heroku-buildpack-python" >> .buildpacks
$ echo "https://github.com/stomita/heroku-buildpack-phantomjs" >> .buildpacks
$ git add --all
$ git commit -m "add phantomjs"
$ git push origin master
$ git push heroku master