エンジニアMのAI学習記録(2017年9月分)
当社のWeb関連技術の公開と採用活動のために掲載しています。
(2017年9月29日更新)
みなさんこんにちは、新人エンジニアのMです。
8月末からAIの勉強を始めました。
これは当社の技術やAIに興味のある方に向けた日誌になります。
毎週更新していきますので、よろしくお願いします。
8月28日 ~ 9月6日
OSや各種言語
■ Vagrantを利用してCentOS(仮想)をセットアップする
Vagrantfileによる設定、UNIX特有のリポジトリを利用したインストール方法、ユーザ権限、環境変数(PATH)など…環境を整えているだけで一日が終わる。Windows歴は15年でもUNIXは少し習っただけの初心者。
■ Pythonに慣れる
入社日までにPythonの入門書を読んで雰囲気をつかむ。それでもサンプルコードを参考にして簡単なウェブアプリケーションを作るのに2,3日。
言語はHTML5+CSS+Python、Webサーバ・フレームワークとしてnginx+uWSGIあるいはFlask。
そもそもホストOSからサーバへのアクセスができなかったり、コード503が返ってきたりとここも苦戦。相変わらず環境構築に時間を食う。
■ PythonはVer2系、Ver3系で細かいところが違うらしい
FlaskはOS標準で入っていた2.7で、それ以外ではyumでインストールした3.6を使って違いを体感する(入門書でも多少違うということは書いてあった)。
のちのAIフレームワークだったりライブラリのことを考えると、最初からpyenvでPythonのバージョン管理しておいたほうが楽だったか。
このあたりは独学ならではの行き当たりばったり感。
ネット上のコードを参考にするときにもこのあたりは注意が必要(ここ数ヶ月の記事でも2系のソースとか平気で出てくるから油断ならない)。
ライブラリもバージョンによって全然違うことがある。
■ UNIXの仕組みについて読書
知らなきゃ恥ずかしい(かもしれない)UNIXの基礎について学ぶ。
C言語の経験でぼんやりとは知っていた部分、気にしていなかった部分などについて知識を軽く上乗せできたようには思う。UNIXの処理がどうなっているかについても多少は知れたかと。
AIについての情報収集
■ そもそも流行りのディープラーニングがどういうものかわからない
言葉としてしか知らないAI関連用語について調べたり、知らなかった用語をインプットしていく。理解していくのはこれから。
(ex. ニューラルネットワーク、機械学習、教師あり・なし学習etc…)
■ どんなライブラリ、フレームワークがあるのかを調べる
AIといえばPythonらしいので、Python向けのライブラリについて調べる。
Doc2Vec(Word2Vec)ができるgensimは簡単に使えて雰囲気をつかむのに良さそう。形態素解析にはJUMAN++を使ったが、ネットで見るのはMeCabのコードばかり。
フレームワークはChainer、TensorFlowあたりをチェックしたが、他にもいろいろあるようで。Chainerは将棋AIなんかでも使われていたはず。最終的にどれを使うかはあとから考えるとして、知識がついてきた段階でいくつか触りたい。
■ 機械学習を特集した雑誌、初歩の本を読む
今どんな場面でAIが活用されているかを知り、今後どのような場面で使えそうかを想像する。AlphaGoがトップ棋士に勝ったのは記憶に新しいが、そういった実例を定期的に仕入れて今後の参考にしていきたい。
機械学習の初歩といっても数式の連続なので、詳しくは触れずにまずは読み切る。ここは雰囲気をつかむためと割り切っておく。
AIについて調べてみて
AIに関してはある問題に対して適切にフレームワークを使いこなせるかどうかが第一と感じた。
処理の実装は基礎の基礎だけに留めて、あとは適切に機械学習を進めるための技法を知ることを重視していきたい。
一週間勉強してみて
まず一番に出てくる感想が「UNIXは難しい」ということ。仕事道具である以上は覚えるべきところは覚えていきたいし、エンジニアとしてUNIXを知らないというわけにはいかない。
ネット上の情報を活用するにも、この情報が自分の環境に適したものかどうかということまで考える必要がある。このあたりはUNIXに慣れる上での訓練にもなるところなので、頑張ってついていきたい。
AIについてはまず勉強していくしかないと感じた。フレームワークを使おうにも最低限の知識がないと始まらない。
9月7日
(※ここからの学習はCourseraを利用して進めていく)
– 誤差2乗関数を最小化することによるモデル最適化
→最急降下法
- 最急降下法実装のための式変形
-
線形代数の復習
→行列、ベクトル
9月8日
- 複数の特徴からなる仮説関数
- 最急降下法(多変数)
→正規化、平均ノーマライゼーション、学習率 - 多項式回帰
- 正規方程式
- デザイン行列
- Octaveのチュートリアル
9月11日
- Octave演習続き(最急降下法の実装)
- 分類問題(Classification)
- 決定境界
- ロジスティック回帰
→コスト関数、最急降下法
→アドバンスドなアルゴリズムの例(共役勾配、BFGS、L-BFGS) - マルチクラス分類
-
オーバーフィッティング
→回避のための正規化(正規化パラメータλ(Lambda)) -
Octave演習(ロジスティック回帰)
行列演算は、Octaveに管理を投げていても次元数の把握に苦労する。
9月12日
- ニューラルネットワークの基礎
→隠れ層、マルチクラス分類 - Octave演習(ニューラルネットワークの実装)
- 誤差逆伝播法
- パラメータのアンロール
- グラディエントチェッキング
9月13日
- 初期値のランダム化
- ここまでのまとめ
- (昔の)自動運転デモ
- Octave演習(誤差逆伝播法)
- 学習仮説の検証
- クロスバリデーション
演習のバグ原因が見つけられず3時間格闘したのち解決。
9月14日
- 高バイアス(アンダーフィット)、高バリアンス(オーバーフィット)
→正規化による回避 - 学習曲線
- モデルに対して選択すべき改善策
- Octave演習(バイアス・バリアンスについて)
- 現実的な例(ex.スパム分類器)について考える
- 歪んだクラス
→精度、再現率とこれらのトレードオフ
→F1スコア(Fスコア) - サポートベクターマシン(Large margin classifier)
- カーネル(ex.ガウスカーネル)
9月15日
- カーネル関数
- SVM(サポートベクターマシン)の使い方
- Octave演習(SVM、スパム分類器)
- クラスタリング(教師なし学習)
→k平均法(K-Means Algorithm)
→ランダム初期化、クラスタ数の決め方 - 次元削減、可視化
教師なし学習に突入。毎日いろんな内容を詰め込みすぎて理解が追いついていないが、フレームワークをいじるようになれば少しずつほぐれていくと思いたい。
9月19日
- 3日休みを挟んだので、過去の内容を少し振り返る
- 主成分分析(PCA)
→適用の注意点、用途 - Octave演習(k-平均法、PCA)
↓
勉強は置いておいて、AIのデモについてのアイデア出し(フォーラム用)
(チャットボットはデータの確保が難しい様子。そもそも機械学習はデータ量が正義
→少ないデータ量でなんとかする方策も後々考える必要があるか)
↓
そもそも学生がほとんどいなさそうということで、この話はなかったことに。
期限があって、いざ何かをやろうと思うと意外と難しいことを再確認。そもそもそれが実現可能かどうかを判断できるレベルにないので、勘とイメージで考えるしかない。
9月20日
- Octave演習(前日の続き)
- アノマリー検出
- ガウス分布
- 多変量ガウス分布
- レコメンダーシステム(機械学習の実用例)
- 協調的フィルタリング
- 低ランク行列分解
- Octave演習(アノマリー検出、レコメンダーシステム)
9月21日
- 巨大なデータセットの扱い
- 確率的最急降下法
- ミニバッチ最急降下法
(これまで最急降下法と呼んでいたのは、バッチ最急降下法のこと)
→これらアルゴリズムをどう評価するか - オンライン学習
- Map Reduce
- フォトOCR
→パイプライン - スライディングウィンドウ分類器
- データセット増幅(人工データ合成)
- シーリング分析
これにて機械学習コース修了。
午後は秋田県主催の機械学習実習に参加。
機械学習に関連する一連の講義は終わったが、しっかり思い出しておきたい部分については再確認していきたい。
9月22日
■ scikit-learn を試してみる
numpyとscikit-learnの両方について実際のコードから学ぶ。
numpyの記法とOctave(Matlab)の記法とのすり合わせを行うことを今回の目的とする。
参考:levelfour/machine-learning-2014
(余談:実行時にtkinter(GUIスクリプティングツール)が無いと怒られインストール。pyenvで作ったpython3.6.2環境には入ってなかった。)
■ Noneの比較
pythonでは「== None」で比較すると、
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
と警告されてしまう(対話型インタープリタでは特に警告されず)。
「is None」で比較する必要がある。
C言語の癖でついやってしまいそうなので、気をつけたい。
それにしてもOctaveGUIを離れると、データの次元数を把握するのも一苦労である。
ソースコードをしっかり理解するには行列を一つ一つ確認することが欠かせない。
9月25日
■ Tensorflowの基本的な使い方を学ぶ
Tensorflowを使って学習させてみた人のコードと、公式のAPIリファレンス(英語)などを見ながら雰囲気をつかむ。
参考:Tensorflow API Documentation(公式)
参考:【Tensorflow入門】適当にTensorflowを理解して、モデルを作ってみる
参考:TensorFlowチュートリアル – ML初心者のためのMNIST(翻訳)
■ 分類精度を向上させた例について読む
MNISTチュートリアルに絡めて、Classification datasets resultsからひとつ読んでみる。実際に精度を向上させたアイデアに学ぶ。
参考:Regularization of Neural Networks using DropConnect
■ ディープラーニングで分類器をつくる
公式の「Deep MNIST for Experts」を読みながら、サンプルコードを実行してみる。GPU非搭載のマシンかつAVXも有効化していない状態での実行がどれほどのスピードなのか、という実験も兼ねる。
参考:Deep MNIST for Experts
→ 最終的にbad_allocエラーを吐いたということはメモリ不足か。ひとまず仮想OSへの割当を6GBに増量することで暫定的に対処できた。ディープラーニングに必要なマシンリソースが想像以上に大きいことを再確認した。
(Step=20000,Accuracy=0.992ということで、時間はかかったが問題なく動作していることを確認)
Windows上に環境構築したところで明らかに性能が足りていないので、とりあえずTensorflowはここまで。
■ CUDAの計算能力について調査
ところでGPUの種類による計算力の差はいかほどなのか?ということで検索してたどり着いたのがこちら。
参考:CUDA で GPU の 戦闘力の差 を 実感する…
一部抜粋すると、
GTX 750Ti (= CUDAコア数 640 )
= 46.122 billion interactions per second
= 922.438 single-precision GFLOP/s at 20 flops per interaction
GTX 1080(= CUDAコア数 2560)
= 272.916 billion interactions per second
= 5458.315 single-precision GFLOP/s at 20 flops per interaction
750Tiと1080では6倍ほどの性能差があるらしい。CPU性能は2桁のGFLOP/s程度(倍精度)ということなので、機械学習におけるGPUがもつ計算能力の高さが分かる。
外部リソースを使うのか、GPUやメモリを自前で用意するのか、このあたりの判断はいずれする必要があるだろう。
■ Tensorflowで利用したサンプル画像をscikit-learn+numpyで学習させてみる
同じデータに対して別の手法で学習させて、処理速度や学習精度を確認する。
データは こちらからダウンロードし、ヘッダーにあたる部分を削除して画像データとラベルのみ利用する。
こちらに習って最小二乗法で学習させてみる。3クラス分類でさえ低精度なので、10クラス分類では相当な低精度になるだろう。今はとにかく練習。
参考:第2回 多クラス分類問題
何か工夫できないか考えるも、とりあえずデータ読み込みをひねりなく実装。ここで時間になってしまったので学習させるのは明日。
9月26日
■ 昨日の続きから
日が変わってヘッダー部分もstructモジュールを使って読み込めたなと気づいたが、気にせず続きの実装をする。
実行した結果、Accuracy = 0.0692…約6.9%。1/10すら下回る結果なのでこれは相当なアンダーフィッティングということがわかる。トレーニングデータに対してもほぼ同じ数値だったので、検証終わり。
学習対象に全く適していない方法を使うと、ここまでひどいことになるという例になった。
■ 統計学をかじる
AIを扱っていく上で統計学の知識は欠かせない。実際、学習手法について調べていると統計学の用語はよく出てくる。
ということで一旦AIから離れて(ビジネス寄りの)統計学の本を読んで、基本的な考え方を学ぶことにする。あくまでも考え方を学びたいので、用語や計算方法等については軽く流す。
1.「これからデータ分析を始めたい人のための本」ISBN 978-4-569-81463-6
2.『すぐれた判断は「統計データ分析」から生まれる』ISBN 978-4-7889-1083-6
3.「はじめての統計学」ISBN 4-532-13074-3
それぞれの感想を簡潔に。
まず1冊目。Excelレベルでは手に負えない分析をすることが、AIに求められると感じた。その上で出てきたデータについては人間が解釈、評価することによって、AIがはじき出した結果に意味を持たせることができる。初歩的な部分の考え方が示されていて、1冊目に読むにはちょうどいい内容だった。
2冊目。コラムの「データ分析がもたらす功罪」はデータ分析する上での心構えが示されていて、気をつけていかなければならないと感じた。
ある分析の結果、誤差が1%であったとする。しかし分析の内容如何では、その1%でも慎重に取り扱わなければならないケースもあるので、その時々に応じて適切に扱う必要がある、といった内容。同じような数字でもその重みはその時々で違う、ということは忘れずにおきたい。
3冊目は翌日に回す。
■ OCR(光学的文字認識)について調査
手軽に使えそうなライブラリはないかと探したところ、 Tesseractというプロジェクトにたどり着く。
機能は揃っていそうなので、翌日実験することに決定。
9月27日
■ Tesseractを試す
試そうと思うもひたすら壁にぶつかる。
最新版(4.0.0)を試したい → コンパイルするところから
必要なツールを入れてコンパイル → Automakeが古い
Automakeを更新しよう → ここもソースから
Configure & make → エラー
一旦諦めてyum経由で少し古いVer3.0.4を試す → サンプルコードが動かない
Python3系でなくPython2系で試す → セグメンテーション違反
コマンドラインからの実行では問題なかったのだが。元々がC言語用なので、いろいろとややこしいのかもしれない。
画像を加工しパラメータをいくつか指定してやることで、V3.0.4でもそれなりの精度が出ることが分かった。
(弊社問合わせフォームをサンプルとした)
・元画像
フォー巫を醜鳳いただきぁりがとうごさいます~ ぁ問合わせについては、 こちらからご醜〈ださい~
・元画像+公式記載の有用なパラメータ指定
フォームズを醜鳳いただきぁりがとうごさいます~ぁ問合わせについては、 こちらから璽鱈〈ださい~
・処理済みの画像+パラメータ指定
フォームズをご利用いただきぁりがとうございます。お問合わせについては、 こちらからご連絡<ださい。
修正を施したほうは「あ」→「ぁ」、「く」→「<」となっているだけで、元の文章をほとんど復元できている。画像加工が効くようだ。
最新版をPythonから利用できるようにしてどれくらい使えそうか判断したいが、どうやってインストールしたものか。ここは別日の検討課題とする。
■ 読書
気難しいTesseractはここまでにし、昨日読めなかった「はじめての統計学」を読む。 計算中心の内容だったので、復習程度での流し読みで終了。
そこで、「データサイエンティストの基礎知識」(ISBN 978-4-89797-953-3)という本も読み始めた。
9月28日
■ Tesseract4.0.0を入れるために少し考えてみる
昨日うまくいかなかったAutomakeやGCCを更新したりと試行錯誤。
→結局この環境に入れるのは断念。行き当たりばったりで構築してきた環境なので、どこかおかしくなっていた可能性はあると思う。いずれ別の仮想環境を構築することを検討しなければ。
■ 昨日の本を読む
過去に勉強した内容について、ビジネスの実例に即した形で読めたという印象。R言語を使うことがあるかどうかは分からないが、Octaveと似たイメージで使えそうな言語だと感じた。
■ 別のVagrant Boxを作ってみる
TesseractのためにVagrant Boxを増やして一からインストールを進めていくも、どこかで環境を壊してしまったようだ。Vagrantがエラーを吐くようになり、起動と終了もままならなくなった。
■ LinuxというOSについて学び直す
ネット上の情報を渡り歩いて、理解を深めることに。
→とりあえず基礎の基礎ということで、「Linux標準教科書」を読む。
さらに「【Linux入門講座】初心者からステップバイステップで学べる!」から必要そうなところを読む。
Linuxに慣れるのはいつになるだろうか。
9月29日
■ GensimとJuman++を使った学習モデル構築環境を作る
広く浅く学習しているので、この辺でちょっとした成果物が欲しい。自然言語処理ライブラリ「Gensim」と形態素解析器「Juman++」を使って、モデルを構築し、オンライン学習と類似度解析を行えるプログラムを作成する。
■ 仕様
1.「入力された文章を分かち書きにする」
↓
2.「モデルを更新する(オンライン学習)」
↓
3.「類似度解析して、類似文の候補を提示する」
この3段階の処理とする。APIリファレンスやGensimを使ってみた人のブログを読み検討した結果、ごくシンプルな仕様となった。
■ 処理1.「入力された文章を分かち書きにする」
最初は「gensimでWikipedia日本語版からコーパスを作ってトピックモデリング」を参考に日本語版Wikipediaのデータを入手し活用してみる予定であったが、あまりにも処理時間が長くなりすぎてしまうので断念。少数(~1000程度)の文章を対象とし、十分正確に類似文を提示できることを目指す。とりあえずサンプルの文章を10個ほど手入力する。
この処理は以前に動かしたコードを流用する。
■ 処理2.「モデルを更新する(オンライン学習)」
ここは、「以前作ったモデルをロード」→「入力文(1つ)を分かち書き」→「既存のモデルと併せて学習」という流れ…にするつもりだったのだが、Gensimの仕様がわからない。ひたすら英語を読んでいたが、今日中の解決はできず。また課題が増えてしまった。
■ 今週を振り返る
いろいろと触った週だったのもあって、この文章を読み返さないと思い出せないくらい。
少なくとも英文に対する耐性はついてきた感覚があるので、もっと効率よく情報収集できるように頑張っていきたい。