vmin style

DL4US落ちたので、書籍『ゼロから作るDeeplearning②―自然言語処理編』をやるしかない

【スポンサーリンク】

ゼロつく②やるしかない...!!

「ゼロから作るDeep Learning②」とは

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

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

10万部も売れているベストセラー本『ゼロから作るDeep Learningの第2段。 "できるだけ優しい言葉と図解を多用する"というのをモットーとして書かれていて、 数式だらけで難解な本が多い中、初学者にとってはヒジョーにありがたい"神シリーズ"である。

最近、待望の続編である自然言語処理が満を持して登場した。 元ネタはスタンフォード大の授業CS231n(画像認識のためのCNN)CS224d(自然言語処理のためのディープラーニングである。

今作もロングセラー間違いなしっすね!!

準備 : 無料GPUgoogle colab上で実行する

こちらのエントリを参考に。 qiita.com forhighlow0.hatenablog.com

  1. 本書GitHubサイト からdeep-learning-from-scratch-2-master をフォルダーごとダウンロードし、zipファイル解凍後、google driveにアップロードします。
  2. google colabのノートブックを新規作成して、「Python3」のノートブックを作成します。
  3. 編集 > ノートブックの設定 > ハードウェア アクセラレータ でGPUに設定。 f:id:stillalive0304:20180731132618p:plain:w200

エントリ通り、下のコードをコピペして実行します。

!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

上記の実行が終わると、URLと認証コード入力フォームが表示されるのでリンクをクリックしてコピペして認証をします。二回行います。認証したあと、さらに下のコードをコピペし、実行します。

!mkdir -p drive
!google-drive-ocamlfuse drive

!lsを実行して、driveディレクトリがあればマウントは成功です。

!ls

f:id:stillalive0304:20180731134630p:plain:w100

誰でも無料でディープラーニングできる時代...凄すぎる!!

「ゼロから作るDeep Learning②」のコード(ch01/show_spiral_dataset.py)を試しに動かす(p.41)

エントリを参考に、ch01/show_spiral_dataset.pyのコードのsys.path.append('..') sys.path.append('/content/drive/deep-learning-from-scratch-2-master')に変更し、実行して、printが正しく出力されれば成功です。 f:id:stillalive0304:20180731142306p:plain f:id:stillalive0304:20180731142322p:plain

以降、pyファイルを同様に変更してから実行します。

追記

  • 4章のch04/eval.pyでエラー
    • pkl_file = '/content/drive/deep-learning-from-scratch-2-master/ch04/cbow_params.pkl'とするとOK
  • 5章のch05/train_custom_loop.pyでエラー
    • sys.path.append('content/drive/deep-learning-from-scratch-2-master/ch05')とするとOK
  • 6章のch06/train_rnnlm.pyでエラー
    • sys.path.append('content/drive/deep-learning-from-scratch-2-master/ch06')とするとOK
  • 7章のch07/train_seq2seq.pyでエラー
    • sys.path.append('/content/drive/deep-learning-from-scratch-2-master/ch07')とするとOK
  • 8章のch07/train.pyでエラー
    • sys.path.append('/content/drive/deep-learning-from-scratch-2-master/ch07')とするとOK

ちょこちょこコードの変更が必要っすね...!!

  

第1章 ニューラルネットワークの復習(P1~P55)

まずは前作の復習から。さらっと流し読み。

ニューラルネットワークを用いると複雑な表現が可能になり、例え「渦巻き」のような複雑なパターンでも分離することができると。

f:id:stillalive0304:20180730142255p:plain

本章で学んだこと

とりあえず、ニューラルネットワークは凄いと...φ(。。)

  

第2章 自然言語と単語の分散表現(P57~P92)

ここから本題の"自然言語処理"に入っていきます...!!

ここからはAmazonのレビューのKyleさんのメモを参考に。感謝!

自然言語処理

  • 『単語の意味』をコンピュータに理解させることがテーマ
  • 本章と次章では次の3つの手法を見ていく
    • シソーラスによる手法 : 人の手によって作られた類語辞書を利用
    • カウントベースの手法 : 統計情報から単語を表現(コーパスを利用)
    • 推論ベースの手法 : ニューラルネットワークによる推論(word2vecと呼ばれる)

シソーラスによる手法

f:id:stillalive0304:20180731150143p:plain:w400

IBM Knowledge Center より引用

  • 単語の上位/下位関係、部分/全体関係などによって単語を分類し、体系づけた類語辞書。
WordNet

f:id:stillalive0304:20180801142747p:plain:w300

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用

シソーラスの問題点
  • 時代の変化に対応するのが困難
  • 人の作業コストが高い
  • 単語の細かなニュアンスを表現できない

②カウントベースの手法

  • 「単語の意味は、周囲の単語によって形成される」という仮説に基づき、着目した単語の周囲の単語の頻度カウントし、集計する手法。

f:id:stillalive0304:20180731185232p:plain:w400

CS224d Lecture2スライド より引用

カウントベースの手法の改善
相互情報量(PMI)の調整
  • 例えば、英語の特性で冠詞(the)単語(car)の頻度が高い場合、他の単語(driveなど)の方を優先させる調整
特異値分解(SVD)による次元削減
  • ベクトルの次元を("重要な情報"をできるだけ残すように)削減して、ロバスト(頑健性)を高める。

f:id:stillalive0304:20180731205501p:plain:w400

30分でわかる機械学習用語「次元削減(Dimensionality Reduction)」 より引用

各改善点などの実装(PTBデータセットを例に)
  • cos_similarity() : ベクトル間の類似度(コサイン類似度)を計測するための関数
  • most_similar() : 類似単語のランキングを表示する関数

f:id:stillalive0304:20180731204648p:plain:w200

SVDは結構時間がかかっていました... ここでは"時間がかかる"というのを体験させる意味合いなのカモ。

本章で学んだこと

  • WordNetなどのシソーラスを利用して、類義語の取得や単語間の類似度の計測など有用なタスクを行うことができる
  • シソーラスを用いる手法には、シソーラス作製する人の作業量新しい単語への対応などの問題がある
  • 現在では、コーパスを利用して単語をベクトル化するアプローチが主流である
  • 近年の単語ベクトル化の手法では、「単語の意味は、周囲の単語によって形成される」という分布仮説に基づくものがほとんどである
  • カウントベースの手法は、コーパス内の各単語に対して、その単語の周囲の単語の頻度をカウントし集計する(=共起行列)
  • 共起行列PPMI行列に変換し、それを次元削減することで、巨大な疎のベクトルを小さな「密なベクトル」へ変換することができる
  • 単語のベクトル空間では、意味的に近い単語はその距離が近くなることが期待される

2章は次のword2vecへの"前振り"っすね。

    

第3章 Word2Vec(P93~P129)

名前の通り、word(単語)をvector(ベクトル)にします。

推論ベースの手法(Word2Vec)の利点

カウントベース(SVD)の手法の問題点
  • 大規模なコーパスを使う場合、語彙数*語彙数の巨大な行列を作る必要がある。計算量的に現実的でない
推論ベース(Word2Vecニューラルネットワークによる推論)の利点
  • 推論ベースでは、少量(ミニバッチ)ごとに重みを繰り返し更新して学習が出来る。(逐次学習が可能)
  • 推論ベースでは、単語の意味を的確にとらえたベクトル表現=単語の「分散表現」を可能にする。

f:id:stillalive0304:20180731233507p:plain:w600

Word2Vecを用いた類義語の抽出が上手く行ったので、分析をまとめてみた より引用

  • 分散表現 : 単語の意味を的確にとらえた"密な"ベクトル表現

f:id:stillalive0304:20180802114343p:plain:w400

Word2Vec - Speaker Deck より引用

イメージ図:単語の分散表現により抽象的な意味を表現できる

f:id:stillalive0304:20180801130939p:plain:w400

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用

例:「king -man + woman=queen」の問題が解ける!

f:id:stillalive0304:20180801125024p:plain:w400

word2vec King-Queen composition | the morning paper より引用

参考:自然言語処理を学ぼう #3 word2vec 理論編(田中TOMさんのyoutube動画)

www.youtube.com

Word2VecのアルゴリズムCBOWモデル、skip-gramモデル)

  • CBOWモデル
    • 前後の単語(文脈)から、現在の単語を推測する。

