《深度学习进阶 自然语言处理》第四章:Embedding层和负采样介绍


之前文章链接:

开篇介绍:《深度学习进阶 自然语言处理》书籍介绍
第一章:《深度学习进阶 自然语言处理》第一章:神经网络的复习
第二章:《深度学习进阶 自然语言处理》第二章:自然语言和单词的分布式表示
第三章:《深度学习进阶 自然语言处理》第三章:word2vec

上一章我们学习了word2vec的机制,并实现了简单的2层神经网络的CBOW模型。目前的实现存在的最大问题是,随着语料库中要处理的词汇量的增加,计算量随之增加。当词汇量达到一定程度后,上一章的2层神经网络的CBOW模型的计算要花费过多的时间。基于此问题,本章将重点讲述如何加速word2vec的计算。主要有两点改进方式:

  • 引入Embedding层,
  • 引入Negative Sampling(负采样)的损失函数。

4.1 word2vec的改进一

上一章我们构建了一个词汇量为7、窗口为1的CBOW模型。已知上下文单词,预测中间单词。计算过程是先通过输入层和输入侧权重(Win)乘积得到中间层,中间层和输出侧权重(Wout)乘积计算每个单词(这里是7个单词)的得分,得分经过Softmax函数转化为每个单词出现的概率,使用交叉熵计算出损失(如下图所示)。
在这里插入图片描述

当处理大规模语料库时,词汇量变大,各层的维度变高,中间的计算耗费很长时间,有两个方面的计算出现瓶颈:

  • 输入层的one-hot表示和权重矩阵Win的乘积

  • 中间层和权重矩阵Wout的乘积以及Softmax层的计算

第1个问题与输入层的one-hot表示有关。我们用one-hot表示来处理单词,随着词汇量的增加,one-hot表示的向量大小也会增加。比如当词汇量有100万个的情况下,one-hot表示本身就需要占用100万个元素的内存大小。此外,在计算one-hot表示和权重矩阵Win的乘积也要花费大量的计算资源。这个问题将通过引入Embedding层来解决。

第2个问题出现在中间层之后的计算。随着词汇量的增加,中间层和权重矩阵Wout的乘积以及Softmax层的计算都需要大量的时间。这个问题将通过引入Negative Sampling(负采样)的损失函数来解决。

4.1.1 Embedding层

上一章的word2vec实现中,我们将单词转化为one-hot表示,并输入MatMul层,在MatMul层中计算该one_hot表示和权重矩阵的乘积,如下图所示。
在这里插入图片描述

上图所做的乘积无非是从Win矩阵中取出某个特定行,当Win中存放的是10万个单词的分布式表示,c中存放的是待取单词的ID,这样构建的层我们称之为Embedding层。

4.2 word2vec的改进二

如前所述,word2vec的另一个瓶颈在于中间层之后的矩阵乘积和Softmax层的计算。为解决这个问题,我们将采用负采样(negative sampling)

4.2.1 中间层之后的计算问题

当词汇量足够大,比如100万个的时候(这里假设每个单词是由大小为100的向量来分布式表示),还有两个地方需要很多计算时间:

  • 中间层的神经元和权重矩阵(Wout)的乘积

  • Softmax层的计算

word2vec进行的处理如下图所示:

在这里插入图片描述

4.2.2 从多分类到二分类

接下来我们来解释一下负采样。用这个方法的关键思想是用二分类拟合多分类。目前为止,我们都是用多分类的方式从词汇库中选出概率最高的1个正确单词,如果词库有100万个单词,最后要计算100万个单词的概率,概率最大的就是我们要的最终单词。如果改成二分类,最后只要计算一个得分,通过sigmoid得到一个概率值,用以判断“是/否”为目标单词,过程举例如下图。
在这里插入图片描述

输出的神经元只有一个,所以计算中间层和输出侧权重矩阵Wout的乘积,Wout只需要提取say对应的列单词向量。

4.2.3 负采样

上一节的方式仅学习了正例,即当上下文是you和goodbye,目标词是say时,经过训练后模型的Sigmoid层输出接近1,但是对say之外的负例一无所知。而我们想获得的最终CBOW模型是,对于正例(say),Sigmoid层的输出接近1;对于负例(say以外的单词),Sigmoid层的输出接近0。

为了把多分类问题处理成二分类问题,对于正例和负例,都需要能够正确地进行二分类。我们不会对所有负例进行学习,而是作为近似方法,选择若干个(5个或10个)负例,这也是负“采样”的真正含义。

那么这若干个负例是如何抽取的呢?实际上基于语料库的统计数据进行的采样要比随机抽样好,具体来说,就是让语料库中经常出现的单词容易被抽到,让语料库中不经常出现的单词难以被抽到。因为在现实问题中,稀有单词基本上不出现,处理好高频词才能获得更好的结果。

总结

Word2vec是谷歌2013年提出的在2018年之前比较主流的词嵌入模型之一,word2vec的用处是从语料中训练生成一批词向量,这批词向量可以直接拿来做后续的任务。

本章以word2vec的高速化为主题,对上一章的CBOW模型进行了改进,实现Embedding层和引入负采样。基于本书的写作时间,本章中并没有介绍众所周知的方法,即基于词频作为叶子节点的权重,构造哈弗曼树,减少softmax的计算量。具体过程感兴趣的同学可以查资料了解一下。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

【文言】

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

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

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

打赏作者

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

抵扣说明:

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

余额充值