怎樣通過神經網路學習語義?

在基於大數據與深度學習的自然語言對話-CSDN.NET這篇博文中看到這樣的描述:「最近自然語言處理與深度學習的一個新發現是,我們可以通過深度學慣用實數值向量來表示語句的語義。」這裡面提供了4種模型,但是不是很懂如何去訓練這些模型,還望各位大神不吝賜教。


謝邀。我發現一個有意思的現象,在知乎上類似於這樣和技術沾點邊,卻又泛泛的問題似乎並不太受歡迎,也鮮有高票回答。我想這一來是因為問題太廣,很難回答,答也不容易答好;二來呢,仔細來解釋這件事實在是要花些時間。然而我既不怕答不好,也不是沒時間,我既不貼二維碼也不經營營銷號,我來知乎答題的主要樂趣就是能在正式答題前說些廢話 #答主實在寂寞得很#

言歸正傳,我曾經想過類似的問題:如果我沒有任何文本挖掘基礎,是不是只要我學了神經網路,就可以讓計算機理解人類語言了。顯然,計算機現在還無法完全理解人類語言,但是通過理解神經網路是怎樣被運用到NLP中的,你會對神經網路能做什麼不能做什麼有了清楚的認識,也會文本挖掘的格局有了一定的認識。

那些科普文章可能把神經網路吹得神乎其神,可是它們從來不會提及神經網路的Input是啥,Output是啥,訓練目標又是啥。它們可能也不會告訴你文章就是單詞一個個按一定順序排列下來,有時候這種順序有規律,有時候是隨機的,而機器學習(包括神經網路)就是通過一個訓練目標,在隨機因素的干擾下,把真正有規律的部分學習起來,然後運用在人們需要的任務上(比如寫個唐詩),如果運用得好,你們就會認為它理解了語義。

拿word2vec作個例子,它先把每個單詞轉換為一個隨機的詞向量,假設詞向量長度都是100,然後有一篇10K字的文章,對於每個單詞,找到它對應的隨機生成的詞向量,這樣就形成了10K*100的矩陣,這就是Input。訓練目標呢,(通俗來說,並非完全是這樣)就是先遮住一個詞,通過該詞的左邊2個詞和右邊2個詞來預測這個詞,看看預測得準不準,所以每次預測都是拿4*100的矩陣(左邊2個詞疊加右邊2個詞的詞向量)來預測1*100的矩陣(被遮住的詞的詞向量)。每次預測之後,都會通過誤差來微調被遮住詞的詞向量,這樣對文章中每個詞都預測一遍後,每個詞的詞向量都被調整過了。有些詞的詞向量距離會被調得近一些,我們就認為它們語義上也相近,離得遠的詞我們也認為它們語義也較遠。你說word2vec是否學到了文章中語法或語義上的規律呢?我想確實是的,這樣評價並不過分,但是它並不是像人類去閱讀文章含義而理解的規律,而是通過學習順序中的統計量來理解的規律。

再舉個RNN encoder-decoder的例子。比如訓練機器人對話(如小黃鴨),我們的訓練集是一組組對話(上句和下句)。想法是把每組上句放進RNN里學習(編碼),學習後生成一組向量,再把這向量放進另一個RNN里學習(解碼),解碼成文字(和對應下句越接近越好)。訓練目標就是找到最佳的RNN參數,使得每句上句經過編碼解碼後都能無限接近下句。於是乎,如果我們假定有10K組對話,一句話最長有20個字,每個字的詞向量是100, 那麼這個Input (和Output)就會是[10K, 20, 100]的三維矩陣。你問我一句話如果比20個字長怎麼辦?超過20的部分砍掉!那如果不到20個字怎麼辦?不到的部分加一個用來padding的字元! 怎麼聽上去好像有點山寨啊,神經網路不是應該很高端的么。。請不要在意這些細節,我相信以後這些東西會慢慢改進的,畢竟這塊領域還比較新不是嗎。一個稍微高級的方法是用bucket,細節請移步賈揚清大神的答案tensorflow中的seq2seq例子為什麼需要bucket? - 知乎用戶的回答

再舉個最接近你們要的語義的例子:如果我說「請幫我訂一張從波士頓到紐約的機票」,神經網路能理解它的意思嗎?來來來,正好借這個例子讓你們來體會一下什麼叫「人工智慧就是有多少人工就有多少智能」。(圖片來源:Using Recurrent Neural Networks for Slot
Filling in Spoken Language Understanding)

