您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Word2Vec論文總結(jié)和實(shí)現(xiàn)是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、總結(jié)
1. word2vec可以在百萬(wàn)數(shù)量級(jí)的詞典和上億的數(shù)據(jù)集上進(jìn)行高效的訓(xùn)練;該工具得到詞向量(word embedding)的訓(xùn)練結(jié)果,可以很好的度量詞與詞之間的相似性。
2. word2vec算法背后時(shí)一個(gè)淺層神經(jīng)網(wǎng)絡(luò)。word2vec算法或模型指的是計(jì)算word vector的CBOW模型和skip-gram模型。
3. Skip-gram的公式及說明
當(dāng)時(shí)間窗口大小為m時(shí),跳字模型需要最大化給定任一中心詞生成背景詞的概率為:
損失函數(shù)中中心詞生成背景詞的概率可以使用 softmax 函數(shù)進(jìn)行定義:
說明:
4. CBOW公式及說明
5. 負(fù)采樣(negative sample)
負(fù)采樣每次讓一個(gè)訓(xùn)練樣本僅僅更新一小部分的權(quán)重 。 在論文中,作者指出指出對(duì)于小規(guī)模數(shù)據(jù)集,選擇5-20個(gè)negative words會(huì)比較好,對(duì)于大規(guī)模數(shù)據(jù)集可以僅選擇2-5個(gè)negative words。 大規(guī)模數(shù)據(jù)集反而取負(fù)采樣詞少,1)減少計(jì)算量,2)經(jīng)驗(yàn)。負(fù)采樣最后會(huì)變成1,0(正負(fù)樣本)的邏輯回歸問題。
負(fù)采樣詞根據(jù)公式進(jìn)行選擇,
一個(gè)單詞的負(fù)采樣概率越大,它被選中的概率越大。負(fù)采樣我這樣理解,現(xiàn)在需要取20個(gè)負(fù)樣本,語(yǔ)料庫(kù)中有1w個(gè)詞,每個(gè)詞都有根據(jù)頻率計(jì)算的概率(和是1),我現(xiàn)在隨機(jī)選0-1之間的數(shù),落在哪個(gè)位置就選哪個(gè)詞,選20次即可。
6. 層序softmax
在模型的訓(xùn)練過程中,通過Huffman編碼,構(gòu)造了一顆龐大的Huffman樹,同時(shí)會(huì)給非葉子結(jié)點(diǎn)賦予向量。我們要計(jì)算的是目標(biāo)詞w的概率,這個(gè)概率的具體含義,是指從root結(jié)點(diǎn)開始隨機(jī)走,走到目標(biāo)詞w的概率。因此在途中路過非葉子結(jié)點(diǎn)(包括root)時(shí),需要分別知道往左走和往右走的概率。例如到達(dá)非葉子節(jié)點(diǎn)n的時(shí)候往左邊走和往右邊走的概率分別是:
由此,我們就可以使用隨機(jī)梯度下降在跳字模型和連續(xù)詞袋模型中不斷迭代計(jì)算詞典中所有詞向量 v 和非葉子節(jié)點(diǎn)的向量 u。每次迭代的計(jì)算開銷由 O(|V|) 降為二叉樹的高度 O(log|V|)。
二、實(shí)現(xiàn)
根據(jù)簡(jiǎn)單語(yǔ)料,展示預(yù)料庫(kù)中詞關(guān)系,為相似度計(jì)算提供基礎(chǔ)。
# 1. 導(dǎo)入基礎(chǔ)包,全局參數(shù) import torch import numpy as np import matplotlib.pyplot as plt from torch import nn, optim from torch.utils.data import TensorDataset, DataLoader device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 2. 語(yǔ)料及語(yǔ)料庫(kù)大小, 詞與索引關(guān)系 sentences = ['i like dog', 'jack hate coffee', 'i love milk', 'jack study natural language process', 'word2vec conclude skip-gram and cbow model', 'jack like coffee', 'dog coffee milk'] word_list = ' '.join(sentences).split() vocab = list(set(word_list)) vocab_size = len(vocab) word2idx = {w:i for i, w in enumerate(vocab)} idx2word = {i:w for i, w in enumerate(vocab)} # 3. 窗口,skip_gram, 輸入輸出 window = 2 batch_size = 8 # 生成skip_gram skip_gram = [] for center_idx in range(len(word_list)): center = word2idx[word_list[center_idx]] for context_idx in (list(range(center_idx - window, center_idx)) + list(range(center_idx + 1, center_idx + 1 + window))): if context_idx < 0 or context_idx > len(word_list) - 1: continue else: context = word2idx[word_list[context_idx]] skip_gram.append([center, context]) def get_data(): input_data = [] target_data = [] for i in range(len(skip_gram)): input_data.append(np.eye(vocab_size)[skip_gram[i][0]]) target_data.append(skip_gram[i][1]) return input_data, target_data input, target = get_data() input, target = torch.Tensor(input), torch.LongTensor(target) # 4. 形成訓(xùn)練所需的dataloader dataset = TensorDataset(input, target) dataloder = DataLoader(dataset, batch_size, True) # 5. 模型實(shí)現(xiàn),優(yōu)化器,損失函數(shù) class Word2Vec(nn.Module): def __init__(self): super(Word2Vec, self).__init__() self.embed_size = 2 self.W = nn.Parameter(torch.randn(vocab_size, self.embed_size).type(torch.Tensor)) self.V = nn.Parameter(torch.randn(self.embed_size, vocab_size).type(torch.Tensor)) def forward(self, x): # x[batch_size, vocab_size] one_hot out = torch.mm(torch.mm(x, self.W), self.V) return out model = Word2Vec().to(device) criteriom = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3) # 6. 訓(xùn)練 for epoch in range(2000): for i, (input_x, target_y) in enumerate(dataloder): input_x = input_x.to(device) target_y = target_y.to(device) pred = model(input_x) loss = criteriom(pred, target_y) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch + 1) % 500 == 0 and i == 0: print(epoch + 1, loss.item()) # 7. 通過圖像展示向量之間的關(guān)系 for i, label in enumerate(vocab): W, WT = model.parameters() x,y = float(W[i][0]), float(W[i][1]) plt.scatter(x, y) plt.annotate(label, xy=(x, y), xytext=(5, 2), textcoords='offset points', ha='right', va='bottom') plt.show()
上述就是小編為大家分享的Word2Vec論文總結(jié)和實(shí)現(xiàn)是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。