到目前為止,我們的序列學習任務的工作示例是語言建模,我們的目標是在給定序列中所有先前標記的情況下預測下一個標記。在這種情況下,我們只希望以左向上下文為條件,因此標準 RNN 的單向鏈接似乎是合適的。然而,還有許多其他序列學習任務上下文,在這些上下文中,在向左和向右上下文的每個時間步調整預測是非常好的。例如,考慮詞性檢測。在評估與給定詞相關的詞性時,為什么我們不應該考慮兩個方向的上下文?
另一項常見任務(通常在針對感興趣的實際任務微調模型之前用作預訓練練習)是屏蔽文本文檔中的隨機標記,然后訓練序列模型以預測缺失標記的值。請注意,根據空白后面的內容,缺失標記的可能值會發(fā)生顯著變化:
-
我是
___
。 -
我
___
餓了。 -
我
___
餓了,我能吃半頭豬。
在第一句話中,“快樂”似乎是一個可能的候選者。“不”和“非常”這兩個詞在第二句中似乎說得通,但“不”與第三句似乎格格不入。
幸運的是,一種簡單的技術可以將任何單向 RNN 轉換為雙向 RNN (Schuster 和 Paliwal,1997)。我們簡單地實現(xiàn)兩個單向 RNN 層,它們以相反的方向鏈接在一起并作用于相同的輸入(圖 10.4.1)。對于第一個 RNN 層,第一個輸入是x1最后的輸入是 xT,但是對于第二個 RNN 層,第一個輸入是 xT最后的輸入是x1. 為了產生這個雙向 RNN 層的輸出,我們只需將兩個底層單向 RNN 層的相應輸出連接在一起。
正式地為任何時間步長t,我們考慮一個小批量輸入 Xt∈Rn×d(示例數量: n,每個示例中的輸入數量:d) 并令隱藏層激活函數為?. 在雙向架構中,這個時間步長的前向和后向隱藏狀態(tài)是H→t∈Rn×h 和H←t∈Rn×h,分別在哪里h是隱藏單元的數量。前向和后向隱藏狀態(tài)更新如下:
權重在哪里 Wxh(f)∈Rd×h,Whh(f)∈Rh×h,Wxh(b)∈Rd×h,?and?Whh(b)∈Rh×h, 和偏見bh(f)∈R1×h和 bh(b)∈R1×h都是模型參數。
接下來,我們連接前向和后向隱藏狀態(tài)
評論
查看更多