初學者——從NN到RNN,深刻理解以softmax為啟用函式的反向傳播,有程式碼
看這篇文章首先你要懂NN,也就是神經網路,我也是隻懂神經網路,RNN是我學的第二個神經網路。如果你以前啥都不懂的話,推薦去這個網站
http://neuralnetworksanddeeplearning.com/
真的賊J8好,筆者是這樣看的,看完第一章,Using neural nets to recognize handwritten digits,我大概明白了什麼叫神經網路,然後它還有程式碼,我就直接看程式碼了,然後我就理解了反向傳播,我覺得這個是最主要的吧,然後第二章我就沒看了,因為懂了反向傳播,然後我又看了第三章和第六章,知道了一點CNN(卷積神經網路)的事,裡面是用theano實現的,然後我又開始學習theano,覺得光學沒有什麼用,得找個專案做一做,於是就找到了這個用theano寫的RNN,上面的網站我真的極力推薦,裡面的公式最好全部手推一遍,如果你不想看英文版的話,我們實驗室翻譯了這個網站,你可以在微信裡搜“哈工大SCIR”,然後在文章目錄裡找到《NN&DL》連載,然後你就可以看了。說實話,那本書廢話賊J8多,你們最好和我一樣跳著看。
好了說我要講的RNN,看這篇文章請結合http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-2-implementing-a-language-model-rnn-with-python-numpy-and-theano/裡面的文章來看,我會把程式碼裡面的公式給你們推一遍,你們先看看這篇文章到底要做什麼
我不會講全部內容,我只講到反向傳播,其他的你們自己可以推
RNN網路結構如下
你們看了上面的網站應該知道,輸入Xt是一個句子中的一個單詞的one-hot-vector(不明白的同學百度一下),這個向量就是這個詞在詞表中的下標(id),比如“I like you”
中的“I”,它在詞表中的id可能是5,那麼它就是[0,0,0,0,0,1,.....0],然後當前隱層的狀態與當前輸入Xt和上一個隱層狀態St-1有關,
通過與U和W的線性變換相加後做tanh得到。輸出Ot是預測的下一個詞在詞表裡的下標,比如輸入是“I”,我們希望輸出是“like”在詞表裡的下標(id)。為了減小計算範圍,
我們限定詞表大小為8000,即只包含了8000個詞,所以Xt與Ot維度也是8000,隱層為100層,Ot的每一維對應詞表的8000個單詞,其中一維的概率越大(softmax會把輸入壓縮到0和1之間,因此可以把它當作一個不同分類的概率)則表示單詞下標越有可能就是這個維度。Loss函式是輸出每維×Yk的總和取負,Yk
是這個單詞。接下來介紹用softmax函式作為啟用函式的反向傳播
Softmax完整函式形式如下
對於Zt的每一維度Zti,softmax為
根據隨機梯度下降演算法思想,我們現在需要求,而就拿上圖為例,我們希望我們預測出來的詞在詞表中的下標是4(詞表總共0-7999),
所以Y4 = 1其他的Yk = 0,那麼loss函式就可以簡化成
現在我們來求一下,
看上面的公式可以推出來圖上所寫的對吧,但是我想提醒一下,我這裡寫成的是向量模式,一會真正求得時候我們得一個數一個數地求,先求,看下圖
發現了嗎,除了為1外,其他的都是0,那麼我們只看Ot4,這裡是重點哈,只看Ot4,之後所有的偏導都是用Ot4(數字/標量)去求,如果遇到
Ot4和向量在一起,得分開每個數每個數地求!
那現在就變成了
下一步要求的這步求導即是對softmax函式的求導,softmax函式的求導要分兩種情況,比如上圖就應該分為I = 4與i != 4的情況,你們看一下下面的求導
這個求導不是我求的,它來自於http://blog.csdn.net/u014313009/article/details/51045303,這小夥子確實不錯,只不過他忘記了LOSS函式前面還有個負號,大家記得把
他求導的結果加上個負號,讓我們再次感謝這位小夥子
那我就直接寫了,
的程式碼。
其實從程式碼中我們也能看出來我這個推導結果是正確的
你們看這一句delta_o[np.arange(
len
(y)),
y]
-
=
1.,也就是說i=4的時候所有輸出都-1,其他輸出都保持不變
符合下圖
好的你們去看程式碼吧,加油
如果你看懂了這篇文章請頂一下,畢竟每個人所學的程度不同,我不知道自己講明白沒有,之後還會調整一些錯誤吧,感謝你們長得這麼好看還
看我的文章
好了我去學LSTM了,good白!