昨今のAIブームに乗っかり、機械学習に挑戦しようと思いました。
ただ、いきなりソースをコピペして、動いた!というのもなんか違うと思い、書籍を読んで、ちゃんと学ぼうと思いました。
というわけで、『詳解 ディープラーニング』を読みました。
だいたい、1か月半ぐらいかかりました。
本の紹介
ディープラーニングのプログラミング言語といえば、有名なのはPythonです。
本書では、Pythonのライブラリのうち、TensorFlow
とKeras
を使って、実装について解説しています。
いきなりPythonのソースから入るのではなく、数学的なものから入り、論理回路(ニューロン)がどういうものなのかの、そしてPythonについてと、順を追って説明されます。
なので、ディープラーニング、数学、Python知らないよ!という人でも、学習に入りやすいと思います。
私の場合、Pythonは一応わかるので、本書とは異なる環境構築して動かしていました。*1
なお、執筆時点では本を一周しただけです。
個人目標
文字から、何らかの分類等を導き出すような処理を、機械学習で作れないか、と思っています。
具体的なことは考えていませんが、会計関連でちょっといろいろ…とは考えています。
理解できたところ
完璧なアルゴリズムはない
機械学習といえばTensorFlow、とは言われていますし、使い方も豊富にありますが、「これさえ使っておけば完璧」という方法はないんだな、と感じました。
こういうのは、経路探索のような、古典的なアルゴリズムに通じるものを感じました。
結局、機械学習のロジックは、「自分で作るしかない」です。
コピペで動くかもしれませんが、それが最適かどうかは別問題のようです。
学習手法:正解に徐々に近づいていく
特に本書で論じられている機械学習手法は、いわゆる教師あり学習に分類されます。
つまり、「問題と正解を同時に大量に与え、正解に近づく方法を数学的に算出する」ものです。 最初に、単純パーセプトロンというものが出てきます。
本書のサンプルをPythonで書いて、matplotlib
というライブラリでグラフを描くと、下の表が得られます。
これは、この線より上に点が存在するか確認するかどうか、機械学習を通して答えを出しています。
それぞれの「点」(問題)と、「上にいるか下にいるか」(正解)を渡したうえで、自動で計算しています。
問題と正解から、問いの答えを出すのは、どれほど難しくなっても変わりません。
単に、学習部分が数学的に高度なだけです。*2
与えるデータの複雑さによって、学習アルゴリズムを変えたり、欠点を克服したりして、徐々に正しい判断をさせるようにさせていくのが、我々の仕事です。
例えば、一般的な欠点として、「過学習」というものがあります。
これは、「学習データに沿いすぎている状態」で、ちょっとでも学習データから外れたデータを渡すと、正しい答えが出せない(たくさん間違う)状態をいいます。
人工知能としては、おおむね正解を導き出せるぐらい*3がちょうどよいようで、過学習になりにくいアルゴリズムもあります。
もちろん、それをそのまま使うのではなく、データの工夫等で何とかなったりもします。
学習データの渡し方もいろいろある
上に書いた通り、過学習という一般的な問題があるのですが。
それを防ぐために、ライブラリでは「検証データとテストデータをランダムに分ける」という操作をサポートしたりします。
また、ドロップアウトという手法で、「ランダムに検証データを対象外にする」操作もできます。*4
いまいち学習状況が良くない、というときには、複数の解決策があると学びました。
プログラム作成時の流れ
だいたい、こんなものかな、と思いました。
学習データの準備
↓
入力データの整形処理をプログラムで作る
↓
学習回数(エピック)、階層を決めて、学習を行う
↓
性能評価
↓
満足いく性能が出たら、保存して活用
なお、学習と性能評価は、おそらく何度もやることになると思います。
ここを効率化と可視化するツールがあれば便利そうですね。
個人的に難しかった点
数式
上で、「学習に入りやすい」とは言いました。言いましたが。
数式は本当につらかったです。
本書では、ディープラーニングで最低限必要な数学知識として、「微分」と「行列」を挙げています。一般的にもそうなのですが。
私は、微分があまりわかっていない程度には、数学ができません。*5
Σは合計、とか、そういうのはわかるのですが、平気でΣが二個来たりします。
数学がわかる人は、下のような式を見て、すぐになるほど!となるのでしょうか…?
詳しい人いたら、どういう感想を持つのか教えてほしいです。
記号が全く分かりません…
数学的な知識が必要なのは理解しているのですが、あまりにもわからないので、いったん「処理の前提となる証明をやっているだけだ」と割り切り、先に進めるようにしていました。
リカレントニューラルネットワーク
通常のニューラルネットワークを、ある一点のデータを分類するものとして、それに時系列の考え方を取り入れたのが、リカレントニューラルネットワークです。
時系列データの取り扱いに特化している、といったほうが正しいようです。
私の印象では、ニューラルネットワークだけなら片方向の回路*6なのですが、時系列が入ると、自身で状態を持つようになる感じです。
一般的なオブジェクト指向でいう、神クラスみたいな。
ここは、何度か読むか、実際にプログラム書かないと分からない気がします。
感想
Pythonを読み書きできるおかげで、理解自体はできたと思います。
ただ、頭を抱えるほどには難しいです。
一方、ライブラリの存在は非常に大きいと感じました。
理論を正確に知らなくても、サンプル等で機械学習は行える状況にあります。
前の記事で書いたGluon
のように、開発者にとっても使いやすいライブラリが出てくる状況は、今の流行を反映しているなぁ、と感じたりします。
でも、上で書いた通り、数学がまるで分っていない私でもある程度理解できたので、いろんな人が機械学習について学べば、素晴らしいサービスがどんどん出てくるのは、と思ったりしました。
読後
今は、別の本を読んでいます。
一冊ではよく分からなかった、というのが正直なところです。*7
というより、もっと別の視点でも見てみたいと思いました。
実は、本書では「教師あり学習」に触れていません。
『Python機械学習プログラミング』のほうで、「教師あり学習」「教師なし学習」「強化学習」に分類しているのを見て、「教師あり学習」なのだと分かりました。
機械学習は、奥が深すぎて、一冊では説明しきれないとも感じました。
プログラム云々抜きでおすすめ
機械学習については、以下の本がおすすめです。
2年半前に読みました。
機械学習のアプローチについて、「一を聞いて十を知る」のではなく、「一億を聞いて十を知る」というような表現がありますが、今考えても、本当に的を射ていると思います。
こちらは、非プログラマさんにすごくおすすめします。
ではでは。