NLP プログラミング勉強会 8 - リカレントニューラルネット

自然言語処理プログラミング勉強会 8リカレントニューラルネット

Graham Neubig
奈良先端科学技術大学院大学 (NAIST)1NLP プログラミング勉強会 8 - リカレントニューラルネット

フィードフォーワードニューラルネット●

すべての線が前方向のネット

ϕ ( x)●( 有効非巡回グラフ DAG になっている )y2

NLP プログラミング勉強会 8 - リカレントニューラルネット

リカレントニューラルネット (RNN)●

ノードの一部の出力が入力として戻ってくる

ht −1
ϕ t (x )●理由：「記憶」が可能

y3

NLP プログラミング勉強会 8 - リカレントニューラルネット

系列モデルとしての RNN
y1

y2

y3

y4

NETNETNET

NET

x1

x2

x3x4

4

NLP プログラミング勉強会 8 - リカレントニューラルネット

例：品詞推定JJNNNNVBZ

NETNETNETNET

naturallanguage processing

is5NLP プログラミング勉強会 8 - リカレントニューラルネット

ニューラルネットを使った多クラス予測

6

NLP プログラミング勉強会 8 - リカレントニューラルネット

復習：予測問題x が与えられた時y を予測する

本のレビュー「良い」評価なのか？ ２値予測
( 選択肢が２つ )Oh, man I love this book!
yesThis book is so boring...
noツイートOn the way to the park!
公園に行くなう！

書かれた言語EnglishJapanese

文

構文木

S

構造化予測
( 選択肢が膨大 )VP

I read a bookNPN

VBD DET

多クラス予測( 選択肢が数個 )NN

I read a book

7

NLP プログラミング勉強会 8 - リカレントニューラルネット

復習：シグモイド関数●

シグモイド関数はステップ関数を柔らかくしたものw⋅ϕ ( x)eP( y =1∣x)=w⋅ϕ (x)1+e
シグモイド関数ステップ関数

1p(y|x)p(y|x)

10.5-10-500w*phi(x)5100.5-10-500510w*phi(x)8NLP プログラミング勉強会 8 - リカレントニューラルネット

softmax 関数●

シグモイド関数を複数のクラスに拡張したもの

P( y∣x)=
●

e

今のクラス

w⋅ϕ (x , y )∑~y ew⋅ϕ ( x , ~y)

すべてのクラスの和ベクトル・行列の掛け算で表現

r=exp (W⋅ϕ( x))p=r / ∑ ~r~r ∈r

9NLP プログラミング勉強会 8 - リカレントニューラルネット

確率分布から最大値の選択●確率が一番高いインデックス y を探す

find_best(p):y=0for each element i in 1 .. len(p)-1:
if p[i] > p[y]:y=ireturn y10

NLP プログラミング勉強会 8 - リカレントニューラルネット

softmax 関数の勾配●

正解の確率分布からモデル推定の確率分布を引いた値−d err / d ϕ out = p '− p●

正解 p' は y 番目の要素だけが 1 のベクトル (one-hotベクトル )p '={0,0,…,1,…, 0}

11

NLP プログラミング勉強会 8 - リカレントニューラルネット

one-hot ベクトルの作成
create_one_hot(id, size):
vec = np.zeros(size)
vec[id] = 1
return vec

12

NLP プログラミング勉強会 8 - リカレントニューラルネット

リカレントニューラルネットの伝搬

13

NLP プログラミング勉強会 8 - リカレントニューラルネット

復習：ニューラルネットの計算
forward_nn(network, φ0)
φ= [ φ0 ] # 各層の値
for each layer i in 0 .. len(network)-1:w, b = network[i]# 前の層の値に基づいて値を計算
φ[i] = np.tanh( np.dot( w, φ[i-1] ) + b )return φ # 各層の結果を返す

14

NLP プログラミング勉強会 8 - リカレントニューラルネット

RNN 計算式
pt
1wr,hht-1wr,xbo

softmax

wo,htanh

pt+11wr,hht
wr,x

xt br

xt+1 b11bo

softmax

