Word2Vec論文總結和實現(xiàn)是怎樣的

這期內容當中小編將會給大家?guī)碛嘘PWord2Vec論文總結和實現(xiàn)是怎樣的,文章內容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

十年建站經(jīng)驗, 成都網(wǎng)站設計、網(wǎng)站制作客戶的見證與正確選擇。成都創(chuàng)新互聯(lián)提供完善的營銷型網(wǎng)頁建站明細報價表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

一、總結

1.  word2vec可以在百萬數(shù)量級的詞典和上億的數(shù)據(jù)集上進行高效的訓練;該工具得到詞向量(word embedding)的訓練結果,可以很好的度量詞與詞之間的相似性。

2. word2vec算法背后時一個淺層神經(jīng)網(wǎng)絡。word2vec算法或模型指的是計算word vector的CBOW模型和skip-gram模型。

Word2Vec論文總結和實現(xiàn)是怎樣的

3. Skip-gram的公式及說明

     當時間窗口大小為m時,跳字模型需要最大化給定任一中心詞生成背景詞的概率為:Word2Vec論文總結和實現(xiàn)是怎樣的

損失函數(shù)中中心詞生成背景詞的概率可以使用 softmax 函數(shù)進行定義:

Word2Vec論文總結和實現(xiàn)是怎樣的

說明:

Word2Vec論文總結和實現(xiàn)是怎樣的

4. CBOW公式及說明

Word2Vec論文總結和實現(xiàn)是怎樣的

Word2Vec論文總結和實現(xiàn)是怎樣的

5. 負采樣(negative sample)

負采樣每次讓一個訓練樣本僅僅更新一小部分的權重 。 在論文中,作者指出指出對于小規(guī)模數(shù)據(jù)集,選擇5-20個negative words會比較好,對于大規(guī)模數(shù)據(jù)集可以僅選擇2-5個negative words。 大規(guī)模數(shù)據(jù)集反而取負采樣詞少,1)減少計算量,2)經(jīng)驗。負采樣最后會變成1,0(正負樣本)的邏輯回歸問題。

負采樣詞根據(jù)公式進行選擇,Word2Vec論文總結和實現(xiàn)是怎樣的

一個單詞的負采樣概率越大,它被選中的概率越大。負采樣我這樣理解,現(xiàn)在需要取20個負樣本,語料庫中有1w個詞,每個詞都有根據(jù)頻率計算的概率(和是1),我現(xiàn)在隨機選0-1之間的數(shù),落在哪個位置就選哪個詞,選20次即可。

Word2Vec論文總結和實現(xiàn)是怎樣的

6. 層序softmax

在模型的訓練過程中,通過Huffman編碼,構造了一顆龐大的Huffman樹,同時會給非葉子結點賦予向量。我們要計算的是目標詞w的概率,這個概率的具體含義,是指從root結點開始隨機走,走到目標詞w的概率。因此在途中路過非葉子結點(包括root)時,需要分別知道往左走和往右走的概率。例如到達非葉子節(jié)點n的時候往左邊走和往右邊走的概率分別是: Word2Vec論文總結和實現(xiàn)是怎樣的

Word2Vec論文總結和實現(xiàn)是怎樣的Word2Vec論文總結和實現(xiàn)是怎樣的

由此,我們就可以使用隨機梯度下降在跳字模型和連續(xù)詞袋模型中不斷迭代計算詞典中所有詞向量 v 和非葉子節(jié)點的向量 u。每次迭代的計算開銷由 O(|V|) 降為二叉樹的高度 O(log|V|)。

二、實現(xiàn)

根據(jù)簡單語料,展示預料庫中詞關系,為相似度計算提供基礎。

# 1. 導入基礎包,全局參數(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. 語料及語料庫大小, 詞與索引關系
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. 形成訓練所需的dataloader
dataset = TensorDataset(input, target)
dataloder = DataLoader(dataset, batch_size, True)

# 5. 模型實現(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. 訓練
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. 通過圖像展示向量之間的關系
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論文總結和實現(xiàn)是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁標題:Word2Vec論文總結和實現(xiàn)是怎樣的
網(wǎng)頁網(wǎng)址:http://bm7419.com/article46/ijhdhg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、軟件開發(fā)、云服務器、自適應網(wǎng)站微信公眾號、網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司