12. 16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 12
リカレントニューラルネット (1)
● リカレントニューラルネット (Recurrent Neural Network: RNN)
– フィードバック付きのニューラルネット
– 時系列データの解析によく用いられる
13. 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
14. 16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 14
Encoder-decoder 翻訳モデル (1)
● 原言語側と目的言語側の2本のRNNを結合
– 原言語側 … 入力単語の情報を蓄積
– 目的言語側 … 蓄積された情報を取り出しながら単語を生成
END runs he
走る は 彼
Encoder
Decoder
15. 16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 15
Chainer で Encoder-decoder 翻訳
● Chainer - http://chainer.org/
– ニューラルネットのフレームワーク
– ソースコードの計算式がそのままニューラルネットの構造になる
● 複雑な形状のニューラルネットを記述するのに最適
は
(一例、他の定式化も可能)
16. 16/05/12 Copyright (C) 2015 by Yusuke Oda, AHC-Lab, IS, NAIST 16
Chainer で Encoder-decoder 翻訳
● Chainer - http://chainer.org/
– ニューラルネットのフレームワーク
– ソースコードの計算式がそのままニューラルネットの構造になる
● 複雑な形状のニューラルネットを記述するのに最適
import numpy as np
import chainer.functions as F
import chainer.links as L
from 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))
は
17. 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に入力系列の情報が入っている(はず)
# decoding
y = 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関数、緑: 重み行列)
18. 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
Attention
A
quick
brown
fox
jumps
...
Enc
速い
茶色の
19. 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]
20. 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))
21. 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]
22. 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
23. 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セル
赤: 記憶が行われるパス
24. 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セル
赤: 記憶が行われるパス
青: ゲート