f:id:stillalive0304:20180801130418p:plain:w400

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用

  • skip-gramモデル
    • 現在の単語から、前後の単語(文脈)を推測する。

f:id:stillalive0304:20180801131836p:plain:w400

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用

  • イメージ図:CBOWモデルとskip-gramモデルは逆の関係

f:id:stillalive0304:20180802111951p:plain:w400

Word Embeddings - word2vec - Mubaris' Blog より引用

  • CBOWモデル vs skip-gramモデル

f:id:stillalive0304:20180804151832p:plain:w400

言語と画像の表現学習 より引用

シンプルなWord2Vecの実装と学習と評価

  • 学習回数(~1000 epoch)を重ねるごとに損失が減少しているのを確認

f:id:stillalive0304:20180802123509p:plain:w400

  • 単語の分散表現を確認

f:id:stillalive0304:20180802123736p:plain:w400

本章で学んだこと

  • 推論ベースの手法は、推測することを目的として、その副産物として単語の分散表現を得られる
  • Word2Vec推論ベースの手法であり、シンプルな2層ニューラルネットワークで構成される
  • Word2Vecには、skip-gramモデルCBOWモデルがある
  • CBOWモデルは複数の単語(コンテキスト)からひとつの単語(ターゲット)を推測する
  • skip-gramモデルに、ひとつの単語(ターゲット)から複数の単語(コンテキスト)を推測する
  • Word2Vec重みの再学習ができるため、単語の分散表現更新追加効率的に行える

引き続き4章では、Word2Vecの問題点を指摘し、"使える"モデルに改善していきます...!!

  

第4章 Word2Vecの高速化(P131~P174)

問題点

  • 大きなコーパスを扱うときに、次の①②の部分で計算量が増える

① 入力層のone-hot表現重み行列の積による計算が重すぎる

対策:重みパラメータから「単語IDに該当する行(ベクトル)」をだけを抜き出すようにする ( = Embeddingレイヤの導入)
  • つまり、Embeddingレイヤに単語の"密な"ベクトル表現(分散表現)が格納される

f:id:stillalive0304:20180802144424p:plain:w400

Lab 06 Recurrent Neural Networks - GPUComputing Sheffield より引用

② 中間層と重み行列の積、およびSoftmaxレイヤの計算が重すぎる

対策多値分類2値分類で近似して計算量を軽くする ( = Negative Samplingの導入)
  • 例) コンテキストが『you』と『goodbye』のとき、
    • ターゲットとなる単語はですか?→『多値分類』
    • ターゲットとなる単語は『say』ですか?→『二値分類』
Negative Samplingの流れ
  • ① 正例をターゲットとした場合の損失を求める
    • Sigmoid with Lossレイヤに正解ラベルとして「1」を入力する
  • ② ①と同時に負例をいくつか(5個とか)サンプリングし、同様に損失を求める
    • Sigmoid with Lossレイヤに正解ラベルとして「0」を入力する
  • ③ 正例と負例の損失を足し合わせ最終的な損失を出力する

f:id:stillalive0304:20180804114049p:plain:w400

Notes from Coursera Deep Learning courses by Andrew Ng より引用

Negative Samplingのサンプリング手法
  • 負の例として多くの単語をカバーするため、高頻出な単語を抜き出す
    • レアな単語はほとんど出現しないため
  • とは言え、レアな単語を"見捨てない”ように、単語の確率分布を0.75乗(3/4乗)する
    • 0.75乗することで、レアな単語の出現確率が少しだけ高くなる
      • =サンプリングされやすくなる

f:id:stillalive0304:20180804115624j:plain:w400

Distributed Representations of Words and Phrases and their Compositio… より引用

問題点対策①②の実装と、改良版での学習と評価

  • CBOWモデルの評価

f:id:stillalive0304:20180804135417p:plain:w200

  • 4題目のbadに対するworseは答えられなかったのは、PTBデータセットが小さかったため
    • 大きなコーパスを対象として学習すれば、より精度が高く、よりロバストな単語の分散表現が得られ、類推問題の正解率も向上する

本章で学んだこと

  • Embeddingレイヤは単語の分散表現を格納し、順伝搬において該当する単語IDのベクトルを抽出する
  • Word2Vecでは語彙数の増加に比例して計算量が増加するので、近似計算を行う高速な手法を使うとよい
  • Negative Sampling負例をいくつかサンプリングする手法であり、これを利用すれば多値分類二値分類として扱うことができる
  • Word2Vecによって得られた単語の分散表現は、単語の意味が埋め込まれたものであり、似たコンテキストで使われる単語は単語ベクトルの空間上で近い位置に位置するようになる
  • Word2Vecの単語の分散表現は、類似問題をベクトルの加算と減算によって解ける性質を持つ
  • Word2Vecは転移学習の点で重要であり、その単語の分散表現は_さまざまな自然処理言語のタスクに利用できる

分散表現すげぇ....発案者のMikolov氏は天才や...。

Word2Vecは革新的技術ですが、まだ"ディープ"ではない。『今のはメラゾーマではない、メラだ』的な*1。ここからいよいよ本題の"ディープ"な技術へ...。

 

第5章 リカレントニューラルネットワーク(RNN)(P175~P221)

ついに、かの有名なRNN登場!キタコレ感。

前章までのフィードフォワード(流れが一方向)タイプのネットワークの問題点

  • 時系列データの性質を十分に学習できない

    • 例)Tom was wathing TV in his room. Mary came into the room. Mary said hi to ??? .
      • 18個のコンテキストを使う学習で、CBOWモデルのコンテキストが10個までだったら、正しく答えられない。
    • CBOWモデルは、単語の並び無視されてしまう

f:id:stillalive0304:20180804143519p:plain:w400

ニューラルネットワークについて より引用

循環するニューラルネットワーク(RNN)

f:id:stillalive0304:20180807120937p:plain:w400

