今日資料:
https://www.tensorflow.org/tutorials/recurrent
中文版:
http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/recurrent.html
代碼:
https://github.com/tensorflow/models/blob/master/tutorials/rnn/ptb/ptb_word_lm.py
今天的內容是基于 LSTM 建立一個語言模型
人每次思考時不會從頭開始,而是保留之前思考的一些結果,為現在的決策提供支持。RNN 的最大特點是可以利用之前的信息,即模擬一定的記憶,具體可以看我之前寫過的這篇文章:
詳解循環神經網絡(Recurrent Neural Network)
http://www.lxweimin.com/p/39a99c88a565
RNN 雖然可以處理整個時間序列信息,但是它記憶最深的還是最后輸入的一些信號,而之前的信號的強度就會越來越低,起到的作用會比較小。
而 LSTM 可以改善長距離依賴的問題,不需要特別復雜的調試超參數就可以記住長期的信息。關于 LSTM 可以看這一篇文章:
詳解 LSTM
http://www.lxweimin.com/p/dcec3f07d3b5
今天要實現一個語言模型,它是 NLP 中比較重要的一部分,給上文的語境后,可以預測下一個單詞出現的概率。
首先下載 ptb 數據集,有一萬個不同的單詞,有句尾的標記,并且將罕見的詞匯統一處理成特殊字符;
$ wget http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz
$ tar xvf simple-examples.tgz
PTBInput,
定義語言模型處理輸入數據的一些參數,包括 LSTM 的展開步數 num_steps
,用 reader.ptb_producer
讀取數據和標簽:
PTBModel,
def __init__(self, is_training, config, input_)
包括三個參數,訓練標記,配置參數以及輸入數據的實例;
把這幾個變量讀取到本地,hidden_size
是隱藏層的節點數,vocab_size
是詞匯表的大小;
def lstm_cell()
,設定基本的 LSTM 單元,用的是 tf.contrib.rnn.BasicLSTMCell
;
如果 if is_training and config.keep_prob < 1
這個條件的話,在 LSTM 單元后面可以加一個 dropout 層;
再用 tf.contrib.rnn.MultiRNNCell
把多層的 LSTM 堆加到一起;
用 cell.zero_state
將 LSTM 的初始狀態設置為0;
接下來是 embedding 矩陣,行數是詞匯表的大小,列數是每個單詞的向量表達的維度,在訓練過程中,它可以被優化和更新;
接下來我們要定義輸出,限制一下反向傳播時可以展開的步數,將 inputs 和 state 傳到 LSTM,然后把輸出結果添加到 outputs 的列表里;
然后將輸出的內容串到一起,接下來 softmax 層,接著要定義損失函數 loss,它的定義形式是這樣的:
然后我們要加和整個 batch 的誤差,再平均到每個樣本的誤差,并且保留最終的狀態,如果不是訓練狀態就直接返回;
接下來是定義學習速率,根據前面的 cost 計算一下梯度,并將梯度的最大范數設置好,相當于正則化的作用,可以防止梯度爆炸;
這個學習速率還可以更新,將其傳入給 _new_lr
,再執行 _lr_update
完成修改:
接下來可以定義幾種不同大小的模型的參數,其中有學習速率,還有梯度的最大范數,還是 LSTM 的層數,反向傳播的步數,隱含層節點數,dropout 保留節點的比例,學習速率的衰減速度:
run_epoch
,是定義訓練一個 epoch 數據的函數,首先初始化 costs 還有 iters,state;
將 LSTM 的所有 state 加入到 feed_dict
中,然后會生成結果的字典表 fetches,其中會有 cost 和 final_state
;
每完成 10% 的 epoch 就顯示一次結果,包括 epoch 的進度,perplexity(是cost 的自然常數指數,這個指標越低,表示預測越好),還有訓練速度(單詞數每秒):
在 main() 中:
用 reader.ptb_raw_data
讀取解壓后的數據;
得到 train_data, valid_data, test_data
數據集;
用 PTBInput 和 PTBModel 分別定義用來訓練的模型 m,驗證的模型 mvalid,測試的模型 mtest;
m.assign_lr
對 m 應用累計的 learning rate;
每個循環內執行一個 epoch 的訓練和驗證,輸出 Learning rate,Train Perplexity, Valid Perplexity。
推薦閱讀 歷史技術博文鏈接匯總
http://www.lxweimin.com/p/28f02bb59fe5
也許可以找到你想要的