ゼロ から 作る deep learning 3。 【第2回】 ゼロから作る Deep Learning (3章:ニューラルネットワーク前半) 解説ブログをやってみた

4時間で「ゼロから作るDeep Learning」を読んで自分で動かしてみた

ゼロ から 作る deep learning 3

まえがき 第1ステージ 微分を自動で求める ステップ1 箱としての変数 1. 1 変数とは 1. 2 Variableクラスの実装 1. 3 【補足】NumPyの多次元配列 ステップ2 変数を生み出す関数 2. 1 関数とは 2. 2 Functionクラスの実装 2. 3 Functionクラスを使う ステップ3 関数の連結 3. 1 Exp関数の実装 3. 2 関数を連結する ステップ4 数値微分 4. 1 微分とは 4. 2 数値微分の実装 4. 3 合成関数の微分 4. 4 数値微分の問題点 ステップ5 バックプロパゲーションの理論 5. 1 チェインルール 5. 2 バックプロパゲーションの導出 5. 3 計算グラフで表す ステップ6 手作業によるバックプロパゲーション 6. 1 Variableクラスの追加実装 6. 2 Functionクラスの追加実装 6. 3 SquareとExpクラスの追加実装 6. 4 バックプロパゲーションの実装 ステップ7 バックプロパゲーションの自動化 7. 1 逆伝播の自動化のために 7. 2 逆伝播を試す 7. 3 backwardメソッドの追加 ステップ8 再帰からループへ 8. 1 現時点のVariableクラス 8. 2 ループを使った実装 8. 3 動作確認 ステップ9 関数をより便利に 9. 1 Pythonの関数として利用 9. 2 backwardメソッドの簡略化 9. 3 ndarrayだけを扱う ステップ10 テストを行う 10. 1 Pythonのユニットテスト 10. 2 square関数の逆伝播のテスト 10. 3 勾配確認による自動テスト 10. 4 テストについてのまとめ コラム :自動微分 第2ステージ 自然なコードで表現する ステップ11 可変長の引数(順伝播編) 11. 1 Functionクラスの修正 11. 2 Addクラスの実装 ステップ12 可変長の引数(改善編) 12. 1 1つ目の改善:関数を使いやすく 12. 2 2つ目の改善:関数を実装しやすく 12. 3 add関数の実装 ステップ13 可変長の引数(逆伝播編) 13. 1 可変長引数に対応したAddクラスの逆伝播 13. 2 Variableクラスの修正 13. 3 Squareクラスの実装 ステップ14 同じ変数を繰り返し使う 14. 1 問題の原因 14. 2 解決策 14. 3 微分をリセットする ステップ15 複雑な計算グラフ(理論編) 15. 1 逆伝播の正しい順番 15. 2 現状のDeZero 15. 3 関数の優先度 ステップ16 複雑な計算グラフ(実装編) 16. 1 世代の追加 16. 2 世代順に取り出す 16. 3 Variableクラスのbackward 16. 4 動作確認 ステップ17 メモリ管理と循環参照 17. 1 メモリ管理 17. 2 参照カウント方式のメモリ管理 17. 3 循環参照 17. 4 weakrefモジュール 17. 5 動作確認 ステップ18 メモリ使用量を減らすモード 18. 1 不要な微分は保持しない 18. 2 Functionクラスの復習 18. 3 Configクラスによる切り替え 18. 4 モードを切り替える 18. 5 with文による切り替え ステップ19 変数を使いやすく 19. 1 変数に名前を付ける 19. 2 ndarrayのインスタンス変数 19. 3 len関数とprint関数 ステップ20 演算子のオーバーロード(1) 20. 1 Mulクラスの実装 20. 2 演算子のオーバーロード ステップ21 演算子のオーバーロード(2) 21. 1 ndarrayと一緒に使う 21. 2 floatやintと一緒に使う 21. 3 問題点1:左項がfloatやintの場合 21. 4 問題点2:左項がndarrayインスタンスの場合 ステップ22 演算子のオーバーロード(3) 22. 1 負数 22. 2 引き算 22. 3 割り算 22. 4 累乗 ステップ23 パッケージとしてまとめる 23. 1 ファイル構成 23. 2 コアクラスへの移し替え 23. 3 演算子のオーバーロード 23. pyファイル 23. 5 dezeroのインポート ステップ24 複雑な関数の微分 24. 1 Sphere関数 24. 2 matyas関数 24. 3 Goldstein-Price関数 コラム :Define-by-Run 第3ステージ 高階微分を実現する ステップ25 計算グラフの可視化(1) 25. 1 Graphvizのインストール 25. 2 DOT言語でグラフを書く 25. 3 ノードの属性を指定する 25. 4 ノードを結ぶ ステップ26 計算グラフの可視化(2) 26. 1 可視化コードの使用例 26. 2 計算グラフからDOT言語への変換 26. 3 画像化までを含めた変換 26. 4 動作確認 ステップ27 テイラー展開の微分 27. 1 sin関数の実装 27. 2 テイラー展開の理論 27. 3 テイラー展開の実装 27. 4 計算グラフの可視化 ステップ28 関数の最適化 28. 1 ローゼンブロック関数 28. 2 微分を求める 28. 3 勾配降下法の実装 ステップ29 ニュートン法を用いた最適化(手計算) 29. 1 ニュートン法による最適化の理論 29. 2 ニュートン法による最適化の実装 ステップ30 高階微分(準備編) 30. 1 逆伝播で行う計算 31. 2 逆伝播で計算グラフを作る方法 ステップ32 高階微分(実装編) 32. 1 新しいDeZeroへ 32. 2 関数クラスの逆伝播 32. 3 より効率的な逆伝播へ(モードの追加) 32. pyの変更 ステップ33 ニュートン法を使った最適化(自動計算) 33. 1 2階微分を求める 33. 2 ニュートン法による最適化 ステップ34 sin関数の高階微分 34. 1 sin関数の実装 34. 2 cos関数の実装 34. 3 sin関数の高階微分 ステップ35 高階微分の計算グラフ 35. 1 tanh関数の微分 35. 2 tanh関数の実装 35. 3 高階微分の計算グラフの可視化 ステップ36 高階微分以外の用途 36. 1 doublebackpropの用途 36. 2 ディープラーニングの研究での使用例 コラム :ニュートン法とdoublebackpropの補足 第4ステージ ニューラルネットワークを作る ステップ37 テンソルを扱う 37. 1 要素ごとの計算 37. 2 テンソルを使用したときのバックプロパゲーション 37. 3 【補足】テンソルを使用したときのバックプロパゲーション ステップ38 形状を変える関数 38. 1 reshape関数の実装 38. 2 Variableからreshapeを使う 38. 3 行列の転置 38. 4 【補足】実際のtranspose関数 ステップ39 和を求める関数 39. 1 sum関数の逆伝播 39. 2 sum関数の実装 39. 3 axisとkeepdims ステップ40 ブロードキャストを行う関数 40. 3 ブロードキャストへの対応 ステップ41 行列の積 41. 1 ベクトルの内積と行列の積 41. 2 行列の形状チェック ステップ42 線形回帰 42. 1 トイ・データセット 42. 2 線形回帰の理論 42. 3 線形回帰の実装 42. 1 DeZeroのlinear関数 43. 2 非線形なデータセット 43. 3 活性化関数とニューラルネットワーク 43. 4 ニューラルネットワークの実装 ステップ44 パラメータをまとめるレイヤ 44. 1 Parameterクラスの実装 44. 2 Layerクラスの実装 44. 3 Linearクラスの実装 44. 4 Layerを使ったニューラルネットワークの実装 ステップ45 レイヤをまとめるレイヤ 45. 1 Layerクラスの拡張 45. 2 Modelクラス 45. 3 Modelを使って問題を解く 45. 4 MLPクラス ステップ46 Optimizerによるパラメータ更新 46. 1 Optimizerクラス 46. 2 SGDクラスの実装 46. 3 SGDクラスを使って問題を解く 46. 4 SGD以外の最適化手法 ステップ47 ソフトマックス関数と交差エントロピー誤差 47. 1 スライス操作のための関数 47. 2 ソフトマックス関数 47. 3 交差エントロピー誤差 ステップ48 多値分類 48. 1 スパイラル・データセット 48. 2 学習用のコード ステップ49 Datasetクラスと前処理 49. 1 Datasetクラスの実装 49. 2 大きいデータセットの場合 49. 3 データの連結 49. 4 学習用のコード 49. 5 データセットの前処理 ステップ50 ミニバッチを取り出すDataLoader 50. 1 イテレータとは 50. 2 DataLoaderを使う 50. 3 accuracy関数の実装 50. 4 スパイラル・データセットの学習コード ステップ51 MNISTの学習 51. 1 MNISTデータセット 51. 2 MNISTの学習 51. 3 モデルの改良 コラム :ディープラーニングのフレームワーク 第5ステージ DeZeroで挑む ステップ52 GPU対応 52. 1 CuPyのインストールと使用方法 52. 2 cudaモジュール 52. 4 関数の追加実装 52. 5 GPUでMNISTを学習 ステップ53 モデルの保存と読み込み 53. 1 NumPyのsave関数とload関数 53. 2 Layerクラスのパラメータをフラットに 53. 3 Layerクラスのsave関数とload関数 ステップ54 Dropoutとテストモード 54. 1 Dropoutとは 54. 2 InvertedDropout 54. 3 テストモードの追加 54. 4 Dropoutの実装 ステップ55 CNNのメカニズム(1) 55. 1 CNNのネットワーク構造 55. 2 畳み込み演算 55. 3 パディング 55. 4 ストライド 55. 5 出力サイズの計算方法 ステップ56 CNNのメカニズム(2) 56. 1 3階テンソル 56. 2 ブロックで考える 56. 3 ミニバッチ処理 56. 4 プーリング層 ステップ57 conv2d関数とpooling関数 57. 1 im2colによる展開 57. 2 conv2d関数の実装 57. 3 Conv2dレイヤの実装 57. 4 pooling関数の実装 ステップ58 代表的なCNN(VGG16) 58. 1 VGG16の実装 58. 2 学習済み重みデータ 58. 3 学習済みのVGG16を使う ステップ59 RNNによる時系列データ処理 59. 1 RNNレイヤの実装 59. 2 RNNモデルの実装 59. 3 「つながり」を切るためのメソッド 59. 4 サイン波の予測 ステップ60 LSTMとデータローダ 60. 1 時系列データのためのデータローダ 60. 2 LSTMレイヤの実装 コラム :これから先へ 付録A インプレース演算(ステップ14の補足) A. 1 問題の確認 A. 2 コピーと上書きについて A.

