1. 程式人生 > >TensorFlow深度學習筆記 迴圈神經網路實踐

TensorFlow深度學習筆記 迴圈神經網路實踐

載入資料

  • 使用text8作為訓練的文字資料集

text8中只包含27種字元:小寫的從a到z,以及空格符。如果把它打出來,讀起來就像是去掉了所有標點的wikipedia。

  • 直接呼叫lesson1中maybe_download下載text8.zip
  • 用zipfile讀取zip內容為字串,並拆分成單詞list
  • 用connections模組統計單詞數量並找出最常見的單詞

達成隨機取資料的目標

構造計算單元

embeddings = tf.Variable(
        tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
  • 構造一個vocabulary_size x embedding_size的矩陣,作為embeddings容器,
  • 有vocabulary_size個容量為embedding_size的向量,每個向量代表一個vocabulary,
  • 每個向量的中的分量的值都在-1到1之間隨機分佈
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
  • 呼叫tf.nn.embedding_lookup,索引與train_dataset對應的向量,相當於用train_dataset作為一個id,去檢索矩陣中與這個id對應的embedding
loss = tf.reduce_mean(
        tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed,
                                   train_labels, num_sampled, vocabulary_size))
  • 取樣計算訓練損失
optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)
  • 自適應梯度調節器,調節embedding列表的資料,使得偏差最小

  • 預測,並用cos值計算預測向量與實際資料的夾角作為預測準確度(相似度)指標

傳入資料進行訓練

  • 切割資料用於訓練,其中:
data_index = (data_index + 1) % len(data)
  • 依舊是每次取一部分隨機資料傳入
    • 等距離擷取一小段文字
    • 構造訓練集:每個擷取視窗的中間位置作為一個train_data
    • 構造標籤:每個擷取視窗中,除了train_data之外的部分,隨機取幾個成為一個list,作為label(這裡只隨機取了一個)
    • 這樣就形成了根據目標詞彙預測上下文的機制,即Skip-gram
  • 訓練100001次,每2000次輸出這兩千次的平均損失
  • 每10000次計算相似度,並輸出與驗證集中的詞最接近的詞彙列表
  • 用tSNE降維呈現詞彙接近程度
  • 用matplotlib繪製結果

CBOW

上面訓練的是Skip-gram模型,是根據目標詞彙預測上下文,而word2vec還有一種方式,CBOW,根據上下文預測目標詞彙。

實際上就是將Skip-gram中的輸入輸出反過來。

  • 修改擷取資料的方式

    • 構造標籤:每個擷取視窗的中間位置作為一個train_label
    • 構造訓練集:每個擷取視窗中,除了train_label之外的部分,作為train_data(這裡只隨機取了一個)
    • 這樣就形成了根據上下文預測目標詞彙的機制,即CBOW
  • 分別從embeding裡找到train_data裡每個word對應的vector,用tf.reduce_sum將其相加,將相加結果與train_label比較

# Look up embeddings for inputs.
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
# sum up vectors on first dimensions, as context vectors
embed_sum = tf.reduce_sum(embed, 0)
  • 訓練中依舊是調節embeding的引數來優化loss
  • 訓練結果如下圖,可以看到不同單詞的接近程度

RNN 造句

整體思路是,以一個文字中的一個詞作為train data,後續的所有詞作為train label,從而能夠根據一個給定詞,預測後續的片段。

訓練資料

  • BatchGenerator
    • text: 全部的文字資料
    • text_size:全部文字的字串長度
    • batch_size:每段訓練資料的大小
    • num_unrollings:要生成的訓練資料段的數目
    • segment:整個訓練資料集可以分成幾個訓練資料片段
    • cursor:重要,
      • 一開始記錄每個訓練資料片段的起始位置座標,即這個片段位於text的哪個index
      • 執行next_batch生成一個訓練資料的時候,遊標會從初始位置自增,直到取夠batch_size個數據
    • last_batch:上一個訓練資料片段
    • 每呼叫一次next,生成一個num_unrollings長的array,以last_batch開頭,跟著num_unrollings個batch
    • 每個batch的作為train_input,每個batch後面的一個batch作為train_label,每個step訓練num_unrolling個batch

lstm-cell

  • 為了解決消失的梯度問題,引入lstm-cell,增強model的記憶能力
  • 分別有三個門:輸入門,遺忘門,輸出門,構成一個cell
    • 輸入資料是num_nodes個詞,可能有vocabulary_size種詞
    • 輸入門:
  input_gate = sigmoid(i * ix + o * im + ib)
