1. 程式人生 > >word2vec中關於霍夫曼樹的應用原理

word2vec中關於霍夫曼樹的應用原理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                看了word2vec中雖然對霍夫曼原理有所瞭解。但是沒有找到使用霍夫曼編碼的原理。 在google上搜到這篇文章,感覺寫的很不錯,果斷轉了http://xiaoquanzi.net/?p=156

2013年末,Google釋出的word2vec引起了一幫人的熱捧,各種興奮。時至今日,各地討論的也不似如此頻繁,也是時候寫一下個人對它的理解,亦可避免被真正的有識之士鄙視。

大量讚歎word2vec的微博或者短文中,幾乎都認為它是深度學習在自然語言領域的一項了不起的應用,各種歡呼“深度學習在自然語言領域開始發力了”。但實際上,簡單看看程式碼就知道它實際上只是一個三層網路,壓根算不上所謂的深層網路,學習過程也很簡單,並未用太玄妙的東西,以至於在瞭解完整以後對它的簡單歎為觀止。

筆者其實也是門外漢,幸好周圍有一些高人,幾經指點,自認為大體瞭解,作此鄙文,記錄一下。

首先,它的結構就是一個三層網路——輸入層、隱層(也可稱為對映層),輸出層。
其次,程式碼中讓人費解(沒學過神經網路,是以費解)的主要是hierarchical softmax。得同事J指導,和同事S討論,終於弄明白其網路結果,如下圖所示:

word2vec_hs_network

word2vec層次softmax網路示意圖

輸入層讀入視窗內的詞,將它們的向量(K維,初始隨機)加和在一起,形成隱藏層K個節點。輸出層是一個巨大的二叉樹,葉節點代表語料裡所有的詞(語料含有V個獨立的詞,則二叉樹有|V|個葉節點)。而這整顆二叉樹構建的演算法就是Huffman樹。這樣,對於葉節點的每一個詞,就會有一個全域性唯一的編碼,形如"010011"。我們可以記左子樹為1,右子樹為0。接下來,隱層的每一個節點都會跟二叉樹的內節點有連邊,於是對於二叉樹的每一個內節點都會有K條連邊,每條邊上也會有權值。

這樣,整體的結構就清晰了。在訓練階段,當給定一個上下文,要預測後面的詞(Wn)的時候(word2vec的CBOW和Skip-gram都不是預測後面的詞,都是在中間的詞上做文章,但是本文這麼寫並不影響理解),實際上我們知道要的是哪個詞(Wn),而Wn是肯定存在於二叉樹的葉子節點的,因此它必然有一個二進位制編號,如"010011",那麼接下來我們就從二叉樹的根節點一個個地去便利,而這裡的目標就是預測這個詞的二進位制編號的每一位!即對於給定的上下文,我們的目標是使得預測詞的二進位制編碼概率最大。形象地說,我們希望在根節點,詞向量和與根節點相連經過logistic計算得到的概率儘量接近0(即預測目標是bit=1);在第二層,希望其bit是1,即概率儘量接近1……這麼一直下去,我們把一路上計算得到的概率相乘,即得到目標詞Wn在當前網路下的概率(P(Wn)),那麼對於當前這個sample的殘差就是1-P(Wn)。於是就可以SGD優化各種權值了。

那麼hs(hierarchical softmax)如何保證葉節點輸出的概率值(即我們一路沿二進位制編號乘下去的概率)是歸一化的呢(否則,所謂的殘差1-P(Wn)就沒什麼意義了)?這點其實很簡單,請看下圖:

hierarchical softmax intuiation

hierarchical softmax說明

從根節點開始,對於一個sample而言,目標詞是W2,二進位制編碼是"110"。我們在根節點計算得到它的第一位是'1'的概率是P,那麼它第一位是'0'的概率就是1-P;在左子樹裡,第二位是"1"的概率是P',那麼第二位是"0"的概率就是1-P',而在右子樹裡,第二位是"1"的概率是P'',那麼第二位是"0"的概率就是1-P'';第三位亦如此。為方便表示記,我們只寫到第二層。這樣,在第二層,整個概率之和就是

(P*(P') + P*(1-P')) + ((1-P)*(P'') + (1-P)*(1-P'')) = P + (1-P) = 1

即按照目標詞的二進位制編碼計算到最後的概率值就是歸一化的,這也是為啥它被稱作hierarchical softmax的原因。

如果沒有使用這種二叉樹,而是直接從隱層直接計算每一個輸出的概率——即傳統的softmax,就需要對|V|中的每一個詞都算一遍,這個過程時間複雜度是O(|V|)的。而使用了二叉樹(如word2vec中的Huffman樹),其時間複雜度就降到了O(log2(|V|)),速度大大地加快了。

不過雖然hierarchical softmax一般被認為只是用於加速,但是仍然可以感性地理解一下為啥它會奏效:二叉樹裡面的每一個內節點實際上是一種隱含概念的分類器(二元分類器,因為二進位制編碼就是0/1),它的輸出值的大小預示著當前上下文能夠表達該隱含概念的概率,而一個詞的編碼實際上是一堆隱含概念的表達(注意,這個隱含概念的表達和詞向量的維度所表達的隱含概念是不一樣的)。我們的目標就在於找到這些當前上下文對於這些概念分類的最準確的那個表達(即目標詞向量)。由於概念之間實際上是有互斥關係的(二叉樹保證),即在根節點如果是"1",即可以表達某一概念,那麼該上下文是絕對不會再有表達根節點是"0"的其他情況的概念了,因此就不需要繼續考慮根節點是"0"的情況了。因此,整個hierarchical softmax可以被看作完全不同於傳統softmax的一套。

寫到這裡,感覺沒有想象的那麼明白。sigh,果然下筆難成書。再慢慢潤色吧。

感謝同事JCH,SC,ZQQ以及軟體所LSW博士的指導。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述