ゼロから作るDeep Learning ❷ ――自然言語処理編

参加者

  1. 髙木 涼太
  2. 小林 和央
  3. 奈須 日向太
  4. 藤兼 由生
  5. 山本 啓太
  6. 大町 凌弥
  7. 嶋田 恭助
  8. 赤尾 貴仁
  9. 葛西 日向
  10. 清水 一生
  11. 鈴木 葵登

目次

まえがき

1章 ニューラルネットワークの復習 1 [清水]
1.1 数学とPythonの復習 1
1.1.1 ベクトルと行列
1.1.2 行列の要素ごとの演算
1.1.3 ブロードキャスト
1.1.4 ベクトルの内積と行列の積
1.1.5 行列の形状チェック
1.2 ニューラルネットワークの推論 8
1.2.1 ニューラルネットワークの推論の全体図
1.2.2 レイヤとしてのクラス化と順伝播の実装
1.3 ニューラルネットワークの学習 18
1.3.1 損失関数
1.3.2 微分と勾配
1.3.3 チェインルール
1.3.4 計算グラフ
1.3.5 勾配の導出と逆伝播の実装
1.3.6 重みの更新
1.4 ニューラルネットワークで問題を解く 41 [葛西]
1.4.1 スパイラル・データセット
1.4.2 ニューラルネットワークの実装
1.4.3 学習用のソースコード
1.4.4 Trainerクラス
1.5 計算の高速化 50
1.5.1 ビット精度
1.5.2 GPU(CuPy)
1.6 まとめ

2章 自然言語と単語の分散表現 57 [鈴木]
2.1 自然言語処理とは 57
2.1.1 単語の意味
2.2 シソーラス 59
2.2.1 WordNet
2.2.2 シソーラスの問題点
2.3 カウントベースの手法 63
2.3.1 Pythonによるコーパスの下準備
2.3.2 単語の分散表現
2.3.3 分布仮説
2.3.4 共起行列
2.3.5 ベクトル間の類似度
2.3.6 類似単語のランキング表示
2.4 カウントベースの手法の改善 77 [藤兼]
2.4.1 相互情報量
2.4.2 次元削減
2.4.3 SVDによる次元削減
2.4.4 PTBデータセット
2.4.5 PTBデータセットでの評価
2.5 まとめ 90

3章 word2vec 93 [赤尾]
3.1 推論ベースの手法とニューラルネットワーク 93
3.1.1 カウントベースの手法の問題点
3.1.2 推論ベースの手法の概要
3.1.3 ニューラルネットワークにおける単語の処理方法
3.2 シンプルなword2vec 101
3.2.1 CBOWモデルの推論処理
3.2.2 CBOWモデルの学習
3.2.3 word2vecの重みと分散表現
3.3 学習データの準備 111
3.3.1 コンテキストとターゲット
3.3.2 one-hot表現への変換
3.4 CBOWモデルの実装 115 [高木]
3.4.1 学習コードの実装
3.5 word2vecに関する補足 121
3.5.1 CBOWモデルと確率
3.5.2 skip-gramモデル
3.5.3 カウントベース v.s. 推論ベース
3.6 まとめ 127

4章 word2vecの高速化 131
4.1 word2vecの改良① 131
4.1.1 Embeddingレイヤ
4.1.2 Embeddingレイヤの実装
4.2 word2vecの改良② 140 [大町]
4.2.1 中間層以降の計算の問題点
4.2.2 多値分類から二値分類へ
4.2.3 シグモイド関数と交差エントロピー誤差
4.2.4 多値分類から二値分類へ(実装編)
4.2.5 Negative Sampling
4.2.6 Negative Samplingのサンプリング手法
4.2.7 Negative Samplingの実装
4.3 改良版word2vecの学習 160 [嶋田]
4.3.1 CBOWモデルの実装
4.3.2 CBOWモデルの学習コード
4.3.3 CBOWモデルの評価
4.4 word2vecに関する残りのテーマ 168
4.4.1 word2vecを使ったアプリケーションの例
4.4.2 単語ベクトルの評価方法
4.5 まとめ 173

