rnn-based translation models (japanese)
TRANSCRIPT
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 1
RNN-based Translation Models
Yusuke Oda@odashi_t
2016/5/12 NAIST MT-Study Group
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 2
Neural Network
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 3
Neural Network (1)● Neural Network 任意の(劣)微分可能な関数の連結
入力層 隠れ層 隠れ層 出力層
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 4
Neural Network (2)● つなぎ方はほぼ自由
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 5
Neural Network の学習● →出力に「損失」=「値の悪さ」を定義 損失が小さくなるよう関数を調整
– 勾配法で更新:
– 関数の勾配をどう求める?
● ネットワークが複雑だと直接計算するのが困難
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 6
Backpropagation (誤差逆伝播) (1)
1. 変数の勾配を「直後の変数の勾配」を用いて求める
(直接計算)
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 7
Backpropagation (誤差逆伝播) (2)
1. 変数の勾配を「直後の変数の勾配」を用いて求める
2. 関数の勾配も同様
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 8
NNで頻繁に使う関数・導関数
線形写像
sigmoid
tanh
lamp (ReLU)
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 9
NN-basedTranslation Models
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 10
Sequence-to-sequence 翻訳(一般人向け)● 部分的な変換ルールは学習せず、文全体の情報を用いて翻訳
直訳手法
原言語 目的言語
理解原言語を解析
分解細かいルールに分割
再構築ルールを結合
原言語 目的言語
理解原言語の
意味を抽出
再構築意味表現から
直接単語を生成
Sequence-to-sequence
意味表現
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 11
ニューラルネット翻訳(一般人向け)● Sequence-to-sequence 翻訳の一種
● 意味の解析・単語の生成にニューラルネットを使用
– 複雑さ: 従来の翻訳アルゴリズムよりも単純
– 翻訳精度: 設定次第で従来手法に匹敵
原言語 目的言語
ニューラルネット
(単語生成)
ニューラルネット
(意味解析)
意味表現
● Encoder-decoder 翻訳モデル
– 最も簡単な sequence-to-sequence 翻訳モデル
– リカレントニューラルネットを使用
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 12
リカレントニューラルネット (1)● リカレントニューラルネット (Recurrent Neural Network: RNN)
– フィードバック付きのニューラルネット
– 時系列データの解析によく用いられる
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 13
リカレントニューラルネット (2)● 時間方向に伸展したRNN
– 中間層には入力の種類と順序に関する情報が蓄積される(はず)
データ1 データ2 データ3
データ1データ1 →データ2
データ1 →データ2 →データ3
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 14
Encoder-decoder 翻訳モデル (1)● 原言語側と目的言語側の2本のRNNを結合
– 原言語側 … 入力単語の情報を蓄積
– 目的言語側 … 蓄積された情報を取り出しながら単語を生成
END runs he
走る は 彼
Encoder
Decoder
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 15
Chainer で Encoder-decoder 翻訳● Chainer - http://chainer.org/
– ニューラルネットのフレームワーク
– ソースコードの計算式がそのままニューラルネットの構造になる
● 複雑な形状のニューラルネットを記述するのに最適
は(一例、他の定式化も可能)
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 16
Chainer で Encoder-decoder 翻訳● Chainer - http://chainer.org/
– ニューラルネットのフレームワーク
– ソースコードの計算式がそのままニューラルネットの構造になる
● 複雑な形状のニューラルネットを記述するのに最適
import numpy as npimport chainer.functions as Fimport chainer.links as Lfrom chainer import Variable
xi = L.EmbedID(VOCAB, EMBED)ip = L.Linear(VOCAB, HIDDEN)pp = L.Linear(HIDDEN, HIDDEN)...x = Variable(np.array([[w]], dtype=np.float32))i = F.tanh(xi(x))p = F.tanh(ip(i) + pp(p))
は
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 17
Encoder-decoder 翻訳の実装
# encoding_p, p = init()何か初期化for word in reversed(sentence): x = Var([[stoi(word)]])単語ID化 _p, p = lstm(_p, xp(x) + pp(p))LSTMに入力
この時点でpに入力系列の情報が入っている(はず)
# decodingy = stoi('SOL')while y != stoi('EOL'): _p, p = lstm(_p, yp(y) + pp(p))デコーダの状態遷移 y = softmax(py(p)).data.argmax()次の単語 print(itos(y))
● Enc-dec のナイーブな実装 (赤字: Chainer/NumPy関数、緑: 重み行列)
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 18
Decoder
Attention (1)● Attention ... 入力の情報から必要な情報をその都度生成
– 入力長に(あまり)依存しない解析が可能
– 使いやすいらしく、割と色々応用されている
● 翻訳、キャプション生成、画像生成(ビットマップ、ベクタ)、構文解析、etc
– 詳しくは http://www.slideshare.net/yutakikuchi927/deep-learning-nlp-attention
SRC TRGEncoder DecoderEnc-dec
AttentionA
quick
brown
fox
jumps
...
Enc
速い
茶色の
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 19
Attention (2)● Global attention ... 現在のデコーダ状態から各単語の重みを計算、線形和
[Luong et al., 2015, Effective Approaches to Attention-based Neural Machine Translation]
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 20
Attention (3)● Global attention のナイーブな実装 (赤字: Chainer/NumPy関数、緑: 重み行列)
a_list:入力単語のベクトル表現(encoderの出力), p:デコーダの状態_p, p = init()y = stoi('SOL')while y != stoi('EOL'): e_list = []重みのリスト e_sum = zeros(...)分母 for a in a_list: w = tanh(aw(a) + pw(p))何か変換して e = exp(we(w))重み計算 e_list.append(e) e_sum += e c = zeros(...)線形和 for a, e in zip(a_list, e_list): e /= e_sum c += reshape(batch_matmul(a, e), ...) _p, p = lstm(_p, ch(p) + hh(p) + yh(Var([[y]])))次の状態 y = softmax(py(p)).data.argmax()次の出力 print(itos(y))
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 21
Attention (4)● Local attention ... 原言語の1か所に集中する縛りを導入
– Attentionの特性が鮮鋭になる
正規分布を掛け合わせて中心から外れたところの重みを無視
(わりと雑…)
Chainerで実装する場合はこの式を追加するだけ
[Luong et al., 2015, Effective Approaches to Attention-based Neural Machine Translation]
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 22
LSTM (long/short-term memory) (1)● LSTM ... 過去のRNNの全状態の線形和で次回の出力を生成
– 長距離のbackpropagationが「まともに」計算できるので、長周期の構造学習が可能
– Encoder-decoder系のネットワークでは使わないとお話にならない
電気回路っぽく書いたLSTMセル
sigmoid
tanh
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 23
LSTM (long/short-term memory) (2)● LSTM ... 過去のRNNの状態の線形和で次回の出力を生成
– 長距離のbackpropagationが「まともに」計算できるので、長周期の構造学習が可能
– Encoder-decoder系のネットワークでは使わないとお話にならない
電気回路っぽく書いたLSTMセル
赤: 記憶が行われるパス
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 24
LSTM (long/short-term memory) (3)● LSTM ... 過去のRNNの状態の線形和で次回の出力を生成
– 長距離のbackpropagationが「まともに」計算できるので、長周期の構造学習が可能
– Encoder-decoder系のネットワークでは使わないとお話にならない
電気回路っぽく書いたLSTMセル
赤: 記憶が行われるパス
青: ゲート
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 25
LSTM (long/short-term memory) (4)● LSTM ... 過去のRNNの状態の線形和で次回の出力を生成
– 長距離のbackpropagationが「まともに」計算できるので、長期の構造学習が可能
– Encoder-decoder系のネットワークでは使わないとお話にならない
電気回路っぽく書いたLSTMセル
赤: 記憶が行われるパス
青: ゲート
緑: Peephole connection(Chainerの標準実装には今の所ないようなので注意)
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 26
GRU (Gated Recurrent Unit) (1)● GRU: LSTMとは異なる種類の記憶素子
– 内部に明示的なメモリセルは持たない
– 新しい情報に更新するか、元の情報を残すかのみ判断
[Chung et al., 2014, Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling]
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 27
GRU (Gated Recurrent Unit) (2)● GRU: LSTMとは異なる種類の記憶素子
– 内部に明示的なメモリセルは持たない
– 新しい情報に更新するか、元の情報を残すかのみ判断
– LSTMとどちらが良いのかは一概に言えない
– Chainerに入っているので簡単に切り替え可能(lstmをgruに変更)
Nottingham MuseData
[Chung et al., 2014, Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling]
16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 28
Stacked RNN● RNNの出力を次のRNNに入力
– 単純にRNNのdeep化とも考えられる(が、どういう影響があるのかはよく分からない)
– 3〜8段くらいが使われているようである
– 段ごとにRNNの方向を折り返すなどのバリエーションあり
LSTMなど