1. Word2Vec
1.Skip-Gram 跳字模型:假設背景詞由中心詞生成,即建模P(Wo|Wc) ,其中Wc爲中心詞, Wo爲任一背景詞
2.CBOW:假設中心詞由背景詞生成,即建模P(Wc|Wo),其中 爲背景詞的集合。
補充:這裏注意一下nn.Embedding 的輸出[seq_len,batch_size,embedding_size],不要把embedding和詞向量搞混了。Embedding只是隨機初始化向量,沒有意義的。
1.1如何處理高頻詞?eg:the,a,in
使用二次採樣:每一個詞都有一個丟棄概率。
# 返回 true or flase
def discard(idx):
return np.random.uniform(0, 1) < 1 - math.sqrt(
1e-4 / counter[idx_to_token[idx]] * num_tokens)
1.2 提取中心詞和背景詞
原來這裏就是每一個單詞都有可能是中心詞,然後根據中心詞的前後max_window_size組成一個list.
每一個dataset就是:[{word - max_wimdow_size,word + max_window_size}]
補充:矩陣批量乘法torch.bmm(X,Y) ,理解就是對應矩陣作矩陣乘法。
然後算法作前向計算,就是矩陣乘法。跟神經網絡的原理一樣。
問題來了:每一個詞都是center_word,那不是一句話就可以生成超級無敵多dataset??
所以就要採用負採樣近似來進行採樣:
:
其中 , 爲 sigmoid 函數。對於一對中心詞和背景詞,我們從詞典中隨機採樣 個噪聲詞(實驗中設 )。根據 Word2Vec 論文的建議,噪聲詞采樣概率 設爲 詞頻與總詞頻之比的 次方。
具體實現還沒完全弄懂。。先留個坑。此外減少運算量還可以層序softmax方法
1.3 損失函數
理解:感覺應該是每一個詞,然後通過計算他的背景詞,背景向量,找到相似性。這相當於自動給了label?
因爲隱含層的矩陣大小就是(詞數,embed_size這個是超參數)記起來上課講過應該就是這樣 肯定是的,需要的是向量。輸入詞(背景),輸出背景(詞)。最後softmax。
2.GloVe 全局向量的詞嵌入
在Skip-Gram模型上做改變:
- 使用非概率分佈的變量 和 ,並對它們取對數;
- 爲每個詞 增加兩個標量模型參數:中心詞偏差項 和背景詞偏差項 ,鬆弛了概率定義中的規範性;
- 將每個損失項的權重 替換成函數 ,權重函數 是值域在 上的單調遞增函數,鬆弛了中心詞重要性與 線性相關的隱含假設;
- 用平方損失函數替代了交叉熵損失函數。
綜上,我們獲得了 GloVe 模型的損失函數表達式:
從而增加了數據集的全局統計信息。
2.1 近義詞和類比詞
觀測概率公式,中心詞的向量很大程度取決於背景詞向量來決定,從而聯想到同義詞。
類比詞,知道a,b,c 求d?
同樣也把abc的向量算出來,等到與結果相似的詞向量
x = vecs[1] - vecs[0] + vecs[2] # 順序可以交換
關於glove的使用:已經由於訓練好的,官方給出的API.
https://nlp.stanford.edu/projects/glove/
下載:glove.6B.zip glove.6B.zip
6B就是60個,xxd 就是維數