Hulu機器學習問題與解答系列 | 十二:注意力機制
」注意力機制「
[場景描述]
作為生物體,我們的視覺和聽覺會不斷地獲得帶有序列的聲音和圖像信號,並交由大腦理解;同時我們在說話、打字、開車等過程中,也在不斷地輸出序列的聲音、文字、操作等信號。在互聯網公司日常要處理的數據中,也有很多是以序列形式存在的,例如文本、語音、視頻、點擊流等。因此如何更好的對序列進行建模,一向是研究的要點。
為了解決這些問題,注意力機制(attention mechanism)被引入Seq2Seq模型中。注意力機制模仿人在生成序列時的行為,當解碼序列的某個輸出時,重點關注輸入序列中和當前位置的輸出相關的部分,緩解了Seq2Seq模型的上述問題。作為一種通用的思想,注意力機制在包括Seq2Seq在內的多種場景中都得到了應用。
[問題描述]
RNN的Seq2Seq模型中引入了注意力機制(attention mechanism)是為了解決什麼問題?在機器翻譯的Seq2Seq模型中使用注意力機制建模時,為什麼選用了雙向的RNN模型?
背景知識假設:基本的深度學習知識。
該類問題的被試者:對RNN有一定的使用經驗,或在自然語言理解、序列建模等領域有一定的經歷。
[解答與分析]
我們已經介紹了Seq2Seq模型以及LSTM。在實際任務,例如機器翻譯中,使用Seq2Seq模型,通常會先使用一個RNN作為編碼器,將輸入序列(源語言句子的詞向量序列)編碼成為一個向量表示,然後再使用一個RNN模型作為解碼器,從編碼器得到的向量表示里解碼得到輸出序列(目標語言句子的詞序列)。
Seq2Seq模型中, 當前隱狀態以及上一個輸出詞決定了當前輸出詞,即:
其中f,g是非線性變換,通常是多層神經網路;yi是輸出序列中的一個詞,si是對應的隱狀態。
在實際使用中,會發現隨著輸入序列的增長,模型的性能發生了顯著下降。這是因為編碼時將輸入序列的全部信息壓縮到一個向量表示中,隨著序列增長,句子越前面的詞的信息的丟失就越嚴重。試想翻譯一個有100個詞的句子,需要將整個句子全部詞的語義信息編碼在一個向量中,而在解碼時,目標語言的第一個詞大概率是和源語言的第一個詞相對應的,這就意味著第一步的解碼就需要考慮100步之前的信息。建模時的一個小技巧是將源語言句子逆序輸入,或者將其重複兩遍輸入來訓練模型,這可以得到一定的性能提升。使用LSTM能夠在一定程度上緩解這個問題,但在實踐中對於過長的序列仍然難以有很好的表現。
同時,Seq2Seq模型的輸出序列中,常常會丟失或者重複部分輸入序列的信息。這是因為在解碼時,對當前詞及對應的源語言詞的上下文信息和位置信息也在編碼解碼過程中丟失了。
Seq2Seq模型中引入注意力機制就是為了解決這些問題。
在注意力機制中,仍然可以用普通的RNN對輸入序列進行編碼,得到隱狀態h1, h2 ... hT,但是在解碼時,每一個輸出詞都依賴於前一個隱狀態以及輸入序列每一個對應的隱狀態:
其中語境向量ci是輸入序列全部隱狀態h1, h2 ... hT的一個加權和:
權重參數,即注意力權重αij並不是一個固定權重,而是由另一個神經網路計算得到:
神經網路α將上一個輸出序列隱狀態si-1和輸入序列隱狀態hj作為輸入,計算出一個xj, yi對齊的值eij,再歸一化得到權重αij。
我們可以對此給出一個直觀的理解:在生成一個輸出詞時,會考慮每一個輸入詞和當前輸出詞的對齊關係,對齊越好的詞,會有越大的權重,對生成當前輸出詞的影響也就越大。下圖給出了翻譯時注意力機制的權重分布,在互為翻譯的詞上會有最大的權重。
在機器翻譯這樣一個典型的序列到序列模型里,生成一個輸出詞yj時,會用到第i個輸入詞對應的隱狀態hi以及對應的attention權重αij,如果只使用一個方向的RNN網路來計算隱狀態,那麼hi只包含了x0到xi的信息,相當於在αij這裡丟失了xi後面的詞的信息。而使用雙向RNN進行建模,第i個輸入詞對應的隱狀態包含了
前者編碼了x0到xi的信息,後者編碼了xi及之後所有詞的信息,防止了前後文信息的丟失。
注意力機制是一種思想,可以有多種不同的實現方式,在Seq2Seq以外的場景也有不少應用,下圖展示了在圖像描述文本生成任務中的結果,可以看到在生成對應詞時,圖片上對應物體的部分有較大的注意力權重。
[參考文獻]
[1] Bahdanau, Dzmitry, Kyunghyun Cho, and Yoshua Bengio. "Neural machine translation by jointly learning to align and translate."
[2] Xu, Kelvin, et al. "Show, attend and tell: Neural image caption generation with visual attention."
[3] Rockt?schel, Tim, et al. "Reasoning about entailment with neural attention."
下一題預告
【集成學習】
[場景描述]
之前幾篇中我們介紹了具體的機器學習模型和演算法,集成學習 (ensemble learning)更多的是一種組合策略,將多個機器學習模型結合起來,可以稱為元演算法 (meta-algorithm)。
面對一個機器學習問題,通常有兩種策略,一種是研發人員嘗試各種模型,選擇其中表現最好的模型做重點調參優化。這種策略類似於奧運會比賽,通過強強競爭來選拔最優的運動員,並逐步提高成績。另一種重要的策略是集各家之長,如同賢明的君主廣泛的聽取眾多謀臣的建議,然後綜合考慮,得到最終決策。後一種策略的核心,是將多個分類器的結果集成為一個統一的決策。使用這類策略的機器學習方法統稱為集成學習。其中的每個單獨的分類器稱為基分類器。
集成學習可以大致分為兩類:
- Boosting:這類方法訓練基分類器時採用串列的方法,各個基分類器之間有依賴。它的基本思路是將基分類器層層疊加,每一層在訓練的時候,對前一層基分類器分錯的樣本,給予更高的權重。測試時,根據各層分類器的結果的加權得到最終結果。
- Bagging:這類方法基分類器之間無強依賴,可以並行。其中很著名的演算法之一是基於決策樹基分類器的隨機森林(Random Forest)。為了讓基分類器之間互相獨立,將訓練集分為若干子集(當訓練樣本數量較少時,子集之間可能有交疊)。
基分類器有時又稱為弱分類器,因為基分類器的錯誤率要大於集成後的分類器。基分類器的錯誤,是偏差(Bias)和方差(Variance)兩種錯誤之和。偏差主要是由於分類器的表達能力有限導致的系統性錯誤,表現在訓練誤差不能收斂到一個比較小的值。方差則是由於分類器對於樣本分布過於敏感,導致在訓練樣本數較少時,產生過擬合。
Boosting方法通過逐步聚焦於基分類器分錯的樣本,減小集成分類器的偏差。Bagging方法則是採取分而治之的策略,通過對訓練樣本多次採樣,並分別訓練出多個不同模型,然後做綜合,來減小集成分類器的方差。假設每個基分類器出錯的概率都是相互獨立的,在某個測試樣本上,用簡單多數的投票方法來集成結果,超過半數基分類器都出錯的概率會小於每個單獨的基分類器的出錯概率。一個Bagging的簡單示例如下圖:
[問題描述]
- 集成學習有哪些基本步驟?
- 常用的基分類器是什麼?
歡迎留言提問或探討
關注「Hulu」微信公眾號,點擊菜單欄「機器學習」獲得更多系列文章
推薦閱讀:
※假冒的人為何會通過面試?
※面試問題剖析:談談你的一次失敗經歷
※面試有什麼需要注意的一些小細節?
※【面試寶典】面試中你能遇到的問題答案全在這兒了
※面試時如何回答「你對加班的看法」?