からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

『ゼロから作るDeep Learning』の学習ノート:記事一覧

はじめに

 「深層学習・機械学習」「プログラミング」「Python」初学者のための『ゼロから作るDeep Learning』攻略ノートです。本と一緒に読んでください。

 本文中で関数やクラスとして実装されている処理の塊を、1つ1つの処理や計算に分割して解説を加えつつ、実行結果を逐一確認しながら進めていきます。また、本での説明だけでも十分であるけれど、もっと知っていた方がより理解が深まるであろう内容も扱います。それでも解説を加えすぎて情報過多にならないように、その時点で必要な情報のみに留めるように心がけました(無理でした)。

 『ゼロつく』わけ分かんない・もっと理解したいという人の助けになれば幸いです。

【目次】

記事一覧

 『ゼロつくシリーズ』は初学者でも読み通せるように配慮されたとても良い本です。このブログは、それでも難しいという人や紙面の都合で省略されたであろう内容をもっと知りたいという人のための資料です。
 また、初学者にとっては「深層学習・機械学習」「Python・プログラミング」「数学」の3分野にわたる初めて聞くアレコレで、今何のために何をしているのか混乱しがちです(実体験)。そこでノートを3つの内容に分けています。

  • 【実装編】:「ニューラルネットワークの実装に関わる処理」を細かく確認しながら解説します。
  • 【Python編】:「Pythonによるプログラミング」や「使用する関数」などニューラルネットワークに直接関わらない内容について解説します。
  • 【数学編】:ニューラルネットワーク内で実行される計算を理解するのに必要な「数学の知識」の解説や「式の導出」を行います。

 基本的には、実装編を進めればいいようにしています。ニューラルネットワーク自体の解説は本を読んでください。

 現在全編加筆修正中です。記事に一言説明が付いているのが修正済みです。

1章 Python入門

www.anarchive-beta.com


 次の2つの記事は、4章の前半を想定して書いた記事ですが、3章でも少しだけ利用する内容なので、ここに貼っておきます。必要になったタイミングで読んでください。

 2変数の関数を3次元のグラフで可視化する方法を解説します。

www.anarchive-beta.com

 2変数の関数の勾配を矢印プロットで可視化する方法を解説します。

www.anarchive-beta.com


2章 パーセプトロン

 ニューラルネットワークのもとになったと言えるパーセプトロンについて確認します。

www.anarchive-beta.com


3章 ニューラルネットワーク

 活性化関数について確認します。

www.anarchive-beta.com

 ステップ関数を実装します。

www.anarchive-beta.com

 シグモイド関数を実装します。

www.anarchive-beta.com

 ReLU関数を実装します。

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

 ニューラルネットワークの推論で行う処理を確認します。

www.anarchive-beta.com

 ソフトマックス関数を実装します。

www.anarchive-beta.com

 オーバーフローが発生しにくいソフトマックス関数を導出します。

www.anarchive-beta.com

 MNISTデータセットの読み込みに関わるアレコレを解説します。

www.anarchive-beta.com

 学習済みのパラメータを利用して手書き数字を分類します。

www.anarchive-beta.com


4章 ニューラルネットワークの学習

 2乗和誤差を実装します。

www.anarchive-beta.com

 交差エントロピー誤差を実装します。4.2.3項の内容は4.5.2-3項の記事で扱います。

www.anarchive-beta.com

 微分の定義を解説して、数値微分を実装します。

www.anarchive-beta.com

 偏微分の定義を解説します。

www.anarchive-beta.com

 勾配の定義を解説して、数値微分により勾配を計算する関数を実装します。

www.anarchive-beta.com

 数値微分による勾配降下法を実装します。

www.anarchive-beta.com

 練習として1層のニューラルネットワークを実装して勾配を求めます。

www.anarchive-beta.com

 2層のニューラルネットワークを実装します。

www.anarchive-beta.com

 前項で実装した2層のニューラルネットワークを用いて、数値微分を使ったミニバッチ学習を行います。

www.anarchive-beta.com


5章 誤差伝播法

www.anarchive-beta.com

www.anarchive-beta.com

 ReLUレイヤを実装します。

www.anarchive-beta.com

 Sigmoidレイヤを実装します。

www.anarchive-beta.com

 シグモイド関数を微分します。

www.anarchive-beta.com

 Affineレイヤを実装します。

www.anarchive-beta.com

 Affineレイヤの順伝播の計算(重み付き和)をグラフで確認します。(Affineレイヤの出力は$z_{n,h}$じゃなくて$a_{n,h}$だった。)

www.anarchive-beta.com

 Affineレイヤの逆伝播の計算をグラフで確認します。

www.anarchive-beta.com

 簡単な例(練習)として、1データの場合のAffineレイヤを微分します。

www.anarchive-beta.com

 バッチデータの場合のAffineレイヤを微分します。こちらが本番ですが、少々キツいので上の記事で分かったことにしてもいいと思います。ただし、1データの場合とバッチデータの場合でバイアスの勾配の計算式が異なるので注意してください。(バッチデータの式を$N = 1$としたとき同じ式になります。)

www.anarchive-beta.com

 3巻用の記事で呼び方が異なりますが、バッチデータの場合のAffineレイヤと同じ内容です。上の記事の方ができるだけ具体的に書き下していて、こちらの記事の方が端的に書き下しています。分かりやすい方を参考にしてください。

www.anarchive-beta.com

 Softmax-with-Lossレイヤを実装します。

www.anarchive-beta.com

 ソフトマックス関数を微分します。(この記事単体だと本の導出過程と異なります。本に沿った内容はSoftmax-with-Lossレイヤの記事の後半にあります。)

www.anarchive-beta.com

 交差エントロピー誤差を微分します。

www.anarchive-beta.com

 ソフトマックス関数と交差エントロピー誤差を合わせたレイヤを微分します。

www.anarchive-beta.com

 レイヤごとのクラスを用いて2層のニューラルネットワークを実装します。

www.anarchive-beta.com

 前項で実装した2層のニューラルネットワークを用いて、誤差逆伝播法を使ったミニバッチ学習を行います。

www.anarchive-beta.com


6章 学習に関するテクニック

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com


7章 畳み込みニューラルネットワーク

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com

www.anarchive-beta.com


8章 ディープラーニング

Create your awesome net!!


参考文献

  • 斎藤康毅『ゼロから作るDeep Learning』オライリー・ジャパン,2016年.

おわりに

 ちなみに私は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周目の段階では、部分部分は理解しつつも全体での繋がりが分かってなかったような印象でした。それぞれの関係が分かりやすくなるように整理できればと思います。

【次巻の内容】

www.anarchive-beta.com