溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-11-15 15:51:24 來源:億速云 閱讀:184 作者:柒染 欄目:大數(shù)據(jù)

這期內(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模型。

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

3. Skip-gram的公式及說明

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

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

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

說明:

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

4. CBOW公式及說明

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

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

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)行選擇,Word2Vec論文總結(jié)和實(shí)現(xià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次即可。

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

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í)候往左邊走和往右邊走的概率分別是: Word2Vec論文總結(jié)和實(shí)現(xiàn)是怎樣的

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

由此,我們就可以使用隨機(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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI