Dive-into-DL-PyTorch项目解析:自然语言处理中的近似训练方法

Dive-into-DL-PyTorch项目解析:自然语言处理中的近似训练方法

Dive-into-DL-PyTorch 本项目将《动手学深度学习》(Dive into Deep Learning)原书中的MXNet实现改为PyTorch实现。 Dive-into-DL-PyTorch 项目地址: https://gitcode.com/gh_mirrors/di/Dive-into-DL-PyTorch

引言

在自然语言处理领域,词向量模型(如Word2Vec)是基础且重要的技术。然而,传统的softmax计算在面对大规模词汇表时会带来巨大的计算开销。本文将深入探讨Dive-into-DL-PyTorch项目中介绍的两种近似训练方法:负采样和层序softmax,帮助读者理解这些优化技术的原理和实现。

传统softmax的问题

在标准的跳字模型(Skip-gram)中,给定中心词$w_c$生成背景词$w_o$的条件概率通过softmax函数计算:

$$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)}$$

这种计算方式需要对词汇表中的所有词进行遍历,当词汇表规模达到数十万甚至数百万时,计算成本变得不可接受。这就是我们需要近似训练方法的原因。

负采样(Negative Sampling)

基本原理

负采样是一种巧妙的方法,它将原本的多分类问题转化为二分类问题。核心思想是:对于每个训练样本,我们不仅考虑正确的上下文词(正样本),还随机采样一些非上下文词(负样本)来训练模型。

数学表达

给定中心词$w_c$和背景词$w_o$,我们定义它们共现的概率为:

$$P(D=1\mid w_c, w_o) = \sigma(\boldsymbol{u}_o^\top \boldsymbol{v}_c)$$

其中$\sigma$是sigmoid函数。对于每个正样本,我们会采样K个负样本,目标函数变为:

$$P(w^{(t+j)} \mid w^{(t)}) = P(D=1\mid w^{(t)}, w^{(t+j)})\prod_{k=1}^K P(D=0\mid w^{(t)}, w_k)$$

实现优势

  1. 计算复杂度从O(|V|)降低到O(K),其中K通常取5-20
  2. 保留了词向量的语义信息
  3. 在实践中表现优异,成为Word2Vec的默认实现方式

采样策略

在实际实现中,负样本的采样通常不是均匀的,而是按照词频的3/4次方进行采样。这种策略能够:

  • 降低高频词的采样概率
  • 提升低频词的采样概率
  • 获得更好的词向量质量

层序softmax(Hierarchical Softmax)

二叉树结构

层序softmax采用了一种完全不同的思路,它使用二叉树来表示词汇表:

  • 每个叶子节点代表一个词
  • 从根节点到叶子节点的路径唯一确定一个词
  • 内部节点也带有向量表示

概率计算

给定中心词$w_c$,生成词$w_o$的概率定义为从根节点到$w_o$路径上各节点决策概率的乘积:

$$P(w_o \mid w_c) = \prod_{j=1}^{L(w_o)-1} \sigma\left( [![ n(w_o, j+1) = \text{leftChild}(n(w_o,j)) ]!] \cdot \boldsymbol{u}_{n(w_o,j)}^\top \boldsymbol{v}_c\right)$$

其中$L(w_o)$是路径长度,$[![x]!]$是指示函数。

性能分析

  1. 计算复杂度从O(|V|)降低到O(log|V|)
  2. 特别适合词汇量大的场景
  3. 需要预先构建二叉树,通常使用霍夫曼树来优化路径长度

两种方法对比

| 特性 | 负采样 | 层序softmax | |------|--------|-------------| | 计算复杂度 | O(K) | O(log|V|) | | 内存占用 | 较低 | 较高(需要存储树结构) | | 实现难度 | 简单 | 较复杂 | | 适用场景 | 通用 | 超大词汇表 | | 采样策略影响 | 大 | 无 |

实践建议

  1. 对于大多数应用,负采样是首选方法
  2. 当词汇表特别大(>100万)时,考虑层序softmax
  3. 负采样的K值通常设置为5-20,需要根据数据规模调整
  4. 层序softmax建议使用霍夫曼编码构建树,优化路径长度

总结

Dive-into-DL-PyTorch项目中介绍的这两种近似训练方法,为解决自然语言处理中的大规模词汇表问题提供了实用解决方案。理解这些方法的原理和实现细节,对于深入掌握词向量技术至关重要。在实际应用中,可以根据具体场景和需求选择合适的方法,或者结合使用以获得更好的效果。

通过本文的讲解,希望读者能够掌握这些优化技术的核心思想,并能在自己的项目中灵活运用。这些方法不仅适用于词向量训练,其思想也可以迁移到其他需要处理大规模分类问题的场景中。

Dive-into-DL-PyTorch 本项目将《动手学深度学习》(Dive into Deep Learning)原书中的MXNet实现改为PyTorch实现。 Dive-into-DL-PyTorch 项目地址: https://gitcode.com/gh_mirrors/di/Dive-into-DL-PyTorch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邴梅忱Walter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值