- 給輸入乘一個vocabulary_size * num_nodes大小的矩陣,給輸出乘一個num_nodes * num_nodes大小的矩陣;
- 用這兩個矩陣調節對輸入資料的取捨程度
- 用sigmoid這個非線性函式進行啟用
  • 遺忘門:
  forget_gate = sigmoid(i * fx + o * fm + fb)

思路同輸入門,用以對歷史資料做取捨

  • 輸出門:
  output_gate = sigmoid(i * ox + o * om + ob)

思路同輸入門,用以對輸出狀態做取捨

  • 組合:
  update = i * cx + o * cm + cb
  state = forget_gate * state + input_gate * tanh(update)
  lstm_cell = output_gate * tanh(state)
- 用同樣的方式構造新狀態update
- 用遺忘門處理歷史狀態state
- 用tanh啟用新狀態update
- 用輸入門處理新狀態update
- 整合新舊狀態,再用tanh啟用狀態state
- 用輸出門處理state

lstm優化

上面的cell中,update,output_gate,forget_gate,input_gate計算方法都是一樣的,
可以把四組引數分別合併,一次計算,再分別取出:

values = tf.split(1, gate_count, tf.matmul(i, input_weights) + tf.matmul(o, output_weights) + bias)
input_gate = tf.sigmoid(values[0])
forget_gate = tf.sigmoid(values[1])
update = values[2]

再將lstm-cell的輸出扔到一個WX+b中調整作為輸出

Optimizer

  • 採用one-hot encoding作為label預測
  • 採用交叉熵計算損失
  • 引入learning rate decay

Flow

  • 填入訓練資料到placeholder中
  • 驗證集的準確性用logprob來計算,即對可能性取對數
  • 每10次訓練隨機挑取5個字母作為起始詞,進行造句測試
  • 你可能注意到輸出的sentence是由sample得到的片語成的,而非選擇概率最高的詞,這是因為,如果一直取概率最高的詞,最後會一直重複這個概率最高的詞

Beam Search

上面的流程裡,每次都是以一個字元作為單位,可以使用多一點的字元做預測,取最高概率的那個,防止特殊情況導致的誤判

在這裡我們增加字元為2個,形成bigram,程式碼見:bigram_lstm.py

主要通過BigramBatchGenerator類實現

Embedding look up

由於bigram情況下,vocabulary_size變為 27*27個,使用one-hot encoding 做predict的話會產生非常稀疏的矩陣,浪費算力,計算速度慢

  • 資料輸入:BatchGenerator不再生成one-hot-encoding的向量作為輸入,而是直接生成bigram對應的index列表
  • embedding look up調整embedding,使bigram與vector對應起來
  • 將embedding look up的結果餵給lstm cell即可
  • 輸出時,需要將label和output都轉為One-hot-encoding,才能用交叉熵和softmax計算損失
  • 在tensor裡做data到one-hot-encoding轉換時,主要依賴tf.gather函式
  • 在對valid資料做轉換時,主要依賴one_hot_voc函式

Drop out

  • 在lstm cell中對input和output做drop out
  • Refer to this article

Seq2Seq

  • 最後一個問題是,將一個句子中每個詞轉為它的逆序字串,也就是一個seq到seq的轉換
  • 正經的實現思路是,word 2 vector 2 lstm 2 vector 2 word
  • 不過tensorflow已經有了這樣一個模型來做這件事情:Seq2SeqModel,關於這個模型可以看這個分析
    以及tensorflow的example
  • 只需要從batch中,根據字串逆序的規律生成target sequence,放到seq2seqmodel裡即可,主要依賴rev_id函式
  • 注意,用Seq2SeqModel的時候,size和num_layer會在學習到正確的規律前就收斂,我把它調大了一點
