SE(たぶん)の雑感記

一応SEやっている筆者の思ったことを書き連ねます。会計学もやってたので、両方を生かした記事を書きたいと考えています。 でもテーマが定まってない感がすごい。

『詳解 ディープラーニング』を読んだ

昨今のAIブームに乗っかり、機械学習に挑戦しようと思いました。

ただ、いきなりソースをコピペして、動いた!というのもなんか違うと思い、書籍を読んで、ちゃんと学ぼうと思いました。

というわけで、『詳解 ディープラーニング』を読みました。
だいたい、1か月半ぐらいかかりました。

本の紹介

honto.jp

ディープラーニングプログラミング言語といえば、有名なのはPythonです。
本書では、Pythonのライブラリのうち、TensorFlowKerasを使って、実装について解説しています。

いきなりPythonのソースから入るのではなく、数学的なものから入り、論理回路ニューロン)がどういうものなのかの、そしてPythonについてと、順を追って説明されます。

なので、ディープラーニング、数学、Python知らないよ!という人でも、学習に入りやすいと思います。
私の場合、Pythonは一応わかるので、本書とは異なる環境構築して動かしていました。*1

なお、執筆時点では本を一周しただけです。

個人目標

文字から、何らかの分類等を導き出すような処理を、機械学習で作れないか、と思っています。

具体的なことは考えていませんが、会計関連でちょっといろいろ…とは考えています。

理解できたところ

完璧なアルゴリズムはない

機械学習といえばTensorFlow、とは言われていますし、使い方も豊富にありますが、「これさえ使っておけば完璧」という方法はないんだな、と感じました。
こういうのは、経路探索のような、古典的なアルゴリズムに通じるものを感じました。

結局、機械学習のロジックは、「自分で作るしかない」です。
コピペで動くかもしれませんが、それが最適かどうかは別問題のようです。

学習手法:正解に徐々に近づいていく

特に本書で論じられている機械学習手法は、いわゆる教師あり学習に分類されます。

つまり、「問題と正解を同時に大量に与え、正解に近づく方法を数学的に算出する」ものです。 最初に、単純パーセプトロンというものが出てきます。

本書のサンプルをPythonで書いて、matplotlibというライブラリでグラフを描くと、下の表が得られます。

f:id:hiroronn:20171020205426p:plain

これは、この線より上に点が存在するか確認するかどうか、機械学習を通して答えを出しています。
それぞれの「点」(問題)と、「上にいるか下にいるか」(正解)を渡したうえで、自動で計算しています。

問題と正解から、問いの答えを出すのは、どれほど難しくなっても変わりません。
単に、学習部分が数学的に高度なだけです。*2
与えるデータの複雑さによって、学習アルゴリズムを変えたり、欠点を克服したりして、徐々に正しい判断をさせるようにさせていくのが、我々の仕事です。

例えば、一般的な欠点として、「過学習」というものがあります。

これは、「学習データに沿いすぎている状態」で、ちょっとでも学習データから外れたデータを渡すと、正しい答えが出せない(たくさん間違う)状態をいいます。

人工知能としては、おおむね正解を導き出せるぐらい*3がちょうどよいようで、過学習になりにくいアルゴリズムもあります。
もちろん、それをそのまま使うのではなく、データの工夫等で何とかなったりもします。

学習データの渡し方もいろいろある

上に書いた通り、過学習という一般的な問題があるのですが。
それを防ぐために、ライブラリでは「検証データとテストデータをランダムに分ける」という操作をサポートしたりします。

また、ドロップアウトという手法で、「ランダムに検証データを対象外にする」操作もできます。*4

いまいち学習状況が良くない、というときには、複数の解決策があると学びました。

プログラム作成時の流れ

だいたい、こんなものかな、と思いました。

学習データの準備

入力データの整形処理をプログラムで作る

学習回数(エピック)、階層を決めて、学習を行う

性能評価

満足いく性能が出たら、保存して活用

なお、学習と性能評価は、おそらく何度もやることになると思います。

ここを効率化と可視化するツールがあれば便利そうですね。

個人的に難しかった点

数式

上で、「学習に入りやすい」とは言いました。言いましたが。

数式は本当につらかったです。

本書では、ディープラーニングで最低限必要な数学知識として、「微分」と「行列」を挙げています。一般的にもそうなのですが。
私は、微分があまりわかっていない程度には、数学ができません。*5

Σは合計、とか、そういうのはわかるのですが、平気でΣが二個来たりします。

数学がわかる人は、下のような式を見て、すぐになるほど!となるのでしょうか…?
詳しい人いたら、どういう感想を持つのか教えてほしいです。

f:id:hiroronn:20171020195008p:plain

記号が全く分かりません…

数学的な知識が必要なのは理解しているのですが、あまりにもわからないので、いったん「処理の前提となる証明をやっているだけだ」と割り切り、先に進めるようにしていました。

リカレントニューラルネットワーク

通常のニューラルネットワークを、ある一点のデータを分類するものとして、それに時系列の考え方を取り入れたのが、リカレントニューラルネットワークです。
時系列データの取り扱いに特化している、といったほうが正しいようです。

私の印象では、ニューラルネットワークだけなら片方向の回路*6なのですが、時系列が入ると、自身で状態を持つようになる感じです。

一般的なオブジェクト指向でいう、神クラスみたいな。

ここは、何度か読むか、実際にプログラム書かないと分からない気がします。

感想

Pythonを読み書きできるおかげで、理解自体はできたと思います。
ただ、頭を抱えるほどには難しいです。

一方、ライブラリの存在は非常に大きいと感じました。
理論を正確に知らなくても、サンプル等で機械学習は行える状況にあります。

前の記事で書いたGluonのように、開発者にとっても使いやすいライブラリが出てくる状況は、今の流行を反映しているなぁ、と感じたりします。

でも、上で書いた通り、数学がまるで分っていない私でもある程度理解できたので、いろんな人が機械学習について学べば、素晴らしいサービスがどんどん出てくるのは、と思ったりしました。

読後

今は、別の本を読んでいます。

honto.jp

一冊ではよく分からなかった、というのが正直なところです。*7
というより、もっと別の視点でも見てみたいと思いました。

実は、本書では「教師あり学習」に触れていません。
Python機械学習プログラミング』のほうで、「教師あり学習」「教師なし学習」「強化学習」に分類しているのを見て、「教師あり学習」なのだと分かりました。

機械学習は、奥が深すぎて、一冊では説明しきれないとも感じました。

プログラム云々抜きでおすすめ

機械学習については、以下の本がおすすめです。

honto.jp

2年半前に読みました。
機械学習のアプローチについて、「一を聞いて十を知る」のではなく、「一億を聞いて十を知る」というような表現がありますが、今考えても、本当に的を射ていると思います。

こちらは、非プログラマさんにすごくおすすめします。

ではでは。


*1:Anacondaを使うよう書いてあったが、自分でTensorFlowとKerasを入れて動かしていた

*2:そこがハードルの高さだけれど

*3:汎化性能、という

*4:こうすると、同じデータで繰り返し学習することによる過学習を防ぎやすくなる

*5:高校は実業系で、数学はあまりやっていない。大学でも統計や確率論を少しやった程度。微積に触れる機会がなかった。

*6:学習のために何度もループはするが、ループ後は式に基づいた評価になるため

*7:hontoのキャンペーンに惹かれた部分もある