漫谈词向量之基于Softmax与Sampling的方法

本文深入探讨了词向量模型中基于softmax和采样方法的优化策略,包括分层softmax、分片softmax、CNN-Softmax、重要性采样、负采样等。这些方法旨在降低softmax层的计算复杂度,提高训练速度和效率,适用于大规模词汇表的语言建模和词向量表示学习。不同方法在不同数据集和任务上有各自优势,如分层softmax速度快,负采样适合词向量学习,而NCE在大数据集上表现良好。
摘要由CSDN通过智能技术生成

本文是词向量与表达学习系列的第二篇文章。前一篇文章介绍了词向量模型。
原文: On word embeddings
作者: Sebastian Ruder
译者: KK4SBB 审校:王艺
责编:王艺 若您有想要分享的行业案例、技术笔记、请联系 wangyi@csdn.net
本文经作者授权CSDN翻译发布,未经允许不得转载。

目录:

  • 基于softmax的方法
    • Hierarchical Softmax
    • Differentiated Softmax
    • CNN softmax
  • 基于sampling的方法
    • Importance Sampling
    • Adaptive Importance Sampling
    • Target Sampling
    • Noise Contrastive Estimation
    • Negative Sampling
    • Self-Normalisation
    • Infrequent Normalisation
    • Other Approaches
  • 各种方法对比
  • 小结

Bengio等人2003年提出的神经语言模型,Collobert和Weston在2008年提出的C&W模型,以及Mikolov等人在2013年提出的word2vec模型。作者认为,降低最后的softmax层的计算复杂度是设计更好词向量模型所面临的主要挑战,同时也是机器翻译(Jean等[10])和语言建模(Jozefowicz等[6])的共性挑战。

本篇文章列举了近几年内新提出的几种替代softmax层的方法。其中一些方法目前还只在语言建模和机器学习中尝试过。关于超参数的讨论将安排在后续的系列文章中介绍。

先来复习一遍上篇文章里用到的符号:假设有一份训练文档集,它包括了T个训练词语w1,w2,w3,⋯,wT,它们构成大小为|V|的词语集合V。语言模型通常只考虑由当前词语wi的左右n个词语组成的上下文ci。每个词语有一个d维的输入词向量vW(即embedding层的词向量)和输出词向量vW(即softmax层的权重矩阵所表示的词语)。最后,针对模型参数θ来优化目标函数Jθ

若指定上下文c,用softmax方法计算词语w出现的概率可以用公式表示为:

图片描述

h是网络倒数第二层的输出向量。为了简化表示,上式中用c表示上下文内容,并且省略了目标词语wt的下标t。为了得到上式的分母部分,需要计算向量h与词典V中每个词语向量之间的内积。因此,计算softmax的代价非常昂贵。

接下来,我们将讨论几种能够近似替代softmax的策略。这些方法可以归纳为基于softmax的和基于sampling的两大类。基于softmax的方法仍旧保留了模型的softmax层,但是通过调整其结构来提高效率。基于sampling的方法则完全抛弃了softmax层,而是优化其它形式的损失函数来代替softmax。

基于softmax的方法

分层Softmax

Hierarchical softmax (H-Softmax)是由Morin和Bengio[3]受到二叉树的启发而提出。H-Softmax本质上是用层级关系替代了扁平化的softmax层,如图1所示,每个叶子节点表示一个词语。于是,计算单个词语概率值的计算过程被拆解为一系列的概率计算,这样可以避免对所有词语进行标准化计算。用H-Softmax替换softmax层之后,词语的预测速度可以提升至少50倍,速度的提升对于低延时要求的实时系统至关重要,比如谷歌新推出的消息应用Allo


图1:Hierarchical softmax

我们可以把原来的softmax看做深度为1的树,词表V中的每一个词语表示一个叶子节点。计算一个词语的softmax概率需要对|V|个节点的概率值做标准化。如果把softmax改为二叉树结构,每个word表示叶子节点,那么只需要沿着通向该词语的叶子节点的路径搜索,而不需要考虑其它的节点。

平衡二叉树的深度是log2(|V|),因此,最多只需要计算log2(|V|)个节点就能得到目标词语的概率值。注意,得到的概率值已经经过了标准化,因为二叉树所有叶子节点组成一个概率分布,所有叶子节点的概率值总和等于1。我们可以简单地验证一下,在图1的根节点(Node o)处,两个分枝的概率和必须为1。之后的每个节点,它的两个子节点的概率值之和等于节点本身的概率值。因为整条搜索路径没有概率值的损失,所以最底层所有叶子节点的概率值之和必定等于1,hierarchical softmax定义了词表V中所有词语的标准化概率分布。

具体说来,当遍历树的时候,我们需要能够计算左侧分枝或是右侧分枝的概率值。为此,给每个节点分配一个向量表示。与常规的softmax做法不同,这里不是给每个输出词语w生成词向量vw,而是给每个节点n计算一个向量vn。总共有|V|-1个节点,每个节点都有自己独一无二的向量表示,H-Softmax方法用到的参数与常规的softmax几乎一样。于是,在给定上下文c时,就能够计算节点n左右两个分枝的概率:

图片描述

上式与常规的softmax大致相同。现在需要计算h与树的每个节点的向量vn的内积,而不是与每个输出词语的向量计算。而且,现在只需要计算一个概率值,这里就是偏向n节点右枝的概率值。相反的,偏向左枝的概率值是1−p(right|n,c)

图2:Hierarchical softmax的计算过程(来自Hugo Lachorelle的YouTube 课件

如图2所示,假设已知出现了词语“the”、“dog”、“and”、“the”,则出现词语“cat”的概率值就是在节点1向左偏的概率值、在节点2向右偏的概率以及在节点5向右偏的概率值的乘积。Hugo Lachorelle在他的视频教程中给了更详细的解释。Rong[7]的文章也详细地解释了这些概念,并推导了H-Softmax。

显然,树形的结构非常重要。若我们让模型在各个节点的预测更方便,比如路径相近的节点概率值也相近,那么凭直觉系统的性能肯定还会提升。沿着这个思路,Morin和Bengio使用WordNet的同义词集作为树簇。然而性能依旧不如常规的softmax方法。Mnih和Hinton[8]将聚类算法融入到树形结构的学习过程,递归地将词集分为两个集合,效果终于和softmax方法持平,计算量有所减小。

值得注意的是,此方法只是加速了训练过程,因为我们可以提前知道将要预测的词语(以及其搜索路径)。在测试过程中,被预测词语是未知的,仍然无法避免计算所有词语的概率值。

在实践中,一般不用“左节点”和“右节点”,而是给每个节点赋一个索引向量,这个向量表示该节点的搜索路径。如图2所示,如果约定该位为0表示向左搜索,该位为1表示向右搜索,那词语“cat”的向量就是011。

上文中提到平衡二叉树的深度不超过log2(|V|)。若词表的大小是|V|=10000,那么搜索路径的平均长度就是13.3。因此,词表中的每个词语都能表示为一个平均长度为13.3比特的向量,即信息量为13.3比特。

关于信息量

在信息论中,人们习惯于将词语w概率值的负对数定义为信息量I(w):

I(w)=−log2p(w)

而熵H则是词表中所有词语的信息量的期望值:

H=∑i∈Vp(wi)I(wi)

熵也代表着根据信息的概率分布对信息编码所需要的最短平均编码长度。 抛硬币事件需要用1比特来编码正反两个时间,对于永恒不变的事件则只需0比特。若用平衡二叉树的节点来表示词表中的词语,还是假设词表的大小|V|=10000,词表中词语的概率值均相等,那么熵H与平均搜索路径的长度恰好相等:

图片描述

之前我们一再强调了树结构的重要性,因为利用好树结构不仅能提升系统的性能,还能加快运算速度。若我们给树加入额外的信息,就能缩短某些携带信息量少的词语的搜索路径。Morin和Bengio就是利用了词表中各个词语出现概率不相等这一信息。他们认为词表中的一些词语出现的概率总是大于其它词语,那这些词语就应该用更短的向量编码。他们所用的文档集(|V|=10000)的熵大约是9.16。

于是,考虑词频之后,文档集中每个词语的平均编码长度从13.3比特减为9.16比

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值