? ? ? ? 本周任務(wù):進(jìn)一步調(diào)整模型餐塘,優(yōu)化效果因篇。
? ? ? ? 單向lstm神經(jīng)網(wǎng)絡(luò)已經(jīng)不能滿足我們的數(shù)據(jù)模型羹奉,由于標(biāo)準(zhǔn)的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)在時(shí)序上處理序列沪停,他們往往忽略了未來(lái)的上下文信息煤辨。一種很顯而易見(jiàn)的解決辦法是在輸入和目標(biāo)之間添加延遲裳涛,進(jìn)而可以給網(wǎng)絡(luò)一些時(shí)步來(lái)加入未來(lái)的上下文信息,也就是加入M時(shí)間幀的未來(lái)信息來(lái)一起預(yù)測(cè)輸出众辨。理論上端三,M可以非常大來(lái)捕獲所有未來(lái)的可用信息,但事實(shí)上發(fā)現(xiàn)如果M過(guò)大鹃彻,預(yù)測(cè)結(jié)果將會(huì)變差郊闯。這是因?yàn)榫W(wǎng)路把精力都集中記憶大量的輸入信息,而導(dǎo)致將不同輸入向量的預(yù)測(cè)知識(shí)聯(lián)合的建模能力下降蛛株。因此团赁,M的大小需要手動(dòng)來(lái)調(diào)節(jié)。
? ? ? ? 所以需要修改模型的架構(gòu)谨履,采用了最近比較新的模型:?雙向長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)欢摄。首先需要介紹一下,雙向循環(huán)神經(jīng)網(wǎng)絡(luò)(BRNN)的基本思想是提出每一個(gè)訓(xùn)練序列向前和向后分別是兩個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)笋粟,而且這兩個(gè)都連接著一個(gè)輸出層怀挠。這個(gè)結(jié)構(gòu)提供給輸出層輸入序列中每一個(gè)點(diǎn)的完整的過(guò)去和未來(lái)的上下文信息。下圖展示的是一個(gè)沿著時(shí)間展開(kāi)的雙向循環(huán)神經(jīng)網(wǎng)絡(luò)害捕。六個(gè)獨(dú)特的權(quán)值在每一個(gè)時(shí)步被重復(fù)的利用绿淋,六個(gè)權(quán)值分別對(duì)應(yīng):輸入到向前和向后隱含層(w1, w3),隱含層到隱含層自己(w2, w5)尝盼,向前和向后隱含層到輸出層(w4, w6)吞滞。值得注意的是:向前和向后隱含層之間沒(méi)有信息流,這保證了展開(kāi)圖是非循環(huán)的盾沫。
????????而B(niǎo)i-directional LSTM在上述基礎(chǔ)上采用lstm單元裁赠,因?yàn)殚L(zhǎng)短時(shí)記憶網(wǎng)絡(luò)本身就是在歷史記憶中添加一些權(quán)重,來(lái)保證遺忘的發(fā)生疮跑,增加了雙向组贺,同時(shí)凸舵,增強(qiáng)對(duì)未來(lái)上下文的預(yù)估祖娘。
? ? ? ? 實(shí)踐,修改模型:其余參數(shù)不變啊奄,只需要修改神經(jīng)元的定義函數(shù)即可:
def BiRNN(x, weights, biases):
? ? x = tf.transpose(x, [1, 0, 2])
? ? x = tf.reshape(x, [-1, n_inputs])
? ? x = tf.split(x, n_steps)
? ? lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units, forget_bias = 1.0)
? ? lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units, forget_bias = 1.0)
? ? outputs, _, _ = tf.contrib.rnn.static_bidirectional_rnn(lstm_fw_cell,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lstm_bw_cell, x,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dtype = tf.float32)
? ? return tf.matmul(outputs[-1], weights['out']) + biases['out']def BiRNN(x, weights, biases):
? ? x = tf.transpose(x, [1, 0, 2])
? ? x = tf.reshape(x, [-1, n_inputs])
? ? x = tf.split(x, n_steps)
? ? lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units, forget_bias = 1.0)
? ? lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden_units, forget_bias = 1.0)
? ? outputs, _, _ = tf.contrib.rnn.static_bidirectional_rnn(lstm_fw_cell,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lstm_bw_cell, x,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dtype = tf.float32)
? ? return tf.matmul(outputs[-1], weights['out']) + biases['out']
? ? ? ? 同樣的渐苏,需要將批數(shù)據(jù)轉(zhuǎn)置,因?yàn)橐掀渚仃嚦说男问焦娇洌覀兛梢缘弥猲_steps*n_inputs是向量的長(zhǎng)度琼富,我們每次輸入僅僅是1/n_steps的數(shù)據(jù),而我們需要一整塊向量來(lái)計(jì)算最終的結(jié)果庄新,需要用上一次訓(xùn)練好的權(quán)重鞠眉,偏執(zhí)來(lái)計(jì)算薯鼠,然后在這個(gè)基礎(chǔ)上在進(jìn)行擬合計(jì)算,可以根據(jù)lstm的結(jié)構(gòu)看出械蹋。
? ? ? ? 隨后出皇,定義兩個(gè)基礎(chǔ)lstm單元,一個(gè)前向哗戈,一個(gè)后向郊艘,兩個(gè)單元相互獨(dú)立計(jì)算,最后結(jié)果在考量?jī)蓚€(gè)的取值唯咬,即可纱注。
? ? ? ? 最后,考量雙向lstm的效果
? ? ? ? 至此胆胰,項(xiàng)目模型已經(jīng)完成狞贱,但依舊有很多可以提升的地方。