「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
コチラで説明した通り。
詳細 †
Encoder-Decoder †
- 入出力
- 入力
翻訳前単語列(x1, x2, ... ,xi)
- 出力
翻訳後単語[確率]列(P(y1), P(y2), ... ,P(yi))
- Encoder:
GRUを使用して、
- 文(x1, x2, ... ,xi)を意味ベクトルCへ変換。
- 意味ベクトルCは一番最後の再帰段階の隠れ状態(hj)
- P(yi) = P(yi|yi-1, Si^(d), C)
yi-1:前の単語, Si^(d):隠れ状態, C:意味ベクトル
- RNNにはどの再帰の段階でも意味ベクトルCと隠れ状態(Si-1^(d))を入力する。
- 一番最初の再帰段階のRNNへの入力はBOSで、隠れ状態は、例外的に意味ベクトルCを指定する。
- RNNからの出力は単語の確率分布(p(yi))で、出力層(Affine変換+Softmax)では、
この確率分布(p(yi))と意味ベクトルCをconcatしたものから、単語(yi)を選ぶ(BEAM search)
- ニ番目以降の再帰段階のRNNへの入力は前段の出力(p(yi-1))から(BEAM searchで)選択した単語(yi-1)
- 論文中は、AttentionではなくAlign(softalign / softsearch)(?)
- Attentionとは簡単に言うと、
- 「時間の重み」の概念をネットワークに組み込んだもの。
- 近年、Attention機構を追加することにより精度が向上したモデルも多い。
- Attentionの重みによってどの時間の入力を重視しているか確認することが可能。
- Enc-Dec、Seq2Seqの問題は
- 「本質」の意味ベクトルが固定次元なので長い系列の場合、意味が入り切らない点。
- 実際に、機械翻訳タスクで長文では単語数が増えるに連れて精度が下がって行く。
- この問題を解決するために、Attentionは固定次元の意味ベクトルに入力系列への参照を追加した。
- 機械翻訳タスクでは、文中の単語の意味を理解する時に、
文中のどの単語に注目すれば良いかを表すスコアとなる。
- 入力単語~出力単語、どれに対応しているか?(対応付けの良さ)の重みを計算する。
- 入力の各単語のベクトルの重みを足して、出力が注意を向けるべき情報を入力から得る。
- 例えば英語でitが出て来たら、その単語だけでは翻訳できない。
itを含む文章中のどの単語にどれだけ注目すべきかというスコアを表す。
- メモリセルをKey・Valueの対で構成し、
Queryに近いKeyでメモリセルからValueを返すと言う、
KVSが語源になっているが実際の仕組みは全然違う。
- Query Q
各単語がそれぞれの持っているベクトル。
- Key K
各単語がそれぞれの持っているベクトル。
- Value V
加重はQとKを使って計算され、Vの加重和がAttention
- y = f(x, h(, r)) の精度向上に関する情報 r を、
x, h に応じて、メモリから拾い上げる機能を実現する。
- Self Attention(自己アテンション)
- Key・Value生成とQueryの生成が同じデータから行われる。
- 系列の文脈に応じて重要な情報を拾いながらベクトル列の特徴抽出を行う。
- Source-Target Attention
- Key・Value生成とQueryの生成が異なるデータから行われる。
- ...
- Encoder-Decoder Attention
...
- RNNと違って並列計算ができるようになり、高速な学習が可能になったが、
背反として語順を考慮できないため、Positional Encoding(位置エンコーディング)
と呼ばれる方法を用いてベクトルに語順情報を付加して間接的にコレを可能にした。
<注意表現を学習する仕組み>
- Attentionとは、
- 注意の英単語である Attentionからきている。
- 従来の意味ベクトルではなく、入力単語への参照を追加した文脈を加味した単語ベクトル。
- LSTMなどで使用されているゲート機構に似ている。
- 必要な情報は強調し、不必要な情報は目立たなくする。
- より良い注意表現を学習できれば膨大な情報から
注意を向けるべき情報に焦点を当てて処理をすることが可能になる。
<RNN Encoder-Decoder>
- Encoder:
Bidirectional な GRUを使用し、
- 文(x1, x2, ... ,xi)の前後の文脈を加味して単語をベクトル化(Annotation)。
- 一番最後の再帰段階の単語ベクトルをEncoderの最初の隠れ状態として使用する。
- P(yi)=P(yi|yi-1, Si^(d), Ci)
yi-1:前の単語, Si^(d):隠れ状態, Ci:文脈を加味した単語ベクトル
- RNNにはどの再帰の段階でも隠れ状態(Si-1^(d))を入力する。
- 一番最初の再帰段階のRNNへの入力はBOSで、隠れ状態は、例外的にEncoderの一番最後の単語ベクトルを指定する。
- ニ番目以降の再帰段階のRNNへの入力は前段の出力(p(yi-1))から(BEAM searchで)選択した単語(yi-1)
- C → Ci は、従来の意味ベクトルではなく、入力単語への参照を追加した文脈を加味した単語ベクトル。
どの単語に注目するか決めるhjの重み付き和で再帰セルに2層のNNを重ね(Attention機構、Align(softalign / softsearch))以下の計算を行い決定する。
- eij = νa^t tanh(WSi-1^(d) + Uhj)
- Si-1^(d):Decoderの隠れ状態(再帰セルの出力)
参考 †
YouTube? †