深度学习、自然语言处理和表征方法
深度學習、自然語言處理和表征方法
分享到: 本文由?伯樂在線?-?XiaoxiaoLi?翻譯。未經許可,禁止轉載!英文出處:colah.github.io。歡迎加入翻譯組。
簡介
過去幾年,深度神經網絡在模式識別中占絕對主流。它們在許多計算機視覺任務中完爆之前的頂尖算法。在語音識別上也有這個趨勢了。
雖然結果好,我們也必須思考……它們為什么這么好使?
在這篇文章里,我綜述一下在自然語言處理(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”那邊挪近一點,網絡的效果就更好。
我們并沒見過每個單詞使用的例子,但是類比能讓我們泛化衍生出新的單詞組合。你懂的單詞你都見過,但是你能懂的句子你并沒有都見過。神經網絡也是如此。
來自于Mikolov?et al.(2013a) 單詞嵌入展示了一個更引人注目的屬性:單詞間的類比仿佛是被編碼在了單詞向量的區別中。比如,這個看來是個男-女區別向量: 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)。
基本思路就是你可以通過單詞嵌入輸出的向量來對圖像進行分類。狗的圖像會被映射到“狗”的單詞向量附近。馬的圖像會被映射到“馬”的單詞向量附近。汽車的圖像會被映射到“汽車”的單詞向量附近。以此類推。
有趣的是如果你用新類別的圖像來測試這個模型會發生什么呢?比如,如果這個模型沒訓練過如何分類“貓”,也就是把貓的圖像映射到“貓”向量附近,那當我們試圖對貓的圖像進行分類的時候會發生什么呢?
(來自Socher?et al.?(2013b))
結果表明,這個網絡是可以很合理地處理新類別的圖像的。貓的圖片并沒有被映射到單詞嵌入空間的隨機的點中。相反的,他們更傾向于被映射到整體上相近的“狗”的向量中去,并且事實上更接近于“貓”的向量。相似的,卡車的圖片最后離“卡車”向量相對也比較近,“卡車”向量和與它相關的“汽車”向量很近。
(來自Socher?et al.?(2013b))
這個圖是斯坦福一個小組用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應用在這個分段上:
(來自Bottou (2011)) 這樣的模型通常被稱作“遞歸神經網絡”因為一個模塊經常會使用另外一個同類型模塊的輸出。有時候它們也被稱作“樹形神經網絡tree-structured neural networks”。
遞歸神經網絡在一系列NLP任務中都有很重大的成功。比如Socher?et al.?(2013c)?就利用了一個遞歸神經網絡來預測句子的情感:
(來自?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 的評論和支持。
注解:
總結
以上是生活随笔為你收集整理的深度学习、自然语言处理和表征方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何快速全面建立自己的大数据知识体系?
- 下一篇: 今日头条成功的核心技术秘诀是什么?深度解