glove
對於一個詞 i 出現的次數爲 ,在其某個窗口範圍內的詞 j 出現的次數爲 , 可以直接得到, 爲所有 的累加和。對於 i 來說,共現矩陣要對所有 i 出現的地方計算 ,最後再累加求和得到 。共現矩陣局算的是概率值 。
j 是 在 i 的窗口內出現的,所以利用到了局部窗口信息;次數的計算利用到了所有 i 和 j 共同出現的地方,這是全局信息。
glove 詞向量爲什麼能夠表現出詞的意義?
假設有 3 個詞:i,j,k。
- 如果詞 k 與 i 關聯較大,與 j 關聯較小,那麼 較大, 較小, 遠大於 1;
- 如果詞 k 與 i 關聯較小,與 j 關聯較大,那麼 較小, 較大, 遠小於 1;
- 如果詞 k 與 i 關聯較小,與 j 關聯較小,那麼 較小, 較小, 約等於 1;
這樣子是不是就可以某種程度上表現出詞的意義來了。
因爲是由向量出現的比值來表現詞的意義的,那麼我們的模型應該由概率比值來呈現。
最初模型爲:
(其中 爲上下文向量)
因爲一個好的word vector應當是線性可加減的,因此對於word之間的差異,可以用減法來進行衡量,所以:
又等式右邊是一個標量,那麼,將 F 內部表示成向量乘積的形式是一種很簡便的方法:
又由於詞向量與上下文詞向量的角色不是固定的,我們應該能夠隨意地交換它們的角色,也就是說詞向量和其上下文詞向量的地位應該相等,將它們的位置顛倒 F 也不應該改變。那麼公式應該對稱。令
其中,
令 F = exp,那麼:
將 移到左邊,因爲其爲常數,設爲 ,爲了對稱,加上一個常數 ,
那麼:
這個公式具有對稱性,滿足我們的要求(左邊即爲 。
損失函數爲:
相對於通常的損失函數多出了一個加權函數 。
該加權函數應該滿足下列條件:
- f(0) = 0.
- f(x) 應該爲非減函數
- 對於很大的值 x,f(x) 應該相對較小
fasttext
三層:輸入層、隱藏層、輸出層。
輸出層爲文本中的單詞經過 lookup-table 得到的 embedding,通過線性變換到隱藏層(加權平均),再經過 softmax 輸出該文本屬於不同類的概率。當然,輸出層可以換成層次 softmax (哈夫曼樹)來提高計算效率。
一個突出的地方 n-gram。原本的輸入是隻有文本中單詞的 embedding,現在還要加上 所有單詞的 n-gram 對應的 embedding。舉例來說 dog 和 dogs ,它們的 1-gram,2-gram。。。基本一樣,對應的 embedding也基本一樣,那麼它們的向量疊加的結果也會基本一樣,這樣子就可以很容易地將他們歸爲一類了。
fasttext 的優點:
- 特別快
- 分類效果很好(因爲 n-gram)
參考文獻:
- https://pengfoo.com/post/machine-learning/2017-04-11
- GloVe: Global Vectors for Word Representation
- fastText 原理及實踐