深度學習、自然語言處理和表徵方法

XiaoxiaoLi發表於2014-10-18

簡介

過去幾年,深度神經網路在模式識別中佔絕對主流。它們在許多計算機視覺任務中完爆之前的頂尖演算法。在語音識別上也有這個趨勢了。

雖然結果好,我們也必須思考……它們為什麼這麼好使?

在這篇文章裡,我綜述一下在自然語言處理(NLP)上應用深度神經網路得到的一些效果極其顯著的成果。我希望能提供一個能解釋為何深度神經網路好用的理由。我認為這是個非常簡練而優美的視角。

單隱層神經網路

單隱層神經網路有一個普適性(universality):給予足夠的隱結點,它可以估算任何函式。這是一個經常被引用的理論,它被誤解和應用的次數就更多了。

本質上這個理論是正確的,因為隱層可以用來做查詢表。

簡單點,我們來看一個感知器網路(perceptron network)。感知器 (perceptron)是非常簡單的神經元,如果超過一個閾值它就會被啟動,如果沒超過改閾值它就沒反應。感知器網路的輸入和輸出都是是二進位制的(0和1)。

注意可能的輸入個數是有限的。對每個可能的輸入,我們可以在隱層裡面構建一個只對這個輸入有反應的神經元(見註解1)。然後我們可以利用這個神經元和輸出神經元之間的連線來控制這個輸入下得到的結果(見註解2)。

這樣可以說明單隱層神經網路的確是有普適性的。但是這也沒啥了不起的呀。你的模型能幹和查詢表一樣的事並不能說明你的模型有任何優點。這隻能說明用你的模型來完成任務並不是不可能的罷了。

普適性的真正意義是:一個網路能適應任何你給它的訓練資料。這並不代表插入新的資料點的時候它能表現地很理想。

所以普適性並不能解釋為什麼神經網路如此好用。真正的原因比這微妙得多… 為了理解它,我們需要先理解一些具體的成果。

單詞嵌入(Word Embeddings)

我想從深度學習研究的一個非常有意思的部分講起,它就是:單詞嵌入(word embeddings)。在我看來,單詞嵌入是目前深度學習最讓人興奮的領域之一,儘管它最早是由Bengio等人在十多年前提出的(見註解3)。除此之外,我認為它們能幫助你通過直覺來了解為什麼深度學習如此有效。

單詞嵌入W:words→Rn是一個引數化函式,它把某個語言裡的單詞對映成高維向量(大概200到500維)。例如這樣:

W(‘‘cat”)=(0.2, -0.4, 0.7, …)
W(‘‘mat”)=(0.0, 0.6, -0.1, …)
(一般這個函式就是一個查詢表,用一個矩陣θ來引數化,每行是一個單詞:Wθ(wn)=θn.)
初始化時,W中每個詞對應一個隨機的向量。它會學習出有意義的向量以便執行任務。

