用通俗易懂例子「乾掉」RNN與LSTM

2021-10-05 14:51:52 字數 3664 閱讀 8610

用簡單例子闡述更易理解枯燥無味的定義,本文由淺入深解析兩者的工作機理,為設計程式奠定基礎,主要分兩部分內容:

(i)舉例理解迴圈神經網路(rnn [1], recurrent neural networks)

(ii)舉例理解長短期記憶網路(lstm [2] ,long short-term memory)

rnn為lstm之父,欲求lstm,必先rnn。

(a)rnn定義:

輸入資料為序列,如:「water is hot」, 「i like chinese chess」, 通過前後輸入互相關聯的網路,**或者分類.

(b)舉例理解rnn(batch size =1 )

如圖一, 區別於深度神經網路(dnn),rnn多了一些隱層的輸出。迴圈體現在前後節點的作用是統一的權重(w),神經網路的權重共享(u、v). 以water is hot為例闡述rnn工作原理,詞性標註問題+語義識別 分別表示 序列輸入-單輸出(分類類別) 和 序列輸入-序列輸出(分類類別).

example1 詞性標註問題:看看乙個句子每個單詞是名詞還是動詞。

網路輸入:

10000句類似標註好的句子。

如 water(名) is(動) hot(形). i(名) am(動) a(形) man(名). 。。。

網路訓練過程:

第一時刻,輸入x

1x_1

x1​= 00001001(water),標籤y

1y_1

y1​:01 (名), 通過網路得到隱層輸出 s1=

f(ux

1+w∗

0+a)

s_1 = f(ux_1+ w*0 +a)

s1​=f(

ux1​

+w∗0

+a), 整個網路最後的**輸出o1=

f(vs

1+b)

o_1 = f(vs_1 + b)

o1​=f(

vs1​

+b)。

第二時刻,輸入x2 = 00101001(is), 通過網路得到隱層輸出s2=

f(ux

2+ws

1+a)

s_2 = f(ux_2+ ws_1 +a)

s2​=f(

ux2​

+ws1

​+a)

, 整個網路最後的**輸出o2=

f(vs

2+b)

o_2 = f(vs_2 + b)

o2​=f(

vs2​

+b)。

第三時刻…等等。 句子有多長, 就迴圈幾次。

損失函式

o 1,

o2,o

3...

o_1,o_2, o_3...

o1​,o2

​,o3

​...

與真實的標註的誤差。

: 前後兩個時刻的輸入向量維數相同。

example2 語義識別:看看話是罵人還是誇人的

網路輸入:

10000句類似標註完成的句子。

如 you are a really bad man(罵).

you are beautiful(誇)…

網路訓練過程:

網路結構與詞性標註問題相同,但是中間層的輸出 s

1s_1

s1​ 其實是不需要的,當然這個任務中也不會有對應的標籤。我們其實僅僅需要最後的o

no_n

on​來達到看看這句話是罵我呢還是誇我。

損失函式就是o

no_n

on​…與真實的標註的誤差。

當然還有 單輸入但是輸出為序列 同理可分析。

(a)lstm定義:

lstm是rnn的son,長江後浪推前浪,lstm看到rnn這個dad記住了太多有的沒的,造成不好的影響(梯度消失or梯度**),於是它向魚取經-7秒記憶三開關**,通過三個開關(又稱作門)來把控要不要資訊。三個開關:遺忘門,輸入門,輸出門。

lstm就比rnn多個cell的機制,如下:

上圖是經典之圖,那一堆公式只要記著乙個原則就行: 記憶或者遺忘的「權重」是0-1之間取值(最好是階躍函式),「資訊」是-1到1之間取值。用tanh做啟用函式的式子都在計算「資訊」,用 σ

\sigma

σ 函式的公式,都在計算權重.

f

ff:遺忘門;

i

ii:輸入門;(這裡為了理解就是0或者1)

o

oo.:輸出門(注意ot=

oto_t=o_t

ot​=ot

​,列印錯誤);

h

th_t

ht​ : 是隱層節點的值(相當於rnn圖的s_t)。

c

tc_t

ct​ : 是cell的縮寫,可以理解成現在的記憶, 腦子裡的東西;

注:可以看出,此時 ct,

htc_t, h_t

ct​,ht

​ 共同影響後乙個單詞。

(b)舉例理解lstm

example3 語義識別:看看話是罵人還是誇人的.

網路輸入:

:10000句類似標註完成的句子。

如you are a really bad man(罵).

you are beautiful(誇)…

網路訓練過程:

輸入 x 特徵, y 標籤。

第一時刻,

輸入 x_1= 00021000(you), 計算遺忘門 f_1 與輸入門 i_1, 更新大腦知識 c_1,計算輸出門, 通過輸出門計算隱層神經元節點值h_1。

第二時刻,

輸入 x_2= 00021020(are), 計算遺忘門 f_2 與輸入門 i_2, 更新大腦知識 c_2, 計算輸出門, 通過輸出門和h_0計算隱層神經元節點值h_1。

第三時刻…等等。 句子有多長, 就迴圈幾次。

最終網路的輸出為 y^=

fsof

tmax

(vhn

+b)\hat = f_(vh_n + b)

y^​=fs

oftm

ax​(

vhn​

+b)

損失函式:

y

^\hat

y^​與真實的標註 y

yy 的誤差(往往是交叉熵損失函式)。

[1]goodfellow, i., bengio, y., courville, a..deep learning (vol. 1):cambridge:mit press,2016:367-415

[2]schmidhuber, j., 2015. deep learning in neural networks: an overview. neural networks, 61, pp.85-117.

本文部分知識受以下文章啟發,在此由衷感謝以下作者的分享!

簡介)簡介)

梯度具體求解)

快速排序 通俗易懂 例子 優化方案

快速排序思想 排序陣列 下標從l到r 選擇l到r之間任意乙個資料作為povit 分割槽點 遍歷陣列,將小於povit到放左邊,大於povit到放右邊,將povit放中間。處理後,陣列l到r的資料分成了3部分,l到p 1之間到資料都是小於povit的,povit在中間,後面p 1到r的資料都是大於po...

通俗易懂 equals 與 的區別

值型別 int,char,long,boolean等 都是用 判斷相等性。物件引用的話,判斷引用所指的物件是否是同乙個。equals是object的成員函式,有些類會覆蓋 override 這個方法,用於判斷物件的等價性。例如string類,兩個引用所指向的string都是 abc 但可能出現他們實...

volatile的乙個例子 通俗易懂

volatile 關鍵字的兩層語義 一旦乙個共享變數 類的成員變數 類的靜態成員變數 被 volatile 修飾之後,那麼就具備了兩層語義 1 保證了不同執行緒對這個變數進行操作時的可見性,即乙個執行緒修改了某個變數的值,這新值對其他執行緒來說是立即可見的。2 禁止進行指令重排序。方式一 變數不使用...