机器学习入门:第十五章 递归神经网络
前言
BP神經(jīng)網(wǎng)絡(luò),訓(xùn)練的時候,給定一組輸入和輸出,不斷的對權(quán)值進(jìn)行訓(xùn)練,使得輸出達(dá)到穩(wěn)定。但BP神經(jīng)網(wǎng)絡(luò)并不是適合所有的場景,并不真正的體現(xiàn)出某些場景的真正特點(diǎn)。回到經(jīng)典的概率論問題,拋硬幣問題,假設(shè)你已經(jīng)拋了100次的,90次是正面的,10次是反面的,問現(xiàn)在繼續(xù)在拋一次,出現(xiàn)正面的概率是多少?如果沒有前面幾次的經(jīng)驗(yàn),很正常的會認(rèn)為再次出現(xiàn)正面的概率是50%,但由于我們之前有對這個進(jìn)行了實(shí)驗(yàn),即有了經(jīng)驗(yàn)了,按照貝葉斯定律,出現(xiàn)正面的概率肯定會大于50%。BP神經(jīng)網(wǎng)絡(luò)也少了對前面結(jié)果的一種反饋。
常見,易懂的受到前位影響的算法,加法算法。十位的結(jié)果,所到個位結(jié)果的影響,因?yàn)榭赡苡羞M(jìn)位,同樣,百位的結(jié)果所到十位的影響。如圖
這種受到前位影響的算法非常的常見,而經(jīng)典BP神經(jīng)網(wǎng)絡(luò)并不能很好的反映這種算法的特性,需要就經(jīng)典的BP神經(jīng)網(wǎng)絡(luò)進(jìn)行優(yōu)化和改造,也就是引進(jìn)前位,歷史數(shù)據(jù)對網(wǎng)絡(luò)的影響,使其具備時序性。通過歷史數(shù)據(jù)的關(guān)聯(lián)來推測后續(xù)的事情。
遞歸神經(jīng)網(wǎng)絡(luò)RNN
從前面加法算法的動態(tài)圖中,對現(xiàn)有的BP神經(jīng)網(wǎng)絡(luò)進(jìn)行改造,也就是加入前位的結(jié)果對于后續(xù)網(wǎng)絡(luò)的影響。
這里把BP神經(jīng)網(wǎng)絡(luò)設(shè)計成上圖的形式,很形象的揭示了遞歸神經(jīng)網(wǎng)絡(luò)的特點(diǎn),前向的結(jié)果,作為下一個輸入,影響下一個網(wǎng)絡(luò)的結(jié)果。遞歸神經(jīng)網(wǎng)絡(luò),在很多方向已經(jīng)取得了很好的成果。而一種特殊的遞歸神經(jīng)網(wǎng)絡(luò)Long Short Term 網(wǎng)絡(luò)(LSTM),取到的結(jié)果最為璀璨,是這個方向的明星。
LSTM結(jié)構(gòu):
來看看LSTM的實(shí)現(xiàn)。關(guān)于LSTM可以進(jìn)一步的參看,http://nicodjimenez.github.io/2014/08/08/lstm.html 和 https://github.com/nicodjimenez/lstm/blob/master/lstm.py,詳細(xì)的給出了LSTM的求解過程。
算法的迭代過程在:
http://nicodjimenez.github.io/2014/08/08/lstm.html
https://github.com/nicodjimenez/lstm
算法跟BP神經(jīng)網(wǎng)絡(luò)沒有太大的不同,但要注意的還是各個變量的增量和迭代問題。
使用RNN實(shí)現(xiàn)加法過程
在簡化一點(diǎn)的方式如下圖:
如果去掉layer_1層,那么就是一個最簡單的BP神經(jīng)網(wǎng)絡(luò)了。這里引入了layer_1層,使得經(jīng)典的BP神經(jīng)網(wǎng)絡(luò)多了一個輸入,layer_1層在加法算法中,表示的是前一個輸入就可以反映出加法算法的特性,從結(jié)構(gòu)來看,這個LSTM的變形并不是非常的復(fù)雜,但現(xiàn)在就重要的就是如何計算出各個層次的增量,然后進(jìn)行迭代了。
構(gòu)建一個二進(jìn)制的網(wǎng)絡(luò),輸入為兩個節(jié)點(diǎn),一個隱層有16個節(jié)點(diǎn),一個中間層有16個節(jié)點(diǎn)用來存放進(jìn)位。
for position in range(binary_dim):# generate input and outputX = np.array([[a[binary_dim - position - 1], b[binary_dim - position - 1]]])y = np.array([[c[binary_dim - position - 1]]]).T# hidden layer (input ~+ prev_hidden)layer_1 = sigmoid(np.dot(X, synapse_0) + np.dot(layer_1_values[-1], synapse_h))# output layer (new binary representation)layer_2 = sigmoid(np.dot(layer_1, synapse_1))# did we miss?... if so by how much?layer_2_error = y - layer_2layer_2_deltas.append((layer_2_error) * sigmoid_output_to_derivative(layer_2))overallError += np.abs(layer_2_error[0])# decode estimate so we can print it outd[binary_dim - position - 1] = np.round(layer_2[0][0])# store hidden layer so we can use it in the next timesteplayer_1_values.append(copy.deepcopy(layer_1))加數(shù)和被加數(shù)作為輸入,計算隱層和中間層的誤差,這是一個加法遞歸神經(jīng)網(wǎng)絡(luò),可以看成進(jìn)制放在中間層中,這里要記住這個加法器輸入層不是八個節(jié)點(diǎn),而只有兩個,也是一種最小加法器。
訓(xùn)練時也是使用誤差傳播的方式,這里主要需要解決導(dǎo)數(shù)問題python的代碼實(shí)現(xiàn):
# compute sigmoid nonlinearity def sigmoid(x):output = 1/(1+np.exp(-x))return output# convert output of sigmoid function to its derivative def sigmoid_output_to_derivative(output):return output*(1-output)計算中間結(jié)果,可以參看LSTM的過程:
for position in range(binary_dim):X = np.array([[a[position], b[position]]])layer_1 = layer_1_values[-position - 1]prev_layer_1 = layer_1_values[-position - 2]# error at output layerlayer_2_delta = layer_2_deltas[-position - 1]# error at hidden layerlayer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + \layer_2_delta.dot(synapse_1.T)) * sigmoid_output_to_derivative(layer_1)# let's update all our weights so we can try againsynapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta)synapse_h_update += np.atleast_2d(prev_layer_1).T.dot(layer_1_delta)synapse_0_update += X.T.dot(layer_1_delta)future_layer_1_delta = layer_1_delta變量的更新:
synapse_1_update += np.atleast_2d(layer_1).T.dot(layer_2_delta) synapse_h_update += np.atleast_2d(prev_layer_1).T.dot(layer_1_delta) synapse_0_update += X.T.dot(layer_1_delta)其中 layer_1_delta變量為兩個變量的和:
layer_1_delta = (future_layer_1_delta.dot(synapse_h.T) + layer_2_delta.dot(synapse_1.T)) * sigmoid_output_to_derivative(layer_1)完整的迭代過程在:
https://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/
在遞歸神經(jīng)網(wǎng)絡(luò)中,跟經(jīng)典的BP神經(jīng)網(wǎng)絡(luò)在結(jié)構(gòu)上并沒有太多的不同,最關(guān)鍵的點(diǎn),還是在求解增量,進(jìn)行迭代。
遞歸神經(jīng)網(wǎng)絡(luò)的應(yīng)用
遞歸神經(jīng)網(wǎng)絡(luò)跟BP神經(jīng)網(wǎng)絡(luò),最大的不同是引進(jìn)了時序,可以根據(jù)以往的數(shù)據(jù)來推測未來的事件。這是現(xiàn)在比較熱門的一個方向。比較多的應(yīng)用實(shí)在語音和文本的處理上,網(wǎng)上有相當(dāng)多的關(guān)于遞歸神經(jīng)網(wǎng)絡(luò)的應(yīng)用,比如寫出像汪峰一樣的歌詞,默寫唐詩,寫冷段子等。但要寫出像樣的歌詞和詩詞,還需要做很多的處理,如果把遞歸神經(jīng)網(wǎng)絡(luò)應(yīng)用在推薦系統(tǒng)里,也會得到不錯的效果。
參考
http://blog.csdn.net/zzukun/article/details/49968129
http://www.jianshu.com/p/9dc9f41f0b29
http://nicodjimenez.github.io/2014/08/08/lstm.html
https://github.com/nicodjimenez/lstm
http://blog.csdn.net/longxinchen_ml/article/details/51253526
https://github.com/karpathy/char-rnn
http://blog.csdn.net/v_july_v/article/details/52796239
總結(jié)
以上是生活随笔為你收集整理的机器学习入门:第十五章 递归神经网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序二维码生成中的一些坑
- 下一篇: 张宇数学基础30讲——数列极限---笔记