wo,hht+1tanhr

ht =tanh (w r , h⋅ht −1+ w r , x⋅xt +b r )pt =softmax (w o , h⋅ht +b o)

15

NLP プログラミング勉強会 8 - リカレントニューラルネット

RNN の前向き計算
forward_rnn(wr,x, wr,h, br, wo,h, bo, x)h = [ ] # 隠れ層の値（各時間 t において）
p = [ ] # 出力の確率分布の値（各時間 t において）
y = [ ] # 出力の確率分布の値（各時間 t において）for each time t in 0 .. len(x)-1:
if t > 0:h[t] = tanh(wr,xx[t] + wr,hh[t-1] + br)else:
h[t] = tanh(wr,xx[t] + br)
p[t] = tanh(wo,hh[t] + bo)
y[t] = find_max(p[t])return h, p, y16

NLP プログラミング勉強会 8 - リカレントニューラルネット

復習：
フィードフォーワードネットの逆伝搬17

NLP プログラミング勉強会 8 - リカレントニューラルネット

確率的勾配降下法(stochastic gradient descent; SGD)●●

ロジスティック回帰を含む確率モデルのための学習ア
ルゴリズム
w=0
for I iterations
for each labeled pair x, y in the dataw += α * dP(y|x)/dw
つまり各学習例に対して勾配を計算（ y の確率が上がる方向）●
その方向へ、学習率 α をかけた分だけ動かす●

18

NLP プログラミング勉強会 8 - リカレントニューラルネット●

確率の微分w⋅ϕ ( x)dP ( y=1∣x ) =dw

d ed w 1+e w⋅ϕ (x)w⋅ϕ (x)e= ϕ (x )w⋅ϕ (x) 2(1+e)
dP ( y=−1∣x ) =dw

dp(y|x)/dw*phi(x)シグモイド関数の勾配0.4
0.3
0.20.1-10-500510w*phi(x)w⋅ϕ (x)de(1−)w⋅ϕ (x)dw
1+ ew⋅ϕ (x)e= −ϕ (x )w⋅ϕ (x) 2(1+ e)

19

NLP プログラミング勉強会 8 - リカレントニューラルネット

学習：隠れ層の勾配が分からない●

出力層のタグしか分からないh( x)w1d P( y=1∣x)=?
d w1d P( y=1∣x)e w ⋅h(x )=h (x)w ⋅h( x) 2dw(1+ e)
4w
4ϕ ( x)

w2

w3

4

4

y=1

d P( y=1∣x)=?
d w2
d P( y=1∣x)=?
d w320NLP プログラミング勉強会 8 - リカレントニューラルネット

逆伝搬 (back propagation)●

連鎖律を使って計算
d P( y=1∣x) d P( y=1∣x ) d w 4 h(x ) d h1 (x )=d w1d w 4 h( x) d h1 (x) d w 1w 4⋅h( x )ew ⋅h( x) 2(1+e)

w 1,4次の層のエラー (δ4)

重み4

一般にはi を次の層のj のエラーで計算

勾配d P( y=1∣x) d hi ( x)=δw∑ji, jjwid wi

21

NLP プログラミング勉強会 8 - リカレントニューラルネット

逆伝搬の概念図●

エラーを逆方向に伝搬
w1ϕ ( x)

δ1w2

w4

δ2

δ4yw3

δ322

NLP プログラミング勉強会 8 - リカレントニューラルネット

リカレントネットの逆伝搬

23

NLP プログラミング勉強会 8 - リカレントニューラルネット

計算できるエラーは？
y1 δNETx1o,1δr,1y2 δo,2NETx2

δr,2y3 δo,3NETx3

δr,3y4 δo,4NETx4

出力エラー δo は簡単に計算可能● 次の時間からのリカレントエラー δ は逆伝搬r●

24

NLP プログラミング勉強会 8 - リカレントニューラルネット

逆伝搬の方法●通時的逆伝播 (back propagation through time; BPTT)●●

各 δo に対して n 回（時間）の逆伝搬を行う

完全勾配計算 (full gradient calculation)●

