神經網路序列建模(一)
在之前的深度學習簡介中,我們瞭解瞭如何使用神經網路對許多示例的資料集進行建模。好訊息是神經網路的基本架構在任何應用中都是非常通用的:堆疊幾個感知器以組成複雜的層次模型,並使用梯度下降和反向傳播進行優化。
儘管如此,您可能已經聽說過多層感知器(MLP),卷積神經網路(CNN),遞迴神經網路(RNN),LSTM,自動編碼器等。這些深度學習模型彼此不同。眾所周知,每個模型在某些特定任務中都具有特殊效能,即使從根本上說,它們都共享相同的基本體系結構。
它們之間的區別在於它們更適合某些資料結構:文字處理可能與影象處理不同,而影象處理又可能與訊號處理不同。
在本文的背景下,我們將重點關注將 序列 建模 為眾所周知的資料結構,並將研究其 特定的學習框架 。
序列建模的應用在日常業務實踐中非常豐富。 其中一些產品的出現是為了滿足當今服務質量和客戶參與方面的挑戰。 這裡有一些例子:
-
語音識別能夠傾聽客戶的聲音。
-
機器語言從不同的源語言翻譯成更常見的語言。
-
主題提取以查詢客戶翻譯查詢的主要主題。
-
語音生成具有會話能力並以類似人的方式與客戶互動。
-
文字總結客戶反饋,以解決關鍵挑戰和難點。
在汽車工業中,自助停車也是一種序列建模任務。 實際上,停車可以看作是一系列的行動,其中下一個運動取決於之前的運動。
其他應用程式包括文字分類,將視訊翻譯成自然語言,影象標題生成,手寫識別/生成,異常檢測等等,這些都是我們目前無法思考(或意識到)的。
然而,在我們進一步討論序列建模的應用之前,讓我們在討論序列時理解我們正在處理的內容。
序列建模簡介
序列是一種資料結構,其中每個示例都可以看作一系列資料點。 這句話:“我目前正在閱讀一篇關於使用神經網路進行序列建模的文章”,這是一個由多個單詞和單詞相互依賴組成的例子。 這同樣適用於醫療記錄。 隨著時間的推移,一個單一的醫療記錄包括許多測量。 語音波形也是如此。
那麼為什麼我們需要一個不同的學習框架來模擬序列,以及我們在這個框架中尋找的特殊功能是什麼?
為了便於說明而不失一般性,讓我們將文字作為一系列文字集中在一起,以激發對不同學習框架的這種需求。
實際上,機器學習演算法通常要求將文字輸入表示為 固定長度的 向量。 訓練模型(網路)所需的許多操作可以通過對輸入特徵值矩陣和權重矩陣的代數運算來表達(考慮n-by-p設計矩陣,其中n是觀察到的樣本數,以及p是所有樣品中測量的變數數)。
對於文字而言,最常見的固定長度矢量表示可能是 單詞 袋或n-gram包,因為它簡單,高效並且通常令人驚訝的準確性。 然而,詞袋(BOW)表示有許多缺點:
-
首先,單詞順序丟失,因此不同的句子可以具有完全相同的表示,只要使用相同的單詞即可。 例如:“食物很好,一點都不差。”vs“食物很糟糕,根本不好吃。” 即使n-gram包在短時間內考慮單詞順序,它也會受到資料稀疏性和高維度的影響。
-
另外,詞袋和n-gram對詞語的語義知之甚少,或者更正式地知道詞之間的距離。 這意味著“強大”,“強大”和“巴黎”這兩個詞同樣遙遠,儘管語義上“強大”應該比“巴黎”更接近“強”。
-
人類每時每刻都不會從頭開始思考。 當您閱讀本文時, 您可以根據您對之前單詞的理解來理解每個單詞 。 傳統的神經網路不能做到這一點,這似乎是一個主要的缺點。 作為文字表示的詞袋和n-gram不允許跟蹤同一句子或段落內的長期依賴性。
-
使用傳統神經網路(例如前饋神經網路)建模序列的另一個缺點是不跨時間共享引數的事實。 讓我們舉個例子:“星期一,下雪了”,“週一下雪了”。 這些句子意思相同,但細節在序列的不同部分。 實際上,當我們將這兩個句子提供給預測任務的前饋神經網路時,模型將在每個時刻為“星期一”分配不同的權重。 如果它們出現在序列中的不同點,我們學習的序列將不會轉移。 共享引數使網路能夠在序列中的任何位置查詢給定的特徵,而不是僅在某個區域中查詢。
因此,為了模擬序列,我們需要一個特定的學習框架,能夠:
-
處理可變長度序列
-
保持順序順序
-
跟蹤長期依賴關係,而不是過短地減少輸入資料
-
在整個序列中共享引數(所以不要重新學習整個序列中的事物)
遞迴神經網路(RNN)可以解決這個問題。 它們是具有迴圈的網路,允許資訊持續存在。
遞迴神經網路
迴歸神經網路如何工作?
迴歸神經網路的構建方式與“傳統”神經網路相同。 我們有一些輸入,我們有一些隱藏的層,我們有一些輸出。
唯一的區別是每個隱藏單元的功能略有不同。 那麼,讓我們來探討這個隱藏單元的工作原理。
迴圈隱藏單元計算輸入的函式及其自己的先前輸出,也稱為單元狀態。 對於文字資料,輸入可以是表示 n個 單詞 的句子中 的單詞 x(i) 的向量 (也稱為單詞嵌入)。
W 和 U 是權重矩陣, tanh 是雙曲正切函式。 類似地,在下一步,它計算新輸入及其先前單元狀態的函式: s2 = tanh ( Wx1 + Us1 ) 。此行為類似於前饋網路中的隱藏單元。差異,適用於序列,是否我們正在新增一個額外的術語來合併其自己的先前狀態。
檢視遞迴神經網路的常見方法是跨時間展開它們。 我們可以注意到 在整個序列 中 我們使用相同的權重矩陣 W 和 U. 這解決了我們的引數共享問題 。 我們沒有為序列的每個點都有新的引數。 因此,一旦我們學到了什麼,它就可以應用於序列中的任何一點。
對序列的每個點都沒有新引數的事實也有助於我們 處理可變長度序列 。 如果序列長度為4,我們可以將此RNN展開為四個時間步長。 在其他情況下,我們可以將其展開到十個時間步,因為在演算法中沒有預先指定序列的長度。 通過展開我們只是意味著我們為整個序列寫出網路。 例如,如果我們關心的序列是5個單詞的句子,則網路將展開為5層神經網路,每個單詞一個層。
注意:
-
Sn ,時刻 n 的單元狀態 ,可以包含來自所有過去時間步的資訊:每個單元狀態是先前自身狀態的函式,而前一個自身狀態又是先前單元狀態的函式。 這解決了我們的長期依賴問題 。
-
上圖在每個時間步都有輸出,但根據任務,這可能不是必需的。 例如,在預測句子的情緒時,我們可能只關心最終的輸出,而不是每個單詞之後的情緒。 同樣,我們可能不需要在每個時間步驟輸入。 RNN的主要特徵是其隱藏狀態,它捕獲有關序列的一些資訊。
現在我們已經瞭解了單個隱藏單元的工作原理,我們需要弄清楚如何訓練整個迴歸神經網路,它由許多隱藏單元組成,甚至包含許多隱藏單元的多層。
我們如何訓練迴歸神經網路?
讓我們考慮以下任務:對於一組英語演講,我們需要模型自動將口語轉換為文字,即在每個時間步,模型根據語音的詞性生成成績單(輸出)的預測。此時間步長(新輸入)和前一個記錄(前一個單元狀態)。
當然,因為我們在每個時間步都有一個輸出,我們可以在每個時間步都有一個損失。 這種損失反映了預測的成績單接近“官方”成績單的程度。
總損失只是每個時間步的損失總和。
由於損失是網路權重的函式,我們的任務是找到 實現最低損失 的權重集 θ 。 為此,正如第一篇文章“深度學習簡介”中所解釋的那樣,我們可以 在每個時間步長應用具有反向傳播(鏈規則)的梯度下降演算法 ,從而考慮額外的時間維度。
W 和 U 是我們的兩個權重矩陣。 讓我們試試 W吧 。
知道總損失是每個時間步長的損失之和,總梯度只是每個時間步長的梯度之和:
現在,我們可以專注於單個時間步長來計算相對於 W 的損失的導數 。
易於操作:我們只使用反向傳播。
我們記得 s2 = tanh(Wx1 + Us1) 所以s2也取決於s1而s1也取決於W. 這實際上意味著我們不能將 s2 的導數 作為常數 保留 為 W。 我們必須進一步擴大它。
那麼 s2 如何 依賴 W ?
它直接取決於W,因為它直接輸入(參見 s2的 公式 )。 我們也知道 s2 取決於 取決於W的 s1 。我們還可以看到 s2 取決於 s0 ,這也依賴於W.
因此,關於 W 的損失的衍生物 可以寫成如下:
我們可以看到,最後兩個術語基本上將 W 在之前時間步長中 的貢獻與 時間步長 t 處的誤差 相加 。 這是理解我們如何建模長期依賴關係的關鍵。 從一次迭代到另一次迭代,梯度下降演算法允許行動網路引數,使得它們包括對過去時間步的誤差的貢獻。
對於任何時間步 t ,相對於 W 的損失的導數 可以寫成如下:
因此,為了訓練模型,即估計網路的權重,我們對每個權重(引數)應用相同的反向傳播過程,然後我們在梯度下降過程中使用它。
為什麼迴歸神經網路難以訓練?
在實踐中,RNN有點難以訓練。 要了解原因,讓我們仔細看看上面計算的漸變:
我們可以看到,隨著時間步長之間的差距變大,漸變的產物變得越來越長。 但是,這些術語是什麼?
每個術語基本上是兩個術語的乘積:轉置 W 和第二個 術語 取決於f',啟用函式的導數。
-
初始權重 W 通常從標準正態分佈中取樣,然後大多數<1。
-
事實證明(我不會在這裡證明,但 本文 詳細說明),第二項是雅可比矩陣,因為我們採用向量函式的導數相對於向量及其2範數,你可以將其視為絕對值, 上限為1 。 這具有直觀意義,因為我們的tanh(或sigmoid)啟用函式將所有值對映到-1和1之間的範圍,並且導數f'的邊界為1(在sigmoid的情況下為1/4)。
因此,對於矩陣中的小值和多個矩陣乘法, 梯度值以指數方式快速收縮,最終在幾個時間步之後完全消失 。 來自“遙遠”步驟的漸變貢獻變為零,並且這些步驟中的狀態對您正在學習的內容沒有貢獻:您最終不會學習遠端依賴。
消失的漸變不是RNN獨有的。 它們也發生在深度前饋神經網路中。 只是RNN傾向於非常深(在我們的情況下與句子長度一樣深),這使問題更加普遍。
幸運的是,有幾種方法可以解決消失的梯度問題。 正確初始化 W 矩陣 可以減少消失梯度的影響。 正規化也是如此。 更優選的解決方案是使用 ReLU 而不是tanh或S形啟用函式。 ReLU導數是0或1的常數,因此不太可能遭受消失的梯度。
更流行的解決方案是使用長短期儲存器(LSTM)或門控迴圈單元(GRU)架構。 LSTM最初是在1997年提出的,也許是今天NLP中使用最廣泛的模型。 2014年首次提出的GRU是LSTM的簡化版本。 這兩種RNN架構都明確地設計用於處理消失的梯度並有效地學習遠端依賴性。 我們將在本文的下一部分介紹它們。