2017年1月25日水曜日

ゼロから作るDeep Learning

ディープ・ラーニングDeep Learningが初等計算レベルから解説されているとの情報を見たので、勉強してみた本です。
うまくいけば、大学院の講義のタネ本としても使えるかとも考えたのですが、結論から言えば、そんなに楽な本ではありません。

目標はMNISTの0から9の手書きのアラビア数字を認識するプログラムの作成です。プログラム言語は機械学習での主流となっているPythonということで、Pythonの入門から始まります。算術計算、配列、グラフのプロットを扱います。第2章からニューラルネットワークの解説で、パーセプトロン での論理回路の構成や単層のときの限界を解説します。パーセプトロンは、多数のチャンネルからのシグナルを線形変換し、しきい値を超えたら1を出力,超えなければ0を出力という単純な回路です。入力と出力の間の層が一層の場合、単純な計算しかできません。例えば、AND、OR、NANDという論理演算は出来ますが、XORはできません。しかし、 パーセプトロンの層を多く(ディープ)することでコンピュータで処理できるどんな複雑な処理でも扱えることを説明します。

第3章では入力信号がしきい値を超えたら1、超えなかったら0では扱いにくいので、この入出力を表す活性化関数をシグモイド関数にしてなめらかにするか、または、ReLU関数というしきい値未満で0、しきい値以上で入力信号そのままを使うこと、行列を用いた入力と出力の関係の表し方、出力層として、信号からある選択肢の確率に変換するソフトマックス関数(多項ロジスティックモデル)を解説し、MINSTのデータで認識精度を計算します。この時点では3層(入力層+2個の隠れ層)のニューラルネットワークで認識精度は93%です。

第4章ではデータでニューラルネットワークの膨大なパラメータを決める=学習の手法の解説です。ニューラルネットの出力と正解の差(損失関数)を交差エントロピーで測ること、また、データすべてでなく、その一部をランダムに選んで学習するミニバッチ学習、また、 損失関数を最小にするアルゴリズムである勾配法を解説し、第3章での93%の認識精度であるニューラルネットを学習で構成します。

第5章は勾配法を効率よくすすめるための誤差逆伝搬法で、計算グラフでアッフィン変換と活性化関数を表し、誤差関数の微分計算を計算グラフを用いて計算する方法を解説します。また、第6章は勾配法などの数値手法のアルゴリズムを改善する話です。5章の計算グラフもですが、この第6章の興味深い。特に、活性化関数の出力がネットワークを流れていく過程でどのように変換するのか、また、どのどうに変化するべきなのか、についての説明があります。

第7章は画像認識で用いられる畳み込みニューラルネットワークの解説です。畳み込み演算を行う畳み込み層を用意するのですが、画像の2次元的な構造をうまく抽出するためのフィルターを用意する目的のようです。ニューラルネットワークワークを多層にする理由は、単純なフィルターを何層も通すことでネットワーク全体でのパラメータ数を抑えながら情報抽出の精度をあげることにあります。そして、第8章で畳み込みニューラルネットによるMINSTデータの認識精度が99%を超え、間違った画像は人間にとっても見分けにくいものであることが示されています。

 非常に勉強になったのですが、問題はPythonという言語を使ったことがないので、5章ぐらいまではプログラムも大体理解できるのですが、それ以降はPythonをちゃんと勉強してとりかからないと消化不良になる。

ということで、Pythonの勉強をしないといけなくなりました。そのあとでもう一度勉強しようと思います。大学院の講義ではRをベースに機械学習を扱う予定なのですが、こうしてPythonで書かれた本や、GoogleがPython押しであることを考えると、RよりPythonでやったほうがいいのかもしれません。

0 件のコメント: