詞向量:word2vec

詞向量技術(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)如下圖:

WX20190723-200320@2x.png

WX20190724-131551@2x.png

CBOW在已知上下文的前提下預(yù)測當(dāng)前詞,學(xué)習(xí)的目標(biāo)函數(shù)是最大化對數(shù)似然函數(shù):
\sum_{w \in C} \log p(w | \operatorname{Context}(w))
Skip-gram在已知當(dāng)前詞的前提下預(yù)測其上下文闷哆,目標(biāo)函數(shù)形如:
\sum_{w \in C} \log p(\operatorname{Context}(w) | w)
同樣用于計算概率值腰奋,從模型的計算方式看,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ù)赠摇。


WX20190723-202249@2x.png

注意,滑動窗口大小是可調(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維向量):


WX20190723-211037@2x.png

注意這里隱藏層并沒有激活函數(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)的詞向量(如下圖示例)镀钓。


WX20190723-213422@2x.png

輸出層的神經(jīng)元數(shù)量和語料庫中的單詞數(shù)量一樣。每一個神經(jīng)元可以認(rèn)為對應(yīng)一個單詞的輸出權(quán)重镀迂,詞向量乘以輸出權(quán)重得到一個數(shù)丁溅,代表了輸出神經(jīng)元對應(yīng)的單詞出現(xiàn)在輸入單詞周圍的可能性大小,通過對所有的輸出層神經(jīng)元的輸出做softmax探遵,我們就把輸出層歸為一個概率分布了窟赏。


WX20190723-214623@2x.png

上面說的是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)頻率越高嫌吠,刪除該詞的概率越大伪窖。原論文給出的概率是:
P\left(w_{i}\right)=1-\sqrt{\frac{t}{f\left(w_{i}\right)}}

f(w_{i})是詞w_{i}在語料庫中出現(xiàn)的頻率,t是一個給定的閾值居兆,通常給10^{-5}左右覆山。

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)驗值:
P\left(w_{i}\right)=\frac{f\left(w_{i}\right)^{3 / 4}} {\sum_{j=1}^{V} f\left(w_{j}\right)^{3 / 4}}

3、Hierarchical Softmax

Hierarchical Softmax也是為了降低概率的計算復(fù)雜度久窟。作為一種計算高效的近似方法秩冈,Hierarchical Softmax被廣泛使用。Morin和Bengio[1]首次將這種方法引入神經(jīng)網(wǎng)絡(luò)語言模型斥扛。該方法不用為了獲得概率分布而評估神經(jīng)網(wǎng)絡(luò)中的W個輸出結(jié)點漩仙,而只需要評估大于\log _{2}(W)個結(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ù)測效率大大提升馁启。


WX20190725-221752@2x.png

例如到達(dá)非葉子結(jié)點n的時候往左邊走和往右邊走的概率分別是:
p(n, \text {left})=\sigma\left(\theta_{n}^{T} \cdot h\right)

p(n, \text {right})=1-\sigma\left(\theta_{n}^{T} \cdot h\right)=\sigma\left(-\theta_{n}^{T} \cdot h\right)

以上圖中目標(biāo)詞w_{2}為例,
\begin{aligned} p\left(w_{2}\right) &=p\left(n\left(w_{2}, 1\right), \text { lef } t\right) \cdot p\left(n\left(w_{2}, 2\right), \text { left }\right) \cdot p\left(n\left(w_{2}, 3\right), \text { right }\right) \\ &=\sigma\left(\theta_{n\left(w_{2}, 1\right)}^{T} \cdot h\right) \cdot \sigma\left(\theta_{n\left(w_{2}, 2\right)}^{T} \cdot h\right) \cdot \sigma\left(-\theta_{n\left(w_{2}, 3\right)}^{T} \cdot h\right) \end{aligned}
到這里可以看出目標(biāo)詞w_{2}的概率可表示成:
p(w)=\prod_{j=1}^{L(w)-1} \sigma\left(\operatorname{sign}(w, j) \cdot \theta_{n(w, j)}^{T} h\right)
其中L(w) 表示 從根節(jié)點到w 的路徑長度芍秆,\theta_{n(w, j)}是非葉子結(jié)點n(w,j)的向量表示(即輸出向量)惯疙;h是隱藏層的輸出值,從輸入詞的向量中計算得來妖啥;sign(x,j)是一個特殊函數(shù)定義:
\operatorname{sign}(w, j)=\left\{\begin{array}{l}{1}虑椎,若n(w,j+1)是n(w,j)的左孩子 \\ {-1}泻蚊,若n(w,j+1)是n(w,j)的右孩子\end{array}\right.
此外轧房,所有詞的概率和為1:
\sum_{i=1}^{n} p\left(w_{i}\right)=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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纸颜,一起剝皮案震驚了整個濱河市朽们,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诉位,老刑警劉巖骑脱,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異不从,居然都是意外死亡惜姐,警方通過查閱死者的電腦和手機(jī)犁跪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門椿息,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坷衍,你說我怎么就攤上這事寝优。” “怎么了枫耳?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵乏矾,是天一觀的道長。 經(jīng)常有香客問我迁杨,道長钻心,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任铅协,我火速辦了婚禮捷沸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狐史。我一直安慰自己痒给,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布骏全。 她就那樣靜靜地躺著苍柏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姜贡。 梳的紋絲不亂的頭發(fā)上试吁,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音楼咳,去河邊找鬼潘悼。 笑死,一個胖子當(dāng)著我的面吹牛爬橡,可吹牛的內(nèi)容都是我干的治唤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼糙申,長吁一口氣:“原來是場噩夢啊……” “哼宾添!你這毒婦竟也來了船惨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤缕陕,失蹤者是張志新(化名)和其女友劉穎粱锐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扛邑,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡怜浅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔬崩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恶座。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沥阳,靈堂內(nèi)的尸體忽然破棺而出跨琳,到底是詐尸還是另有隱情,我是刑警寧澤桐罕,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布脉让,位于F島的核電站,受9級特大地震影響功炮,放射性物質(zhì)發(fā)生泄漏溅潜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一薪伏、第九天 我趴在偏房一處隱蔽的房頂上張望滚澜。 院中可真熱鬧,春花似錦毅该、人聲如沸博秫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挡育。三九已至,卻和暖如春朴爬,著一層夾襖步出監(jiān)牢的瞬間即寒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工召噩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留母赵,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓具滴,卻偏偏與公主長得像凹嘲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子构韵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354