MIRU2018 tutorial より引用

  • ループする経路(閉じた経路)を持ち、隠れ状態を内部に記憶できる

f:id:stillalive0304:20180807121103p:plain:w400

MIRU2018 tutorial より引用

RNNレイヤに対する誤差逆伝播法も行える:BPTT

  • BPTT (Backpropagation Through Time): 時間軸上の逆伝播

f:id:stillalive0304:20180806162148p:plain:w400

【Day-18】時系列のディープラーニング、RNNのまとめとKeras実装 - プロクラシスト より引用

弱点:時間サイズが長くなると逆伝播時の勾配が不安定になる

f:id:stillalive0304:20180804150656p:plain:w400

最近の自然言語処理 より引用

f:id:stillalive0304:20180806163043p:plain:w400

http://akimacho.hatenablog.com より引用

Truncated BPTTで解決!

  • truncatedは「切り取られた」という意味。途中で断ち切る逆伝搬。

f:id:stillalive0304:20180804151409p:plain:w400

Chainerの使い方と自然言語処理への応用 より引用

  • 逆伝播のつながりを一定間隔で断ち切る
    • 順伝播はそのまま変えない

Truncated BPTTのミニバッチ学習

  • 注意点
    • ①データをシーケンシャルに与えること
      • 例)[0~9][500~509] > [10~19][510~519] > ....
    • ②各バッチでデータを与える開始位置をズラすこと

RNNLM(Language Model)の実装、学習と評価

  • RNNLMはWord2Vecの提案者であるMikolov氏によって発案されたもの。

f:id:stillalive0304:20180806170919p:plain:w400

MeCabより高精度?RNNLMの形態素解析器JUMAN++ - DeepAge より引用

またMikolov氏...まさに自然言語処理界の界王....。

パープレキシティ(予測性能の良さ)の評価

  • パープレキシティ:言語モデルの予測性能の良さを評価する指標。最小値は1.0で、1に近いほど性能が良い。

f:id:stillalive0304:20180806172927p:plain:w400 f:id:stillalive0304:20180806173228p:plain:w400 f:id:stillalive0304:20180806173249p:plain:w400

最近の自然言語処理 より引用

PTBデータセット(1000個の単語)を利用したRNNLMの学習

f:id:stillalive0304:20180804152508p:plain:w400

  • 最初は300を超えていたパープレキシティが、最後の方では(最小値の)1に近づいている!

とはいえ、今回は小さい(1000個の)データセットだったので上手くいったにすぎず、現状のモデルでは大きいコーパスだと全く歯が立たないとのこと。

そこで次章ではRNNの改良版として...ついに...かの有名なLSTM登場!wktk

本章で学んだこと

  • RNNはループする経路があり、それによって「隠れ状態」を内部に記憶することができる
  • RNNのループ経路を展開することで、複数のRNNレイヤがつながったネットワークと解釈することができ、通常の逆誤差伝搬法によって学習することができる(=BPTT)
  • 長い時系列データを学習する場合は、適当な長さでデータのまとまりを作りーーこれを「ブロックと言う」ーー、ブロック単位でBPTTによる学習を行う(=Truncated BPTT)
  • Truncated BPTT では逆伝搬のつながりのみを切断する
  • Truncated BPTTでは順伝搬のつながりは維持するため、データは”シーケンシャル”に与える必要がある
  • 言語モデルは、単語の羅列を確率として解釈する
  • RNNレイヤを利用した条件付き言語モデルは、(理論的には)それまで登場した単語の情報を記憶することができる

  

第6章 ゲート付きRNN( LSTM ) (P223~P275)

あの複雑そうなLSTMが果たして理解できるのか...!? いよいよゼロつく②も後半戦...!!

 前章RNNの問題点

f:id:stillalive0304:20180806184748p:plain:w400

Recurrent Neural Networks により引用

時系列データの長期の依存関係をうまく学習できない

  • 勾配消失、または勾配爆発がおきてしまう
    • 理由:重み行列Whの値を規定回数分乗算しているため、データが大きいと乗算回数が多くなり、1より大きいと指数的に増加し、1より小さいと指数的に減少するため。

勾配爆発対策

  • 勾配クリッピング
    • 単純に勾配の最大値を制限する技。例えば、勾配は100は大きすぎるから5にしましょうという超単純な考え。

DeepLearning勉強会 - 講義ノート6 より引用

f:id:stillalive0304:20180806203329p:plain:w400

第2回 メドレー読書会 より引用

勾配消失対策

ゲート付きRNN:LSTM

f:id:stillalive0304:20180807121345p:plain:w400

f:id:stillalive0304:20180807120108p:plain:w400

MIRU2018 tutorial より引用

 LSTMレイヤのインタフェース

情報を保存する記憶セル

f:id:stillalive0304:20180806210322p:plain:w400

Understanding LSTM Networks -- colah's blog より引用

  • RNNで1つだった前セルからの情報伝搬が、隠れ状態ベクトルhのほかに記憶セルcが追加されて2ラインになっている。

f:id:stillalive0304:20180810150836p:plain:w400

ディープラーニングブログ より引用

  • 隠れ状態ベクトルhの方が短期記憶で、記憶セルcが長期記憶だと考える。LSTM(Long short-term memory)は、その名の通り、短期長期を関連させながらも別々のラインで記憶保持している。

LSTM 〜Long Short-Term Memory〜(Vol.18) より引用

  • LSTMレイヤ内だけで完結し、他レイヤへは出力しない。
  • 記憶セルと隠れ状態のセル数は同じ。 (記憶セルの要素数が100なら、隠れ状態の要素数も100)

LSTMで使用するゲート:開くか閉じるかだけでなく、どの割合(0.0~1.0)で開くかをコントロールする

f:id:stillalive0304:20180806215305p:plain

LSTM -- Gateを持つRNN より引用

  • 学習データから自動的にゲートの開き具合を学ばせる
    • LSTMにある3つのゲートでは、ゲートの開き具合をコントロールするための、専用の重みパラメータがあり、学習データによって更新される

f:id:stillalive0304:20180806215406p:plain:w400

LSTM -- Gateを持つRNN より引用

  • ゲートの開き具合を求めるときにsigmoid関数を利用する
    • シグモイド関数σによって、1が全開、0が閉め切りで、例えば0.5なら半開きというゲートで信号の重みコントロールを行っている。

f:id:stillalive0304:20180806215759p:plain:w400

LSTM -- Gateを持つRNN より引用

ゲート① outputゲート

f:id:stillalive0304:20180807121457p:plain:w400

MIRU2018 tutorial より引用

  • 情報を出力するかどうかを制御する
    • 0.0のとき、何も出力しない
    • 1.0のとき、全部出力する
    • 0.0~1.0の間、一部出力する

ゲート② forgetゲート

f:id:stillalive0304:20180807121601p:plain:w400

MIRU2018 tutorial より引用

  • 情報を削除かどうかを制御する
    • 0.0のとき、全部削除する
    • 1.0のとき、何も削除しない
    • 0.0~1.0の間、一部削除する

ゲート③ inputゲート

f:id:stillalive0304:20180807121715p:plain:w400

MIRU2018 tutorial より引用

  • 情報を書き込むかどうかを制御する
    • 0.0のとき、何も書き込まない
    • 1.0のとき、全部書き込む
    • 0.0~1.0の間、一部書き込む

LSTMが勾配消失を起こさない理由

  • LSTMの逆伝播は、記憶セルの「行列の積」ではなく、「要素ごとの積(アダマール積)」であるため、勾配爆発・消失を起こしにくい

f:id:stillalive0304:20180806225346p:plain:w400

LSTM -- Gateを持つRNN より引用

LSTM難しい…、ぐぬぬ...。

参考 : LSTM 〜Long Short-Term Memory〜(Vol.18) のわかりやすい説明

  • 上記ブログでわかりやすくまとめられていました。感謝!

f:id:stillalive0304:20180806222952p:plain

LSTM 〜Long Short-Term Memory〜(Vol.18) より引用

①前セルの出力に記憶ラインが追加(ht-1とCt-1)

②前セルの出力(Recurrent)と入力の合流(ht-1とXt)

  • 前セルの出力ht-1(短期記憶)と今セルの入力Xtが合流する。合流された信号は4つのラインに分岐同一情報コピー)される。

