TensorFlow實戰Google深度學習框架8-9章學習筆記

目錄

第8章 循環神經網絡

第9章 自然語言處理

 

 


第8章 循環神經網絡

循環神經網絡的主要用途是處理和預測序列數據。循環神經網絡的來源就是爲了刻畫一個序列當前的輸出與之前信息的關係。也就是說,循環神經網絡的隱藏層之間的節點是有連接的,隱藏層的輸入不僅包括輸入層的輸出,還包括上一時刻隱藏層的輸出。下面給出一個長度爲2的RNN前向傳播示例代碼:

import numpy as np
 
X = [1,2]
state = [0.0, 0.0]
w_cell_state = np.asarray([[0.1, 0.2], [0.3, 0.4]])
w_cell_input = np.asarray([0.5, 0.6])
b_cell = np.asarray([0.1, -0.1])
w_output = np.asarray([[1.0], [2.0]])
b_output = 0.1
 
for i in range(len(X)):
    before_activation = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell
    state = np.tanh(before_activation)
    final_output = np.dot(state, w_output) + b_output
    print ("before activation: ", before_activation)
    print ("state: ", state)

print ("output: ", final_output)

運行結果:

before activation:  [0.6 0.5]
state:  [0.53704957 0.46211716]
output:  [1.56128388]
before activation:  [1.2923401  1.39225678]
state:  [0.85973818 0.88366641]
output:  [2.72707101] 

 

循環神經網絡可以很好地利用傳統神經網絡結構不能建模的信息,但同時,這也帶來了更大的技術挑戰——長期依賴問題。在這些問題中,模型僅僅需要短期內的信息來執行當前的任務。但同樣也會有一些上下文場景更加複雜的情況。因此,當預測位置和相關信息之間的文本間隔變得很大時,簡單的循環神經網絡有可能會喪失學習到距離如此遠的信息的能力。或者在複雜語言場景中,有用信息的間隔有大有小、長短不一,循環神經網絡的性能也會受到限制。

長短時記憶網絡(LSTM)的設計就是爲了解決這個問題,在很多任務上,採用LSTM結構的循環神經網絡比標準的循環神經網絡表現更好。LSTM是一種擁有三個門結構的特殊網絡結構,分別爲輸入門、遺忘門和輸出門。

LSTM靠一些“門”的結構讓信息有選擇性地影響循環神經網絡中每一個時刻的狀態。所謂“門”的結構就是一個使用sigmoid神經網絡和一個按位做乘法的操作,這兩個操作合在一起就是一個“門”的結構。之所以該結構叫做“門”,是因爲使用sigmoid作爲激活函數的全連接神經網絡層會輸出一個0到1之間的數值,描述當前輸入有多少信息量可以通過這個結構。於是這個結構的功能就類似於一扇門,當門打開時(sigmoid神經網絡層輸出爲1時),全部信息都可以通過;當門關上時(sigmoid神經網絡層輸出爲0時),任何信息都無法通過。

 


第9章 自然語言處理

假設一門語言中所有可能的句子服從某一個概率分佈,每個句子出現的概率加起來爲1,那麼”語言模型”的任務就是預測每個句子在語言中出現的概率。很多生成自然語言文本的應用都依賴語言模型來優化輸出文本的流暢性,生成的句子在語言模型中的概率越高,說明其越有可能是一個流暢、自然的句子。

 

那麼,如何計算一個句子的概率呢?首先一個句子可以被看成是一個單詞序列:

其中m爲句子的長度,那麼它的概率可以表示爲:

爲了控制參數數量,n-gram模型做了一個有限歷史假設:當前單詞的出現概率僅僅於前面的n-1個單詞相關,因此以上公式可以近似爲:

n-gram模型裏的n指的是當前單詞依賴它前面的單詞的個數。通常n可以取1、2、3、4,其中n取1、2、3時分別稱爲unigram、bigram和trigram。當n越大時,n-gram模型在理論上越準確,但也越複雜,需要的計算量和訓練語料數據量也就越大,因此n取大於等於4的情況非常少。

n-gram模型的參數一般採用最大似然估計(Maximum Likelihood Estimation, MLE)方法計算:

語言模型效果好壞的常用評價指標是複雜度(perplexity),在一個測試集上得到的perplexity越低,說明建模的效果越好。計算perplexity的公式如下:

在語言模型的訓練中,通常採用perplexity的對數表達形式:

在預測下個單詞時,n-gram模型只能考慮前n個單詞的信息,這就對語言模型的能力造成了很大的限制。與之相比,循環神經網絡可以將任意長度的上文信息存儲在隱藏狀態中,因此使用循環神經網絡作爲語言模型有着天然的優勢。

 

基於循環神經網絡的神經語言模型相比於正常的循環神經網絡,在NLP的應用中主要多了兩層:詞向量層(embedding)和softmax層。

在輸入層,每一個單詞用一個實數向量表示,這個向量被稱爲“詞向量”(word embedding)。詞向量可以形象地理解爲將詞彙表嵌入到一個固定維度的實數空間裏。將單詞編號轉化爲詞向量主要有兩大作用:降低輸入的維度和增加語義信息。

Softmax層的作用是將循環神經網絡大的輸出轉化爲一個單詞表中每個單詞的輸出概率。

 

Seq2Seq模型的基本思想非常簡單——使用一個循環神經網絡讀取輸入句子,將整個句子的信息壓縮到一個固定維度的編碼中;再使用另一個循環神經網絡讀取輸入句子,將整個句子的信息壓縮到一個固定維度的編碼中;再使另一個循環神經網絡讀取這個編碼,將其“解壓”爲目標語言的一個句子。這兩個循環神經網絡分別稱爲編碼器(Encoder)和解碼器(Decoder),這個模型也稱爲encoder-decoder模型。

 

在Seq2Seq模型中,編碼器將完整的輸入句子壓縮到一個維度固定的向量中,然後解碼器根據這個向量生成輸出句子。當輸入句子較長時,這個中間向量難以存儲足夠的信息,就成爲這個模型的一個瓶頸。注意力(“Attention”)機制就是爲了解決這個問題而設計的。注意力機制允許解碼器隨時查閱輸入句子的部分單詞或片段,因此不需要在中間向量中存儲所有信息。

 

解碼器在解碼的每一步將隱藏狀態作爲查詢的輸入來“查詢”編碼器的隱藏狀態,在每個輸入的位置計算一個反映與查詢輸入相關程度的權重,再根據這個權重對輸入位置的隱藏狀態求加權平均。加權平均後得到的向量稱爲“context”,表示它時與翻譯當前單詞最相關的原文信息。在解碼下一個單詞時,將context作爲額外信息輸入到循環神經網絡中,這樣循環神經網絡可以時刻讀取原文中最相關的信息,而不必完全依賴於上一時刻的隱藏狀態。計算j時刻的context的方法如下:

其中 是計算原文各單詞與當前解碼器狀態的“相關度”的函數。最常用的 函數定義是一個帶有單個隱藏層的前饋神經網絡:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章