「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
コチラで説明した通り。
詳細 †
RNN EncDec? †
- RNN EncDec?とはRNN Encoder-Decoderの事で、ココでは
- 入力
翻訳前embedding単語列(x1, x2, ... ,xi)
- 出力
- 翻訳後embedding単語[確率]列(P(y1), P(y2), ... ,P(yi))
- この確率分布(p(yi))から(BEAM searchで)単語(yi)を選ぶ。
- Encoder:
GRUを使用して、
- 文(x1, x2, ... ,xi)を意味ベクトルCへ変換。
- 意味ベクトルCは一番最後の再帰段階の隠れ状態(C = Sn^(e))
- P(yi) = P(yi|yi-1, Si^(d), C)
P(yi):単語の確率, yi-1:前の単語, Si^(d):隠れ状態, C:意味ベクトル
- RNN層にはどの再帰の段階でも意味ベクトルCと隠れ状態(Si^(d))を入力する。
- 一番最初の再帰段階のRNN層への入力は[BOS]で、隠れ状態は、例外的に意味ベクトルCを指定する。
- RNN層の出力を出力層(Affine変換+Softmax)で単語の確率分布(p(yi))にして単語(yi)を選ぶ。
- ニ番目以降の再帰段階のRNN層への入力は前段で選択した単語(yi-1)
- 一番最後の再帰段階のRNN層→出力層からの最終的な出力は[EOS]
- 論文中は、AttentionではなくAlign(softalign / softsearch)(?)
- これは、機械翻訳で単語の対応関係を表す情報を「Align」と呼ぶため。
- Attentionとは簡単に言うと、
- 注意の英単語である Attentionからきている。
- 従来の意味ベクトルではなく、入力単語への参照を追加した文脈を加味した単語ベクトル。
- 「時間の重み」の概念をネットワークに組み込んだもの。
- 近年、Attention機構を追加することにより精度が向上したモデルも多い。
- Attentionの重みによってどの時間の入力を重視しているか確認することが可能。
- 機構
2層のNNを使って 「入力単語」「隠れ状態(今まで何書いた?)」のベクトルから注目する単語を選んで足す。
- LSTMなどで使用されているゲート機構に似ている。
- 必要な情報は強調し、不必要な情報は目立たなくする。
- より良い注意表現を学習できれば膨大な情報から
注意を向けるべき情報に焦点を当てて処理をすることが可能になる。
- Enc-Dec、Seq2Seqの問題は
- 「本質」の意味ベクトルが固定次元なので長い系列の場合、意味が入り切らない点。
- 実際に、機械翻訳タスクで長文では単語数が増えるに連れて精度が下がって行く。
- この問題を解決するために、Attentionは固定次元の意味ベクトルに入力系列への参照を追加した。
- 機械翻訳タスクでは、文中の単語の意味を理解する時に、
文中のどの単語に注目すれば良いかを表すスコアとなる。
- 入力単語~出力単語、どれに対応しているか?(対応付けの良さ)の重みを計算する。
- 入力の各単語のベクトルの重みを足して、出力が注意を向けるべき情報を入力から得る。
- 例えば英語でitが出て来たら、その単語だけでは翻訳できない。
itを含む文章中のどの単語にどれだけ注目すべきかというスコアを表す。
- 種類
以下の種類があるが、ココでは、Source-Target Attentionにについての説明になる。
- Source-Target Attention
- 2つの文中の単語間の関係性を算出するAttention機構
- Key・ValueとQueryが異なる2つの文から生成される。
- Self-Attention(自己アテンション)
- 同一の文中の単語同士の関係性を捉えるAttention機構
- Key・ValueとQueryが同一の文から生成される。
RNN search †
- RNN searchとはsoftsearch(つまりAttention)を実装したRNN EncDecで、ココでは
- 入力
翻訳前embedding単語列(x1, x2, ... ,xi)
- 出力
- 翻訳後embedding単語[確率]列(P(y1), P(y2), ... ,P(yi))
- この確率分布(p(yi))から(BEAM searchで)単語(yi)を選ぶ。
- Encoder:
Bidirectional な GRUを使用し、
- 文(x1, x2, ... ,xi)の前後の文脈を加味して単語をベクトル化(Annotation)。
- コレは→方向と←方向の2つのベクトル(→hj, ←hj)をconcatして縦ベクトルに変換したもの(hj)。
- ←方向のEncoderの一番最後の再帰段階の単語ベクトルをDecoderの最初の隠れ状態として使用する(S0^(d) = ←h1)。
- P(yi) = P(yi|yi-1, Si^(d), Ci)
P(yi):単語の確率, yi-1:前の単語, Si^(d):隠れ状態, Ci:文脈を加味した単語ベクトル
- RNN層にはどの再帰の段階でも隠れ状態(Si^(d))を入力する。
- 一番最初の再帰段階のRNN層への入力は[BOS]で、
隠れ状態は、例外的に←方向のEncoderの一番最後の再帰段階の単語ベクトルを指定する(S0^(d) = ←h1)。
- RNN層の出力をAttention層→出力層で単語の確率分布(p(yi))にして単語(yi)を選ぶ。
- ニ番目以降の再帰段階のRNN層への入力は前段で選択した単語(yi-1)
- 一番最後の再帰段階のRNN層→Attention層→出力層からの最終的な出力は[EOS]
- C → Ci は、従来の意味ベクトルではなく、入力単語への参照を追加した文脈を加味した単語ベクトル。
再帰セルに2層のNNを重ね(Attention機構、Align(softalign / softsearch))、どの単語に注目するか以下の計算を行い決定する。
- Attention の基本は query と memory(key, value)
Attention とは query によって memory(key, value) から必要な情報を選択的に引っ張ってくること。
- KVSが語源になっているが実際の仕組みは全然違う。
- KVSではMemoryをKey・Valueの対で構成し、MemoryからKeyに対応したValueを返す。
- AttentionではQueryとKeyの類似度(内積)をSoftmaxで重み(Attention_Weight)に変換し、
- この重み(Attention_Weight)とVのdot積=加重和がCi(文脈を加味した単語ベクトル)になる。
- Query Q
decoderのRNNセルから出力される情報:Si-1^(d) = h
- Key K
encoderから連動される単語ベクトル(hj)のリストで行列(hs)
- Value V
encoderから連動される単語ベクトル(hj)のリストで行列(hs)(何気にKと同じ)
- 計算方法
- hs(memory(K, V))はhj(Encoderの単語ベクトル)のリストで行列
- h(= Si^(d))とhs(K)の内積(hW・hs)(Wは重み)で類似度(入力と出力の関係)を計算
- (ベクトルの内積は同方向の場合は大きくなり、直行する場合は0になり、反対方向の場合はマイナスになる。)
- 上記の内積をSoftmaxにかけて合計1になるように正規化して重み(Attention_Weight)に変換する。
- この重み(Attention_Weight)とhs(V)のdot積=加重和がCi(文脈を加味した単語ベクトル)になる。
- hj(Encoderの単語ベクトル)* 重み(Attention_Weight)
- 上記のすべてベクトルを足し合わせるとCiになる。
- Ciとhを使って出力層で計算(Ciとhを使って計算したhj^tをAffine変換+Softmax)する。
参考 †
Qiita †
YouTube? †