word2vec層次化softmax理解


在外網發現一篇把word2vec的hierarchical softmax優化講得比較好的博客,詳見:http://building-babylon.net/2017/08/01/hierarchical-softmax/

總結:

1、層次化softmax是為了解決用softmax進行V分類時(V是詞典大小),由於詞典巨大導致計算目標詞的似然概率的低效問題。

2、層次化softmax通常和CBOW模型一起講,但它作為一種優化手段,也可以用於skip-gram的優化。

3、層次化softmax改變了原來的模型結構。原來是1*V(輸入one-hot),經過V*D的矩陣(input-embedding) ,再經過D*V矩陣(output-embedding),即一系列矩陣乘法(1,V)*(V,D)*(D,V)=(1,V)【其中的第一次乘法,一般用查表的方式直接讀取,不用相乘】,再softmax,得到目標詞是詞典中每個詞的概率。使用層次化softmax時,output-embedding被取消了,查表后直接用(1,D)的向量與每個中間路徑節點對應的一個向量γn【形狀為(D,1)】,進行相乘,得到一個scalar,再經過sigmoid,轉為一個0到1之間的小數,此數從就是從樹(樹是二叉樹,樹的每個葉子節點都對應一個單詞)的根節點到某個葉子節點的路徑上每次在中間節點選擇向左(也可定為向右)走的概率。也就是這段話的意思:

如此這般,路徑上每條邊的概率進行連乘,就是從根節點到葉子節點的總的概率,也就是模型的預測值為該葉子節點(目標單詞)的概率。層次化softmax的目標函數就是最大化目標詞的路徑概率,換句話說,我們只需要關注目標詞的路徑概率即可,而目標詞是已知的,完全不需要計算其他的詞的路徑概率。這點是后續優化措施的關鍵。

4、那層次化softmax的優點體現在哪里?體現在計算預測輸出值為每個單詞的概率時,由於概率是從根節點到葉子節點的路徑上的邊進行連乘,也就是計算量與目標詞(葉子節點)的路徑長度成正比,原來的softmax的目標函數在反向傳播時需要求導,而求導時,由於分母是e的指數的累加和,導致必須算出所有單詞的概率,計算量是與詞表大小V成正比。【目標函數為交叉熵,loss=-ΣYi*logPi, 其中i代表某個類別,而只有目標詞的Yi為1,其余詞的Yi為0,因此loss=-logP(target)。而Pi=softmax(w1*w2),w1,w2分別是input-embedding、output-embedding矩陣中的參數, 先求對w2的梯度:d(loss) /d(w2)=-1/P(target)* d(P(target))/d(w2),可見梯度中包括P(target)的計算,因此必須包含V個e的指數計算。】

而層次化softmax的樹是二叉樹,路徑長度也就是樹的高度,假設是滿二叉樹,則樹高=V取2為底的對數值,遠遠小於V,節省了很多計算過程。比如一個大小為1024的詞典,原來softmax是1024個e的指數計算,現在是log1024=10次sigmoid值再連乘,共節省了1024-10=1014次計算。

5、是否還可以進一步優化?可以。以上表述中層次化的softmax用到的樹,一般認為是滿的二叉樹,也就是樹的高度為logV,其實還有優化的空間。因為目標詞的概率僅與根節點到目標詞的路徑長度有關,如果我們能夠優化根節點到目標詞的路徑長度,就可以進一步節省計算。什么二叉樹的根節點到葉子節點的路徑長度最短?答案是哈夫曼樹。

因此可以把樹做成哈夫曼樹。mikolov的論文就是采用了哈夫曼樹,且構建哈夫曼樹時,比較節點的權重大小是依據該節點(也就是單詞)的詞頻,詞頻大的放在離根節點近的地方,詞頻小的遠離根節點。如此詞頻大的詞只需要很少的比較次數,路徑就結束了,計算次數比較少。

6、由於是根據詞頻來構建哈夫曼樹,所以一開始這課樹的結構就是已經確定的,每個葉子節點對應的單詞也是已知的,換言之根節點到目標節點的路徑包括中間節點、向左還是向右也是已知的,每個中間節點對應的向量的形狀已經定好了,並不是真的需要每次都要判斷向左走還是向右走。后續優化時只需要更新中間節點對應的向量、詞向量即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM