はじめに
「深層学習・機械学習」「プログラミング」「Python」初学者のための『ゼロから作るDeep Learning』攻略ノートです。本と一緒に読んでください。
本文中で関数やクラスとして実装されている処理の塊を、1つ1つの処理や計算に分割して解説を加えつつ、実行結果を逐一確認しながら進めていきます。また、本での説明だけでも十分であるけれど、もっと知っていた方がより理解が深まるであろう内容も扱います。それでも解説を加えすぎて情報過多にならないように、その時点で必要な情報のみに留めるように心がけました(無理でした)。
『ゼロつく』わけ分かんない・もっと理解したいという人の助けになれば幸いです。
【目次】
記事一覧
『ゼロつくシリーズ』は初学者でも読み通せるように配慮されたとても良い本です。このブログは、それでも難しいという人や紙面の都合で省略されたであろう内容をもっと知りたいという人のための資料です。
また、初学者にとっては「深層学習・機械学習」「Python・プログラミング」「数学」の3分野にわたる初めて聞くアレコレで、今何のために何をしているのか混乱しがちです(実体験)。そこでノートを3つの内容に分けています。
- 【実装編】:「ニューラルネットワークの実装に関わる処理」を細かく確認しながら解説します。
- 【Python編】:「Pythonによるプログラミング」や「使用する関数」などニューラルネットワークに直接関わらない内容について解説します。
- 【数学編】:ニューラルネットワーク内で実行される計算を理解するのに必要な「数学の知識」の解説や「式の導出」を行います。
基本的には、実装編を進めればいいようにしています。ニューラルネットワーク自体の解説は本を読んでください。
現在全編加筆修正中です。記事に一言説明が付いているのが修正済みです。
1章 Python入門
次の2つの記事は、4章の前半を想定して書いた記事ですが、3章でも少しだけ利用する内容なので、ここに貼っておきます。必要になったタイミングで読んでください。
2変数の関数を3次元のグラフで可視化する方法を解説します。
2変数の関数の勾配を矢印プロットで可視化する方法を解説します。
2章 パーセプトロン
ニューラルネットワークのもとになったと言えるパーセプトロンについて確認します。
3章 ニューラルネットワーク
活性化関数について確認します。
ステップ関数を実装します。
シグモイド関数を実装します。
ReLU関数を実装します。
ニューラルネットワークの推論で行う処理を確認します。
ソフトマックス関数を実装します。
オーバーフローが発生しにくいソフトマックス関数を導出します。
MNISTデータセットの読み込みに関わるアレコレを解説します。
学習済みのパラメータを利用して手書き数字を分類します。
4章 ニューラルネットワークの学習
2乗和誤差を実装します。
交差エントロピー誤差を実装します。4.2.3項の内容は4.5.2-3項の記事で扱います。
微分の定義を解説して、数値微分を実装します。
偏微分の定義を解説します。
勾配の定義を解説して、数値微分により勾配を計算する関数を実装します。
数値微分による勾配降下法を実装します。
練習として1層のニューラルネットワークを実装して勾配を求めます。
2層のニューラルネットワークを実装します。
前項で実装した2層のニューラルネットワークを用いて、数値微分を使ったミニバッチ学習を行います。
5章 誤差伝播法
ReLUレイヤを実装します。
Sigmoidレイヤを実装します。
シグモイド関数を微分します。
Affineレイヤを実装します。
Affineレイヤの順伝播の計算(重み付き和)をグラフで確認します。(Affineレイヤの出力は$z_{n,h}$じゃなくて$a_{n,h}$だった。)
Affineレイヤの逆伝播の計算をグラフで確認します。
簡単な例(練習)として、1データの場合のAffineレイヤを微分します。
バッチデータの場合のAffineレイヤを微分します。こちらが本番ですが、少々キツいので上の記事で分かったことにしてもいいと思います。ただし、1データの場合とバッチデータの場合でバイアスの勾配の計算式が異なるので注意してください。(バッチデータの式を$N = 1$としたとき同じ式になります。)
3巻用の記事で呼び方が異なりますが、バッチデータの場合のAffineレイヤと同じ内容です。上の記事の方ができるだけ具体的に書き下していて、こちらの記事の方が端的に書き下しています。分かりやすい方を参考にしてください。
Softmax-with-Lossレイヤを実装します。
ソフトマックス関数を微分します。(この記事単体だと本の導出過程と異なります。本に沿った内容はSoftmax-with-Lossレイヤの記事の後半にあります。)
交差エントロピー誤差を微分します。
ソフトマックス関数と交差エントロピー誤差を合わせたレイヤを微分します。
レイヤごとのクラスを用いて2層のニューラルネットワークを実装します。
前項で実装した2層のニューラルネットワークを用いて、誤差逆伝播法を使ったミニバッチ学習を行います。
6章 学習に関するテクニック
7章 畳み込みニューラルネットワーク
新規で書き足した記事で前後の記事の修正作業が間にあっていないので、解説などが連動していませんがこちらを先に読むと処理をイメージしやすいと思います。
近い内に修正していく予定(はあるん)です。
8章 ディープラーニング
Create your awesome net!!
参考文献
おわりに
ちなみに私はPython歴1か月・機械学習の勉強歴1年ですので、内容に間違い等あるかと思います。見付けたら全て指摘していただけるととても助かります。よろしくお願いします。(2020.06.01)
Python歴が1年ちょっと・機械学習の勉強歴が2年半ほどになりました。まだまだ間違い・勘違い等あると思います。なんでも指摘していただけるととても嬉しいです。よろしくお願いします。(2021.07.13)
- 修正点メモ
os
はほとんどの記事でインポートする必要がなかった。- 「初期化」という言葉を「変数を空にする」と「初期値を与える」の2通りの意味で使っている。
- 認識精度メソッド
accuracy
の定義の意図を勘違いして、マスターデータの実装を少し弄って載せました。正解ラベルデータが1次元か2次元かで条件分岐するのですが、これはone-hot表現かどうかに関わらず扱えるようにするためです。それを入力データの次元によって処理が変わるためと捉えてしまった(そしてこれじゃできないじゃんと思ってしまった)ので書き換えました。処理事態に問題はない(はず)ですが、この記事の実装方法だとone-hot表現しか対応していません。 - 情報を極力抑えるというコンセプトは破綻しました。
- 2020.06.01
ゼロつく1勉強会にて、プログラミング初めて機械学習という単語も知らない人達に教えることになりました。そんな勉強会向けに作っている資料です。勉強会自体は始まったところなので、そこでの反応も踏まえて追々加筆修正していく予定です。現在3章まで書き終わっています。
- 2020.06.16
現在4章を更新中です。Python歴が2か月になりました。
x[0:9]
としていたり、引数の=
の前後にスペースを入れないっぽいぞ(紙面の都合故と思っていた)とかありますが、全て書き終わってから修正します、、、あと0番目や0行目とか、数式上の$x_{11}$とx[0, 0]
との兼ね合いとかで、かなり表記が揺れていると思います。まだどう対応するのか悩んでいますが、それもその内なんとかします。
- 2020.7.29
5章書き終わりました!Affineレイヤの逆伝播の導出に1か月かかりました。そして1つ解けてません。早く2巻をやりたくて仕方がない。
- 2020.8.04
まだ5章の記事が1日1つずつ自動投稿されているところですが、6章の記事を仕込み始めました。途切れずどこまで更新続けられるかな。
とりあえず5章頭から途切れず更新できました!(8/17)
- 2020.8.23
7章の記事も途切れず更新できそうです。連続更新記録更新中。
全ての更新が完了しました!書き終わったら修正していくつもりでしたが、保留にして2巻を始めます!2巻が終わったら、きっと3巻をやりたくなることでしょう。(8/24)
- 2021.07.13
3巻まで読み終わったので1巻から加筆修正していきます。当初は初学者がいっぱいいっぱいにならないように情報を絞るというコンセプトでしたが、破綻しました。よくよく考えると必要な情報だけでよければ本だけを読めばいいわけで、わざわざこのブログを読む人は何かしら知りたいことがあるのだろうということにして、自分が気になったことをどんどん載せていく所存です。
1巻の記事は完全に身内2・3人のために作った資料だったので、ブログで読むには自分でも気持ち悪い文体でした。何よりこれを早く直したい。
- 2021.07.30
いくつか飛ばしつつ3章まで修正できました。1周目の段階では、部分部分は理解しつつも全体での繋がりが分かってなかったような印象でした。それぞれの関係が分かりやすくなるように整理できればと思います。
【次巻の内容】