def create_model(sess, forward_only):
    model = seq2seq_model.Seq2SeqModel(source_vocab_size=vocabulary_size,
                                       target_vocab_size=vocabulary_size,
                                       buckets=[(20, 21)],
                                       size=256,
                                       num_layers=4,
                                       max_gradient_norm=5.0,
                                       batch_size=batch_size,
                                       learning_rate=1.0,
                                       learning_rate_decay_factor=0.9,
                                       use_lstm=True,
                                       forward_only=forward_only)
    return model
  • 引數含義
    • source_vocab_size: size of the source vocabulary.
    • target_vocab_size: size of the target vocabulary.
    • buckets: a list of pairs (I, O), where I specifies maximum input length
      that will be processed in that bucket, and O specifies maximum output
      length. Training instances that have inputs longer than I or outputs
      longer than O will be pushed to the next bucket and padded accordingly.
      We assume that the list is sorted, e.g., [(2, 4), (8, 16)].
    • size: number of units in each layer of the model.
    • num_layers: number of layers in the model.
    • max_gradient_norm: gradients will be clipped to maximally this norm.
    • batch_size: the size of the batches used during training;
      the model construction is independent of batch_size, so it can be
      changed after initialization if this is convenient, e.g., for decoding.
    • learning_rate: learning rate to start with.
    • learning_rate_decay_factor: decay learning rate by this much when needed.
    • use_lstm: if true, we use LSTM cells instead of GRU cells.
    • num_samples: number of samples for sampled softmax.
    • forward_only: if set, we do not construct the backward pass in the model.

參考連結


原文連結:http://www.jianshu.com/p/45dbfe5809d4

相關推薦

TensorFlow深度學習筆記 迴圈神經網路實踐

載入資料 使用text8作為訓練的文字資料集text8中只包含27種字元:小寫的從a到z,以及空格符。如果把它打出來,讀起來就像是去掉了所有標點的wikipedia。 直接呼叫lesson1中maybe_download下載text8.zip用zipfile讀取zip內容

吳恩達深度學習筆記(21)-神經網路的權重初始化為什麼要隨機初始化?

隨機初始化(Random+Initialization) 當你訓練神經網路時,權重隨機初始化是很重要的。 對於邏輯迴歸,把權重初始化為0當然也是可以的。 但是對於一個神經網路,如果你把權重或者引數都初始化為0,那麼梯度下降將不會起作用。 讓我們看看這是為什麼? 有兩個輸入

吳恩達序列模型學習筆記--迴圈神經網路(RNN)

1. 序列模型的應用 序列模型能解決哪些激動人心的問題呢? 語音識別:將輸入的語音訊號直接輸出相應的語音文字資訊。無論是語音訊號還是文字資訊均是序列資料。 音樂生成:生成音樂樂譜。只有輸出的音樂樂譜是序列資料,輸入可以是空或者一個整數。 情感分類:將輸入的評論句子轉換

吳恩達深度學習筆記(29)-神經網路訓練的方差和偏差分析

這一節我們學習在神經網路學習訓練時出現的結果進行分析,偏差和方差的表現和優化,仔細看好咯~ 偏差,方差(Bias /Variance) 幾乎所有機器學習從業人員都期望深刻理解偏差和方差,這兩個概念易學難精,即使你自己認為已經理解了偏差和方差的基本概念,卻總有一些意想不到的新東西出現。

深度學習筆記1-神經網路

深度學習筆記1-神經網路 神經元與多層網路 神經網路中最基本的成分是神經元模型,目前基本上用的都是“M-P神經元模型”。在這個模型中,神經元接收到來自 n

斯坦福大學深度學習筆記神經網路

神經網路演算法在八十到九十年代被廣泛使用過, 20世紀90年代,各種各樣的淺層機器學習模型相繼被提出,例如支撐向量機(SVM,Support Vector Machines)、 Boosting、最大熵方法(如LR,Logistic Regression)等。但之後便使用的變少了。但最近又開始流行起來了,原

深度學習迴圈神經網路

