詞向量技術(shù)將自然語言中的詞轉(zhuǎn)化為稠密向量烘豹,使得相近的詞有相似的向量表示,方便后續(xù)在向量的基礎(chǔ)上做運算焙蹭,進(jìn)一步挖掘文本之間的潛在關(guān)系位仁。
在傳統(tǒng)的機(jī)器學(xué)習(xí)模型構(gòu)建中柑贞,我們常使用one-hot編碼來表示離散特征。在詞表達(dá)方面聂抢,如果我們也用one-hot來做钧嘶,將會得到一個高維且稀疏的向量表達(dá)。如詞典中有一萬個詞涛浙,每個詞的向量表示都是一個對應(yīng)位置的1和9999個0康辑。而深度學(xué)習(xí)的特點以及工程方面的原因使其不利于稀疏特征向量的處理摄欲,所以我們需要把高維稀疏向量映射到低維空間的稠密向量轿亮。
2013年Google推出了用來產(chǎn)生詞向量的模型——word2vec。模型為淺層雙層的神經(jīng)網(wǎng)絡(luò)胸墙,用來訓(xùn)練以重新構(gòu)建語言學(xué)之詞文本我注。網(wǎng)絡(luò)以詞表現(xiàn),并且需要猜測相鄰位置的輸入詞迟隅,在word2vec中詞袋模型假設(shè)下但骨,詞的順序是不重要的励七。訓(xùn)練完之后,word2vec模型可用來映射每個詞到一個向量奔缠,可用來表示詞與詞之間的關(guān)系掠抬。
word2vec的核心思想是通過詞的上下文得到詞的向量化表示。有兩種方法:CBOW(通過附近詞預(yù)測中心測)校哎、Skip-gram(通過中心詞預(yù)測附近的詞)两波。網(wǎng)絡(luò)結(jié)構(gòu)如下圖:
CBOW在已知上下文的前提下預(yù)測當(dāng)前詞,學(xué)習(xí)的目標(biāo)函數(shù)是最大化對數(shù)似然函數(shù):
Skip-gram在已知當(dāng)前詞的前提下預(yù)測其上下文闷哆,目標(biāo)函數(shù)形如:
同樣用于計算概率值腰奋,從模型的計算方式看,skip-gram想要預(yù)測更多(上下文)抱怔,一次會更比CBOW慢一些劣坊,但有觀點認(rèn)為對低頻詞效果更好一些
下面我們基于skip-gram算法來一探究竟。我們的語料文本是:The quick brown fox jumps over the lazy dog. 如下圖所示屈留,定義一個大小為5的滑動窗口局冰,從第一個詞開始逐個往后滑動,這就有了中心詞和鄰近詞對灌危。如(the, quick)锐想,(the, brown), (quick, the)等等乍狐,這些就是我們的訓(xùn)練數(shù)據(jù)赠摇。
注意,滑動窗口大小是可調(diào)整的浅蚪,我們這里為了簡單舉例窗口大小為5藕帜。一般來說,取10是比較好的經(jīng)驗值惜傲,也就是左右各取5個單詞洽故。
到這里我們有了訓(xùn)練數(shù)據(jù),但是這里的詞對是不能直接輸入神經(jīng)網(wǎng)絡(luò)的盗誊。這里解決方法很簡單时甚,直接用one-hot編碼。因為我們的詞典里面有8個詞哈踱,所以我們把每個單詞都表示成一個8維向量荒适。比如單詞the的one-hot編碼為(1, 0, 0, 0, 0, 0, 0, 0),quick的one-hot編碼為(0, 1, 0, 0, 0, 0, 0, 0)开镣。當(dāng)我們把the輸入時刀诬,希望網(wǎng)絡(luò)也能輸出一個8維向量,并且第2維盡可能接近1邪财,其他維盡可能接近0陕壹。也就是讓神經(jīng)網(wǎng)絡(luò)告訴我們质欲,quick更可能出現(xiàn)在the的周圍。并且我們還希望這8維向量所有位置的值相加為1糠馆。這樣就可以認(rèn)為這個8維向量描述的是一個概率分布嘶伟,正好我們的y值也是符合概率分布(一個位置為1,其他為0)又碌》茉纾基于此,我們就可以用交叉熵來衡量神經(jīng)網(wǎng)絡(luò)的輸出與y的差異赠橙,也就定義出loss function了耽装。
有了以上信息,我們就能定義出如下的網(wǎng)絡(luò)結(jié)構(gòu)(圖借鑒于10000個單詞的300維向量):
注意這里隱藏層并沒有激活函數(shù)期揪,但是輸出成用了softmax掉奄,保證輸出向量是一個概率分布。
隱藏層的神經(jīng)元應(yīng)該設(shè)置多少個凤薛?這取決于我們希望得到的詞向量的維數(shù)姓建,google給出的經(jīng)驗值是300。還是回到我們的例子中來缤苫,假設(shè)我們的隱藏層神經(jīng)元有3個速兔,那隱藏層的權(quán)重就是一個8行3列的矩陣。網(wǎng)絡(luò)訓(xùn)練完成后活玲,隱藏層權(quán)重的每一行代表一個詞向量涣狗。
因此我們只需要保存隱藏層的權(quán)重矩陣,又因為輸入是one-hot編碼舒憾,所以用輸入向量乘以這個權(quán)重矩陣就得到了對應(yīng)的詞向量(如下圖示例)镀钓。
輸出層的神經(jīng)元數(shù)量和語料庫中的單詞數(shù)量一樣。每一個神經(jīng)元可以認(rèn)為對應(yīng)一個單詞的輸出權(quán)重镀迂,詞向量乘以輸出權(quán)重得到一個數(shù)丁溅,代表了輸出神經(jīng)元對應(yīng)的單詞出現(xiàn)在輸入單詞周圍的可能性大小,通過對所有的輸出層神經(jīng)元的輸出做softmax探遵,我們就把輸出層歸為一個概率分布了窟赏。
上面說的是Skip-gram算法流程,CBOW的計算流程也基本差不多箱季,不同之處在于隱藏層不再是取一個詞的詞向量各維涯穷,而是上下文C個詞的詞向量各維的平均值。
到這里规哪,word2vec的流程我們是大概搞清楚了求豫。上面的做法在實踐過程中會有一些問題:首先塌衰,按照google的做法詞庫有10000個詞诉稍,詞向量設(shè)置300維蝠嘉,雖然我們的網(wǎng)絡(luò)比較淺,但是我們一共需要訓(xùn)練2x300x10000個參數(shù)杯巨,加上龐大的訓(xùn)練數(shù)據(jù)蚤告,我們的訓(xùn)練過程會比較慢;其次服爷,輸出層采用softmax算概率分布杜恰,因為指數(shù)計算的復(fù)雜度比較高,一旦詞典比較大仍源,這里的效率會極其低下心褐。
針對上面的問題,原論文里面給出一些優(yōu)化的方法笼踩,這里我們主要看幾個:
1逗爹、對高頻詞進(jìn)行采樣
在我們構(gòu)建訓(xùn)練數(shù)據(jù)的時候,有些高頻詞實際上對其他詞的預(yù)測并沒有產(chǎn)生積極作用嚎于,反而無端增加了訓(xùn)練樣本掘而。比如"The quick brown fox jumps over the lazy dog.",在這句話中"the"出現(xiàn)了兩次于购,但是它并不構(gòu)成fox的context袍睡,在其他的訓(xùn)練數(shù)據(jù)中也會大量出現(xiàn)這個詞,所以這里我們可以做subsampling. 當(dāng)掃描文本時肋僧,根據(jù)一定的概率刪除這個詞斑胜。這個概率大小取決于這個詞在整個語料庫中出現(xiàn)的頻率,出現(xiàn)頻率越高嫌吠,刪除該詞的概率越大伪窖。原論文給出的概率是:
是詞在語料庫中出現(xiàn)的頻率,t是一個給定的閾值居兆,通常給左右覆山。
2、負(fù)采樣
負(fù)采樣的目的是為改善在預(yù)測每一個詞的概率時泥栖,普通softmax需要累加一次歸一化項帶來的高計算成本問題簇宽。其核心思想是把對每一個詞概率的預(yù)測都轉(zhuǎn)化為小規(guī)模的監(jiān)督學(xué)習(xí)問題。
還是拿上面的例子說"The quick brown fox jumps over the lazy dog. "吧享,選取fox為上文魏割,然后把預(yù)測為jumps標(biāo)記為1(正樣本),再選取句子中的k個其他詞為負(fù)樣本钢颂,類似:(fox, apple)钞它,(fox, book)這種。再將采樣到的這些樣本用來訓(xùn)練一個邏輯回歸模型,在預(yù)測fox一詞下文出現(xiàn)的詞的概率時遭垛,每次迭代softmax的計算量就下來了尼桶。這里k的取值,原論文中提到如果語料庫比較大一般取5-20之間锯仪;如果語料庫比較小泵督,k取5以內(nèi)。
上面提到對負(fù)樣本進(jìn)行采樣庶喜,這就涉及到概率的問題小腊,原論文中給出一個經(jīng)驗值:
3、Hierarchical Softmax
Hierarchical Softmax也是為了降低概率的計算復(fù)雜度久窟。作為一種計算高效的近似方法秩冈,Hierarchical Softmax被廣泛使用。Morin和Bengio[1]首次將這種方法引入神經(jīng)網(wǎng)絡(luò)語言模型斥扛。該方法不用為了獲得概率分布而評估神經(jīng)網(wǎng)絡(luò)中的W個輸出結(jié)點漩仙,而只需要評估大于個結(jié)點。Hierarchical Softmax使用一種二叉樹結(jié)構(gòu)來表示詞典里的所有詞犹赖,V個詞都是二叉樹的葉子結(jié)點队他,而這棵樹一共有V-1個非葉子結(jié)點。
首先以詞典中的每個詞在語料中出現(xiàn)的次數(shù)為權(quán)重峻村,構(gòu)建一棵哈夫曼樹麸折,葉子結(jié)點為詞典中的每個詞的one-hot表示,每個非葉子結(jié)點也表示為一個向量粘昨。此時垢啼,從根結(jié)點到每一個葉子結(jié)點的路徑都可以由一串哈夫曼編碼來表示。
在預(yù)測過程中张肾,每一個非葉子結(jié)點都用自身的向量表示來做一次二分類(如使用邏輯回歸)芭析,分類的結(jié)果便導(dǎo)向其是去到左結(jié)點還是有結(jié)點。此方法在預(yù)測某一個特定的詞的概率時就只需考慮從根結(jié)點到該葉子結(jié)點這幾步了吞瞪,使預(yù)測效率大大提升馁启。
例如到達(dá)非葉子結(jié)點n的時候往左邊走和往右邊走的概率分別是:
以上圖中目標(biāo)詞為例,
到這里可以看出目標(biāo)詞的概率可表示成:
其中L(w) 表示 從根節(jié)點到w 的路徑長度芍秆,是非葉子結(jié)點n(w,j)的向量表示(即輸出向量)惯疙;h是隱藏層的輸出值,從輸入詞的向量中計算得來妖啥;sign(x,j)是一個特殊函數(shù)定義:
此外轧房,所有詞的概率和為1:
參考:
http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/
https://arxiv.org/abs/1411.2738