舉個一個可能的任務的例子:訓練一個網路讓其預測一個5元組(5-gram)(連續的5個詞)是否‘成立’。我們可以隨便從維基百科上選一堆5元組(比如cat sat on the mat)然後把其中一個詞隨便換成另外一個詞(比如cat sat song the mat),那麼一半的5元組估計都會變得荒謬且沒意義了。

 判斷5元組是否成立的模組網路(來自於Bottou (2011)

我們訓練的模型會通過W把5元組中每個詞的表徵向量取出來,輸入給另外一個叫R的模組,模組R會試圖預測這個5元組是‘成立的’或者是‘破碎的’。然後我們希望看見:

R(W(‘‘cat”), W(‘‘sat”), W(‘‘on”), W(‘‘the”), W(‘‘mat”))=1
R(W(‘‘cat”), W(‘‘sat”), W(‘‘song”), W(‘‘the”), W(‘‘mat”))=0

為了準確地預測這些值,這個網路需要從W以及R中學習到好的引數。

現在看來這個任務並沒什麼意思。也許它能用來檢測語法錯誤什麼的,沒什麼大不了。但是極其有趣的部分是這個W。

(事實上,對我們來說,這個任務的意義就是學習W。我們當然也可以做一些其他的任務 – 一個很常見的任務是預測句子中下一個單詞。但我們實際上並不在乎任務是什麼。這節後面我們會談到許多單詞嵌入成果,但並不會區分得到這些成果的方法的不同。)

想直觀感受一下單詞嵌入空間的話,我們可以用t-SNE來對它進行視覺化。t-SNE是一個複雜的高維資料視覺化技術。

 t-SNE對單詞嵌入的視覺化結果。左圖:數字區間。右圖:工作崗位區間。來源:Turian et al. (2010)全圖在此

這種單詞構成的“地圖”對我們來說更直觀。相似的詞離得近。另一種方法是看對一個給定單詞來說,哪些其他的單詞離它最近。我們可以再一次看到,這些詞都很相似。

 哪些詞的嵌入離一個給定詞最近?來自於Collobertet al. (2011)

網路能讓意義相似的詞擁有相似的向量,這看起來是很自然的事。如果你把一個詞換成它的同義詞(例如 “a few people sing well” → “a couple people sing well”),句子的成立性並沒有變化。雖然從字面上看,句子變化很大,但如果W把同義詞(像“few”和”couple”這種)對映到相近的空間,從R的角度來看句子的變化很小。

這就牛了。可能的5元組的數目是巨大的,相比之下我們的訓練資料量很小。相似的單詞距離近能讓我們從一個句子演變出一類相似的句子。這不僅指把一個詞替換成一個它的同義詞,而且指把一個詞換成一個相似類別裡面的詞(如“the wall is blue” → “the wall is red” )。進一步地,我們可以替換多個單詞(例如“the wall is blue” → “the ceiling is red”)。它的影響對單詞數目來說是指數級的 (參見注解4)。

很明顯,這是W的一個用武之地。但它是如何學會做這個的呢?看起來很可能很多情況下它是先知道“the wall is blue”這樣的句子是成立的,然後才見到“the wall is red”這樣的句子。這樣的話,把“red”往”blue”那邊挪近一點,網路的效果就更好。

我們並沒見過每個單詞使用的例子,但是類比能讓我們泛化衍生出新的單片語合。你懂的單詞你都見過,但是你能懂的句子你並沒有都見過。神經網路也是如此。

單詞嵌入展示了一個更引人注目的屬性:單詞間的類比彷彿是被編碼在了單詞向量的區別中。比如,這個看來是個男-女區別向量:
W(‘‘woman”)−W(‘‘man”) ≃ W(‘‘aunt”)−W(‘‘uncle”)
W(‘‘woman”)−W(‘‘man”) ≃ W(‘‘queen”)−W(‘‘king”)

也許這看起來並不奇怪。畢竟表性別的代詞意味著換一個詞整個句子的語法就錯了。正常話是這麼說的 “she is the aunt” ,“he is the uncle.”。同樣的,“he is the King”, “she is the Queen.”。如果你看見“she is the uncle,” 最可能的解釋就是這句話有語法錯誤。這個情況看起來很可能是:一半的時候單詞都被隨機地替換了。

也許我們會放馬後炮:“當然是這樣啦!單詞嵌入會學著把性別按照一致的方式來編碼。事實上也許就存在一個性別的維度。對單複數來說也是一樣。找出這些明顯的關係太簡單了!”

然而,更復雜的關係也是這樣被編碼的。這看起來幾乎像奇蹟一樣!

單詞嵌入中的關係對。來自 Mikolov et al. (2013b).

能夠充分意識到W的這些屬性不過是副產品而已是很重要的。我們沒有嘗試著讓相似的詞離得近。我們沒想把類比編碼進不同的向量裡。我們想做的不過是一個簡單的任務,比如預測一個句子是不是成立的。這些屬性大概也就是在優化過程中自動蹦出來的。

這看來是神經網路的一個非常強大的優點:它們能自動學習更好的資料表徵的方法。反過來講,能有效地表示資料對許多機器學習問題的成功都是必不可少的。單詞嵌入僅僅是學習資料表示中一個引人注目的例子而已。

共同表徵

單詞嵌入的這些屬性當然非常有意思,但是除了判斷5元組是不是成立這種傻問題還能幹點啥有用的麼?

W和F學習完成任務A, G可以根據W來學習完成任務B

之前我們學習單詞嵌入是為了在簡單任務上有出色的表現,但基於我們從單詞嵌入中發現的好屬性,你也許會猜想它們對自然語言處理任務整體都適用。實際上,這樣的單詞特徵表示(word representations)是極其有用的:

“利用單詞特徵表示…已經成為近年來許多NLP系統成功的祕密武器,包括命名實體識別,詞性標註,語法分析和語義角色標註。(Luong et al. (2013) ”

在深度學習工具箱裡,把從任務A中學到的好表徵方法用在任務B上是一個很主要的技巧。根據細節不同,這個普遍的技巧的名稱也不同,如:預訓練(pretraining),遷移學習(transfer learning),多工學習(multi-task learning)等。這種方法的好處之一是可以從多種不同資料中學習特徵表示。

這個技巧有個對應面。除了在一種資料上學習表徵然後應用在不同任務上,我們還可以從多種資料中學習出一種單個的表徵!

一個很好的例子就是Socher et al. (2013a) 提出的雙語單詞嵌入。我們可以從兩種不同語言中把單詞嵌入到一個共享的空間去。在這個例子裡,我們學習把漢語和英語嵌入到同一個空間去。

我們用和上面差不多的方法來訓練Wen和Wzh兩種嵌入。但是,我們已知某些中文和英文的詞彙有相似的意思。所以,我們追加一個屬性優化:我們已知的翻譯過後意思相似的詞應該離得更近。

理所當然,我們會發現我們已知的有相似意思的詞在最後結果中離得很近。我們本來就是針對這個做的優化,這個結果沒什麼讓人驚訝的。但更有意思的是我們未知的翻譯後意思相似的詞結果距離也很近。

鑑於我們前面有關單詞嵌入的經驗,這個也許並不太讓你感到驚奇。單詞嵌入就是會把相似的詞聚到一起,所以如果我們已知的中英詞彙離得近,它們的同義詞自然離得近。我們還知道類似性別差異趨向於可以用一個常數的差異向量表示。看起來,對齊足夠多的點會讓這些差異向量在中文和英文的嵌入中保持一致。這樣會導致如果我們已知兩個男性詞互為翻譯,最後我們也會得到一對互為翻譯的女性詞。

直觀來講,彷彿就是兩種語言有著相似的“形狀”,通過對齊不同的點,兩種語言就能夠重疊,其他的點就自然能被放在正確的位置上。

雙語單詞嵌入的t-SNE視覺化圖。綠色是中文,黃色是英文。來自(Socher et al. (2013a))

在雙語單詞嵌入中,我們對兩種很相似的資料學習了一個共享表徵。我們也可以學習把非常不同的幾種資料嵌入到同一個空間去。

近期,深度學習已經開始探索能夠把單詞和影象嵌入到同一個表徵下的模型(參見注解5)。

基本思路就是你可以通過單詞嵌入輸出的向量來對影象進行分類。狗的影象會被對映到“狗”的單詞向量附近。馬的影象會被對映到“馬”的單詞向量附近。汽車的影象會被對映到“汽車”的單詞向量附近。以此類推。

有趣的是如果你用新類別的影象來測試這個模型會發生什麼呢?比如,如果這個模型沒訓練過如何分類“貓”,也就是把貓的影象對映到“貓”向量附近,那當我們試圖對貓的影象進行分類的時候會發生什麼呢?

結果表明,這個網路是可以很合理地處理新類別的影象的。貓的圖片並沒有被對映到單詞嵌入空間的隨機的點中。相反的,他們更傾向於被對映到整體上相近的“狗”的向量中去,並且事實上更接近於“貓”的向量。相似的,卡車的圖片最後離“卡車”向量相對也比較近,“卡車”向量和與它相關的“汽車”向量很近。

這個圖是史丹佛一個小組用8個已知類(和2個未知類別)做的圖。結果已經很可觀了。但因為已知類數目小,能夠用來插入影象和語義空間的關係的點就很少了。

差不多同時期,Google的小組做了一個大得多的版本,他們用了1000個類別而不是8個(Frome et al. (2013))。之後他們又做了一個新的版本(Norouzi et al.(2014))。兩者都基於非常有效的影象分類模型(來自 Krizehvsky et al.(2012)),但它們使用了不同的方式把影象嵌入到單詞嵌入空間去。

他們的成果是很讚的。雖然他們不能把未知類的圖片準確放到代表這個類的向量上去,但是他們能夠把它放到正確的區域。所以,如果你用它來對區別比較大的未知類的圖片來分類,它是能夠區分類別的不同的。

即使我從來沒見過艾斯庫拉普蛇和穿山甲,如果你給我看這兩樣東西的照片,我能告訴你哪個是哪個因為我大致知道這兩個詞和什麼樣的動物有關。這些網路可以做到同樣的事情。

(這些結果都利用到一種“這些詞是相似的”的推斷。但是看起來根據詞之前的關係應該有更有力的結果。在我們的單詞嵌入空間裡,在男性和女性詞上有一個一致的差異向量。相似的,在影象空間中,也有一致的可以區分男性和女性的特徵。鬍子,八字鬍,禿頂都是強烈的,可見的男性特徵。胸部,及沒那麼可靠的如長髮,化妝品及珠寶這些是明顯的女性特徵(參見注解6)。即使你從來沒見過一個國王,如果一個帶著王冠的王后突然有了鬍子,那把她變成男人也是很合理的。)

共享嵌入是一個非常讓人興奮的研究領域,它暗示著為何深度學習中這個注重表徵方法的角度是如此的引人入勝。

遞迴神經網路

我們之前是用下面這個網路開始談單詞嵌入的:

學習單詞嵌入的模組化網路(來自Bottou (2011)

上面的圖描繪了一個模組化網路,R(W(w1), W(w2), W(w3), W(w4), W(w5))。它是由兩個模組構建的,W和R。這個用能拼在一起的小一些的神經網路模組來構建神經網路的方法傳播並不是十分廣泛。然而,在NLP中它很有效。

像上面那樣的模型很有效,但很不幸它們有個侷限:輸入引數的個數必須是固定的。

(來自 Bottou (2011))
 我們可以通過加入一個關聯模組A來解決這個問題。這個關聯模組可以將兩個單詞或片語的表徵合併起來。

通過合併一系列的單詞,A讓我們不僅能夠表示單詞,而且能夠表示片語甚至整個句子!另外因為我們可以合併不同數量的單詞,我們就可以不固定死輸入的個數了。

把句子中的單詞線性地合併在一起的做法並不是在所有情況下都講得通。考慮下面這個句子“the cat sat on the mat”,很自然地它可以被分成下面這樣用括號分開的不同的段:“((the cat) (sat (on (the mat))”. 我們可以把A應用在這個分段上:

這樣的模型通常被稱作“遞迴神經網路”因為一個模組經常會使用另外一個同型別模組的輸出。有時候它們也被稱作“樹形神經網路tree-structured neural networks”。

遞迴神經網路在一系列NLP任務中都有很重大的成功。比如Socher et al. (2013c) 就利用了一個遞迴神經網路來預測句子的情感:

一直以來,一個很主要的目標是如何建立一個可逆的句子表徵(sentence representation),也就是能夠通過這個表徵來構建一個真正的有著相似意思的句子。例如,我們可以嘗試引入一個分解模組(disassociation module)D來試著把A分解了:

(來自 Bottou (2011))

如果這個能成功,將會是一個極其強大的工具。舉個例子,我們可以嘗試做一個雙語句子表徵然後把它用在翻譯任務上。

不幸的是,這個實際上是很難實現的。非常,非常難。同時因為它一旦成功有巨大的前途,有很多人在為研究它而努力。

最近,Cho et al. (2014)在片語表徵上有了一些進展,他們做了一個能把英語片語編碼,解碼成法語的模型。來看看它學習出來的片語表徵吧!

片語表徵的t-SNE的一小部分(來自Cho et al. (2014)

批判

有關上面我們綜述的一些結果,我也聽說有其他領域的研究人員,尤其是NLP和語言學的人,對他們進行了批判。他們的顧慮倒不是針對結果本身的,反而是從結果中得出的結論以及他們和其他方法的區別。

我覺得自己的能力不足以清晰的表達這些顧慮。我鼓勵有能力的人在(英文原文)評論裡描述這些顧慮。

結論

深度學習中的表徵視角是非常有力的,也似乎能夠解答為何深度神經網路如此有效。在此之上,我認為它還有一個極美的地方:為何神經網路有效?因為在優化多層模型的過程中,更好的來資料表徵方法會自動浮現出來。

深度學習是個非常年輕的領域,理論根基還不強,觀點也在快速地改變。我感覺神經網路中重視表徵的這個方面目前是十分流行的。

在這篇文章裡,我綜述了一些我覺得十分讓人興奮的研究成果,但我寫這篇文章的主要動力是為之後要寫的一篇探索深度學習,型別論(type theory)和功能性程式設計(functional programming)之間關係的文章鋪路。如果你感興趣的話,可以訂閱我的RSS(原文作者),這樣文章釋出時你就能看見了。

(我很樂意聽聽你們的想法和評論。如果針對英文原文你發現了錯別字,技術錯誤,或者你認為需要新增的修正或者澄清,歡迎到github來pull。

致謝

我很感激Eliana Lorch、Yoshua Bengio、Michael Nielsen、Laura Ball、Rob Gilson 及 Jacob Steinhardt 的評論和支援。


註解:
  1.  當你有n個輸入神經元時,構建所有可能的輸入情況需要2^n個隱神經元。在實際操作中,通常不會這麼嚴重。你可以採取能夠包含不同輸入的情況。你也可以採用重疊的情況,他們利用疊加的方式來在交集處獲得正確的輸入。
  2. 不僅是感知器網路才有普適性。多層感知器(sigmoid neurons)網路(及其他激發函式)也具有普適性:給予足夠的隱節點,他們估算任何連續函式都可以得到不錯的結果。因為你不能簡單地孤立輸入,所以想看明白這點是十分複雜的。
  3. 單詞嵌入最初是由(Bengio et al, 2001Bengio et al, 2003)開發的。那是2006年深度學習重構開始的前幾年,那時神經網路被認為是過時的。而符號話的向量表示(distributed representations)的概念就更老了,比如(Hinton 1986)。
  4. 這篇開創性的文章:A Neural Probabilistic Language Model (Bengio, et al. 2003)裡包含了很多單詞嵌入為何有力的解釋。
  5.  之前也有對影象和標籤聯合分佈建模的工作,但他們的觀點和我們要描述的截然不同。
  6. 我十分清楚利用性別的外表特徵可能是十分誤導人的。來暗示諸如每個禿頭的人都是男性或者每個有胸部的人都是女性並不是我的本意。只是這些是通常的情況而已,而它們可以用來很大程度上的調節我們的先驗知識。

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

深度學習、自然語言處理和表徵方法

相關文章