動的計画法に基づいて、系列全体の勾配を計算

25

NLP プログラミング勉強会 8 - リカレントニューラルネット

通時的逆伝搬δδy1δo,1 y2 δo,2y3 δNETδδNETx1NETx2

δδo,3y4δo,4NETδ
x3

1 つの出力エラーだけを考慮● n 回の計算だけを行う ( ここでは n=2)

x4

●

26

NLP プログラミング勉強会 8 - リカレントニューラルネット

完全勾配計算y1δδo,1y2δδo,2y3δ

δo,3y4δo,4δ

NETNETNET

NETx1x2x3x4

まず系列のネット結果全体を計算● 後ろからエラーを計算●

27

NLP プログラミング勉強会 8 - リカレントニューラルネット

BPTT? 完全勾配計算？
●

完全勾配計算+ 計算量が少ない、ステップ数の指定がない● - 系列全体の計算結果を保存するのが必要
●

●

BPTT:
+ メモリ量は系列の長さではなくステップ数に比例● - 計算量が多い、長距離の情報が捉えにくい●

28

NLP プログラミング勉強会 8 - リカレントニューラルネット

ニューラルネットにおける消える勾配極微y1

δ

●

微y2

δ

小y3

δ

中y4δo,4

δ

NETNETNETNETx1x2x3x4「 Long Short Term Memory (LSTM) 」などでこの問
題に対処

29

NLP プログラミング勉強会 8 - リカレントニューラルネット

RNN の完全勾配計算
gradient_rnn(wr,x, wr,h, br, wo,h, bo, x, h, p, y')initialize Δwr,x, Δwr,h, Δbr, Δwo,h, Δboδr' = np.zeros(len(br)) # 次の時間から伝搬するエラー
for each time t in len(x)-1 .. 0:p' = create_one_hot(y'[t])δo' = p' – p# 出力層エラー
Δwo,h += np.outer(h[t], δo');Δbo += δo' # 出力層重み勾配
δr = np.dot(δ'r, wr,h) + np.dot(δ'o, wo,h)# 逆伝搬
δ'r = δr * (1 – h[t]2)# tanh の勾配
Δwr,x += np.outer(x[t], δr');
Δbr += δr'# 隠れ層重み勾配
if t != 0:
Δwr,h += np.outer(h[t-1], δr');
return Δwr,x, Δwr,h, Δbr, Δwo,h, Δbo
30

NLP プログラミング勉強会 8 - リカレントニューラルネット

重み更新
update_weights(wr,x, wr,h, br, wo,h, bo, Δwr,x, Δwr,h, Δbr, Δwo,h, Δbo, λ)wr,x += λ * Δwr,xwr,h += λ * Δwr,hbr += λ * Δbrwo,h += λ * Δwo,hbo += λ * Δbo

31

NLP プログラミング勉強会 8 - リカレントニューラルネット

学習の全体像# 素性を作り、ネットワークをランダムな値で初期化
create map x_ids, y_ids, array data
for each labeled pair x, y in the data
add (create_ids(x, x_ids), create_ids(y, y_ids) ) to data

initialize net randomly# 学習を行う
for I iterations
for each labeled pair x, y' in the feat_lab
h, p, y = forward_rnn(net, φ0)
Δ= gradient_rnn(net, x, h, y')update_weights(net, Δ, λ)print net to weight_file
print x_ids, y_ids to id_file32

NLP プログラミング勉強会 8 - リカレントニューラルネット

演習問題

33

NLP プログラミング勉強会 8 - リカレントニューラルネット

演習問題

●
●
●

●

●

系列ラベリングのための RNN を実装
学習 train-rnn とテスト test-rnn

テスト：品詞推定のものを利用●

入力： test/05-{train,test}-input.txt●

正解： test/05-{train,test}-answer.txt

data/wiki-en-train.norm_pos を使ってモデルを学習し、 data/wiki-en-test.norm に対して品詞推定を行う

品詞推定の性能を評価し、 HMM と比較：
script/gradepos.pl data/wiki-en-test.pos my_answer.pos

34