词向量模型 Word2Vec
Skip-gram 模型是图嵌入模型 Random Walk 中要使用到的模型,因此先学习 Word2Vec
神经网络语言模型 NNLM
目标:根据给定的词序列,预测下一个会出现的词,如给定 “他”,“是”,“一个”,预测下一个会出现的词的概率
模型输入
设定语料库中词的个数是 v,对每个词进行 one-hot 编码,得到每个词对应的编码是 1×v维的;设需要得到的词向量为k 维,构建一个 v×k 维的矩阵 C
假设给定 x 个词,预测下一个出现的词,那么就先根据这 x 个词的独热编码乘以 C,得到对应的 x 个词向量
模型训练
-
前向传播:对这 x 个词向量根据模型的w加权求和,并施加激活函数 tanh,再 Softmax 求得概率
-
反向传播:更新矩阵 C、w
引入 Word2Vec
NNLM 模型的目的是为了预测下一个要出现的词,所得到的词向量只是副产品;而 Word2Vec 是以得到词向量为目的所训练的网络模型,根据上下文进行训练
- CBOW:给定上下文预测这个词
- Skip-gram:给定词预测上下文
设每个词对应的词向量矩阵 C,输入的多个词的 one-hot 向量拼接为 x,输入到隐藏层的权重矩阵为w,偏置bias为 b,则前向传播表示为为:softmax(w1(xC) + b)
因为这里目的是为了训练得到词向量,所以没有加激活函数(不需要非线性的变换、加快训练速度)
Skip-gram Pytorch实现
import torch
from torch import nn
class SkipGram(nn.Module):
def __init__(self, vocabulary_size, embedding_size):
super().__init__()
self.vocabulary_size = vocabulary_size
self.embedding_size = embedding_size
self.embedding = nn.Embedding(self.vocabulary_size, self.embedding_size)
self.output = nn.Linear(self.embedding_size, self.vocabulary_size)
self.log_softmax = nn.LogSoftmax(dim=1)
def forward(self, x):
x = self.embedding(x)
x = self.output(x)
log_ps = self.log_softmax(x)
return log_ps
```