次の

ゼロから作るDeep Learning - 第3回:3章(その2) pythonによるニューラルネットワークの実装

ゼロ から 作る deep learning 3

LeNet 1998• 約20年前に提案された初めてのCNN• 活性化関数はシグモイド関数で,Pooling層はサブサンプリングという点が現在のCNNとは異なる.• AlexNet 2012• Data Augmentation データ拡張)• 訓練画像の回転や平行移動,または一部切り出し crop処理),左右反転(flip処理),輝度変化などにより,人工的に訓練画像枚数を増やすこと• ネットワークを深くする理由• 深いネットワークの方が浅いネットワークより少ないパラメータ数で高精度な表現力を持つ.• 深いネットワークのほうが学習が効率的になる.すなわち少ないデータ数でも学習が行える.(各層がより簡単なタスクに取り組むことになる)• ImageNet CVPR2009• ILSVRC ImageNet Large Scale Visual Recognition Challenge に用いられる100万枚を超えるラベル付き画像データセット• 転移学習• 学習済みのパラメータを別のニューラルネットワークにうつして再学習すること 様々なディープラーニングのフレームワーク• VGG 2014• Convolution層とPooling層からなる基本的なCNN.• 最後は全結合層を経由する• GooGleNet 2014• CNNの構造をしているが,縦方向のみならず,横方向にも深さを持つインセプション構造を持つ.• 横方向にはサイズの異なるフィルターによる畳込みとプーリングが並んでいる.• ResNet 2015• Convolution層の一部を複数まとめてスキップするスキップ構造(ショートカット,バイパス)を導入し,学習時の逆伝播において勾配をそのまま流すことで,勾配消失の問題を軽減する• これにより150層以上をつなげることができるようになった ディープラーニングの高速化 ディープラーニングの学習にかかる時間の9割程度はConvolution層の処理である.これを並列して解くのがGPU. GPUの主な提供元はNVIDIA社とAMD社の2つだが,親しいのはNVIDIA社のものである. ただし,GPUの高速化にも限界があるため,分散学習も注目されている.TensorFlow Google やCNTK Microsoft では分散学習を重要視している. 計算量以外にもメモリ容量やバス帯域が問題になる. メモリ容量では,大量のパラメータや中間データの扱い方,バス帯域ではネットワークを流れるデータのビット数が問題になり,ディープラーニングでは16bitの半精度浮動小数点数でも学習できると言われている.NVIDIA社のPascalアーキテクチャではこの16bit演算に対応している.2016年には重みや中間データを1bitで表現するBinarized Neural Networkも提案された. ディープラーニングの実用例• 物体検出• 画像から物体の種類と位置を特定するクラス分類問題• CNNをベースとした手法が多く,R-CNN,さらにはFaster R-CNNが有名.• セグメンテーション• 画像に対するピクセルレベルでのクラス分類問題• FCN Fully Convolutional Network というすべてがConvolution層からなるネットワークが使われる• 画像キャプション生成• 画像を入力すると,その説明文を出力する問題• 代表的な方法はNIC Neural Image Caption を呼ばれ,画像を理解するでディープなCNNと自然言語を扱うRNNから構成される.• CNNが画像から特徴を抽出し,RNNに初期値としてそれを渡す.そこからRNNは再帰的に文章を生成する.• 画像スタイル変換• スタイル画像とコンテンツ画像の2つの画像を入力することで,新しい画像を生成する.• ネットワークの中間データがコンテンツ画像の中間データに近くなるように,かつスタイル画像から抽出したスタイル行列のズレも小さくなるように学習を行う• 画像生成• DCGAN Deep Convolutional Generative Adversarial Network• GeneratorとDiscriminatorという2つのニューラルネットワークを用い,前者が本物そっくりの偽物を作り,後者がそれが本物か否かを判定することを競争的に繰り返し,お互いに学習を進める.• 自動運転• SegNet CNNベース• Deep Q-Network• Q学習における最適価値行動関数の近似においてCNNを用いる強化学習 感想 勉強時間234分! とてもわかりやすく,最近話題になっているようなトピックまで触れることができました. 今回は実装を「見る」ことによって学習を進めました.時間的には間違いなく早いですが,やはり自分で実装して初めて気づくことも多々あるかと思います.その点を考えて,これから第5章~7章あたりのものを時間外で実装してみようと思います. それでも4時間で一通りの理解が出来たことはとても良かったと思います. ソースコードは章ごとに分かれているのはいいが,ファイル名に数字をつけるなどして,各章内での順番も明示すると,書籍との行き来が楽になるように感じました. 4時間というのは社会人でいうと半日にあたりますね.挑戦できてよかったです..

