kaeken(嘉永島健司)のTech探究ブログ

主に情報科学/情報技術全般に関する知見をポストします。(最近は、特にData Science、機械学習、深層学習、統計学、Python、数学、ビッグデータ)

『ゼロから作るDeep Learning2自然言語処理編』学習開始

f:id:kaeken:20181001221520p:plain

『ゼロから作るDeep Learning自然言語処理編』学習開始。

『ゼロから作るDeep Learning』の続編で、自然言語処理・時系列データがメインテーマ。

機械学習・深層学習の分野は、2年前に『ゼロから作るDeep Learning』を学習したときから比べて、ものすごい勢いで発展してきており、すべてを追うことはかなり困難。

また、基礎ができていないと、多数の事象をそれぞれ個別に学ぶことになり、効率が悪い。

目先のビジネスは最低限にして、倦まず弛まず、基礎を淡々と積み上げていく。

以下、リソースまとめ。

GitHubリポジトリoreilly-japan/deep-learning-from-scratch-2: 『ゼロから作る Deep Learning ❷』のリポジトリ

git clone https://github.com/oreilly-japan/deep-learning-from-scratch-2.git

正誤表 errata · oreilly-japan/deep-learning-from-scratch-2 Wiki

以下『ゼロから作るDeep Learning自然言語処理編』目次。

まえがき

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

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

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

4章 word2vecの高速化
    4.1 word2vecの改良①
        4.1.1 Embeddingレイヤ
        4.1.2 Embeddingレイヤの実装
    4.2 word2vecの改良②
        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の学習
        4.3.1 CBOWモデルの実装
        4.3.2 CBOWモデルの学習コード
        4.3.3 CBOWモデルの評価
    4.4 word2vecに関する残りのテーマ
        4.4.1 word2vecを使ったアプリケーションの例
        4.4.2 単語ベクトルの評価方法
    4.5 まとめ

5章 リカレントニューラルネットワーク(RNN)
    5.1 確率と言語モデル
        5.1.1 word2vecを確率の視点から眺める
        5.1.2 言語モデル
        5.1.3 CBOWモデルを言語モデルに?
    5.2 RNNとは
        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の実装
        5.3.1 RNNレイヤの実装
        5.3.2 Time RNNレイヤの実装
    5.4 時系列データを扱うレイヤの実装
        5.4.1 RNNLMの全体図
        5.4.2 Timeレイヤの実装
    5.5 RNNLMの学習と評価
        5.5.1 RNNLMの実装
        5.5.2 言語モデルの評価
        5.5.3 RNNLMの学習コード
        5.5.4 RNNLMのTrainerクラス
    5.6 まとめ

6章 ゲート付きRNN
    6.1 RNNの問題点
        6.1.1 RNNの復習
        6.1.2 勾配消失もしくは勾配爆発
        6.1.3 勾配消失もしくは勾配爆発の原因
        6.1.4 勾配爆発への対策
    6.2 勾配消失とLSTM
        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の実装
        6.3.1 TimeLSTMの実装
    6.4 LSTMを使った言語モデル
    6.5 RNNLMのさらなる改善
        6.5.1 LSTMレイヤの多層化
        6.5.2 Dropoutによる過学習の抑制
        6.5.3 重み共有
        6.5.4 より良いRNNLMの実装
        6.5.5 最先端の研究へ
    6.6 まとめ

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

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

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

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

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

おわりに
参考文献
索引

手を動かしながら、コツコツ進める。