あれもPython,これもPython

Pythonで世界を包みたい

【ディープラーニング】10時間でChainerの基本を身につける

ディープラーニングは色々な知識が必要です。
チュートリアル動かしました」で止まったままの人も多いでしょう。

そこで、自分がchainerを理解しながら動かした時の方法を書きます。

大前提

とは言ったものの、誰でも入門は無理なので。
以下が最低限の前提です。

数学:微分積分、行列、確率とか聞いても「ああ、あれね・・・」くらいには思う
IT:Pythonがそれなりに分かる。numpyはそこそこ分かる。
機械学習:説明変数とか、目的変数とか分類とかが何となく分かる
やる気:引っかかった時に、調べる気力がある

ゴール

chainerを自分で色々試せるレベルになる。

あくまで試せるレベルになるだけです。
それでも千里の道も一歩からです。
一緒に頑張りましょう。

ちなみになぜchainerか、というと、
入門者が触るには、バランスは良さそうに見えたからです。

最初の最初

ディープラーニングは歴史から学ばなきゃ!とか
数式がわからん奴はモグリwwwとか、
社会が変わる!仕事がなくなる!みたいな煽りは
一旦忘れて、必要最小限のインプットを行います。

おすすめの本

前も記事にしましたが、
この本がやはりおすすめ。
(理論や実装に傾倒しすぎず、煽りも少なく最小限の情報が載っている)

初めてのディープラーニング --オープンソース

初めてのディープラーニング --オープンソース"Caffe"による演習付き

※以前の記事
esu-ko.hatenablog.com

無理に全て理解しようとせず、
雜誌感覚で読み飛ばしてください。
(実装は試さないほうがいいです)

自分の場合は、用語とかは書き出して覚えたり、
ノートに簡単な整理をしました。

あたりが、1行でなんとなく言える位になるといい感じです。
あくまでなんとなく。数式は後回し。

実装を試す(2時間)

ここでモジュールのチュートリアルを試すと、先に進まなくなります。
TensorBoardといったメインじゃない所に時間とられます。

ので、以下を参考に、最小限を自分の手で書くことで学びます。
ニューラルネットの実装に何が必要か?を体験してみます。

ライブラリーを使わずにPythonでニューラルネットワークを構築してみる

書いてみる、といっても完全に再現する必要はありません。
(自分はグラフとか、難しいところは書かなかった)

なんでこんな実装が必要なんだ?とか、あーここ自分で書けと言われたらわからん、
といった感覚を掴みます。

ニューラルネットの実装に必要な要素をつかむのが目的です。
全部理解する必要もありません。
むしろ、理解せずただ、必死にコピーして動いた−というのが一番無駄だからやめましょう。

  • モデルを作ること
  • フォワードや最適化が必要なこと
  • どんな変数が必要か

がだいたいわかればOKです。
(数式も無理に理解する必要なしです。)

読むときにnumpy調べるのはめんどくさいので、
下記に書いておきます。

メソッド 機能
np.random.randn 乱数をつくる
np.sqrt ルートをとる
np.zeros 空配列の作成
np.array.dot 内積を計算
np.array.T 転置する
np.sum 指定方向へのsum
np.tanh tanhを計算する
np.exp 指数関数

実際にchainerを試す(4時間)

chainerを試します。

下記を参考にしますが、画像判定はしません。
(ここで欲張って画像を扱っていいのは、既に画像処理に慣れてる人だけです)
【機械学習】ディープラーニング フレームワークChainerを試しながら解説してみる。

その代わり、irisのSpecies判定に自分でコードを書き換えることで、勉強します。
データがなければUCLからどうぞ

元記事だと結構話があちこちに飛んで、理解し難いので
必要最小限のコードのみ抜き出します。

以下のコメントがついている部分を抜き出して理解します。


  • 次に各種パラメーターの定義・設定を行います。
  • データセットを学習用データ検証用データに分割します。
  • いよいよモデルの定義です。ここからが本番ですね。Chainerのクラスや関数を使います。
  • 順伝播の構造が下記のforward()関数で定義されます。
  • ここでは最適化手法としてAdamが使われています。
  • 以上の準備から、ミニバッチ学習で手書き数字の判別を実施し、その精度を見ていきます。

今までのステップをきちんと踏んでいれば、
モデルの作り方や、最適化の部分でchainerの便利さが分かると思います。
(最適化の中身やdropoutって?というのは、飛ばします)

ここまできたら、irisのデータを読み込んで、学習するようにコードを書き換えていきます。

  • 入力層の数
  • 出力層の数
  • データ取り込みとnumpy.arrayの変換

を変えれば大丈夫です。

仕様っぽいエラーが出た部分を補足しておきます。

  • 目的変数yの中身を、数値0,1,2に変換しておかないと後続作業でエラーになる
  • 説明変数yのnumpy.array.astype(np.int32)で変換しないとエラーになる
  • 説明変数xのnumpy.array.astype(np.float32)で変換しないとエラーになる

ここまで実装したら、動かしてみましょう。

動いたら

動いたら、パラメータを変えて遊んでみます。

加えて、学習後のモデルを予測に使ってみます。
これも自分で考えて実装してみます。
(自分は、モデルをpickleでファイルに永続化。
予測する際はそれを呼び出して、そのモデルでforwardを呼び出すようにしました。)

今後

chainer入門は完了で、色々自分で試せる感じになりました。
お疲れ様でした!

きちんとやれば、自力で以下ができるようになっているはずです。

  • 基本実装
  • 学習データの用意の仕方
  • 変えられるパラメータの理解
  • 予測の方法

この後は、以下を試してみる感じかなーと思います。

  • CNN,AutoEncoder,RNNなどを実装してみる
  • 画像処理、音声処理、自然言語処理なんかのやり方を覚えて、そこにディープラーニングを使ってみる
  • chainerのドキュメントを見て、もう少し詳しくなってみる
  • TensorFlowやCaffeを試してみる
  • 数学とか理論の辺りをきちんと勉強して、チューニングできるようにする(Adamとかの勉強はここですればいい)

(自分もまだ手探りですが、次はMNISTの手書き文字を試すのがいいかな、という気がしています)