天天看點

TensorFlow教程之完整教程 2.8 遞歸神經網絡循環神經網絡

本文檔為tensorflow參考文檔,本轉載已得到tensorflow中文社群授權。

此教程将展示如何在高難度的語言模型中訓練循環神經網絡。該問題的目标是獲得一個能确定語句機率的機率模型。為了做到這一點,通過之前已經給出的詞語來預測後面的詞語。我們将使用 ptb(penn tree bank) 資料集,這是一種常用來衡量模型的基準,同時它比較小而且訓練起來相對快速。

本教程使用的下面檔案的目錄是 <code>models/rnn/ptb</code>:

檔案

作用

<code>ptb_word_lm.py</code>

在 ptb 資料集上訓練一個語言模型.

<code>reader.py</code>

讀取資料集.

本教程需要的資料在 data/ 路徑下,來源于 tomas mikolov 網站上的 ptb 資料集<code>http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz</code>。

該資料集已經預先處理過并且包含了全部的 10000 個不同的詞語,其中包括語句結束标記符,以及标記稀有詞語的特殊符号 <code>(&lt;unk&gt;)</code> 。我們在 <code>reader.py</code> 中轉換所有的詞語,讓他們各自有唯一的整型辨別符,便于神經網絡處理。

模型的核心由一個 lstm 單元組成,其可以在某時刻處理一個詞語,以及計算語句可能的延續性的機率。網絡的存儲狀态由一個零矢量初始化并在讀取每一個詞語後更新。而且,由于計算上的原因,我們将以 <code>batch_size</code> 為最小批量來處理資料。

基礎的僞代碼就像下面這樣:

為使學習過程易于處理,通常的做法是将反向傳播的梯度在(按時間)展開的步驟上照一個固定長度(<code>num_steps</code>)截斷。 通過在一次疊代中的每個時刻上提供長度為 <code>num_steps</code> 的輸入和每次疊代完成之後反向傳導,這會很容易實作。

一個簡化版的用于計算圖建立的截斷反向傳播代碼:

下面展現如何實作疊代整個資料集:

嵌入的矩陣會被随機地初始化,模型會學會通過資料分辨不同詞語的意思。

我們想使目标詞語的平均負對數機率最小

TensorFlow教程之完整教程 2.8 遞歸神經網絡循環神經網絡

實作起來并非很難,而且函數 <code>sequence_loss_by_example</code> 已經有了,可以直接使用。

論文中的典型衡量标準是每個詞語的平均困惑度(perplexity),計算式為

TensorFlow教程之完整教程 2.8 遞歸神經網絡循環神經網絡

同時我們會觀察訓練過程中的困惑度值(perplexity)。

要想給模型更強的表達能力,可以添加多層 lstm 來處理資料。第一層的輸出作為第二層的輸入,以此類推。

類 <code>multirnncell</code> 可以無縫的将其實作:

首先需要建構庫,在 cpu 上編譯:

如果你有一個強大的 gpu,可以運作:

運作模型:

教程代碼中有 3 個支援的模型配置參數:"small", "medium" 和 "large"。它們指的是 lstm 的大小,以及用于訓練的超參數集。

模型越大,得到的結果應該更好。在測試集中 <code>small</code> 模型應該可以達到低于 120 的困惑度(perplexity),<code>large</code> 模型則是低于 80,但它可能花費數小時來訓練。

還有幾個優化模型的技巧沒有提到,包括:

随時間降低學習率,

lstm 層間 dropout.

繼續學習和更改代碼以進一步改善模型吧。