ゼロから作るDeep Learning ❸
――フレームワーク編

[cover photo]
  • 2020年04月 発行
  • 552ページ
  • ISBN978-4-87311-906-9
  • フォーマット 本 PDF EPUB

オライリー・ジャパンで書籍を購入:
定価4,400円

Ebook Storeで電子版を購入:
価格3,520円

大ヒットを続ける人気シリーズの第3弾。今回は「DeZero」というディープラーニングのフレームワークをゼロから作ります。DeZeroは本書オリジナルのフレームワークです。最小限のコードで、フレームワークのモダンな機能を実現します。本書では、この小さな――それでいて十分にパワフルな――フレームワークを、全部で60のステップで完成させます。それによって、PyTorch、TensorFlow、Chainerなどの現代のフレームワークに通じる知識を深めます。キャッチフレーズは――作るからこそ、見えるモノ。

関連書籍

PythonによるAIプログラミング入門
scikit-learnとTensorFlowによる実践機械学習
ゼロから作るDeep Learning
ゼロから作るDeep Learning ❷
直感 Deep Learning

まえがき

第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.4 実際の__init__.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 確認作業①:Variableのインスタンス変数
        30.2 確認作業②:Functionクラス
        30.3 確認作業③:Variableクラスの逆伝播
    ステップ31 高階微分(理論編)
        31.1 逆伝播で行う計算
        31.2 逆伝播で計算グラフを作る方法
    ステップ32 高階微分(実装編)
        32.1 新しいDeZeroへ
        32.2 関数クラスの逆伝播
        32.3 より効率的な逆伝播へ(モードの追加)
        32.4 __init__.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.1 broadcast_to関数とsum_to関数
        40.2 DeZeroのbroadcast_toとsum_to関数
        40.3 ブロードキャストへの対応
    ステップ41 行列の積
        41.1 ベクトルの内積と行列の積
        41.2 行列の形状チェック
    ステップ42 線形回帰
        42.1 トイ・データセット
        42.2 線形回帰の理論
        42.3 線形回帰の実装
        42.4 【補足】DeZeroのmean_squared_error関数
    ステップ43 ニューラルネットワーク
        43.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.3 Variable/Layer/DataLoaderクラスの追加実装
        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.3 DeZeroの逆伝播では

付録B get_item関数の実装(ステップ47の補足)

付録C GoogleColaboratoryで動かす

おわりに
参考文献
索引

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]