良くできた教材

CS231n: Convolutional Neural Networks for Visual Recognition これからDeep Learningをの原理を勉強し、自分でNural Networkを組んで学習させたい、という方には、Stanford大学の講義資料がお勧めです。
CS231n: Convolutional Neural Networks for Visual Recognition
シラバスはこちら
どこが良いのか?
  • 講義でのスライド、講義ノート、課題を全て無料で入手できる!
  • スライド:とても良くまとまっている
  • 講義ノート:もう少し書けば本になるほどの内容、ポイントがつかみやすい
  • 課題:Python2.7 + Jupyter notebookを実行できる環境で誰でも実験できる課題。とても良くできていて楽しく勉強できる
  • スライドでは最新テーマも触れられていてトレンドもよくわかる。

一例としてkNNの課題の回答

補足

以上でこのページの目的95%は達成済みだが

おそらく、この講義資料を全部読んで理解し、課題にも取り組めば「基礎は理解できている」と自信が持てるのではないかと思います。

一方、「AI, Deep Learningは最近流行っているから、触れてみたい(だけ)」という方には、フレームワーク使って何かを学習あるいは予測させる方法を紹介している ページは沢山あるので、そちらを試してみる方が近道で楽しいでしょう。

以降、「でも、ちょっと難しいかも・・・」という方のための助けになれば嬉しいです。

必要な数学の知識

三角関数の微分(偏微分)、行列の乗算を理解しているだけで、だいたい(80%くらい?)は理解できると思います。

講義資料や課題には、超難しい数式は1つも出てきません。引用される論文に難しそうな数式が出てきたりしますが、実はそんなに難しいことを言っていなかったりします。 不思議な記号が沢山並だ数式に怯むことなく進みましょう!

課題の実行環境

課題が良くできていて、自分で手を動かして楽しく理解が進むので、課題(Assignment1~3)はトライしてみることをお勧めします。

課題の実行には、Python2.7 + Jupyter notebookが使える環境が必要です。Linux環境が良いです。Windowsでも課題に含まれるいくつかのダウンロード・スクリプトをCygwinで実行すればできるかもしれません。しかし、Virtual Machineでも良いのでLinux環境を用意してしまった方が早いでしょう。

私は、CentOS上でpyenvにanacondaを入れ、そこでpython2.7を走らせています。

Python, numpyの知識

課題に取り組むには、Pythonとnumpyを使って行列操作や演算ができる必要があります。特に、numpyの行列におけるbroadcastingはよく理解しておく必要があります。

引用論文

後半は、最新技術が含まれていたり、講義ノートだけでは十分に理解できないので、引用論文を読む必要があります。

講義のビデオ

CS231nで検索すると、ネット上に講義ビデオが見つかったりします。

課題の回答

回答は・・・

ネットで検索すると課題の回答がいくつも見つかりますが、講義のofficialな回答は無いようです。Stanford大学の学生さんか、私のように外部の人間で課題に取り組んだ人の回答とみられます。

しかし、できるなら回答は見ないことをお勧めします。とても良くできた課題に取り組んでいるのに、わからないところですぐにgive upして自分で考えるのを中止してしまうのは、本当に勿体ないことだと思うからです。

それに、回答がなくても出来たかどうか、自分で判断できるように構成されているので、「回答がないと不安」ということもありません。

私の回答

と言いつつも、私の回答は、GitHubのこのページに置いてあります。

他の人の回答を見たことはなく、答え合わせもしていないので、間違っているところ/もっと良い解があるかもしれません。 回答は見ないことをお勧めしますが、どうしても・・・ というときに。

課題で私がつまずいたところ

Backpropagationにおいてbiasで和をとる理由

何も引っかからなければ、良いのですが。もしこのタイトル:「Backpropagationにおいてbiasで和をとる理由」にピンとくるところがあれば、Pedro costaさんのこの説明を読むと良いでしょう。(私は、この理由を理解するのに少し時間がかかりました。後のBatch normalizationでPedroさんのページを発見し、この説明を知ったのでした。)

もしくは、batch size=1の場合を考えてみれば、和をとる理由がわかるでしょう。

Batch normalization

batch-normは、講義資料に詳細までは書かれていません。紹介されている論文を読み、Pedro costaさんのこのページこのページを読むと良いでしょう。

LSTM

LSTMでimage captioningする課題がありますが、ここで"embedding"という言葉が出てきますが、論文 Long-term Recurrent Convolutional Networks for Visual Recognition and Description, Donahue et al.に詳しく説明されています。

また、LSTMの説明の多くでそうなのですが、time step毎にLSTMが並べられ、左から右にデータ(Cell state)が流れるような図が出てきます。しかし、実際にはtime step数だけLSTMのブロック(とパラメータ)があるわけではなく、1つのLSTMブロックで全time stepの演算を行います。(パラメータがtime stepの数だけ有るわけではない) このことを忘れ、よく出てくるLSTMにデータが流れる図を眺めていると、trainingで何が行われるのか、全く解らなくなります。

それから講義と課題では、CNNの上位層からとってきた画像の特徴をもとに、LSTMの初期値h0を決定する方式をとっていますが、論文 Long-term・・・では、特徴と1つ前の文字(embedded)を結合してLSTMに入れる方式をとっています。 1つの変化しない画像についてcaptioningするので、論文の方法の方が理にかなっているように思いますが・・・

ヒント:CNNの最後の課題

ネタバレ注意!のヒントです。

CNNの最後の課題は、Cifar10をCNNで分類して65%以上のvalidation accuracyを得るというものです。  色々なネットワーク構成を試してみたいところですが、コードがpythonで書かれているのでtrainingにかなりの時間がかかってしまいます。 もう少し速くならないのか、あるいは何かバグがあるのか、調べてみましたが残念ながらこの程度のスピードしか出ないようです。

Convolution layer (conv) は、cythonで高速化されていますが、最初のfully connected layer (FC) はどうしても入力数が多くなり、従って行列サイズが大きくなってしまうことが スピードを落とす原因になるようです。そのためpoolingをconv毎に入れてFCの入力次元数を落とすことが効果的です。

それでも、やはり遅いことに変わりなく、本格的に試してみるには高速に実行できる環境を用意するしかありません。 結局、caffeでGPUを使っていくつかCNNを試しました。

[conv-relu-Pool(max)]-[conv-Pool(ave)-relu]-[conv-Pool(ave)-relu]-FC-FC-softmax のような構成では85%くらいはすぐに出ることがわかりました。 また、パラメータの初期化が適切でないと重みが偏ってしまうので、Xavier initializationを使うと解決します。 さらに、average poolingは課題にコードがないので、実装が必要なのですが面倒なので、これはmax poolingで妥協します。

その結果、[conv-relu-Pool(max)] X3 -FC-FC-softmax としても80%以上のval acc.は達成できました。 実は、私の回答はこのようにcaffeで試してから持ってきたものです。しかし、やはり課題のコードでは実行が遅いので10epochだけのトレーニングにしています。 (learning rateを段々小さくするようにしてあと4倍くらい時間をかければ85%は行くはずですが、そこまでやっていません。)

なぜこのページを書いたのか?

あまりに良い教材だったので

CNNの良い説明資料はないか?と画像検索していてCS231nを見つけ、説明が解りやすく、課題もおもしろそうだったのでやってみました。 発見したときは、とても嬉しかったのを覚えています。

しかし、こんな良い教材があるのに、日本語のページでは何故か全く紹介されていない。 あまりにも勿体ないので、自分のページで紹介することにしました。