蘇州h5模板建站seo網(wǎng)站優(yōu)化快速排名軟件
目錄
自然語(yǔ)言處理2-NLP
如何把詞轉(zhuǎn)換為向量
如何讓向量具有語(yǔ)義信息
在CBOW中
在Skip-gram中
skip-gram比CBOW效果更好
CBOW和Skip-gram的算法實(shí)現(xiàn)
Skip-gram的理想實(shí)現(xiàn)
Skip-gram的實(shí)際實(shí)現(xiàn)
自然語(yǔ)言處理2-NLP
在自然語(yǔ)言處理任務(wù)中,詞向量(Word Embedding)是表示自然語(yǔ)言里單詞的一種方法,即把每個(gè)詞都表示為一個(gè)N維空間內(nèi)的點(diǎn),即一個(gè)高維空間內(nèi)的向量。通過(guò)這種方法,實(shí)現(xiàn)把自然語(yǔ)言計(jì)算轉(zhuǎn)換為向量計(jì)算。
如?圖1?所示的詞向量計(jì)算任務(wù)中,先把每個(gè)詞(如queen,king等)轉(zhuǎn)換成一個(gè)高維空間的向量,這些向量在一定意義上可以代表這個(gè)詞的語(yǔ)義信息。再通過(guò)計(jì)算這些向量之間的距離,就可以計(jì)算出詞語(yǔ)之間的關(guān)聯(lián)關(guān)系,從而達(dá)到讓計(jì)算機(jī)像計(jì)算數(shù)值一樣去計(jì)算自然語(yǔ)言的目的。
圖1:詞向量計(jì)算示意圖
?
因此,大部分詞向量模型都需要回答兩個(gè)問(wèn)題:
- 如何把詞轉(zhuǎn)換為向量?
自然語(yǔ)言單詞是離散信號(hào),比如“香蕉”,“橘子”,“水果”在我們看來(lái)就是3個(gè)離散的詞。
如何把每個(gè)離散的單詞轉(zhuǎn)換為一個(gè)向量?
- 如何讓向量具有語(yǔ)義信息?
比如,我們知道在很多情況下,“香蕉”和“橘子”更加相似,而“香蕉”和“句子”就沒(méi)有那么相似,同時(shí)“香蕉”和“食物”、“水果”的相似程度可能介于“橘子”和“句子”之間。
那么,我們?cè)撊绾巫屧~向量具備這樣的語(yǔ)義信息?
如何把詞轉(zhuǎn)換為向量
自然語(yǔ)言單詞是離散信號(hào),比如“我”、“ 愛(ài)”、“人工智能”。如何把每個(gè)離散的單詞轉(zhuǎn)換為一個(gè)向量?通常情況下,我們可以維護(hù)一個(gè)如?圖2?所示的查詢(xún)表。表中每一行都存儲(chǔ)了一個(gè)特定詞語(yǔ)的向量值,每一列的第一個(gè)元素都代表著這個(gè)詞本身,以便于我們進(jìn)行詞和向量的映射(如“我”對(duì)應(yīng)的向量值為 [0.3,0.5,0.7,0.9,-0.2,0.03] )。給定任何一個(gè)或者一組單詞,我們都可以通過(guò)查詢(xún)這個(gè)excel,實(shí)現(xiàn)把單詞轉(zhuǎn)換為向量的目的,這個(gè)查詢(xún)和替換過(guò)程稱(chēng)之為Embedding Lookup。
圖2:詞向量查詢(xún)表
?
上述過(guò)程也可以使用一個(gè)字典數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。事實(shí)上如果不考慮計(jì)算效率,使用字典實(shí)現(xiàn)上述功能是個(gè)不錯(cuò)的選擇。然而在進(jìn)行神經(jīng)網(wǎng)絡(luò)計(jì)算的過(guò)程中,需要大量的算力,常常要借助特定硬件(如GPU)滿(mǎn)足訓(xùn)練速度的需求。GPU上所支持的計(jì)算都是以張量(Tensor)為單位展開(kāi)的,因此在實(shí)際場(chǎng)景中,我們需要把Embedding Lookup的過(guò)程轉(zhuǎn)換為張量計(jì)算,如?圖3?所示。
圖3:張量計(jì)算示意圖
?
假設(shè)對(duì)于句子"我,愛(ài),人工,智能",把Embedding Lookup的過(guò)程轉(zhuǎn)換為張量計(jì)算的流程如下:
-
通過(guò)查詢(xún)字典,先把句子中的單詞轉(zhuǎn)換成一個(gè)ID(通常是一個(gè)大于等于0的整數(shù)),這個(gè)單詞到ID的映射關(guān)系可以根據(jù)需求自定義(如圖3中,我=>1, 人工=>2,愛(ài)=>3,…)。
-
得到ID后,再把每個(gè)ID轉(zhuǎn)換成一個(gè)固定長(zhǎng)度的向量。假設(shè)字典的詞表中有5000個(gè)詞,那么,對(duì)于單詞“我”,就可以用一個(gè)5000維的向量來(lái)表示。由于“我”的ID是1,因此這個(gè)向量的第一個(gè)元素是1,其他元素都是0([1,0,0,…,0]);
-
同樣對(duì)于單詞“人工”,第二個(gè)元素是1,其他元素都是0。
-
用這種方式就實(shí)現(xiàn)了用一個(gè)向量表示一個(gè)單詞。由于每個(gè)單詞的向量表示都只有一個(gè)元素為1,而其他元素為0,因此我們稱(chēng)上述過(guò)程為One-Hot Encoding。
-
經(jīng)過(guò)One-Hot Encoding后,句子“我,愛(ài),人工,智能”就被轉(zhuǎn)換成為了一個(gè)形狀為 4×5000的張量,記為V。在這個(gè)張量里共有4行、5000列,從上到下,每一行分別代表了“我”、“愛(ài)”、“人工”、“智能”四個(gè)單詞的One-Hot Encoding。最后,我們把這個(gè)張量V和另外一個(gè)稠密張量W相乘,其中W張量的形狀為5000 × 128(5000表示詞表大小,128表示每個(gè)詞的向量大小)。經(jīng)過(guò)張量乘法,我們就得到了一個(gè)4×128的張量,從而完成了把單詞表示成向量的目的。
如何讓向量具有語(yǔ)義信息
得到每個(gè)單詞的向量表示后,我們需要思考下一個(gè)問(wèn)題:比如在多數(shù)情況下,“香蕉”和“橘子”更加相似,而“香蕉”和“句子”就沒(méi)有那么相似;同時(shí),“香蕉”和“食物”、“水果”的相似程度可能介于“橘子”和“句子”之間。那么如何讓存儲(chǔ)的詞向量具備這樣的語(yǔ)義信息呢?
我們先學(xué)習(xí)自然語(yǔ)言處理領(lǐng)域的一個(gè)小技巧。在自然語(yǔ)言處理研究中,科研人員通常有一個(gè)共識(shí):使用一個(gè)單詞的上下文來(lái)了解這個(gè)單詞的語(yǔ)義,比如:
“蘋(píng)果手機(jī)質(zhì)量不錯(cuò),就是價(jià)格有點(diǎn)貴?!?/p>
“這個(gè)蘋(píng)果很好吃,非常脆?!?/p>
“菠蘿質(zhì)量也還行,但是不如蘋(píng)果支持的APP多?!?/p>
在上面的句子中,我們通過(guò)上下文可以推斷出第一個(gè)“蘋(píng)果”指的是蘋(píng)果手機(jī),第二個(gè)“蘋(píng)果”指的是水果蘋(píng)果,而第三個(gè)“菠蘿”指的應(yīng)該也是一個(gè)手機(jī)。事實(shí)上,
在自然語(yǔ)言處理領(lǐng)域,使用上下文描述一個(gè)詞語(yǔ)或者元素的語(yǔ)義是一個(gè)常見(jiàn)且有效的做法。
我們可以使用同樣的方式訓(xùn)練詞向量,讓這些詞向量具備表示語(yǔ)義信息的能力。
2013年,Mikolov提出的經(jīng)典word2vec算法就是通過(guò)上下文來(lái)學(xué)習(xí)語(yǔ)義信息。word2vec包含兩個(gè)經(jīng)典模型:CBOW(Continuous Bag-of-Words)和Skip-gram,如?圖4?所示。
- CBOW:通過(guò)上下文的詞向量推理中心詞。
- Skip-gram:根據(jù)中心詞推理上下文。
圖4:CBOW和Skip-gram語(yǔ)義學(xué)習(xí)示意圖
假設(shè)有一個(gè)句子“Pineapples are spiked and yellow”,兩個(gè)模型的推理方式如下:
-
在CBOW中
-
先在句子中選定一個(gè)中心詞,并把其它詞作為這個(gè)中心詞的上下文。如?圖4?CBOW所示,把“Spiked”作為中心詞,把“Pineapples、are、and、yellow”作為中心詞的上下文。在學(xué)習(xí)過(guò)程中,使用上下文的詞向量推理中心詞,這樣中心詞的語(yǔ)義就被傳遞到上下文的詞向量中,如“Spiked → pineapple”,從而達(dá)到學(xué)習(xí)語(yǔ)義信息的目的。
-
在Skip-gram中
-
同樣先選定一個(gè)中心詞,并把其他詞作為這個(gè)中心詞的上下文。如?圖4?Skip-gram所示,把“Spiked”作為中心詞,把“Pineapples、are、and、yellow”作為中心詞的上下文。不同的是,在學(xué)習(xí)過(guò)程中,使用中心詞的詞向量去推理上下文,這樣上下文定義的語(yǔ)義被傳入中心詞的表示中,如“pineapple → Spiked”, 從而達(dá)到學(xué)習(xí)語(yǔ)義信息的目的。
說(shuō)明:
一般來(lái)說(shuō),CBOW比Skip-gram訓(xùn)練速度快,訓(xùn)練過(guò)程更加穩(wěn)定,原因是CBOW使用上下文average的方式進(jìn)行訓(xùn)練,每個(gè)訓(xùn)練step會(huì)見(jiàn)到更多樣本。
而在生僻字(出現(xiàn)頻率低的字)
skip-gram比CBOW效果更好
原因是skip-gram不會(huì)刻意回避生僻字(CBOW結(jié)構(gòu)中輸入中存在生僻字時(shí),生僻字會(huì)被其它非生僻字的權(quán)重沖淡)。
CBOW和Skip-gram的算法實(shí)現(xiàn)
我們以這句話(huà):“Pineapples are spiked and yellow”為例分別介紹CBOW和Skip-gram的算法實(shí)現(xiàn)。
如?圖5?所示,CBOW是一個(gè)具有3層結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),分別是:
圖5:CBOW的算法實(shí)現(xiàn)
- 輸入層:?一個(gè)形狀為C×V的one-hot張量,其中C代表上線(xiàn)文中詞的個(gè)數(shù),通常是一個(gè)偶數(shù),我們假設(shè)為4;V表示詞表大小,我們假設(shè)為5000,該張量的每一行都是一個(gè)上下文詞的one-hot向量表示,比如“Pineapples, are, and, yellow”。
- 隱藏層:?一個(gè)形狀為V×N的參數(shù)張量W1,一般稱(chēng)為word-embedding,N表示每個(gè)詞的詞向量長(zhǎng)度,我們假設(shè)為128。輸入張量和word embedding W1進(jìn)行矩陣乘法,就會(huì)得到一個(gè)形狀為C×N的張量。綜合考慮上下文中所有詞的信息去推理中心詞,因此將上下文中C個(gè)詞相加得一個(gè)1×N的向量,是整個(gè)上下文的一個(gè)隱含表示。
- 輸出層:?創(chuàng)建另一個(gè)形狀為N×V的參數(shù)張量,將隱藏層得到的1×N的向量乘以該N×V的參數(shù)張量,得到了一個(gè)形狀為1×V的向量。最終,1×V的向量代表了使用上下文去推理中心詞,每個(gè)候選詞的打分,再經(jīng)過(guò)softmax函數(shù)的歸一化,即得到了對(duì)中心詞的推理概率:
如?圖6?所示,Skip-gram是一個(gè)具有3層結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),分別是:
圖6:Skip-gram算法實(shí)現(xiàn)
?
在實(shí)際操作中,使用一個(gè)滑動(dòng)窗口(一般情況下,長(zhǎng)度是奇數(shù)),從左到右開(kāi)始掃描當(dāng)前句子。每個(gè)掃描出來(lái)的片段被當(dāng)成一個(gè)小句子,每個(gè)小句子中間的詞被認(rèn)為是中心詞,其余的詞被認(rèn)為是這個(gè)中心詞的上下文。
Skip-gram的理想實(shí)現(xiàn)
?
Skip-gram的實(shí)際實(shí)現(xiàn)
?