兩種模型,兩種方法
- 模型:CBOW和Skip-Gram
- 方法:Hierarchical Softmax和Negative Sampling
CBOW模型Hierarchical Softmax方法
CBOW 是 Continuous Bag-of-Words Model 的縮寫,是預測 \(
P({W_t}|W_{t-k},W_{t-(k-1)},W_{t-(k-2)}...,W_{t-1},W_{t+1},W_{t+2}...,W_{t+k})\)
- INPUT:輸入層,輸入的是若干個詞的詞向量
- PROJECTION:投影層,是輸入的若干個詞向量的累加和,注意是向量的累加和,結果是一個向量。
- OUTPUT:輸出層,其實是個二叉樹,隱層的那個節點要跟輸出層的那個二叉樹的所有非葉節點鏈接的,第三層的這個二叉樹是一個霍夫曼樹,每個非葉節點也是一個向量,但是這個向量不代表某個詞,代表某一類別的詞;每個葉子節點代表一個詞向量,為了簡單只用一個w表示,沒有下標。輸入的幾個詞向量其實跟這個霍夫曼樹中的某幾個葉子節點是一樣的,當然輸入的那幾個詞跟它們最終輸出的到的那個詞未必是同一個詞,而且基本不會是同一個詞,只是這幾個詞跟輸出的那個詞往往有語義上的關系。
還有要注意的是,這個霍夫曼樹的所有葉子節點就代表了語料庫里面的所有詞,而且是每個葉子節點對應一個詞,不重復。 - w(t):當前詞語(向量)
- w(t-2),w(t-1),w(t+1),w(t+2):當前詞語的上下文
- SUM:上下文的累加和
這個網絡結構的功能是為了完成一個的事情——判斷一句話是否是自然語言。怎么判斷呢?使用的是概率,就是計算一下這句話的“一列詞的組合”的概率的連乘(聯合概率)是多少,如果比較低,那么就可以認為不是一句自然語言,如果概率高,就是一句正常的話。這個也是語言模型的目標。
對於上面的那個網絡結構來說,網絡訓練完成后,假如給定一句話s,這句話由詞w1,w2,w3,…,wT組成,就可以利用計算這句話是自然語言的概率了,計算的公式是下面的公式
其中的Context表示的是該詞的上下文,也就是這個詞的前面和后面各若干個詞,這個“若干”(后面簡稱c)一般是隨機的,也就是一般會從1到5之間的一個隨機數;每個\( p({w_i}|Contex{t_i})\)代表的意義是前后的c個詞分別是那幾個的情況下,出現該詞的概率。舉個例子就是:“大家 喜歡 吃 好吃 的 蘋果”這句話總共6個詞,假設對“吃”這個詞來說c隨機抽到2,則“吃”這個詞的context是“大家”、“喜歡”、“好吃”和“的”,總共四個詞,這四個詞的順序可以亂,這是word2vec的一個特點。
計算\({p({w_i}|Context_i)}\)的時候都要用到上面的那個網絡,具體計算的方法用例子說明,假設就是計算“吃”這個詞的在“大家”、“喜歡”、“好吃”和“的”這四個詞作為上下文的條件概率,又假設“吃”這個詞在霍夫曼樹中是的最右邊那一個葉子節點,那么從根節點到到達它就有兩個非葉節點,根節點對應的詞向量命名為A,根節點的右孩子節點對應的詞向量命名為B,另外再假設“大家”、“喜歡”、“好吃”和“的”這四個詞的詞向量的和為C,則
其中
其中V表示語料庫里面的的詞的個數,這個定義的意思是在上下文C出現的情況下,中間這個詞是A的概率。為了計算這個概率,需要把語料庫里所有的詞的能量都算一次,然后根據A的能量,得到的比值就是出現A的概率。
例子說明
例子:句子:我,喜歡,觀看,巴西,足球,世界杯
w=足球
正類概率:$${\rm{\sigma(X_w^T\theta)} = \frac{1}{1+e^{-X_w^T\theta}}}$$
負類概率:$$1-\rm{\sigma(X_w^T\theta)}$$
"足球" 葉子節點經過4次二分類,每次分類結果對應的概率為
由Context("足球")預測"足球"出現的概率
- 對於詞典中的每個詞w有,\(l^w\) 結點個數
\(p(w|Context(w))= \sum_{j=2}^{l_w}p(d_j^w|{X_w,\theta_{j-1}^w})\)
- 對於由S個句子組成的語料庫C有
- 取對數似然函數:
- 梯度下降法進行求解
對於語料庫中的某個詞\(w_t\),對應着二叉樹的某個葉子節點,因此它必然有一個二進制編碼,如"010011"。在訓練階段,當給定上下文,要預測后面的詞\(w_t\)的時候,我們就從二叉樹的根節點開始遍歷,這里的目標就是預測這個詞的二進制編號的每一位。即對於給定的上下文,我們的目標是使得預測詞的二進制編碼概率最大。形象地說,我們希望在根節點,詞向量和與根節點相連經過logistic計算得到bit=1的概率盡量接近0,在第二層,希望其bit=1的概率盡量接近1,這么一直下去,我們把一路上計算得到的概率相乘,即得到目標詞\(w_t\)在當前網絡下的概率\(P(w_t)\),那么對於當前這個sample的殘差就是\(1-P(w_t)\),於是就可以使用梯度下降法訓練這個網絡得到所有的參數值了。顯而易見,按照目標詞的二進制編碼計算到最后的概率值就是歸一化的。
Hierarchical Softmax用Huffman編碼構造二叉樹,其實借助了分類問題中,使用一連串二分類近似多分類的思想。例如我們是把所有的詞都作為輸出,那么“桔子”、“汽車”都是混在一起。給定w_t的上下文,先讓模型判斷\(w_t\)是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是“桔子”。
但是在訓練過程中,模型會賦予這些抽象的中間結點一個合適的向量,這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,所以Hierarchical Softmax方法和原始問題並不是等價的,但是這種近似並不會顯著帶來性能上的損失同時又使得模型的求解規模顯著上升。
沒有使用這種二叉樹,而是直接從隱層直接計算每一個輸出的概率——即傳統的Softmax,就需要對|V|中的每一個詞都算一遍,這個過程時間復雜度是O(|V|)的。而使用了二叉樹(如Word2vec中的Huffman樹),其時間復雜度就降到了O(log2(|V|)),速度大大地加快了。
Skip-gram
網絡結構如下:
計算p(大家│吃)這么一個概率,這里的計算方法就簡單多了,就是隨機從語料庫里面抽取c個詞,這里假設c=3,抽中了D,E,F這三個詞,又假設“吃”這個詞的詞向量是A,那么就計算“吃”這個詞的概率就用下面的公式
所有詞的概率計算出來再連乘就是整句話是自然語言的概率了。剩下的同上。
解法跟上面相同。
為什么要使用 Hierarchical Softmax 或 Negative Sampling
前面提到到 skip-gram 中的條件概率為:
\(p(w_o|w_I) = \frac{e^{v_{w_o}^T{V_{W_I}}}} {\sum_{w=1}^W{e^{v_w^T {V_{W_I}}}}}\)
這其實是一個多分類的 logistic regression, 即 softmax 模型,對應的 label 是One-hot representation,只有當前詞對應的位置為 1,其他為 0。普通的方法是 p(wo|wi) 的分母要對所有詞匯表里的單詞求和,這使得計算梯度很耗時。
Hierarchical Softmax 則是介於兩者之間的一種方法,使用的辦法其實是借助了分類的概念。 假設我們是把所有的詞都作為輸出,那么“桔子”、“汽車”都是混在一起。而 Hierarchical Softmax 則是把這些詞按照類別進行區分的。對於二叉樹來說,則是使用二分類近似原來的多分類。例如給定 wi,先讓模型判斷 wo是不是名詞,再判斷是不是食物名,再判斷是不是水果,再判斷是不是“桔子”。雖然 word2vec 論文里,作者是使用哈夫曼編碼構造的一連串兩分類。但是在訓練過程中,模型會賦予這些抽象的中間結點一個合適的向量, 這個向量代表了它對應的所有子結點。因為真正的單詞公用了這些抽象結點的向量,所以Hierarchical Softmax 方法和原始問題並不是等價的,但是這種近似並不會顯著帶來性能上的損失同時又使得模型的求解規模顯著上升。
Negative Sampling 也是用二分類近似多分類,區別在於使用的是one-versus-one 的方式近似,即采樣一些負例,調整模型參數使得模型可以區分正例和負例。 換一個角度來看,就是 Negative Sampling 有點懶,他不想把分母中的所有詞都算一次,就稍微選幾個算算,選多少,就是模型中負例的個數,怎么選,一般就需要按照詞頻對應的概率分布來隨機抽樣了。