年末年始だ!コードを書こう!
ということで、「ゼロから作るDeep Learning をHaskellでやる」というチャレンジをしてみました。
なぜHaskellを使うのか?
- Haskellってなんかイケてるよね
- 本の通りにやるだけだと味気ないし
- fusionとかいうのがあるらしいし、計算の効率性が求められそうなDeep Learningの分野でも、実はHaskellが向いてるんじゃない?というのを検証してみたかった
結論
失敗。Haskell力が足りませんでした
俺の屍を超えていけ、という気持ちで書いたコードを上げておきます。
https://github.com/spinylobster/my-deep-learning-from-scratch-in-haskell
進捗は全然ダメで、ニューラルネットの推論と学習までは書いたけど、実際に学習できるところまでは確かめられていない状態
誤差逆伝播法の実装ができていないので、4章の途中という感じ
追記 2017/1/9: ちょっと進んで、ニューラルネットの学習まではできた状態
AdaGradの実装もしてるので、6章の途中という感じ
Haskell力低いのでコードが煩雑なのと、本のコードにも沿ってないですが、各種ライブラリを使う際の参考にはなるかも
原因と考えるもの
- Haskellの勉強に時間を費やしすぎた
- 忘れてた知識の再学習、Stackの使い方、モナド変換子、データのシリアライズなど
- 元々、数年前にすごいH本をやった程度だった
- Gnuplotの使い方の把握にも大分時間を使ってしまった
- 状態を持たないといけない計算があったが、それを書く方法を分かってなかった
-
行列の計算が安全じゃなくて、実行時エラーに悩まされた-> 型安全な計算できるっぽい!- Haskellで実行中の状態をデバッグするのめっちゃ難しい
使ったもの
- Stack - これがないと各パッケージのインストールでこける。
- Haskell超入門 - 基本的な文法を思い出すために
- HMatrix - NumPyに相当するもの。行列の計算。Repaというのもあるらしく、後でパフォーマンスを比べようと企んでた
- Gnuplot - matplotlibに相当するもの。グラフの描画。使い方の把握はここを見るのが早い
- GHCiのデバッガ - 存在を初めて知った。遅延評価とデバッガは相性が悪いっぽい。めっちゃ使いづらかった
- その他のライブラリ - cabalファイルを参照
本の感想
- めちゃくちゃ良い 分かりやすい
- ニューラルネットの入門から、この先どういうことを学習していけば良いかまでカバーされている。入門書としてこれ以上はないんじゃないかと思う
- ただ、肝心のディープラーニングのところはぶっちゃけ余り理解できていない
- CNNの畳み込み層の設計の意図が理解できていない
- 自分の手で書いていないというのもあると思う
- 他の資料と合わせて理解していきたい
参考になったURL
- VSCodeでHaskell環境整える
- Macにgnuplotをインストール
- Haskellからgnuplotを使う
- hMatrixの使い方把握
- https://github.com/albertoruiz/hmatrix/tree/master/examples
- element-wise な計算は
+-*/
が使える - 行列に対するmapは
cmap
-
matrix * 2
のようなブロードキャストが出来る時とできない時がある気がする。良く分かってない
- Haskellライブラリ所感2016
- Haskellで型レベルプログラミング