CS224n笔记二之word2vec与softmax推导

本文是斯坦福CS224n课程的笔记,重点介绍了如何用电脑表示词的意义,特别是词向量的概念。讲解了Skip-gram模型的原理,包括条件概率的表示、Softmax函数的应用以及训练模型时计算参数向量的梯度。文章还探讨了词向量如何通过上下文预测彼此,并提到了Hierarchical softmax和Negative sampling两种训练方法。

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

最近刚刚开始看斯坦福CS224n系列视频,主要讲的是自然语言处理与深度学习的结合。笔者怕自己看完视频就忘了,因此想记录下学习过程中的笔记。当然笔者发现了网上已经有人也发了一些CS224n的学习笔记。笔者主要学习了视频和参考了这篇笔记,再加上一些自己觉得难懂的地方的理解。笔者也是刚刚入门,水平有限,如有错漏,还望指出。

如何在电脑中表示一个词的意义?

用电脑表示一个词的问题

|500*0|center

词向量的主要思路

  • 通过单词和单词的上下文预测彼此。
  • 两个算法:
    • Skip-gram:通过目标单词来预测它的上下文
    • Continuous Bag of Words(CBOW):通过上下文预测目标单词
  • 两种训练方法:
    • Hierarchical softmax
    • Negative sampling
Skip-gram模型

|500*0|center

  • 上图的意思就是在已知banking的情况下,预测turning,into,cnises,as的概率,即: P(wt+j|wt),j=2,1,1,2 P ( w t + j | w t ) , j = − 2 , − 1 , 1 , 2 。所以我们的目标函数就是:
    J(θ)=t=1Tmjm, j0P(wt+j|wt;θ) J ′ ( θ ) = ∏ t = 1 T ∏ − m ≤ j ≤ m ,   j ≠ 0 P ( w t + j | w t ; θ )
  • 我们要的是让概率最大化,也就是最大化这个目标函数,但是这里是连乘的形式,一般我们会取负对数,让乘法变成加法,让最大化变最小化。即:
    J(θ)=1Tt=1Tmjm,j0log P(wt+j|wt;θ) J ( θ ) = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 l o g   P ( w t + j | w t ; θ )
P(wt+j|wt;θ) P ( w t + j | w t ; θ ) 这个条件概率要怎么表示。
  • 预测某个上下文条件概率 P(wt+j|wt;θ) P ( w t + j | w t ; θ ) 可以由softmax来计算:

    P(o|c)=exp(uTovc)Vw=1exp(uTwvc) P ( o | c ) = e x p ( u o T v c ) ∑ w = 1 V e x p ( u w T v c )

  • 首先,公式中的u和v都是词向量,所以 uTv u T v 是向量内积,如果两个词向量比较接近,他们的内积会比较大。V是整个词典词的个数,所以其实分母部分就是所有词的词向量与目标词向量(即上面图中的示例banking的词向量)的内积之和。而使用指数是为了将实数(有负有正)映射成整数,然后分母部分是为了归一化变成概率。

skip-gram

这里写图片描述

  • 上图很清晰地展示了skip-gram模型的整个流程。
  • 最左边是当前词的one-hot向量( wt w t )。
  • 第二个矩阵W(图中W矩阵是dxV,实际应该是Vxd,下同),矩阵的每一列其实就是一个词的分布式词向量。V是词典的词的个数,所以这个矩阵包含了词库中每个词的词向量。
  • wt w t 的one-hot向量与W相乘得到 vc v c ,也就是相当于从W矩阵中提取了词 wt w t 的词向量。
  • W矩阵包含了所有词的词向量,所以第三步是 vc v c 与W矩阵的转置相乘,其实就是让 vc v c 与词库中的所有词的词向量作内积。
  • 得到内积之后,利用softmax将内积的结果映射成概率,就可以得到在 vc v c 的条件下,上下文中出现最大概率的词是哪一个,然后和标签(就是上图中最后一行)对比,接下来可以得到loss函数。然后利用梯度下降来更新W矩阵,让它的结果更接近标签的结果。
  • 官方笔记有非手写版的图:
    这里写图片描述
  • 这个图的W矩阵的行与列才是对的。
训练模型:计算参数向量的梯度
  • 我们的目标是训练出矩阵W,所以我们把所有参数写进向量 θ θ :
    这里写图片描述
  • 其中,每一行都是一个词向量, v v 是当词作为center word的时候的词向量,u是当词作为上下文的时候的词向量,所以有2V个。
  • 梯度下降的具体推导如下:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    导数的后一项刚好就是均值(期望)。p为概率,乘以u。然后加和,不就是均值的定义吗?

  • 计算出了梯度之后,就可以更新参数 θ θ 了。即:

    θnew=θoldαθoldJ(θ) θ n e w = θ o l d − α ∂ ∂ θ o l d J ( θ )

### CS224N Assignment 1 中 Word2Vec 相关的内容 在自然语言处理领域,Word2Vec 是一种用于生成词向量的技术。其核心思想在于通过上下文关系学习单词的分布式表示[^3]。具体而言,在给定中心词 \(c\) 和周围窗口大小的情况下,目标是从语料库中预测周围的“外部词”。这种技术通常被实现为两种模型:Skip-gram 和 CBOW。 #### 资源推荐 对于 CS224N 的 Assignment 1,官方文档和讲义提供了详细的指导材料。以下是关于如何完成 Word2Vec 部分的一些提示: 1. **理论基础** 学习 Word2Vec 的基本原理可以从 Dan Jurafsky 和 James H. Martin 合著的《Speech and Language Processing》第三版草稿入手[^4]。该书详细介绍了神经网络模型及其应用背景。 2. **实践指南** 官方作业文件会提供 Python 实现框架以及数据集准备方法。重点理解负采样(Negative Sampling)、Softmax 函数优化等内容。以下是一个简单的 Skip-gram 模型实现示例: ```python import torch import torch.nn as nn import torch.optim as optim class SkipGramModel(nn.Module): def __init__(self, vocab_size, embedding_dim): super(SkipGramModel, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) def forward(self, target_word_indices): embeds = self.embeddings(target_word_indices) return embeds # Example usage vocab_size = 10000 embedding_dim = 100 model = SkipGramModel(vocab_size, embedding_dim) loss_function = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) ``` 上述代码片段展示了如何定义一个基于 PyTorch 的嵌入层并计算损失函数。 3. **调试技巧** 如果遇到收敛速度慢或者结果不理想的情况,可以尝试调整超参数如批量大小、学习率等;另外也可以引入更高效的梯度下降算法比如 Adam 或 RMSProp 来加速训练过程。 #### 注意事项 务必仔细阅读每一步的要求说明,并按照指定格式提交最终成果。此外,建议多查阅论坛上的讨论帖以获取额外的帮助和支持[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值