Word2Vec

在上个视频中你已经见到了如何学习一个神经语言模型来得到更好的词嵌入,在本视频中你会见到 Word2Vec算法,这是一种简单而且计算时更加高效的方式来学习这种类型的嵌入,让我们来看看。

本视频中的大多数的想法来源于Tomas Mikolov,Kai Chen,Greg CorradoJeff Dean

(Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.)

假设在训练集中给定了一个这样的句子:“I want a glass of orange juice to go along with my cereal.”,在Skip-Gram模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题。上下文不一定总是目标单词之前离得最近的四个单词,或最近的 nnn 个单词。我们要的做的是随机选一个词作为上下文词,比如选orange这个词,然后我们要做的是随机在一定词距内选另一个词,比如在上下文词前后5个词内或者前后10个词内,我们就在这个范围内选择目标词。可能你正好选到了juice作为目标词,正好是下一个词(表示orange的下一个词),也有可能你选到了前面第二个词,所以另一种配对目标词可以是glass,还可能正好选到了单词my作为目标词。

于是我们将构造一个监督学习问题,它给定上下文词,要求你预测在这个词正负10个词距或者正负5个词距内随机选择的某个目标词。显然,这不是个非常简单的学习问题,因为在单词orange的正负10个词距之间,可能会有很多不同的单词。但是构造这个监督学习问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型。

接下来说说模型的细节,我们继续假设使用一个10,000词的词汇表,有时训练使用的词汇表会超过一百万词。但我们要解决的基本的监督学习问题是学习一种映射关系,从上下文c,比如单词orange,到某个目标词,记为t,可能是单词juice或者单词glass或者单词my。延续上一张幻灯片的例子,在我们的词汇表中,orange是第6257个单词,juice是10,000个单词中的第4834个,这就是你想要的映射到输出 yyy 的输入 xxx。

为了表示输入,比如单词orange,你可以先从one-hot向量开始,我们将其写作 OcO_cOc​ ,这就是上下文词的one-hot向量(上图编号1所示)。然后和你在上节视频中看到的类似,你可以拿嵌入矩阵 EEE 乘以向量 OcO_cOc​ ,然后得到了输入的上下文词的嵌入向量,于是这里 ec=EOce_c=EO_cec​=EOc​ 。在这个神经网络中(上图编号2所示),我们将把向量 ece_cec​ 喂入一个softmax单元。我通常把softmax单元画成神经网络中的一个节点(上图编号3所示),这不是字母O,而是softmax单元,softmax单元要做的就是输出 y^\hat{y}y^​ 。然后我们再写出模型的细节,这是softmax模型(上图编号4所示),预测不同目标词的概率:

Softmax:p(t∣c)=exp(θtTec)∑j=110,000exp(θjTec)Softmax:p(t|c)=\frac{exp(\theta_t^Te_c)}{\sum_{j=1}^{10,000}exp(\theta^T_je_c)}Softmax:p(t∣c)=∑j=110,000​exp(θjT​ec​)exp(θtT​ec​)​

这里 θt\theta_tθt​ 是一个与输出 ttt 有关的参数,即某个词 ttt 和标签相符的概率是多少。我省略了softmax中的偏差项,想要加上的话也可以加上。

最终softmax的损失函数就会像之前一样,我们用 yyy 表示目标词,我们这里用的 yyy 和 y^\hat{y}y^​ 都是用one-hot表示的,于是损失函数就会是:

L(y^,y)=−∑i=110,000yilog⁡y^iL(\hat{y},y)=-\sum_{i=1}^{10,000}y_i\log\hat{y}_iL(y^​,y)=−i=1∑10,000​yi​logy^​i​

这是常用的softmax损失函数, yyy 就是只有一个1其他都是0的one-hot向量,如果目标词是juice,那么第4834个元素就是1,其余是0(上图编号5所示)。类似的 y^\hat{y}y^​ 是一个从softmax单元输出的10,000维的向量,这个向量是所有可能目标词的概率。

总结一下,这大体上就是一个可以找到词嵌入的简化模型和神经网络(上图编号2所示),其实就是个softmax单元。矩阵 EEE 将会有很多参数,所以矩阵 EEE 有对应所有嵌入向量 ece_cec​ 的参数(上图编号6所示),softmax单元也有 θt\theta_tθt​ 的参数(上图编号3所示)。如果优化这个关于所有这些参数的损失函数,你就会得到一个较好的嵌入向量集,这个就叫做Skip-Gram模型。它把一个像orange这样的词作为输入,并预测这个输入词,从左数或从右数的某个词,预测上下文词的前面一些或者后面一些是什么词。

