DL4US落ちたので、書籍『ゼロから作るDeeplearning②―自然言語処理編』をやるしかない
【スポンサーリンク】
ゼロつく②やるしかない...!!
- 「ゼロから作るDeep Learning②」とは
- 第3章 Word2Vec(P93~P129)
- 第4章 Word2Vecの高速化(P131~P174)
- 第5章 リカレントニューラルネットワーク(RNN)(P175~P221)
- 第6章 ゲート付きRNN( LSTM ) (P223~P275)
- 第7章 RNN( LSTM ) による文章生成(P277~P324)
- 第8章 Attention (P325~P379)
「ゼロから作るDeep Learning②」とは
ゼロから作るDeep Learning ? ―自然言語処理編
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/07/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
10万部も売れているベストセラー本『ゼロから作るDeep Learning』の第2段。 "できるだけ優しい言葉と図解を多用する"というのをモットーとして書かれていて、 数式だらけで難解な本が多い中、初学者にとってはヒジョーにありがたい"神シリーズ"である。
最近、待望の続編である自然言語処理編が満を持して登場した。 元ネタはスタンフォード大の授業CS231n(画像認識のためのCNN)、CS224d(自然言語処理のためのディープラーニング)である。
今作もロングセラー間違いなしっすね!!
準備 : 無料GPUのgoogle colab上で実行する
こちらのエントリを参考に。 qiita.com forhighlow0.hatenablog.com
- 本書GitHubサイト からdeep-learning-from-scratch-2-master をフォルダーごとダウンロードし、zipファイル解凍後、google driveにアップロードします。
- google colabのノートブックを新規作成して、「Python3」のノートブックを作成します。
- 編集 > ノートブックの設定 > ハードウェア アクセラレータ でGPUに設定。
エントリ通り、下のコードをコピペして実行します。
!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
誰でも無料でディープラーニングできる時代...凄すぎる!!
「ゼロから作る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が正しく出力されれば成功です。
以降、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)
まずは前作の復習から。さらっと流し読み。
ニューラルネットワークを用いると複雑な表現が可能になり、例え「渦巻き」のような複雑なパターンでも分離することができると。
本章で学んだこと
- ニューラルネットワークは、入力層、隠れ層、出力層を持つ
- 全結合層によって線形な変換が行われ、活性化関数によって非線形な変換が行われる
- 全結合層やミニバッチ処理は、行列としてまとめて計算することができる
- 誤差逆伝搬法を使って、効率的にニューラルネットワークの損失に関する勾配を求めることができる
- ニューラルネットワークで行う処理は、計算グラフによって可視化することができ、順伝搬や逆伝搬の理解に役立つ
- ニューラルネットワークの実装では、構成要素を「レイヤ」としてモジュール化することで、組み立てが容易になる
- ニューラルネットワークの高速化において、データのビット精度とGPUによる並列計算が重要である
とりあえず、ニューラルネットワークは凄いと...φ(。。)
第2章 自然言語と単語の分散表現(P57~P92)
ここから本題の"自然言語処理"に入っていきます...!!
ここからはAmazonのレビューのKyleさんのメモを参考に。感謝!
自然言語処理
- 『単語の意味』をコンピュータに理解させることがテーマ
- 本章と次章では次の3つの手法を見ていく
- ① シソーラスによる手法 : 人の手によって作られた類語辞書を利用
- ② カウントベースの手法 : 統計情報から単語を表現(コーパスを利用)
- ③ 推論ベースの手法 : ニューラルネットワークによる推論(word2vecと呼ばれる)
①シソーラスによる手法
IBM Knowledge Center より引用
- 単語の上位/下位関係、部分/全体関係などによって単語を分類し、体系づけた類語辞書。
WordNet
- もっとも有名なシソーラス
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用
シソーラスの問題点
- 時代の変化に対応するのが困難!
- 人の作業コストが高い!
- 単語の細かなニュアンスを表現できない!
②カウントベースの手法
- 「単語の意味は、周囲の単語によって形成される」という仮説に基づき、着目した単語の周囲の単語の頻度をカウントし、集計する手法。
CS224d Lecture2スライド より引用
カウントベースの手法の改善
①相互情報量(PMI)の調整
- 例えば、英語の特性で冠詞(the)と単語(car)の頻度が高い場合、他の単語(driveなど)の方を優先させる調整
②特異値分解(SVD)による次元削減
- ベクトルの次元を("重要な情報"をできるだけ残すように)削減して、ロバスト性(頑健性)を高める。
30分でわかる機械学習用語「次元削減(Dimensionality Reduction)」 より引用
各改善点などの実装(PTBデータセットを例に)
- cos_similarity() : ベクトル間の類似度(コサイン類似度)を計測するための関数
- most_similar() : 類似単語のランキングを表示する関数
SVDは結構時間がかかっていました... ここでは"時間がかかる"というのを体験させる意味合いなのカモ。
本章で学んだこと
- WordNetなどのシソーラスを利用して、類義語の取得や単語間の類似度の計測など有用なタスクを行うことができる
- シソーラスを用いる手法には、シソーラスを作製する人の作業量や新しい単語への対応などの問題がある
- 現在では、コーパスを利用して単語をベクトル化するアプローチが主流である
- 近年の単語ベクトル化の手法では、「単語の意味は、周囲の単語によって形成される」という分布仮説に基づくものがほとんどである
- カウントベースの手法は、コーパス内の各単語に対して、その単語の周囲の単語の頻度をカウントし集計する(=共起行列)
- 共起行列をPPMI行列に変換し、それを次元削減することで、巨大な疎のベクトルを小さな「密なベクトル」へ変換することができる
- 単語のベクトル空間では、意味的に近い単語はその距離が近くなることが期待される
2章は次のword2vecへの"前振り"っすね。
第3章 Word2Vec(P93~P129)
名前の通り、word(単語)をvector(ベクトル)にします。
推論ベースの手法(Word2Vec)の利点
カウントベース(SVD)の手法の問題点
- 大規模なコーパスを使う場合、語彙数*語彙数の巨大な行列を作る必要がある。計算量的に現実的でない!
推論ベース(Word2Vec:ニューラルネットワークによる推論)の利点
- 推論ベースでは、少量(ミニバッチ)ごとに重みを繰り返し更新して学習が出来る。(逐次学習が可能)
- 推論ベースでは、単語の意味を的確にとらえたベクトル表現=単語の「分散表現」を可能にする。
Word2Vecを用いた類義語の抽出が上手く行ったので、分析をまとめてみた より引用
- 分散表現 : 単語の意味を的確にとらえた"密な"ベクトル表現
イメージ図:単語の分散表現により抽象的な意味を表現できる
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用
例:「king -man + woman=queen」の問題が解ける!
word2vec King-Queen composition | the morning paper より引用
参考:自然言語処理を学ぼう #3 word2vec 理論編(田中TOMさんのyoutube動画)
Word2Vecのアルゴリズム(CBOWモデル、skip-gramモデル)
- CBOWモデル
- 前後の単語(文脈)から、現在の単語を推測する。
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用
- skip-gramモデル
- 現在の単語から、前後の単語(文脈)を推測する。
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用
- イメージ図:CBOWモデルとskip-gramモデルは逆の関係
Word Embeddings - word2vec - Mubaris' Blog より引用
- CBOWモデル vs skip-gramモデル
言語と画像の表現学習 より引用
シンプルなWord2Vecの実装と学習と評価
- 学習回数(~1000 epoch)を重ねるごとに損失が減少しているのを確認
- 単語の分散表現を確認
本章で学んだこと
- 推論ベースの手法は、推測することを目的として、その副産物として単語の分散表現を得られる
- Word2Vecは推論ベースの手法であり、シンプルな2層のニューラルネットワークで構成される
- Word2Vecには、skip-gramモデルとCBOWモデルがある
- CBOWモデルは複数の単語(コンテキスト)からひとつの単語(ターゲット)を推測する
- skip-gramモデルは逆に、ひとつの単語(ターゲット)から複数の単語(コンテキスト)を推測する
- Word2Vecは重みの再学習ができるため、単語の分散表現の更新や追加が効率的に行える
引き続き4章では、Word2Vecの問題点を指摘し、"使える"モデルに改善していきます...!!
第4章 Word2Vecの高速化(P131~P174)
問題点
- 大きなコーパスを扱うときに、次の①②の部分で計算量が増える
① 入力層のone-hot表現と重み行列の積による計算が重すぎる
対策:重みパラメータから「単語IDに該当する行(ベクトル)」をだけを抜き出すようにする ( = Embeddingレイヤの導入)
- つまり、Embeddingレイヤに単語の"密な"ベクトル表現(分散表現)が格納される
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」を入力する
- ③ 正例と負例の損失を足し合わせ、最終的な損失を出力する
Notes from Coursera Deep Learning courses by Andrew Ng より引用
Negative Samplingのサンプリング手法
- 負の例として多くの単語をカバーするため、高頻出な単語を抜き出す
- レアな単語はほとんど出現しないため
- とは言え、レアな単語を"見捨てない”ように、単語の確率分布を0.75乗(3/4乗)する
- 0.75乗することで、レアな単語の出現確率が少しだけ高くなる
- =サンプリングされやすくなる
Distributed Representations of Words and Phrases and their Compositio… より引用
問題点対策①②の実装と、改良版での学習と評価
- CBOWモデルの評価
- 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モデルは、単語の並びが無視されてしまう
ニューラルネットワークについて より引用
循環するニューラルネットワーク(RNN)
MIRU2018 tutorial より引用
- ループする経路(閉じた経路)を持ち、隠れ状態を内部に記憶できる
MIRU2018 tutorial より引用
- RNNレイヤを展開すると、複数のニューラルネットワークが繋がった状態とみなすことができる。
RNNレイヤに対する誤差逆伝播法も行える:BPTT
- BPTT (Backpropagation Through Time): 時間軸上の逆伝播
【Day-18】時系列のディープラーニング、RNNのまとめとKeras実装 - プロクラシスト より引用
弱点:時間サイズが長くなると逆伝播時の勾配が不安定になる
最近の自然言語処理 より引用
http://akimacho.hatenablog.com より引用
Truncated BPTTで解決!
- truncatedは「切り取られた」という意味。途中で断ち切る逆伝搬。
- 逆伝播のつながりを一定間隔で断ち切る。
- ※順伝播はそのまま変えない
Truncated BPTTのミニバッチ学習
- 注意点
- ①データをシーケンシャルに与えること
- 例)[0~9][500~509] > [10~19][510~519] > ....
- ②各バッチでデータを与える開始位置をズラすこと
RNNLM(Language Model)の実装、学習と評価
- RNNLMはWord2Vecの提案者であるMikolov氏によって発案されたもの。
またMikolov氏...まさに自然言語処理界の界王....。
パープレキシティ(予測性能の良さ)の評価
- パープレキシティ:言語モデルの予測性能の良さを評価する指標。最小値は1.0で、1に近いほど性能が良い。
![]()
![]()
最近の自然言語処理 より引用
PTBデータセット(1000個の単語)を利用したRNNLMの学習
- 最初は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の問題点
Recurrent Neural Networks により引用
時系列データの長期の依存関係をうまく学習できない
- 勾配消失、または勾配爆発がおきてしまう
- 理由:重み行列Whの値を規定回数分乗算しているため、データが大きいと乗算回数が多くなり、1より大きいと指数的に増加し、1より小さいと指数的に減少するため。
勾配爆発対策
- 勾配クリッピング
- 単純に勾配の最大値を制限する技。例えば、勾配は100は大きすぎるから5にしましょうという超単純な考え。
第2回 メドレー読書会 より引用
勾配消失対策
ゲート付きRNN:LSTM
MIRU2018 tutorial より引用
LSTMレイヤのインタフェース
情報を保存する記憶セル
Understanding LSTM Networks -- colah's blog より引用
- RNNで1つだった前セルからの情報伝搬が、隠れ状態ベクトルhのほかに記憶セルcが追加されて2ラインになっている。
ディープラーニングブログ より引用
- 隠れ状態ベクトルhの方が短期記憶で、記憶セルcが長期記憶だと考える。LSTM(Long short-term memory)は、その名の通り、短期と長期を関連させながらも別々のラインで記憶保持している。
LSTM 〜Long Short-Term Memory〜(Vol.18) より引用
LSTMで使用するゲート:開くか閉じるかだけでなく、どの割合(0.0~1.0)で開くかをコントロールする
LSTM -- Gateを持つRNN より引用
- 学習データから自動的にゲートの開き具合を学ばせる
- LSTMにある3つのゲートでは、ゲートの開き具合をコントロールするための、専用の重みパラメータがあり、学習データによって更新される
LSTM -- Gateを持つRNN より引用
LSTM -- Gateを持つRNN より引用
ゲート① outputゲート
MIRU2018 tutorial より引用
- 情報を出力するかどうかを制御する
- 0.0のとき、何も出力しない
- 1.0のとき、全部出力する
- 0.0~1.0の間、一部出力する
ゲート② forgetゲート
MIRU2018 tutorial より引用
- 情報を削除かどうかを制御する
- 0.0のとき、全部削除する
- 1.0のとき、何も削除しない
- 0.0~1.0の間、一部削除する
ゲート③ inputゲート
MIRU2018 tutorial より引用
- 情報を書き込むかどうかを制御する
- 0.0のとき、何も書き込まない
- 1.0のとき、全部書き込む
- 0.0~1.0の間、一部書き込む
LSTMが勾配消失を起こさない理由
- LSTMの逆伝播は、記憶セルの「行列の積」ではなく、「要素ごとの積(アダマール積)」であるため、勾配爆発・消失を起こしにくい。
LSTM -- Gateを持つRNN より引用
LSTM難しい…、ぐぬぬ...。
参考 : LSTM 〜Long Short-Term Memory〜(Vol.18) のわかりやすい説明
- 上記ブログでわかりやすくまとめられていました。感謝!
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: 下ブログでもわかりやすい図でまとめられています。
あーそーゆーことね、LSTM完全に理解した...(棒)
LINEスタンプ ポプテピピックより引用
ぐぬぬ...使っているうちに理解できる日が来ると信じ...先へ...
LSTMの実装
- PTBデータセットの訓練データ全てを使ったLSTMによる学習
20分程の学習で、パープテキシティは100を下回る結果に。
これは全然良い結果ではないので、さらなる匠の技を追加すると...!!
LSTMのさらなる改善
LSTMレイヤの多層化
最近の自然言語処理 より引用
Dropoutによる過学習の抑制
- 時系列方向のDropout(右)では、時間が進むにつれて情報が失われる(ノイズが蓄積する)ため、深さ方向のDropout(左)を考える。
最近の自然言語処理 より引用
- 変分Dropoutなら深さ方向に加えて時間方向へも適応でき、言語モデルの精度向上をさらに押し上げる。
重み共有
- EmbeddingレイヤとAffineレイヤの重みを共有するテクニック
- 学習するパラメータを大きく減らすことができ、それでいて精度を向上させることができる、一石二鳥のテクニック!
より良いRNNLMの実装
GPUで5時間かかるとのことで、今回はパス
6章むずい~...7章はRNN(LSTM)の実践編..."文章生成"、"seq2seq"へ...!!
本章で学んだこと
第7章 RNN( LSTM ) による文章生成(P277~P324)
RNN( LSTM ) による文章生成
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') と設定
最初の言葉"you"とor"the meaning of life"から、なんかそれっぽい文章が生成されてきました...これがLSTMのチカラ...
時系列データを別の時系列データに変換するモデルとしてのseq2seq
ここから"seq2seq"、google翻訳やチャットボット*3で使われている技術、を学んでいくと...!!
- "seq2seq"は時系列データ(sequence)を別の時系列データへ変換する、という意味
- RNN(LSTM や「シンプルなRNN」やGRU )を2つ組み合わせたもの
確かに、LSTMが2つつながっていますね...!!
参考:Ryobotさんのブログ
推論は次のように実行する.
- 入力文 (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)を使用する
- 入力されるデータ系列の長さがバッチ内で異なるので、バッチ内での長さを揃えるためのパディングと、パディングした部分が学習の邪魔にならないようにするマスキングを実装して対処する必要がある
パディングとマスキング...CNNで学んだ技術が再び...そして足し算学習データを実際に学習させてみます!
ぐぬぬ...かなり低いですが、seq2seqの正答率は徐々に上昇していますね...このように「昨日より今日、今日より明日」の前進が大事であると感じます...
seq2seqの改良
- ① 入力データを反転させて学習させる(Reverse)と学習効率が格段にあがる
うおっ、Reverse学習でseq2seqが急に50%正解し始めました...学習の仕方はやはり...コツがある...と!!
- ② 覗き見(Peeky):重要な情報を複数レイヤで共有させる
GitHub - farizrahman4u/seq2seq: Sequence to Sequence Learning with Keras より引用
すげぇ...Peekyを身につけたseq2seqは完全に足し算をマスターしています...!! なんか育成ゲームみたいな楽しさ...!!
スラムダンク 22巻 より引用
seq2seqを用いたアプリケーション
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用
- 自動要約
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用
- 画像キャプション
![]()
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用
本章で学んだこと
- RNNを用いた言語モデルは新しい文章を生成することができる
- 文章生成を行う際には、ひとつの単語(もしくは文字)を与え、モデルの出力(確率分布)からサンプリングするという手順を繰り返し行う
- RNNを2つ組み合わせることで、時系列データを別の時系列データに変換することができる(seq2seq)
- seq2seqは、Encoderが入力文をエンコードし、そのエンコード情報をDecoderが受け取り、デコードして目的の出力文を得る
- 入力文を反転させること(Reverse)、またエンコード情報をDecoderの複数レイヤに与えること(Peeky)は、seq2seqの精度向上に有効である
- 機械翻訳やチャットボット、イメージキャプションなど、seq2seqはさまざまなアプリケーションに利用できる
第8章 Attention (P325~P379)
最後はseq2seqを更なる高みへと押し上げる究極奥義..."Attention"...を学びます...!!
seq2seqを更に強力にする「注意機構(attention mechanism)」
[最新版] JSAI2018 チュートリアル「"深層学習時代の" ゼロから始める自然言語処理」 より引用
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用
- seq2seqには問題点があり、入力分の長さに関わらず、出力が固定長のベクトルである。そのため、必要な情報が収まり切れなくなって溢れちゃう....
- そこで重要な情報に注意(Attention)を向けさせる!
NLP2017 NMT Tutorial より引用
Attentionで拡張されたRecurrent Neural Networks - DeepAge より引用
Attention付きseq2seqへ改良
A Brief Overview of Attention Mechanism – SyncedReview – Medium より引用
最近のDeep Learning (NLP) 界隈におけるAttention事情 より引用
- Encoderの改良:LSTMレイヤの隠れ状態のベクトルをすべて利用する
- Decoderの改良:
- Weight Sumレイヤ:Encoderから出力されたhsをすべて活用できるようにする
- Attention Weightレイヤ:各単語の重要度を表す重み付き和を計算し、コンテキストベクトルを得る
![]()
NLP2017 NMT Tutorial より引用
ぐぬぬ...さすが最終章...わけがわからなくなってきました...!! ここでも、使っているうちに理解できると信じて、先へ...
Attention付きseq2seqの実装、学習と評価
それではAttentionつきseq2seqを早速使っていきます...!!
お題:日付フォーマットの変換問題
How to Visualize Your Recurrent Neural Network with Attention in Keras より引用
2エポック目でほとんどすべての問題に正解という驚異の結果...!Attentionつよい...!!(確信)
Attentionの可視化
- 単語と単語の関連性を見ることができ、モデルの処理ロジックが人間のそれに従っているかを判断することができる
おぉ...キレイに対応関係を結べていますね...Attentionすごい...!!
Attentionに関する残りのテーマ
双方向RNN
- 双方向から処理することで、各単語に対する隠れベクトルはバランスのとれた情報がエンコードされる。
- 実装は簡単!
seq2seqの深層化とskipコネクション
- 層を深くすることで、表現力の高いモデルを作ることができる。
- skipコネクションを用いることで、層を深くしても勾配が消失(or爆発)せず、良い学習が期待できる
Attentionの応用
Google Neural Machine Translation (GNMT)
いつもお世話になっているgoogle翻訳。LSTMレイヤの多層化、skipコネクションなどが見られると...!!
Transformer (機械翻訳の現王者)
論文解説 Attention Is All You Need (Transformer) - ディープラーニングブログ より引用
名前からして怪物ですが、RNNの代わりにSelf-Attentionという技術が使われていると...!!
Neural Turing Machine (NTM)
人間で言う「紙とペンによる計算」を、Attentionを使って必要な情報をメモリに読み書きさせることで実現してしまう技術...!!
本章で学んだこと
- 翻訳や音声認識など、ある時系列のデータを別の時系列データに変換するタスクでは、時系列データ間に対応関係が存在することが多くある
- Attentionは2つの時系列データ間の対応関係をデータから学習する
- Attentionでは、(ひとつの方法として)ベクトルの内積を使ってベクトル間の類似度を算出し、その類似度を用いた重み付き和ベクトルがAttentionの出力となる
- Attentionで使用する演算は微分可能であるため、誤差逆伝搬法によって学習ができる
- Attentionが算出する重み(確率)を可視化することで、入出力の対応関係を見ることができる
- 外部メモリによるニューラルネットワークの拡張の研究例では、メモリの読み書きにAttentionが用いられる