自己动手实现word2vec(skip-gram模型)

本文深入解析word2vec的skip-gram模型,介绍了模型结构、输入输出层、one-hot编码、隐藏层的词向量表示以及softmax函数的作用。通过数学表示和损失函数,阐述了模型的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文由罗周杨原创,转载请注明作者和出处。未经允许,不得用于商业用途

学习word2vec的skip-gram实现,除了skip-gram模型还有CBOW模型。
Skip-gram模式是根据中间词,预测前后词,CBOW模型刚好相反,根据前后的词,预测中间词。

那么什么是中间词呢?什么样的词才叫做前后词呢?

首先,我们需要定义一个窗口大小,在窗口里面的词,我们才有中间词和前后词的定义。一般这个窗口大小在5-10之间。
举个例子,我们设置窗口大小(window size)为2:

|The|quick|brown|fox|jump|

那么,brown就是我们的中间词,Thequickfoxjump就是前后词。

我们知道,word2vec实际上就是一个神经网络(后面会解释),那么这样的数据,我们是以什么样的格式用来训练的呢?
看一张图,你就明白了:

word2vec window

可以看到,我们总是以中间词放在第一个位置,然后跟着我们的前后相邻词。可以看到,每一对词都是一个输入和一个输出组成的数据对(X,Y)。其中,X是feature,Y是label。

所以,我们训练模型之前,需要根据语料,整理出所有的像上面这样的输入数据用来训练。

word2vec是一个神经网络

word2vec是一个简单的神经网络,有以下几个层组成:

  • 1个输入层
  • 1个隐藏层
  • 1个输出层

输入层输入的就是上面我们说的数据对的数字表示,输出到隐藏层。
隐藏层的神经网络单元的数量,其实就是我们所说的embedding size,只有为什么,我们后面简单计算一下就知道。需要注意的是,我们的隐藏层后面不需要使用激活函数。
输出层,我们使用softmax操作,得到每一个预测结果的概率。

这里有一张图,能够表示这个网络:
skip-gram-net-arhc

输入层

现在问题来了,刚刚我们说,输入层的输入是我们之前准备的数据对的数字表示,那么我们该如何用数字表示文本数据呢?

好像随便一种方式都可以用来表示我们的文本啊。

看上图,我们发现,它的输入使用的是one-hot编码。什么是ont-hot编码呢?如图所示,假设有n个词,则每一个词可以用一个n维的向量来表示,这个n维向量只有一个位置是1,其余位置都是0。

那么为什么要用这样的编码来表示呢?答案后面揭晓。

隐藏层

隐藏层的神经单元数量,代表着每一个词用向量表示的维度大小。假设我们的hidden_size取300,也就是我们的隐藏层有300个神经元,那么对于每一个词,我们的向量表示就是一个 1N 1 ∗ N 的向量。
有多少个词,就有多少个这样的向量!

所以对于输入层隐藏层之间的权值矩阵 W W ,它的形状应该是[vocab_size, hidden_size]的矩阵,

输出层

那么我们的输出层,应该是什么样子的呢?从上面的图上可以看出来,输出层是一个[vocab_size]大小的向量,每一个值代表着输出一个词的概率。

为什么要这样输出?因为我们想要知道,对于一个输入词,它接下来的词最有可能的若干个词是哪些,换句话说,我们需要知道它接下来的词的概率分布。

你可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值