忘却ゲート(ftの出力)

  • 一番上のラインは忘却ゲート。これは、前セルからの長期記憶1つずつに対して、σ(シグモイド関数からでた0~1までの値ft情報取捨選択を行うもの。1は”全て残す”で、0は”全部捨てる”
  • 忘却ゲートにより不要と思われる情報を捨てることで勾配爆発を防ぐ

入力ゲート(Ct'it)

  • 短期記憶ht-1と入力Xtで合算された入力データを長期保存用に変換した上で、どの信号をどのくらいの重みで長期記憶に保存するか制御する。ここは2つのステップで処理。
4-1. tanhによる変換(Ct'を出力)
  • 入ってきた情報をそのまま流すのではなく、要点を絞った端的な形にし、情報量を削減して利用しやすくする。
4-2. 入力ゲート(it)による取捨選択
  • 何も考えずに新しい情報を追加するのではなく、追加する情報の取捨選択を行う。これは別の見方をすると、inputゲートによって重み付けされた情報が新たに追加されるということ。

出力ゲート(otを出力)

  • htは短期記憶の出力。上記のような処理により長期記憶短期記憶が加わって取捨選択された値(長期記憶の出力Ct)の中で、短期記憶に関する部分のみを出力する。
5-1. tanhによる変換
  • tanhの入力は、前セルからの長期記憶Ct-1に入力Xtを変換した短期記憶Ct'を加えたもの。それぞれ忘却ゲートおよび入力ゲートで取捨選択済み。これをそのまま長期記憶として出力するのがCtだが、そこに含まれる短期記憶部分も長期記憶と合わせることによって、短期記憶のみの時より端的で利用しやすいものに変換。
5-2. 短期記憶の取捨選択
  • 次のセルへの悪い情報伝搬を防止する。出力ゲートのσ(シグモイド関数により0から1の範囲でOtが出力され、短期記憶出力htに必要な信号だけを適切に伝搬するように制御。

"長期記憶"、"短期記憶"という言葉で例えるとと、人間っぽくてイメージが湧きやすいっすね!しかし複雑...

参考2: 下ブログでもわかりやすい図でまとめられています。

f:id:stillalive0304:20180807143634p:plain

NIPS2017論文読みメモ: Tensorized LSTM(その1) - クッキーの日記 より引用

あーそーゆーことね、LSTM完全に理解した...(棒)

f:id:stillalive0304:20180807013841p:plain:w200

LINEスタンプ ポプテピピックより引用

ぐぬぬ...使っているうちに理解できる日が来ると信じ...先へ...

LSTMの実装

  • PTBデータセットの訓練データ全てを使ったLSTMによる学習

f:id:stillalive0304:20180807135330p:plain:w400

20分程の学習で、パープテキシティは100を下回る結果に。

これは全然良い結果ではないので、さらなる匠の技を追加すると...!!

LSTMのさらなる改善

  • LSTMレイヤの多層化
  • Dropoutベースの正則化(変分DropoutやDropConnect*2 )
  • 重み共有

LSTMレイヤの多層化

f:id:stillalive0304:20180807141558p:plain:w400

最近の自然言語処理 より引用

Dropoutによる過学習の抑制

f:id:stillalive0304:20180807142546p:plain:w400

  • 時系列方向のDropout(右)では、時間が進むにつれて情報が失われる(ノイズが蓄積する)ため、深さ方向のDropout(左)を考える。

f:id:stillalive0304:20180807142139p:plain:w400

最近の自然言語処理 より引用

  • 変分Dropoutなら深さ方向に加えて時間方向へも適応でき、言語モデルの精度向上をさらに押し上げる。

重み共有

  • EmbeddingレイヤとAffineレイヤの重み共有するテクニック
    • 学習するパラメータを大きく減らすことができ、それでいて精度向上させることができる、一石二鳥のテクニック!

より良いRNNLMの実装

GPUで5時間かかるとのことで、今回はパス

6章むずい~...7章はRNN(LSTM)の実践編..."文章生成"、"seq2seq"へ...!!

本章で学んだこと

  • 単純なRNNの学習では、勾配消失・勾配爆発が問題になる
  • 勾配爆発には勾配クリッピング、勾配消失にはLSTMGRUなどのゲート付きRNNが有効である
  • ゲートには専用の重みがあり、sigmoid関数を使って0.0から1.0までの実数を出力する
  • 言語モデルの改善には、LSTMレイヤの多層化Dropout重み共有などのテクニックが有効である
  • RNNの正則化は重要なテーマであり、Dropoutベースのさまざまな手法が提案されている

   

第7章 RNN( LSTM ) による文章生成(P277~P324)

 RNN( LSTM ) による文章生成

f:id:stillalive0304:20180808123237p:plain:w400

Show and Tell: A Neural Image Caption Generatorの紹介 より引用

前章で改良した『より良いRNNLM』モデルにより文章を生成させる

  • https://www.oreilly.co.jp/pub/9784873118369/BetterRnnlm.pklからpklファイルをダウンロードし、google driveにアップロードしているゼロつく②フォルダ内のch07フォルダにアップロード
  • ch07/generate_better_text.pyをpklファイルのパスを変更して実行
    • → model.load_params('/content/drive/deep-learning-from-scratch-2-master/ch07/BetterRnnlm.pkl') と設定

f:id:stillalive0304:20180808135338p:plain

最初の言葉"you"とor"the meaning of life"から、なんかそれっぽい文章が生成されてきました...これがLSTMのチカラ...

時系列データを別の時系列データに変換するモデルとしてのseq2seq

f:id:stillalive0304:20180810123256p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

ここから"seq2seq"、google翻訳やチャットボット*3で使われている技術、を学んでいくと...!!

  • "seq2seq"は時系列データ(sequence)を別の時系列データへ変換する、という意味
  • RNN(LSTM や「シンプルなRNN」やGRU )を2つ組み合わせたもの

f:id:stillalive0304:20180808121746p:plain:w400

Seq2Seqで小説自動生成の学習を失敗した話 - にほんごのれんしゅう より引用

確かに、LSTMが2つつながっていますね...!!

f:id:stillalive0304:20180808143909p:plain:w400

Attention? Attention! より引用

  • エンコーダーは、任意の長さの文章を固定長のベクトルhに変換する
  • デコーダ固定長のベクトルhを受け取り、目的とする文章を生成する(上は英語→中国語翻訳の例)

参考:Ryobotさんのブログ

f:id:stillalive0304:20180810151228p:plain:w400

推論は次のように実行する.

  • 入力文 (one-hot ベクトルの配列) を埋め込み層の行列で埋め込み,エンコーダ LSTM で内部状態 S (最終タイムステップの LSTM 内の cell state と hidden state) に縮約する.
  • S デコーダ LSTM の内部状態にセットし,SOS (Start of Sentence) の埋め込みベクトルをデコーダ LSTM に入力し,予測単語ベクトルを出力する.
  • 予測単語ベクトルとソフトマックス層の行列 (単語ベクトルの配列) の内積から確率分布を生成し,最大確率に対応する単語出力する.
  • 出力した単語を埋め込み,次のタイムステップのデコーダ LSTM に入力し,予測単語ベクトルを出力する.
  • デコーダ LSTM が EOS (End of Sentence) を出力するまでステップ 3 と 4 を繰り返す

ディープラーニングブログ より引用

seq2seqの実装と学習と評価

  • 今回はトイ・プロブレムとして*4、50000個の足し算学習データ例(dataset/addition.txt)を使用する
  • 入力されるデータ系列の長さがバッチ内で異なるので、バッチ内での長さを揃えるためのパディングと、パディングした部分が学習の邪魔にならないようにするマスキングを実装して対処する必要がある

PyTorchのSeq2Seqをミニバッチ化するときに気をつけたこと - 人工知能とか犬とか より引用

パディングとマスキング...CNNで学んだ技術が再び...そして足し算学習データを実際に学習させてみます!

f:id:stillalive0304:20180810124140p:plain:w400

ぐぬぬ...かなり低いですが、seq2seqの正答率は徐々に上昇していますね...このように「昨日より今日、今日より明日」の前進が大事であると感じます...

seq2seqの改良

  • ① 入力データを反転させて学習させる(Reverse)と学習効率が格段にあがる

f:id:stillalive0304:20180810131856p:plain:w400

うおっ、Reverse学習でseq2seqが急に50%正解し始めました...学習の仕方はやはり...コツがある...と!!

f:id:stillalive0304:20180810140535p:plain:w400

ゼロから深層学習を学ぶ方法 - CMS大阪夏祭り2017 より引用

  

  • ② 覗き見(Peeky):重要な情報を複数レイヤで共有させる f:id:stillalive0304:20180810152640p:plain:w400

GitHub - farizrahman4u/seq2seq: Sequence to Sequence Learning with Keras より引用

f:id:stillalive0304:20180810134707p:plain:w400

すげぇ...Peekyを身につけたseq2seqは完全に足し算をマスターしています...!! なんか育成ゲームみたいな楽しさ...!!

f:id:stillalive0304:20180810134446p:plain:w400

スラムダンク 22巻 より引用

seq2seqを用いたアプリケーション

f:id:stillalive0304:20180810144417p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

  • 自動要約

f:id:stillalive0304:20180810144532p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

  • 画像キャプション

f:id:stillalive0304:20180810144718p:plain:w400 f:id:stillalive0304:20180810144755p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

本章で学んだこと

  • RNNを用いた言語モデル新しい文章を生成することができる
  • 文章生成を行う際には、ひとつの単語(もしくは文字)を与え、モデルの出力(確率分布)からサンプリングするという手順を繰り返し行う
  • RNNを2つ組み合わせることで、時系列データを別の時系列データに変換することができる(seq2seq)
  • seq2seqは、Encoderが入力文をエンコードし、そのエンコード情報Decoderが受け取り、デコードして目的の出力文を得る
  • 入力文を反転させること(Reverse)、またエンコード情報をDecoderの複数レイヤに与えること(Peeky)は、seq2seqの精度向上に有効である
  • 機械翻訳チャットボットイメージキャプションなど、seq2seqはさまざまなアプリケーションに利用できる

  

第8章 Attention (P325~P379)

最後はseq2seqを更なる高みへと押し上げる究極奥義..."Attention"...を学びます...!!

seq2seqを更に強力にする「注意機構(attention mechanism)」

f:id:stillalive0304:20180810135905p:plain:w400

[最新版] JSAI2018 チュートリアル「"深層学習時代の" ゼロから始める自然言語処理」 より引用

f:id:stillalive0304:20180810144904p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

  • seq2seqには問題点があり、入力分の長さに関わらず、出力が固定長のベクトルである。そのため、必要な情報が収まり切れなくなって溢れちゃう....
  • そこで重要な情報注意(Attention)を向けさせる!

f:id:stillalive0304:20180811184806p:plain:w400

NLP2017 NMT Tutorial より引用

f:id:stillalive0304:20180811213209p:plain

Attentionで拡張されたRecurrent Neural Networks - DeepAge より引用

Attention付きseq2seqへ改良

f:id:stillalive0304:20180811193144p:plain:w400

A Brief Overview of Attention Mechanism – SyncedReview – Medium より引用

f:id:stillalive0304:20180811195111p:plain:w400

最近のDeep Learning (NLP) 界隈におけるAttention事情 より引用

  • Encoderの改良:LSTMレイヤの隠れ状態のベクトルすべて利用する
  • Decoderの改良:
    • Weight Sumレイヤ:Encoderから出力されたhsをすべて活用できるようにする
    • Attention Weightレイヤ:各単語の重要度を表す重み付き和を計算し、コンテキストベクトルを得る

f:id:stillalive0304:20180811190716p:plain:w400 f:id:stillalive0304:20180811191501p:plain:w400

NLP2017 NMT Tutorial より引用

ぐぬぬ...さすが最終章...わけがわからなくなってきました...!! ここでも、使っているうちに理解できると信じて、先へ...

Attention付きseq2seqの実装、学習と評価

それではAttentionつきseq2seqを早速使っていきます...!!

お題:日付フォーマットの変換問題

f:id:stillalive0304:20180811182946p:plain:w400

How to Visualize Your Recurrent Neural Network with Attention in Keras より引用

f:id:stillalive0304:20180811233037p:plain:w400

2エポック目でほとんどすべての問題に正解という驚異の結果...!Attentionつよい...!!(確信)

Attentionの可視化

  • 単語と単語の関連性を見ることができ、モデルの処理ロジックが人間のそれに従っているかを判断することができる

f:id:stillalive0304:20180811234318p:plain:w400 f:id:stillalive0304:20180811234813p:plain:w400

おぉ...キレイに対応関係を結べていますね...Attentionすごい...!!

Attentionに関する残りのテーマ

双方向RNN

f:id:stillalive0304:20180811215128p:plain:w400

論文解説 Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (GNMT) - ディープラーニングブログ より引用

  • 双方向から処理することで、各単語に対する隠れベクトルはバランスのとれた情報がエンコードされる。
  • 実装は簡単

seq2seqの深層化とskipコネクション

  • 層を深くすることで、表現力の高いモデルを作ることができる。
  • skipコネクションを用いることで、層を深くしても勾配が消失(or爆発)せず、良い学習が期待できる

f:id:stillalive0304:20180811215329p:plain:w600

論文解説 Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (GNMT) - ディープラーニングブログ より引用

Attentionの応用

Google Neural Machine Translation (GNMT)

f:id:stillalive0304:20180811215809p:plain:w400

論文解説 Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (GNMT) - ディープラーニングブログ より引用

いつもお世話になっているgoogle翻訳。LSTMレイヤの多層化、skipコネクションなどが見られると...!!

Transformer (機械翻訳の現王者)

f:id:stillalive0304:20180811220338p:plain:w400

論文解説 Attention Is All You Need (Transformer) - ディープラーニングブログ より引用

名前からして怪物ですが、RNNの代わりにSelf-Attentionという技術が使われていると...!!

Neural Turing Machine (NTM)

f:id:stillalive0304:20180811222519p:plain:w400

最近のDeep Learning (NLP) 界隈におけるAttention事情 より引用

人間で言う「紙とペンによる計算」を、Attentionを使って必要な情報をメモリに読み書きさせることで実現してしまう技術...!!

本章で学んだこと

  • 翻訳や音声認識など、ある時系列のデータを別の時系列データに変換するタスクでは、時系列データ間に対応関係が存在することが多くある
  • Attentionは2つの時系列データ間の対応関係をデータから学習する
  • Attentionでは、(ひとつの方法として)ベクトルの内積を使ってベクトル間の類似度を算出し、その類似度を用いた重み付き和ベクトルがAttentionの出力となる
  • Attentionで使用する演算は微分可能であるため、誤差逆伝搬法によって学習ができる
  • Attentionが算出する重み(確率)を可視化することで、入出力の対応関係を見ることができる
  • 外部メモリによるニューラルネットワークの拡張の研究例では、メモリの読み書きAttentionが用いられる

*1:ダイの大冒険 22巻で大魔王バーンが放った台詞。

*2:重み自体をランダムに無視する手法

*3:近年よく見る人工知能を活用した「自動会話プログラム」のこと

*4:機械学習を評価するために作られた簡単な問題