目錄網絡
循環神經網絡的主要用途是處理和預測序列數據。循環神經網絡的來源就是爲了刻畫一個序列當前的輸出與以前信息的關係。也就是說,循環神經網絡的隱藏層之間的節點是有鏈接的,隱藏層的輸入不只包括輸入層的輸出,還包括上一時刻隱藏層的輸出。下面給出一個長度爲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時),任何信息都沒法經過。spa
假設一門語言中全部可能的句子服從某一個機率分佈,每一個句子出現的機率加起來爲1,那麼」語言模型」的任務就是預測每一個句子在語言中出現的機率。不少生成天然語言文本的應用都依賴語言模型來優化輸出文本的流暢性,生成的句子在語言模型中的機率越高,說明其越有多是一個流暢、天然的句子。翻譯
那麼,如何計算一個句子的機率呢?首先一個句子能夠被當作是一個單詞序列:設計
其中m爲句子的長度,那麼它的機率能夠表示爲:
爲了控制參數數量,n-gram模型作了一個有限歷史假設:當前單詞的出現機率僅僅於前面的n-1個單詞相關,所以以上公式能夠近似爲:
n-gram模型裏的n指的是當前單詞依賴它前面的單詞的個數。一般n能夠取一、二、三、4,其中n取一、二、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的方法以下:
其中 是計算原文各單詞與當前解碼器狀態的「相關度」的函數。最經常使用的 函數定義是一個帶有單個隱藏層的前饋神經網絡: