“全球人工智能”擁有十多萬AI產(chǎn)業(yè)用戶,10000多名AI技術(shù)專家,。主要來自:北大,,清華,,中科院,麻省理工,,卡內(nèi)基梅隆,,斯坦福,哈佛,,牛津,,劍橋...以及谷歌,騰訊,,百度,,臉譜,微軟,,阿里,,海康威視,,英偉達(dá)......等全球名校和名企,。 摘要: 本文作者正在寫自己的新書Machine Learning with TensorFlow,這篇博文只是他新書的一小部分,,作者用簡單的語言介紹了RNN,,不用一個(gè)小例子介紹了如何使用Tensorflow中內(nèi)置的RNN模型進(jìn)行預(yù)測。 今天我們將研究一種名為循環(huán)神經(jīng)網(wǎng)絡(luò)的神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)。它針對的不是自然語言數(shù)據(jù),,而是處理連續(xù)的時(shí)間數(shù)據(jù),,如股票市場價(jià)格。在本文結(jié)束之時(shí),,你將能夠?qū)r(shí)間序列數(shù)據(jù)中的模式進(jìn)行建模,,以對未來的值進(jìn)行預(yù)測。
1.上下文信息 回到學(xué)校,,我的一個(gè)期中考試僅由真的或假的問題組成時(shí),。假設(shè)一半的答案是“真的”,而另一半則是“假的”,。我想出了大部分問題的答案,,剩下的是靠隨機(jī)猜測。我做了一件聰明的事情,,也許你也可以嘗試一下這個(gè)策略,。在計(jì)數(shù)了我的“真”的答案之后,我意識到它與“假”這個(gè)答案不成比例,。于是我的大部分猜測是“假”的,,這樣就可以平衡分配。 這竟然是有效的,。在那一時(shí)刻我感覺到我是狡猾的,。這是什么樣的判斷力,使我們對自己的決定那么有信心,,我們又如何將這種判斷力給予神經(jīng)網(wǎng)絡(luò),? 這個(gè)問題的一個(gè)答案是使用上下文來回答問題。語境提示是可以提高機(jī)器學(xué)習(xí)算法性能的重要信號,。例如,,假設(shè)你想檢查一個(gè)英文句子,并標(biāo)記每個(gè)單詞的詞性,。 傻傻的方法是將每個(gè)單詞單獨(dú)分類為“名詞”,,“形容詞”等,而不確認(rèn)其相鄰的單詞,。單詞“努力”被用作動詞,,但根據(jù)上下文,你也可以使用它作為一個(gè)形容詞,,單純的詞性標(biāo)注是一個(gè)需要努力的問題,。 更好的方法是考慮上下文信息。為了向神經(jīng)網(wǎng)絡(luò)提供上下文信息,,我們可以使用稱為循環(huán)神經(jīng)網(wǎng)絡(luò)的體系結(jié)構(gòu),。 循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)簡介
為了理解循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),,我們首先來看一下圖1所示的簡單架構(gòu)。它將輸入向量X(t)作為輸入,,并在某個(gè)時(shí)間(t)產(chǎn)生一個(gè)向量Y(t)的輸出,。中間的圓圈表示網(wǎng)絡(luò)的隱藏層。
圖1分別具有標(biāo)記為X(k)和Y(k)的輸入和輸出層的神經(jīng)網(wǎng)絡(luò) 通過足夠的輸入/輸出示例,,你可以在TensorFlow中了解網(wǎng)絡(luò)的參數(shù),。例如,我們將輸入權(quán)重稱為矩陣W in,,輸出權(quán)重作為矩陣W out,。假設(shè)有一個(gè)隱藏層,,稱為向量Z(t),。
如圖2所示,,神經(jīng)網(wǎng)絡(luò)的前半部分的特征在于函數(shù)Z(t)= X(t)* W in,,神經(jīng)網(wǎng)絡(luò)的后半部分形式為Y(t)= Z(t)* W out。同樣,如果你愿意,,整個(gè)神經(jīng)網(wǎng)絡(luò)可以是函數(shù)Y(t)=(X(t)* Win)* W out。
圖2神經(jīng)網(wǎng)絡(luò)的隱藏層可以被認(rèn)為是數(shù)據(jù)的隱藏,,由其輸入權(quán)重編碼并輸出權(quán)重解碼,。 在微調(diào)神經(jīng)網(wǎng)絡(luò)后,,你可能希望在現(xiàn)實(shí)世界的場景中開始使用你所學(xué)習(xí)的模型,。通常,,這意味著你將多次調(diào)用該模型,,甚至可能連續(xù)反復(fù)調(diào)用,,如圖3所示,。
圖3通常,,我們會運(yùn)行相同的神經(jīng)網(wǎng)絡(luò)多次,而不考慮關(guān)于先前運(yùn)行的隱藏狀態(tài)。 在每個(gè)時(shí)間t,,當(dāng)調(diào)用學(xué)習(xí)模型時(shí),這種體系結(jié)構(gòu)不考慮關(guān)于以前運(yùn)行的結(jié)果經(jīng)驗(yàn),。就像預(yù)測股市走勢一樣,,只看當(dāng)前的數(shù)據(jù),。循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)不同,因?yàn)樗肓宿D(zhuǎn)移權(quán)重W來跨越時(shí)間傳遞信息,。圖4顯示了必須在RNN中學(xué)習(xí)的三個(gè)加權(quán)矩陣,。
圖4循環(huán)神經(jīng)網(wǎng)絡(luò)架構(gòu)可以利用網(wǎng)絡(luò)的先前狀態(tài)來實(shí)現(xiàn)其優(yōu)點(diǎn),。 理論上很好理解,但是你在這里必須要親自動手做一下,。讓我們來吧,!接下來將介紹如何使用TensorFlow的內(nèi)置RNN模型。我們將使用這個(gè)RNN在現(xiàn)實(shí)世界的時(shí)間數(shù)據(jù)來預(yù)測未來,! 2.實(shí)施循環(huán)神經(jīng)網(wǎng)絡(luò) 當(dāng)我們實(shí)施RNN時(shí),,我們將使用TensorFlow,。如圖4所示,,你不需要手動構(gòu)建網(wǎng)絡(luò),因?yàn)門ensorFlow庫中已經(jīng)支持一些魯棒(robust)的RNN模型,。 參考有關(guān)RNN的TensorFlow庫信息,請參見https://www./tutorials/recurrent,。 RNN的一種類型模型被稱為長短期記憶網(wǎng)絡(luò)(LSTM)。我覺得這是一個(gè)有趣的名字。它聽起來也意味著:短期模式長期不會被遺忘,。 LSTM的精確實(shí)現(xiàn)細(xì)節(jié)不在本文的范圍之內(nèi)。相信我,,如果只學(xué)習(xí)LSTM模型會分散我們的注意力,因?yàn)樗€沒有確定的標(biāo)準(zhǔn),。 進(jìn)一步閱讀:為了了解如何從頭開始執(zhí)行LSTM,,我建議你閱讀以下的文章:https://apaszke./lstm-explained.html 我們現(xiàn)在開始我們的教程。首先從編寫我們的代碼開始,,先創(chuàng)建一個(gè)新的文件,,叫做
步驟1:導(dǎo)入相關(guān)庫 import numpy as npimport tensorflow as tffrom tensorflow.contrib import rnn 接著,定義一個(gè)類叫做 步驟2:定義一個(gè)類及其構(gòu)造函數(shù) class SeriesPredictor: def __init__(self, input_dim, seq_size, hidden_dim=10): self.input_dim = input_dim //#A self.seq_size = seq_size //#A self.hidden_dim = hidden_dim //#A self.W_out = tf.Variable(tf.random_normal([hidden_dim, 1]),name='W_out') //#B self.b_out = tf.Variable(tf.random_normal([1]), name='b_out') //#B self.x = tf.placeholder(tf.float32, [None, seq_size, input_dim]) //#B self.y = tf.placeholder(tf.float32, [None, seq_size]) //#B self.cost = tf.reduce_mean(tf.square(self.model() - self.y)) //#C self.train_op = tf.train.AdamOptimizer().minimize(self.cost) //#C self.saver = tf.train.Saver() //#D #A超參數(shù),。 #B權(quán)重變量和輸入占位符。 #C成本優(yōu)化器(cost optimizer),。 #D輔助操作,。 接下來,我們使用TensorFlow的內(nèi)置RNN模型,,名為BasicLSTMCell,。LSTM單元的隱藏維度是通過時(shí)間的隱藏狀態(tài)的維度。我們可以使用該 步驟3:定義RNN模型 def model(self): ''' :param x: inputs of size [T, batch_size, input_size] :param W: matrix of fully-connected output layer weights :param b: vector of fully-connected output layer biases ''' cell = rnn.BasicLSTMCell(self.hidden_dim) #A outputs, states = tf.nn.dynamic_rnn(cell, self.x, dtype=tf.float32) #B num_examples = tf.shape(self.x)[0] W_repeated = tf.tile(tf.expand_dims(self.W_out, 0), [num_examples, 1, 1])#C out = tf.matmul(outputs, W_repeated) + self.b_out out = tf.squeeze(out) return out #A創(chuàng)建一個(gè)LSTM單元,。 #B運(yùn)行輸入單元,,獲取輸出和狀態(tài)的張量。 #C將輸出層計(jì)算為完全連接的線性函數(shù),。 通過定義模型和成本函數(shù),,我們現(xiàn)在可以實(shí)現(xiàn)訓(xùn)練函數(shù),該函數(shù)學(xué)習(xí)給定示例輸入/輸出對的LSTM權(quán)重,。如步驟4所示,,你打開會話并重復(fù)運(yùn)行優(yōu)化器,。 另外,你可以使用交叉驗(yàn)證來確定訓(xùn)練模型的迭代次數(shù),。在這里我們假設(shè)固定數(shù)量的epocs,。 訓(xùn)練后,將模型保存到文件中,,以便稍后加載使用,。 步驟4:在一個(gè)數(shù)據(jù)集上訓(xùn)練模型 def train(self, train_x, train_y): with tf.Session() as sess: tf.get_variable_scope().reuse_variables() sess.run(tf.global_variables_initializer()) for i in range(1000): #A mse = sess.run([self.train_op, self.cost], feed_dict={self.x: train_x, self.y: train_y}) if i % 100 == 0: print(i, mse) save_path = self.saver.save(sess, 'model.ckpt') print('Model saved to {}'.format(save_path)) #A訓(xùn)練1000次 我們的模型已經(jīng)成功地學(xué)習(xí)了參數(shù)。接下來,,我們想評估利用其他數(shù)據(jù)來評估以下預(yù)測模型的性能,。步驟5加載已保存的模型,并通過饋送一些測試數(shù)據(jù)以此來運(yùn)行模型,。如果學(xué)習(xí)的模型在測試數(shù)據(jù)上表現(xiàn)不佳,,那么我們可以嘗試調(diào)整LSTM單元格的隱藏維數(shù)。 步驟5:測試學(xué)習(xí)的模型 def test(self, test_x): with tf.Session() as sess: tf.get_variable_scope().reuse_variables() self.saver.restore(sess, './model.ckpt') output = sess.run(self.model(), feed_dict={self.x: test_x}) print(output) 但為了完善自己的工作,,讓我們組成一些數(shù)據(jù),,并嘗試訓(xùn)練預(yù)測模型。在步驟6中,,我們將創(chuàng)建輸入序列,,稱為 步驟6訓(xùn)練并測試一些虛擬數(shù)據(jù) if __name__ == '__main__': predictor = SeriesPredictor(input_dim=1, seq_size=4, hidden_dim=10) train_x = [[[1], [2], [5], [6]], [[5], [7], [7], [8]], [[3], [4], [5], [7]]] train_y = [[1, 3, 7, 11], [5, 12, 14, 15], [3, 7, 9, 12]] predictor.train(train_x, train_y) test_x = [[[1], [2], [3], [4]], #A [[4], [5], [6], [7]]] #B predictor.test(test_x) #A預(yù)測結(jié)果應(yīng)為1,3,,5,,7。 #B預(yù)測結(jié)果應(yīng)為4,,9,,11,13,。 你可以將此預(yù)測模型視為黑盒子,,并用現(xiàn)實(shí)世界的時(shí)間數(shù)據(jù)進(jìn)行測試。 這篇博文只是我新書的一小部分,,如果你想要學(xué)習(xí)更多的知識請移步: |
|