动手学pytorch-Word2vec

Word2vec

1.词嵌入基础

2.PTB数据集

3.Skip-Gram

4.负采样近似

5.训练模型

1.词嵌入基础

使用 one-hot 向量表示单词,虽然它们构造起来很容易,但通常并不是一个好选择。一个主要的原因是,one-hot 词向量无法准确表达不同词之间的相似度,如常常使用的余弦相似度。

Word2Vec 词嵌入工具的提出正是为了解决上面这个问题,它将每个词表示成一个定长的向量,并通过在语料库上的预训练使得这些向量能较好地表达不同词之间的相似和类比关系,以引入一定的语义信息。基于两种概率模型的假设,可以定义两种 Word2Vec 模型:

  • Skip-Gram 跳字模型:假设背景词由中心词生成,即建模 \(P(w_o\mid w_c)\),其中 \(w_c\) 为中心词,\(w_o\) 为任一背景词;

Image Name

Image Name

本文主要介绍 Skip-Gram 模型的实现,CBOW 实现与其类似。

2.PTB 数据集

简单来说,Word2Vec 能从语料中学到如何将离散的词映射为连续空间中的向量,并保留其语义上的相似关系。本文使用经典的 PTB 语料库进行训练。PTB (Penn Tree Bank) 是一个常用的小型语料库,它采样自《华尔街日报》的文章,包括训练集、验证集和测试集。在PTB训练集上训练词嵌入模型。

载入数据集

建立词语索引

二次采样

文本数据中一般会出现一些高频词,如英文中的“the”“a”和“in”。通常来说,在一个背景窗口中,一个词(如“chip”)和较低频词(如“microprocessor”)同时出现比和较高频词(如“the”)同时出现对训练词嵌入模型更有益。因此,训练词嵌入模型时可以对词进行二次采样。 具体来说,数据集中每个被索引词 \(w_i\) 将有一定概率被丢弃,该丢弃概率为

\[P(w_i)=\max(1-\sqrt{\frac{t}{f(w_i)}},0) \]

其中 \(f(w_i)\) 是数据集中词 \(w_i\) 的个数与总词数之比,常数 \(t\) 是一个超参数(实验中设为 \(10^{−4}\))。可见,只有当 \(f(w_i)>t\) 时,才有可能在二次采样中丢弃词 \(w_i\),并且越高频的词被丢弃的概率越大。具体的代码如下:

提取中心词和背景词

注:数据批量读取的实现需要依赖负采样近似的实现,故放于负采样近似部分进行讲解。

3.Skip-Gram

在跳字模型中,每个词被表示成两个 \(d\) 维向量,用来计算条件概率。假设这个词在词典中索引为 \(i\) ,当它为中心词时向量表示为 \(\boldsymbol{v}_i\in\mathbb{R}^d\),而为背景词时向量表示为 \(\boldsymbol{u}_i\in\mathbb{R}^d\) 。设中心词 \(w_c\) 在词典中索引为 \(c\),背景词 \(w_o\) 在词典中索引为 \(o\),假设给定中心词生成背景词的条件概率满足下式:

\[P(w_o\mid w_c)=\frac{\exp(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{\sum_{i\in\mathcal{V}}\exp(\boldsymbol{u}_i^\top \boldsymbol{v}_c)} \]

PyTorch 预置的 Embedding 层

PyTorch 预置的批量乘法

Skip-Gram 模型的前向计算

4.负采样近似

由于 softmax 运算考虑了背景词可能是词典 \(\mathcal{V}\) 中的任一词,对于含几十万或上百万词的较大词典,就可能导致计算的开销过大。将以 skip-gram 模型为例,介绍负采样 (negative sampling) 的实现来尝试解决这个问题。

负采样方法用以下公式来近似条件概率 \(P(w_o\mid w_c)=\frac{\exp(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{\sum_{i\in\mathcal{V}}\exp(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\)

\[P(w_o\mid w_c)=P(D=1\mid w_c,w_o)\prod_{k=1,w_k\sim P(w)}^K P(D=0\mid w_c,w_k) \]

其中 \(P(D=1\mid w_c,w_o)=\sigma(\boldsymbol{u}_o^\top\boldsymbol{v}_c)\)\(\sigma(\cdot)\) 为 sigmoid 函数。对于一对中心词和背景词,从词典中随机采样 \(K\) 个噪声词(实验中设 \(K=5\))。根据 Word2Vec 论文的建议,噪声词采样概率 \(P(w)\) 设为 \(w\) 词频与总词频之比的 \(0.75\) 次方。

注:除负采样方法外,还有层序 softmax (hiererarchical softmax) 方法也可以用来解决计算量过大的问题,参考原书10.2.2节

批量读取数据

5.训练模型

损失函数

应用负采样方法后,可利用最大似然估计的对数等价形式将损失函数定义为如下

\[\sum_{t=1}^T\sum_{-m\le j\le m,j\ne 0} [-\log P(D=1\mid w^{(t)},w^{(t+j)})-\sum_{k=1,w_k\sim P(w)^K}\log P(D=0\mid w^{(t)},w_k)] \]

根据这个损失函数的定义,可以直接使用二元交叉熵损失函数进行计算:

模型初始化

训练模型

测试模型

posted @   hou永胜  阅读(1588)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示