1、介紹
長短期記憶修改了迴圈神經網路隱藏狀態的計算方式,並引入了與隱藏狀態形狀相同的記憶細胞(某些文獻把記憶細胞當成一種特殊的隱藏狀態)。
2、具體的設計
(1)輸入門、遺忘門和輸出門it
ftot
=σ(x
twxi
+ht−
1whi
+bi)
,=σ(
xtwx
f+ht
−1wh
f+bf
),=σ
(xtw
xo+h
t−1w
ho+b
o). it=
σ(xt
wxi+
ht−1
whi+
bi),
ft=σ
(xtw
xf+h
t−1w
hf+b
f),o
t=σ(
xtwx
o+ht
−1wh
o+bo
).
和門控迴圈單元中的重置門和更新門一樣,這裡的輸入門、遺忘門和輸出門中每個元素的值域都是[0,1](這裡的i,
f,o i,f
,o
大小都是h h
,即超引數只有num_hiddens)
(2)候選記憶細胞c~
t=tanh(x
twxc
+ht−
1whc
+bc)
.' role="presentation">c~t
=tanh(x
twxc
+ht−
1whc
+bc)
.c~t
=tanh(x
twxc
+ht−
1whc
+bc)
.(3)記憶細胞ct
=ft⊙
ct−1
+it⊙
c~t.
c t=
ft⊙c
t−1+
it⊙c
~t
.如果遺忘門一直近似1且輸入門一直近似0,過去的記憶細胞將一直通過時間儲存並傳遞至當前時間步。 這個設計可以應對迴圈神經網路中的梯度衰減問題,並更好地捕捉時序資料中間隔較大的依賴關係。
(4)隱藏狀態
通過輸出門來控制從記憶細胞到隱藏狀態 ht
=ot⊙
tanh(c
t). ht=
ot
⊙tanh(c
t)
.(5)輸出層
在時間步t,長短期記憶的輸出層計算和之前描述的迴圈神經網路輸出層計算一樣
3、**
超引數num_hiddens定義了隱藏單元的個數
ctx = gb.try_gpu()
input_dim = vocab_size
num_hiddens = 256
output_dim = vocab_size
def get_params():
# 輸入門引數.
w_xi = nd.random_normal(scale=0.01, shape=(input_dim, num_hiddens),
ctx=ctx)
w_hi = nd.random_normal(scale=0.01, shape=(num_hiddens, num_hiddens),
ctx=ctx)
b_i = nd.zeros(num_hiddens, ctx=ctx)
# 遺忘門引數。
w_xf = nd.random_normal(scale=0.01, shape=(input_dim, num_hiddens),
ctx=ctx)
w_hf = nd.random_normal(scale=0.01, shape=(num_hiddens, num_hiddens),
ctx=ctx)
b_f = nd.zeros(num_hiddens, ctx=ctx)
# 輸出門引數。
w_xo = nd.random_normal(scale=0.01, shape=(input_dim, num_hiddens),
ctx=ctx)
w_ho = nd.random_normal(scale=0.01, shape=(num_hiddens, num_hiddens),
ctx=ctx)
b_o = nd.zeros(num_hiddens, ctx=ctx)
# 候選細胞引數。
w_xc = nd.random_normal(scale=0.01, shape=(input_dim, num_hiddens),
ctx=ctx)
w_hc = nd.random_normal(scale=0.01, shape=(num_hiddens, num_hiddens),
ctx=ctx)
b_c = nd.zeros(num_hiddens, ctx=ctx)
# 輸出層引數。
w_hy = nd.random_normal(scale=0.01, shape=(num_hiddens, output_dim),
ctx=ctx)
b_y = nd.zeros(output_dim, ctx=ctx)
params = [w_xi, w_hi, b_i, w_xf, w_hf, b_f, w_xo, w_ho, b_o, w_xc, w_hc,
b_c, w_hy, b_y]
for param in params:
param.attach_grad()
return params
def lstm_rnn(inputs, state_h, state_c, *params):
[w_xi, w_hi, b_i, w_xf, w_hf, b_f, w_xo, w_ho, b_o, w_xc, w_hc, b_c,
w_hy, b_y] = params
h = state_h
c = state_c
outputs =
for x
in inputs:
i = nd.sigmoid(nd.dot(x, w_xi) + nd.dot(h, w_hi) + b_i)
f = nd.sigmoid(nd.dot(x, w_xf) + nd.dot(h, w_hf) + b_f)
o = nd.sigmoid(nd.dot(x, w_xo) + nd.dot(h, w_ho) + b_o)
c_tilda = nd.tanh(nd.dot(x, w_xc) + nd.dot(h, w_hc) + b_c)
c = f * c + i * c_tilda
h = o * c.tanh()
y = nd.dot(h, w_hy) + b_y
return (outputs, h, c)
長短期記憶網路 長短期記憶網路 LSTM 簡介
考慮這樣乙個場景,當我們在看乙個精彩的電影時,我們會被電影中的各個精彩情節所吸引,但是我們不能夠記住所有的電影情節。當觀影結束時,我們會立馬忘記電影裡面一些無關緊要的情節,留在我們腦海中的可能更多的是一些對劇情發展起關鍵作用的場景,這些場景可能在之後的很長一段時間後依然停留在我們的腦海中,以至於當我...
lstm原理 長短期記憶網路LSTM
上兩小節我們主要講述了迴圈神經網路rnn,但是儘管 rnn 被設計成可以利用歷史的資訊來 當前的決策,例如使用之前出現的單詞來加強對當前單詞的理解,但是 rnn決策的主要還是最後輸入的一些訊號,更早之前的訊號會隨著時間的推遲而變得強度越來越低,它對後續的影響越來越弱。這樣就會給rnn帶來了新的技術挑...
LSTM長短期記憶人工神經網路簡述
by yang liu 1.什麼是lstm 長短期記憶網路 lstm,long short term memory 是一種時間迴圈神經網路,是為了解決一般的rnn 迴圈神經網路 存在的長期依賴問題而專門設計出來的,屬於時間遞迴神經網路 rnn 中的一種。lstm適合於處理和 時間序列中間隔和延遲非常...