迴圈神經網路或RNN是一類用於處理序列資料的神經網路。 展開計算圖 考慮一個又外部訊號x(t)驅動的動態系統, s(t)=f(s(t−1),x(t);θ) 當前狀態包含了整個過去序列的資訊。 我們可以用一個函式g(t)代表t步展開後的迴圈: h(

深度學習迴圈神經網路(RNN)的變體LSTM、GRU

訪問請移步至,這裡有能“擊穿”平行宇宙的亂序並行位元組流… 假設我們試著去預測“I grew up in France… I speak fluent French”最後的詞French。當前的資訊建議下一個詞可能是一種語言的名字,但是如果我們需要弄清楚是什麼

TensorFlow入門-07.深度學習與深層神經網路

0.深度學習的定義(維基百科): 一類通過多層非線性變換對高複雜性資料建模演算法的合集。 1.深度學習與深層神經網路的關係: 因為深層神經網路時實現“多層非線性變換”最常用的一種方法,所以在實際中基本上可以認為深度學習就是深層神經網路的代名詞。 2.深度學習的兩個重要

機器學習Tensorflow(5)——迴圈神經網路、長短時記憶網路

  1.迴圈神經網路的標準模型 前饋神經網路能夠用來建立資料之間的對映關係,但是不能用來分析過去訊號的時間依賴關係,而且要求輸入樣本的長度固定 迴圈神經網路是一種在前饋神經網路中增加了分虧連結的神經網路,能夠產生對過去資料的記憶狀態,所以可以用於對序列資料的處理,並建立不同時段資料之間

吳恩達-深度學習-卷積神經網路-Stride 筆記

卷積中的步幅是另一個構建卷積神經網路的基本操作,讓我向你展示一個例子。如果你想用3×3的過濾器卷積這個7×7的影象,和之前不同的是,我們把步幅設定成了2。你還和之前一樣取左上方的3×3區域的元素的乘積,再加起來,最後結果為91。只是之前我們移動藍框的步長是1,現在移動的步長是

深度學習——卷積神經網路tensorflow框架下的應用案例

一、簡單的卷積神經網路的小應用 tensorflow框架下構建訓練一個簡單的3層卷積神經網路實現分類問題 (一)資料集介紹——SIGNS Datasets 教電腦破譯手語,在白色的牆壁前拍照,得到以下資料集。 現在的任務是建立一個演算法,使有語音障礙的人與不懂手語的人

深度學習(莫煩 神經網路 lecture 4) TensorFlow (GAN)

TensorFlow (GAN) 目錄 1、GAN 今天我們會來說說現在最流行的一種生成網路, 叫做 GAN, 又稱生成對抗網路, 也是 Generative Adversarial Nets 的簡稱 1.1 常見神經網路形式

TensorFlow學習筆記——深層神經網路的整理

  維基百科對深度學習的精確定義為“一類通過多層非線性變換對高複雜性資料建模演算法的合集”。因為深層神經網路是實現“多層非線性變換”最常用的一種方法,所以在實際中可以認為深度學習就是深度神經網路的代名詞。從維基百科給出的定義可以看出,深度學習有兩個非常重要的特性——多層和非線性。那麼為什麼要強調這兩個性質呢?

使用深度學習的CNN神經網路破解Captcha驗證碼

樣本資料的生成與處理: 我們先來看看mnist(一個手寫體數字圖片的資料集,有55000張0-9的手寫體數字的圖片)中圖片和圖片標籤的資料形式: 已知mnist資料集中的每張圖片是28x28畫素的灰度影象。每張圖片上是一個單獨的手寫體數字。 程式碼如下: from tensorf

機器學習迴圈神經網路(十)

摘要:        多層反饋RNN(Recurrent neural Network、迴圈神經網路)神經網路是一種節點定向連線成環的人工神經網路。這種網路的內部狀態可以展示動態時序行為。不同於前饋神經網路的是,RNN可以利用它內部的記憶來處理任意時序的輸入序列,這讓

學習記憶迴圈神經網路心得

如有繆誤歡迎指正     GRU結構向前傳播 心得(歡迎指正) 當遺忘門等於0的時候當前資訊拋棄 之前記憶前傳 當遺忘門等於1 的時候之前記憶拋棄 當前資訊前傳 當遺忘門的值為0和1之間的時候 調控前傳的記憶與資訊的比例   QAQ Q:LSTM與GRU 的

神經網路系列學習筆記(四)——神經網路之RNN學習筆記

  不同於傳統的FNNs(Feed-forward Neural Networks,前向反饋神經網路),RNNs引入了定向迴圈,能夠處理那些輸入之間前後關聯的問題。   RNNs的目的是用來處理序列資料。   具體的表現形式為網路會對前面的資訊進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連線

深度學習 --- 徑向基神經網路RBF詳解

上一節我們基本上打開了深度學習的大門,其實下一步應該是卷積神經網路即CNN了,但是呢卷積神經網路的最後一層採用的是徑向基神經網路,為了以後到CNN不用再費力氣將RBF和保持CNN的整體性和連貫性,因此這裡我們系統的學習一下,講解之前我們還是先好好回顧我們的總體學習思路,首先我們從BP神經網路開始

小川學習筆記--BP神經網路JAVA程式碼解析

小川學習筆記–BP神經網路JAVA程式碼解析 闊別有些時日了,今天我就寫一篇最近學習BP神經網路JAVA程式碼的一個筆記,我們大家都知道BP神經網路是在上個世紀進行了兩次熱潮,由於反向傳播的發現從而促進了神經網路的發展。由於筆者在本科期間還未學習過JAVA,因此還在學習階段,對於一些程式