次の

ゼロから作るDeep Learning - 第3回:3章(その2) pythonによるニューラルネットワークの実装

ゼロ から 作る deep learning 3

【内容情報】(出版社より) 大ヒットを続ける人気シリーズの第3弾。 今回は「DeZero」というディープラーニングのフレームワークをゼロから作ります。 DeZeroは本書オリジナルのフレームワークです。 最小限のコードで、フレームワークのモダンな機能を実現します。 本書では、この小さなーーそれでいて十分にパワフルなーーフレームワークを、全部で60のステップで完成させます。 それによって、PyTorch、TensorFlow、Chainerなどの現代のフレームワークに通じる知識を深めます。 キャッチフレーズはーー作るからこそ、見えるモノ。 【内容情報】(「BOOK」データベースより) 大ヒットを続ける人気シリーズの第3弾。 今回は「DeZero」というディープラーニングのフレームワークをゼロから作ります。 DeZeroは本書オリジナルのフレームワークです。 最小限のコードで、フレームワークのモダンな機能を実現します。 本書では、この小さなーそれでいて十分にパワフルなーフレームワークを、全部で60のステップで完成させます。 それによって、PyTorch、TensorFlow、Chainerなどの現代のフレームワークに通じる知識を深めます。 【目次】(「BOOK」データベースより) 第1ステージ 微分を自動で求める(箱としての変数/変数を生み出す関数 ほか)/第2ステージ 自然なコードで表現する(可変長の引数(順伝播編)/可変長の引数(改善編) ほか)/第3ステージ 高階微分を実現する(計算グラフの可視化/テイラー展開の微分 ほか)/第4ステージ ニューラルネットワークを作る(テンソルを扱う/形状を変える関数 ほか)/第5ステージ DeZeroで挑む(GPU対応/モデルの保存と読み込み ほか) 【著者情報】(「BOOK」データベースより) 斎藤康毅(サイトウコウキ) 1984年長崎県対馬生まれ。 東京工業大学工学部卒、東京大学大学院学際情報学府修士課程修了。 現在、企業にて人工知能に関する研究開発に従事(本データはこの書籍が刊行された当時に掲載されていたものです).

次の