实际上使用这个算法会遇到一些问题,首要的问题就是计算速度。尤其是在softmax模型中,每次你想要计算这个概率,你需要对你词汇表中的所有10,000个词做求和计算,可能10,000个词的情况还不算太差。如果你用了一个大小为100,000或1,000,000的词汇表,那么这个分母的求和操作是相当慢的,实际上10,000已经是相当慢的了,所以扩大词汇表就更加困难了。

这里有一些解决方案,如分级(hierarchical)的softmax分类器和负采样(Negative Sampling)。

在文献中你会看到的方法是使用一个分级(hierarchical)的softmax分类器,意思就是说不是一下子就确定到底是属于10,000类中的哪一类。想象如果你有一个分类器(上图编号1所示),它告诉你目标词是在词汇表的前5000个中还是在词汇表的后5000个词中,假如这个二分类器告诉你这个词在前5000个词中(上图编号2所示),然后第二个分类器会告诉你这个词在词汇表的前2500个词中,或者在词汇表的第二组2500个词中,诸如此类,直到最终你找到一个词准确所在的分类器(上图编号3所示),那么就是这棵树的一个叶子节点。像这样有一个树形的分类器,意味着树上内部的每一个节点都可以是一个二分类器,比如逻辑回归分类器,所以你不需要再为单次分类,对词汇表中所有的10,000个词求和了。实际上用这样的分类树,计算成本与词汇表大小的对数成正比(上图编号4所示),而不是词汇表大小的线性函数,这个就叫做分级softmax分类器。

我要提一下,在实践中分级softmax分类器不会使用一棵完美平衡的分类树或者说一棵左边和右边分支的词数相同的对称树(上图编号1所示的分类树)。实际上,分级的softmax分类器会被构造成常用词在顶部,然而不常用的词像durian会在树的更深处(上图编号2所示的分类树),因为你想更常见的词会更频繁,所以你可能只需要少量检索就可以获得常用单词像theof。然而你更少见到的词比如durian就更合适在树的较深处,因为你一般不需要到那样的深处,所以有不同的经验法则可以帮助构造分类树形成分级softmax分类器。所以这是你能在文献中见到的一个加速softmax分类的方法,但是我不会再花太多时间在这上面了,你可以从我在第一张幻灯片中提到的Tomas Mikolov等人的论文中参阅更多的细节,所以我不会再花更多时间讲这个了。因为在下个视频中,我们会讲到另一个方法叫做负采样,我感觉这个会更简单一点,对于加速softmax和解决需要在分母中对整个词汇表求和的问题也很有作用,下个视频中你会看到更多的细节。

但是在进入下个视频前,我想要你理解一个东西,那就是怎么对上下文c进行采样,一旦你对上下文c进行采样,那么目标词t就会在上下文c的正负10个词距内进行采样。但是你要如何选择上下文c?一种选择是你可以就对语料库均匀且随机地采样,如果你那么做,你会发现有一些词,像theofaandto诸如此类是出现得相当频繁的,于是你那么做的话,你会发现你的上下文到目标词的映射会相当频繁地得到这些种类的词,但是其他词,像orangeappledurian就不会那么频繁地出现了。你可能不会想要你的训练集都是这些出现得很频繁的词,因为这会导致你花大部分的力气来更新这些频繁出现的单词的 ece_cec​ (上图编号1所示),但你想要的是花时间来更新像durian这些更少出现的词的嵌入,即 eduriane_{durian}edurian​ 。实际上词 p(c)p(c)p(c) 的分布并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的分级来平衡更常见的词和不那么常见的词。

这就是Word2VecSkip-Gram模型,如果你读过我之前提到的论文原文,你会发现那篇论文实际上有两个不同版本的Word2Vec模型,Skip-Gram只是其中的一个,另一个叫做CBOW,即连续词袋模型(Continuous Bag-Of-Words Model),它获得中间词两边的的上下文,然后用周围的词去预测中间的词,这个模型也很有效,也有一些优点和缺点。

