深度学习在自然语言处理的应用
深度學(xué)習(xí)在自然語(yǔ)言處理的應(yīng)用
發(fā)表于2015-11-11 08:27| 931次閱讀| 來(lái)源21CT| 0 條評(píng)論| 作者Jonathan Mugan
深度學(xué)習(xí)自然語(yǔ)言處理機(jī)器學(xué)習(xí)語(yǔ)義網(wǎng)絡(luò)詞向量RNN width="22" height="16" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-11-09%2F2826166&type=3&count=&appkey=&title=%E5%9C%A8%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%87%BA%E7%8E%B0%E4%B9%8B%E5%89%8D%EF%BC%8C%E6%96%87%E5%AD%97%E6%89%80%E5%8C%85%E5%90%AB%E7%9A%84%E6%84%8F%E6%80%9D%E6%98%AF%E9%80%9A%E8%BF%87%E4%BA%BA%E4%B8%BA%E8%AE%BE%E8%AE%A1%E7%9A%84%E7%AC%A6%E5%8F%B7%E5%92%8C%E7%BB%93%E6%9E%84%E4%BC%A0%E8%BE%BE%E7%BB%99%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E3%80%82%E6%9C%AC%E6%96%87%E8%AE%A8%E8%AE%BA%E4%BA%86%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%A6%82%E4%BD%95%E7%94%A8%E5%90%91%E9%87%8F%E6%9D%A5%E8%A1%A8%E7%A4%BA%E8%AF%AD%E4%B9%89%EF%BC%8C%E5%A6%82%E4%BD%95%E6%9B%B4%E7%81%B5%E6%B4%BB%E5%9C%B0%E8%A1%A8%E7%A4%BA%E5%90%91%E9%87%8F%EF%BC%8C%E5%A6%82%E4%BD%95%E7%94%A8%E5%90%91%E9%87%8F%E7%BC%96%E7%A0%81%E7%9A%84%E8%AF%AD%E4%B9%89%E5%8E%BB%E5%AE%8C%E6%88%90%E7%BF%BB%E8%AF%91%EF%BC%8C%E4%BB%A5%E5%8F%8A%E6%9C%89%E5%BE%85%E6%94%B9%E8%BF%9B%E7%9A%84%E5%9C%B0%E6%96%B9%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1447374942981" frameborder="0" scrolling="no" allowtransparency="true">摘要:在深度學(xué)習(xí)出現(xiàn)之前,文字所包含的意思是通過(guò)人為設(shè)計(jì)的符號(hào)和結(jié)構(gòu)傳達(dá)給計(jì)算機(jī)的。本文討論了深度學(xué)習(xí)如何用向量來(lái)表示語(yǔ)義,如何更靈活地表示向量,如何用向量編碼的語(yǔ)義去完成翻譯,以及有待改進(jìn)的地方。【編者按】Jonathan?Mugan寫(xiě)了兩篇博文來(lái)解釋計(jì)算機(jī)如何理解我們?cè)谏缃幻襟w平臺(tái)上使用的語(yǔ)言,以及能理解到何種程度。本文是其中的第二篇。
在深度學(xué)習(xí)出現(xiàn)之前,我們書(shū)寫(xiě)的文字所包含的意思是通過(guò)人為設(shè)計(jì)的符號(hào)和結(jié)構(gòu)傳達(dá)給計(jì)算機(jī)的。我在上一篇博文里詳細(xì)闡述了這個(gè)實(shí)現(xiàn)過(guò)程。這里先回顧一下幾種符號(hào)方法:WordNet、ConceptNet和FrameNet,通過(guò)對(duì)比來(lái)更好地理解深度學(xué)習(xí)的能力。然后我會(huì)討論深度學(xué)習(xí)如何用向量來(lái)表示語(yǔ)義,以及如何更靈活地表示向量。接著我將探討如何用向量編碼的語(yǔ)義去完成翻譯,甚至為圖片添加描述和用文字回答問(wèn)題。最后,我總結(jié)了用深度學(xué)習(xí)技術(shù)真正地理解人類語(yǔ)言還需要哪些改進(jìn)。
WordNet可能是最著名的象征意義的語(yǔ)料庫(kù),由普林斯頓大學(xué)研發(fā)。它將意思相近的單詞歸為一組,并且表示組與組之間的層次聯(lián)系。舉個(gè)例子,它認(rèn)為“轎車(chē)”和“汽車(chē)”指的是同一個(gè)物體,都是屬于一類交通工具。
ConceptNet是來(lái)自麻省理工學(xué)院的語(yǔ)義網(wǎng)絡(luò)。它表示的關(guān)系比WordNet更廣。例如,ConceptNet認(rèn)為“面包”一詞往往出現(xiàn)在“烤面包機(jī)”附近。然而,詞語(yǔ)間的這種關(guān)系實(shí)在是不勝枚舉。理想情況下,我們會(huì)說(shuō)“面包機(jī)”不能被“叉子”插入。
FrameNet是伯克利大學(xué)的一個(gè)項(xiàng)目,它試圖用框架對(duì)語(yǔ)義歸檔。框架表示各種概念及其相關(guān)的角色。正如我在上一篇博文里寫(xiě)到的,孩子生日聚會(huì)框架的不同部分有著不同的角色,比如場(chǎng)地、娛樂(lè)活動(dòng)和糖源。另一個(gè)框架是“購(gòu)買(mǎi)”這個(gè)行為,包括賣(mài)方、買(mǎi)方和交易商品。計(jì)算機(jī)能夠通過(guò)搜索觸發(fā)框架的關(guān)鍵詞來(lái)“理解”文字。這些框架需要手動(dòng)創(chuàng)建,它們的觸發(fā)詞也需要手動(dòng)關(guān)聯(lián)。我們可以用這種方式來(lái)表示大量知識(shí),但是很難一五一十地明確寫(xiě)出來(lái)。因?yàn)閮?nèi)容實(shí)在太多,完完全全寫(xiě)出來(lái)也太費(fèi)神了。
符號(hào)也可以用來(lái)創(chuàng)建語(yǔ)言模型,計(jì)算某個(gè)單詞將會(huì)出現(xiàn)在句子中的概率。舉個(gè)例子,假設(shè)我剛剛寫(xiě)下“我吃了”,那么下一個(gè)詞語(yǔ)是“慶豐包子”的概率,可以用語(yǔ)料庫(kù)中“我吃了慶豐包子”出現(xiàn)的次數(shù)除以“我吃了”出現(xiàn)的次數(shù)來(lái)計(jì)算。此類模型相當(dāng)有用,但我們知道“慶豐包子”與“狗不理包子”非常相似,至少比“電飯鍋”相似,但是模型并沒(méi)有利用這種相似性的優(yōu)勢(shì)。使用的詞語(yǔ)有千千萬(wàn)萬(wàn),若是存儲(chǔ)所有三詞短語(yǔ)需消耗(詞語(yǔ)數(shù)量?x?詞語(yǔ)數(shù)量?x?詞語(yǔ)數(shù)量)存儲(chǔ)空間,這也是使用符號(hào)所帶來(lái)的問(wèn)題,因?yàn)樵~語(yǔ)以及詞語(yǔ)的組合實(shí)在太多。所以,我們需要一種更好的方式。
使用向量表示語(yǔ)義
深度學(xué)習(xí)使用向量來(lái)表示語(yǔ)義,因此概念不再是由一個(gè)龐大的符號(hào)來(lái)表示,而是由特征值表示的一個(gè)向量來(lái)表示。向量的每個(gè)索引代表神經(jīng)網(wǎng)絡(luò)訓(xùn)練得到的一個(gè)特征,向量的長(zhǎng)度一般在300左右。這是一種更加有效的概念表示方法,因?yàn)檫@里的概念是由特征組成的[Bengio?and?LeCun,?2007]。兩個(gè)符號(hào)只有相同或者不同兩種情況,而兩個(gè)向量可以用相似性來(lái)衡量。“慶豐包子”對(duì)應(yīng)的向量與“狗不理包子”對(duì)應(yīng)的向量很接近,但是它們和“轎車(chē)”對(duì)應(yīng)的向量差別很大。如同WordNet處理方式一樣,相似的向量被歸為同一類。
向量還存在內(nèi)部結(jié)構(gòu)。如果你用意大利向量減去羅馬向量,得到的結(jié)果應(yīng)該與法國(guó)向量減去巴黎向量的結(jié)果非常接近[Mikolov?et?al.,?2013]。我們可以用一個(gè)等式來(lái)表示:
意大利?-?羅馬?=?法國(guó)?-?巴黎另一個(gè)例子是:
國(guó)王?-?皇后?=?男人?-?女人我們通過(guò)訓(xùn)練神經(jīng)網(wǎng)絡(luò)來(lái)預(yù)測(cè)每個(gè)詞語(yǔ)附近的詞語(yǔ),得到帶有這些屬性的向量[Mikolov?et?al.,?2013]。你可以從谷歌或者是斯坦福直接下載已經(jīng)訓(xùn)練好的向量,或是用Gensim軟件庫(kù)自己訓(xùn)練。令人驚訝的是這種方法竟然有效,而且詞向量有如此直觀的相似性和聯(lián)系,但事實(shí)上確實(shí)是有效。
由詞向量構(gòu)成語(yǔ)義
我們已經(jīng)有了原來(lái)表示單個(gè)詞語(yǔ)的向量,該如何用這些詞表示語(yǔ)義,甚至形成完整的句子呢?我們使用一種稱為遞歸神經(jīng)網(wǎng)絡(luò)(recurrent?neural?network,?RNN)的技術(shù),如下圖所示。用RNN把句子“The?woman?ate?tacos.”編碼為向量,記作h4。單詞“the”的詞向量記作h0,然后RNN把h0與表示“woman”的詞向量結(jié)合,生成新的向量h1。然后向量h1繼續(xù)與下一個(gè)單詞“ate”的詞向量結(jié)合,生成新的向量h2,以此類推,直到向量h4。向量h4則表示了完整的句子。
一旦信息被編碼為一個(gè)向量,我們就能將其解碼為另一種形式[2],如下圖所示。比如,RNN隨后可以將向量h4表示的句子翻譯(解碼)成西班牙語(yǔ)。它先根據(jù)已有向量h4生成一個(gè)最有可能的單詞。向量h4與新生成的單詞“La”一起又產(chǎn)生了向量h5。在向量h5的基礎(chǔ)上,RNN推出下一個(gè)最有可能出現(xiàn)的單詞,“mujer”。重復(fù)進(jìn)行這個(gè)過(guò)程直到產(chǎn)生句號(hào),網(wǎng)絡(luò)結(jié)構(gòu)也到此為止。
使用這種編碼器—解碼器模型來(lái)做語(yǔ)言轉(zhuǎn)換,需要用一個(gè)包含大量源語(yǔ)言與目標(biāo)語(yǔ)言的語(yǔ)料庫(kù),基于這個(gè)語(yǔ)料庫(kù)訓(xùn)練RNN網(wǎng)絡(luò)。這些RNN通常含有非常復(fù)雜的內(nèi)部節(jié)點(diǎn)[3>,整個(gè)模型往往有幾百萬(wàn)個(gè)參數(shù)需要學(xué)習(xí)。
我們可以將解碼的結(jié)果以任何形式輸出,例如解析樹(shù)(parse?tree)[6],或是圖像的描述,假設(shè)有足夠多包含描述的圖像素材。當(dāng)給圖片添加描述時(shí),你可以用圖片訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)識(shí)別圖像中的物體。然后,把神經(jīng)網(wǎng)絡(luò)輸出層的權(quán)重值作為這幅圖像的向量表示,再將這個(gè)向量用解碼器解析出圖像的描述[4,7]。(點(diǎn)擊這里和這里查看示例)
從合成語(yǔ)義到關(guān)注、記憶和問(wèn)答
剛才的編碼器—解碼器方法似乎像是小把戲,我們接著就慢慢的來(lái)看看其在實(shí)際場(chǎng)景的應(yīng)用。我們可以把解碼的過(guò)程想象成回答問(wèn)題,“這句話該怎么翻譯?”或者,已經(jīng)有了待翻譯的句子,并且一部分內(nèi)容已經(jīng)翻譯了,那么“接下去該怎么寫(xiě)?”
為了回答這些問(wèn)題,算法首先需要記住一些狀態(tài)。在之前提到的例子中,系統(tǒng)只記住當(dāng)前向量狀態(tài)h以及最后寫(xiě)下的單詞。若是我們想讓它能運(yùn)用之前全部所見(jiàn)所學(xué)該怎么辦?在機(jī)器翻譯的例子里,這就意味著在選擇下一個(gè)單詞時(shí),要能夠回溯之前的狀態(tài)向量h0、h1、h2和h3。Bahdanau?et?al.?[1]創(chuàng)造了能滿足這種需求的網(wǎng)絡(luò)結(jié)構(gòu)。神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)如何在每個(gè)決策點(diǎn)確定之前哪個(gè)記憶狀態(tài)是最相關(guān)的。我們可以認(rèn)為這是一個(gè)關(guān)注記憶的焦點(diǎn)。
它的意義在于,由于我們可以將概念和語(yǔ)句編碼為向量,并且我們可以使用大量的向量作為記憶元素,通過(guò)搜索能找到問(wèn)題的最佳答案,那么深度學(xué)習(xí)技術(shù)就能用文字來(lái)回答問(wèn)題了。舉一個(gè)最簡(jiǎn)單的例子[8],用表示問(wèn)題的向量與表示記憶的向量做內(nèi)積運(yùn)算,把最吻合的結(jié)果作為問(wèn)題的最佳回答。另一種方法是把問(wèn)題和事實(shí)用多層神經(jīng)網(wǎng)絡(luò)進(jìn)行編碼,并把最后一層輸出傳給一個(gè)函數(shù),函數(shù)的輸出即為答案。這些方法都是基于模擬問(wèn)答的數(shù)據(jù)來(lái)訓(xùn)練,然后用下文Weston[8]所示的方法回答問(wèn)題。
下一個(gè)前沿方向是準(zhǔn)確理解語(yǔ)義
剛剛討論的方法是關(guān)于如何以讀故事的方式回答問(wèn)題,但是故事的一些重要情節(jié)一目了然,我們不必都寫(xiě)下來(lái)。設(shè)想桌上放著一本書(shū)。計(jì)算機(jī)如何才能知道你挪動(dòng)桌子的同時(shí)也挪動(dòng)了書(shū)本?同樣的,計(jì)算機(jī)怎么知道屋外只是下雨了呢?就如Marvin?Minsky所問(wèn),計(jì)算機(jī)如何知道你能用一根繩索拉箱子而不是推箱子呢?因?yàn)檫@些事實(shí)我們不會(huì)都寫(xiě)下來(lái),故事將只限于能被我們算法所表示的知識(shí)。為了獲取這部分知識(shí),我們的機(jī)器人(robot)將通過(guò)實(shí)景體驗(yàn)或者模擬體驗(yàn)來(lái)學(xué)習(xí)。
機(jī)器人必須經(jīng)歷這種實(shí)景體驗(yàn),并用深度神經(jīng)網(wǎng)絡(luò)編碼,基于此可以構(gòu)建通用語(yǔ)義。如果機(jī)器人總是看到箱子從桌上掉下來(lái),它則會(huì)根據(jù)這一事件創(chuàng)建一條神經(jīng)回路。當(dāng)媽媽說(shuō)“天啊,箱子跌落下來(lái)了”,這條回路將會(huì)和單詞“跌落”結(jié)合。然后,作為一個(gè)成熟的機(jī)器人,當(dāng)它再遇到句子“股票跌落了10個(gè)點(diǎn)”,根據(jù)這條神經(jīng)回路,它就該理解其中的意思了。
機(jī)器人還需要把一般的實(shí)景體驗(yàn)與抽象推理相結(jié)合。試著來(lái)理解這句話的含義“他去了垃圾場(chǎng)。”(He?went?to?the?junkyard.)WordNet只能提供一組與“went”相關(guān)的單詞。ConceptNet能把“went”和“go”聯(lián)系在一起,但是永遠(yuǎn)也不明白“go”的真正意思是什么。FrameNet有一個(gè)self-motion的框架,已經(jīng)非常接近了,但還是不夠。深度學(xué)習(xí)能把句子編碼成向量,然后回答各種問(wèn)題,諸如用“垃圾場(chǎng)”回答“他在哪兒”的問(wèn)題。然而,沒(méi)有一種方法能夠傳遞出一個(gè)人在不同位置這層意思,也就是說(shuō)他既不在這里,也不在其它地方。我們需要有一個(gè)連接自然語(yǔ)言和語(yǔ)言邏輯的接口,或者是用神經(jīng)網(wǎng)絡(luò)對(duì)抽象的邏輯進(jìn)行編碼。
實(shí)踐:深度學(xué)習(xí)的入門(mén)資源
入門(mén)的方法有很多種。斯坦福有一門(mén)用深度學(xué)習(xí)做NLP的公開(kāi)課。也可以去看Hinton教授在Coursera?Course的課程。另外,Bengio教授和他的朋友們也編寫(xiě)了一本簡(jiǎn)明易懂的在線教材來(lái)講解深度學(xué)習(xí)。在開(kāi)始編程之前,如果你使用Python語(yǔ)言,可以用Theano,如果你擅長(zhǎng)Java語(yǔ)言,就用Deeplearning4j。
總結(jié)
計(jì)算機(jī)性能的提升和我們生活的日益數(shù)字化,推動(dòng)了深度學(xué)習(xí)的革命。深度學(xué)習(xí)模型的成功是因?yàn)樗鼈冏銐虼?#xff0c;往往帶有上百萬(wàn)的參數(shù)。訓(xùn)練這些模型需要足夠多的訓(xùn)練數(shù)據(jù)和大量的計(jì)算。若要實(shí)現(xiàn)真正的智能,我們還需要走得更深。深度學(xué)習(xí)算法必須從實(shí)景體驗(yàn)中習(xí)得,并概念化這種經(jīng)驗(yàn),然后將這些經(jīng)驗(yàn)與抽象推理相結(jié)合
關(guān)于作者
Jonathan是21CT的首席科學(xué)家。他主要研究機(jī)器學(xué)習(xí)和人工智能如何使用在文本和知識(shí)中讓計(jì)算機(jī)變得更智能。他在德克薩斯農(nóng)工大學(xué)獲得心理學(xué)學(xué)士學(xué)位和工商管理碩士,在德克薩斯大學(xué)獲得計(jì)算機(jī)博士學(xué)位。他也是《?Curiosity?Cycle:?Preparing?Your?Child?for?the?Ongoing?Technological?Explosion》一書(shū)的作者。
參考文獻(xiàn)
[1] Dzmitry?Bahdanau,?Kyunghyun?Cho,?and?Yoshua?Bengio.?Neural?machine?translation?by?jointly
?learning?to?align?and?translate.?arXiv?preprint?arXiv:1409.0473,?2014.
[2]?Kyunghyun?Cho,?Bart?van?Merrienboer,?Caglar?Gulcehre,?Fethi?Bougares,?Holger?Schwenk,?and
?Yoshua?Bengio.?Learning?phrase?representations?using?RNN?encoder-decoder?for?statistical?machine translation.?arXiv?preprint?arXiv:1406.1078,?2014.
[3]?Sepp?Hochreiter?and?Jürgen?Schmidhuber.?Long?short-term?memory.?Neural computation,?9(8):1735–1780,?1997.
[4]?Andrej?Karpathy?and?Li?Fei-Fei.?Deep?visual-semantic?alignments?for?generating?image?descriptions.?arXiv preprint?arXiv:1412.2306,?2014.
[5]?Baolin?Peng,?Zhengdong?Lu,?Hang?Li,?and?Kam-Fai?Wong.?Towards?neural?network-based?reasoning.?arXiv preprint?arXiv:1508.05508,?2015.
[6]?Oriol?Vinyals,?Lukasz?Kaiser,?Terry?Koo,?Slav?Petrov,?Ilya?Sutskever,?and?Geoffrey?Hinton.
?Grammar?as?a foreign?language.?arXiv?preprint?arXiv:1412.7449,?2014.
[7]?Oriol?Vinyals,?Alexander?Toshev,?Samy?Bengio,?and?Dumitru?Erhan.?Show?and?tell:?A?neural?
image?caption generator.?arXiv?preprint?arXiv:1411.4555,?2014.
[8]?Jason?Weston,?Sumit?Chopra,?and?Antoine?Bordes.?Memory?networks.?arXiv
?preprint?arXiv:1410.3916,?2014.
[9]?Yoshua?Bengio?and?Yann?LeCun.?Scaling?learning?algorithms?towards?AI.?Large-scale?kernel?machines,?34(5),?2007.
[10]?Tomas?Mikolov,?Kai?Chen,?Greg?Corrado,?and?Jeffrey?Dean.?Efficient?estimation?of?word
?representations in?vector?space.?arXiv?preprint?arXiv:1301.3781,?2013.
總結(jié)
以上是生活随笔為你收集整理的深度学习在自然语言处理的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OpenStack架构企业IT应用的敏捷
- 下一篇: 移动应用开发者正饱受折磨