在訓練集中,需要先把Boston標成B-dept (B指的是開始,dept指departure),New York標成(B-arr和I-arr,B指開始I指繼續,意思是New York是一個片語,arr指arrival),所有的O都是無關的詞。這叫IOB標註法(Inside Outside Beginning)。總之,對於每個詞都給出一個角色的標註,然後拿去經過RNN訓練,經過成千上萬的訓練樣本,哪怕是你給出一句不太標準的英語,電腦也能識別出一些重要的角色(這裡的Boston的New York)。然後圖片的Intent代表了意圖,這裡的意圖是「找航班」,其他意圖可能還有「找火車」,「找輪船」等等,所以判斷一句話的意圖在這裡成了一個分類問題,需要另外建個模型進行訓練。所以假設用戶提交了一句話「上海到北京高鐵票」,在後台會發生這樣的事,首先RNN訓練完以後會把上海和北京的角色(dept和arr)提取出來,然後根據另外的分類模型來判斷意圖為「找火車」,再把這些轉換為SPARQL語言去RDF資料庫里查詢結果,再返回給用戶。你如果不知道它是怎麼運作的,可能會很驚奇為什麼它能理解我說的話,但現在你知道它是怎麼運作的了,似乎也沒有那麼高端。。。你如果說它能理解語義呢,我勉強能同意,但你說這樣的智能可以佔領地球毀滅人類,我就只能呵呵了。當然我們還是要抱以信心,隨著神經網路的發展,將來越來越多的任務會從端到端,也會逐步代替這種兩階段分步的做法。

說了這麼多,還是要說點具體的學習方法。如果題主有志向於這個領域,還是應該多動動手,試驗一下別人的代碼,再回過頭來研究論文。這方面中文材料啊代碼啊數據集啊真心很少,所以切記切記一定要上谷歌,搜github,看科普博客也盡量看英文的,曲線救國是很必要的:先學會了自然語言如何處理英文,再回過頭來看如何處理中文。

下面貼一下可以練手的別人寫的代碼(親測都可以運行):

建議先從玩word2vec開始玩起,如果有一定熟悉的話可以直接用gensim,然後看看知乎上別人都是怎麼拿來玩花樣的。如果不熟悉的話可以看看Kaggle的一個教程Bag of Words Meets Bags of Popcorn

想要玩機器人對話的朋友們,可以用tensorflow seq2seq https://www.tensorflow.org/versions/r0.8/tutorials/seq2seq/index.html或者torch (GitHub - macournoyer/neuralconvo: Neural conversational model in Torch)。可以把和女朋友的QQ聊天記錄拉下來訓練喲,來個花式虐狗。

想要用神網寫一首汪峰老師歌曲的朋友請注意了,先學怎麼像莎士比亞一樣寫文章,The Unreasonable Effectiveness of Recurrent Neural Networks,然後有人已經訓練好了汪峰老師的歌詞GitHub - phunterlau/wangfeng-rnn: Multi-layer RNN building Wang Feng style lyric

如果這時候內心燃起了想要自己寫演算法訓練些什麼的念頭,請把Keras里的例子都跑一遍,這時候就可以慢慢定製化了,然後就攢錢買電腦買顯卡吧。阿彌陀佛。。功德無量。。


前面說到的都比較基礎,再進一步可以看看DSSM


*但是不是很懂如何去訓練這些模型* -- 很正常,我看完這個文章也不知道他在說啥。不過你看這文章下面不是有很多references嗎?把它們全看一遍就差不多了。


答主們說得都很好,不過語義實在太博大了。Word2vec, RNN autoencoder等,僅僅是語義這座大山的一小塊岩石(5%的完成度)。目前的神經網路模型遠遠沒有達到語義需要的功能、結構和複雜度。一起繼續努力!

我個人也有很多這方面研究和建模工作,理論上完成了大約80%吧,可以說理論探索的過程是山重水複,機關算盡,似乎重演了生物進化的千萬年曆程。其中滋味,真是無法言說。希望多年以後,可以和大家傾訴。


主要是分詞 有幾個成熟的方案 國內百度搞得最好了吧 我看他們就有分詞服務


推薦閱讀:

機器學習與微博:TensorFlow在微博的大規模應用與實踐
編程是大眾化需求嗎?關於設計和編程的思考

TAG:人工智慧 | 機器學習 | 神經網路 | 深度學習DeepLearning |