1. 程式人生 > >Long short-term memory 論文小記

Long short-term memory 論文小記

這是Hochreiter(1997)的一篇老論文,我為了一睹lstm的原創遺風而讀。本來想看看最樸素最正宗的lstm模型,結果卻發現在本文中作者並未提出一種特有的模型。文章很長,並不打算翻譯。下面是我的一些總結和見解,純粹小菜鳥的個人觀點,大家多多指正,非常歡迎~

首先是這篇文章的動機。作為一篇長文,什麼支撐著作者進行這麼多的實驗,以及這篇文章的重要性有多大,取決於動機。在這裡,總結成一句話就是:Old activation and scaled current input always perturb stored information so that information can’t last for long term.By adding a higher order unit can soften the problem a bit but can’t generalize.就是之前的啟用函式還有直接對輸入進行變換並不能儲存資訊,尤其是長時間的資訊。通過加一些高階的單元可以緩解這個問題,但是並不能每個模型都手動加,所以這個方法不能推廣。

而當前的需求是:More realistic tasks require either many free parameters or high weight precision, such that guessing becomes completely infeasible.現實生活中的問題要麼需要很多的引數,要麼需要很高的精度,這都無法通過隨機猜得到(指隨機初始化)

基於這兩點,作者想找到一種方法能夠儲存長時資訊,而且不需要很多引數。

於是作者進行了一段時間的研究,發現之前的RNN也好,前饋也好,之所以不能儲存長時資訊,是因為:

  1. 所有的輸入都被接收了,傳入到了網路中覆蓋了之前的資訊
  2. BP的過程是一個迭代累乘的過程,隨著時間步長變長,資訊會衰減。每一步的衰減因子就是前一步的f’(z).*W,這個無論如何都沒辦法等於1,所以會導致梯度消失或者梯度爆炸。具體的數學推導過程見原文。我是一個數學盲,就不展開說了。

所以針對以上兩點,作者巧妙地設計出了門(Gate)的概念。以及在一個LSTMcell中,資訊的更新和傳輸是以加的方式進行的。這兩者就是這篇長文的核心!

先說說門(gate),門是由一個sigmod之類的啟用函式生成的,主要作用就是生成一個值[0,1]之間掩模(mask),然後拿這個掩模去作用於輸入或者輸出。值為1表示允許該輸入進入(輸出出去),為0則把該輸入遮蔽(輸出被關上)。門可以作用於很多地方,根據作用不同,有輸入門,輸出門,後來人們還加了忘記門。關於門,作者說了兩句很費解的話:The input gate learns when to release errors, the output gates learns which errors to trap in its CEC.CEC 就是下面說到了一個LSTM cell 的更新機制。

然後就是在每個LSTM cell中狀態的更新。Sc(t)表示t時刻的狀態的話,那麼
Sc(t)=Sc(t-1)+fin(net(x(t)))g(net(c(t))
其中fin就是輸入門,g是一個規整函式,可以是tanh或其他。x(t)是輸入。net()是表示一個權重網路。可以看出,這裡更新是以加的方式進行的,而不是直接輸入一個權重網路,以乘的方式進行。這樣的話求導的時候,本來衰減因子是f’(z).*W,而這裡沒有W,或者說W=1,而f’(z)之間也不是相乘的關係,而是加的關係。
例如,RNN展開之後是這樣的:
delta(t-q)=K(t-q+1)*K(t-q+1)*...*K(t-1)*delta(t)
而LSTM展開之後就是這樣的:
delta(t-q)=A(t)+B(t)+C(t)=(A(t-1)+C(t-1)+D(t-1))+B(t)+C(t)=
A(t-q)+...+B(t)+C(t)

因此,LSTM不存在衰減或者爆炸的問題。另外可以看出,RNN的誤差僅由t時刻的delta決定,儲存的只是t時刻當前資訊,而LSTM儲存了從t-q到t這q個時刻的資訊。

然後就到了實驗部分,這部分並沒有怎麼看。因為僅實驗所用的樣例lstm的結構我都沒有看懂,設計得相當複雜。更可憐的是,連每個實驗要做什麼我也沒有看懂。看懂的大牛快來解答一下,歡迎留言探討(md怎麼沒有字型發亮變色功能)
前面也說了,只是提出了門和cell的更新傳遞方式,並沒有規定組合。用作者原話是根據實際需要user define。在樣例裡,作者用了兩個lstm block,每個block有兩個cell,它們共用一個輸出門和輸出門。至於它們的資料是怎麼傳遞的呢,我看到輸入不僅流入了兩個輸入門,還直接流入cell裡還有輸出門。相當凌亂的樣子。而輸出層的每個神經元只與block1的兩個cell相連,注意是cell不是輸出門!而block2,我並不知道它用來幹嘛,因為只有輸入流沒有輸出流~