5章 リカレントニューラルネットワーク(RNN) 175 [山本]
5.1 確率と言語モデル 175
5.1.1 word2vecを確率の視点から眺める
5.1.2 言語モデル
5.1.3 CBOWモデルを言語モデルに?
5.2 RNNとは 183
5.2.1 循環するニューラルネットワーク
5.2.2 ループの展開
5.2.3 Backpropagation Through Time
5.2.4 Truncated BPTT
5.2.5 Truncated BPTTのミニバッチ学習
5.3 RNNの実装 195 [藤兼]
5.3.1 RNNレイヤの実装
5.3.2 Time RNNレイヤの実装
5.4 時系列データを扱うレイヤの実装 205
5.4.1 RNNLMの全体図
5.4.2 Timeレイヤの実装
5.5 RNNLMの学習と評価 210
5.5.1 RNNLMの実装
5.5.2 言語モデルの評価
5.5.3 RNNLMの学習コード
5.5.4 RNNLMのTrainerクラス
5.6 まとめ 220

6章 ゲート付きRNN 223 [奈須]
6.1 RNNの問題点 223
6.1.1 RNNの復習
6.1.2 勾配消失もしくは勾配爆発
6.1.3 勾配消失もしくは勾配爆発の原因
6.1.4 勾配爆発への対策
6.2 勾配消失とLSTM 233
6.2.1 LSTMのインタフェース
6.2.2 LSTMレイヤの組み立て
6.2.3 outputゲート
6.2.4 forgetゲート
6.2.5 新しい記憶セル
6.2.6 inputゲート
6.2.7 LSTMの勾配の流れ
6.3 LSTMの実装 244 [嶋田]
6.3.1 TimeLSTMの実装
6.4 LSTMを使った言語モデル 252
6.5 RNNLMのさらなる改善 259
6.5.1 LSTMレイヤの多層化
6.5.2 Dropoutによる過学習の抑制
6.5.3 重み共有
6.5.4 より良いRNNLMの実装
6.5.5 最先端の研究へ
6.6 まとめ 274

7章 RNNによる文章生成 277 [小林]
7.1 言語モデルを使った文章生成 278
7.1.1 RNNによる文章生成の手順
7.1.2 文章生成の実装
7.1.3 さらに良い文章へ
7.2 seq2seq 287
7.2.1 seq2seqの原理
7.2.2 時系列データ変換用のトイ・プロブレム
7.2.3 可変長の時系列データ
7.2.4 足し算データセット
7.3 seq2seqの実装 296 [小林]
7.3.1 Encoderクラス
7.3.2 Decoderクラス
7.3.3 Seq2seqクラス
7.3.4 seq2seqの評価
7.4 seq2seqの改良 310
7.4.1 入力データの反転(Reverse)
7.4.2 覗き見(Peeky)
7.5 seq2seqを用いたアプリケーション 318
7.5.1 チャットボット
7.5.2 アルゴリズムの学習
7.5.3 イメージキャプション
7.6 まとめ 323

8章 Attention 325 [奈須]
8.1 Attentionの仕組み 325
8.1.1 seq2seqの問題点
8.1.2 Encoderの改良
8.1.3 Decoderの改良①
8.1.4 Decoderの改良②
8.1.5 Decoderの改良③
8.2 Attention付きseq2seqの実装 348
8.2.1 Encoderの実装
8.2.2 Decoderの実装
8.2.3 seq2seqの実装
8.3 Attentionの評価 351 [高木]
8.3.1 日付フォーマットの変換問題
8.3.2 Attention付きseq2seqの学習
8.3.3 Attentionの可視化
8.4 Attentionに関する残りのテーマ 360
8.4.1 双方向RNN
8.4.2 Attentionレイヤの使用方法
8.4.3 seq2seqの深層化とskipコネクション
8.5 Attentionの応用 367
8.5.1 Google Neural Machine Translation(GNMT)
8.5.2 Transformer
8.5.3 Neural Turing Machine(NTM)
8.6 まとめ 379

付録A sigmoid関数とtanh関数の微分 381
A.1 sigmoid関数
A.2 tanh関数
A.3 まとめ

付録B WordNetを動かす 387
B.1 NLTKのインストール
B.2 WordNetで同義語を得る
B.3 WordNetと単語ネットワーク
B.4 WordNetによる意味の類似度

付録C GRU 393
C.1 GRUのインタフェース
C.2 GRUの計算グラフ

おわりに
参考文献
索引


参考資料


風間 一洋