总结下:CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。 (下图左边为CBOW,右边为Skip-Gram

而刚才讲的Skip-Gram模型,关键问题在于softmax这个步骤的计算成本非常昂贵,因为它需要在分母里对词汇表中所有词求和。通常情况下,Skip-Gram模型用到更多点。在下个视频中,我会展示给你一个算法,它修改了训练目标使其可以运行得更有效,因此它可以让你应用在一个更大的训练集上面,也可以学到更好的词嵌入。

2.6 Word2Vec-深度学习第五课《序列模型》-Stanford吴恩达教授相关推荐

  1. 深度学习教程(10) | 卷积神经网络解读(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/35 本文地址:http://www.showmeai.tech/article-det ...

  2. 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...

  3. 2.19 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.18 Logistic 损失函数的解释 回到目录 3.1 神经网络概览 文章目录 总结 习题 第 11 题 第 12 题 第 13 题 第 14 题 第 15 题 第 1 ...

  4. 1.1 欢迎-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 无 回到目录 1.2 什么是神经网络 欢迎 第一个视频主要讲了什么是深度学习,深度学习能做些什么事情.以下是吴恩达老师的原话: 深度学习改变了传统互联网业务,例如如网络搜索和 ...

  5. 1.8 其他正则化方法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.7 理解 Dropout 回到目录 1.9 归一化输入 其他正则化方法 (Other Regularization Methods) 除了 L2L2L2 正则化和随机失活 ...

  6. 机器学习和深度学习到底怎么学?顶尖专家吴恩达告诉你

    机器学习和深度学习到底怎么学? 在外国版知乎上,有位网友问:新手如何学习机器学习?学习完MOOC的课程后有没有能力阅读研究论文或者真正的做出一点研究成果? 这个困惑很多人的问题吴恩达给出了详细的回答, ...

  7. 3.12 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.11 随机初始化 回到目录 4.1 深层神经网络 文章目录 总结 习题 第 21 题 第 22 题 第 23 题 第 24 题 第 25 题 第 26 题 第 27 题 ...

  8. 3.5 向量化实现的解释-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.4 多个例子中的向量化 回到目录 3.6 激活函数 向量化实现的解释 (Explanation for Vectorized Implementation) 在上一个视频 ...

  9. 0.0 目录-深度学习第五课《序列模型》-Stanford吴恩达教授

    文章目录 目录 第五课 第四课 第三课 第二课 第一课 目录 第五课 <序列模型> 笔记列表 Week 1 循环序列模型 Week 1 传送门 -> 1.1 为什么选择序列模型 1. ...

  10. 3.8 注意力模型-深度学习第五课《序列模型》-Stanford吴恩达教授

    注意力模型 (Attention Model) 在上个视频中你已经见到了,注意力模型如何让一个神经网络只注意到一部分的输入句子.当它在生成句子的时候,更像人类翻译.让我们把这些想法转化成确切的式子,来 ...

最新文章

  1. 迁移学习与微调的区别
  2. 安卓百度地图附近poi搜索以及到指定poi的换乘方案
  3. html 给 ol添加abc,英语abc怎么写
  4. Flutter学习笔记(10)--容器组件、图片组件
  5. 悉尼大学计算机录取要求,Q 同学_悉尼大学_计算机_录取成功案例分享
  6. iOS开发UI篇—IOS开发中Xcode的一些使用技巧
  7. 双向循环链表讲解及实现
  8. python-opencv图像处理之车牌识别+区域划分+车牌提取+保存图片(2)
  9. Photoshop实用的快捷键大全
  10. 工程项目常见风险及其22种最佳管理实践
  11. 嵌入式c c++开发笔记(opencv图片,视频的翻转,截取,旋转)
  12. AutoHotKey:Shift+ijkl实现方向键
  13. 支持安卓与iphone13和安卓手机的5W无线充电芯片IC
  14. 宝塔部署uniapp和php后端的经历
  15. 实例讲解PMP相关方参与度评估矩阵
  16. win10无法完成更新正在撤销更改怎么办?windows10无法更新正在撤销更改的解决方法
  17. python实现docx的批注(comments)插入
  18. 【jzoj1965】【递推】【普组模拟赛】马球比赛
  19. (六)改掉这些坏习惯,还怕写不出精简的代码?
  20. 软件测试工程师面试题总结

热门文章

  1. 分享大麦UWP版本开发历程-03.GridView或ListView 滚动底部自动加载后续数据
  2. SQL Developer更改日期显示格式
  3. UA MATH567 高维统计专题1 稀疏信号及其恢复5 LASSO的估计误差
  4. UA PHYS515A 电磁理论V 电磁波与辐射7 运动点电荷的辐射
  5. UA STAT675 统计计算I 随机数生成8 Adaptive Rejection Sampling
  6. UA MATH567 高维统计IV Lipschitz组合2 Spherical Distribution的Lipschitz函数 Isoperimetric不等式
  7. VC++ 显示对话框
  8. tasklist命令参数应用详细图解
  9. 学习笔记94—所有用过SCI-hub的科研工作者都应该知道的事
  10. Springboot-读取核心配置文件及自定义配置文件