美文网首页
Word2Vec原理(一)-Cbow与SkipGram

Word2Vec原理(一)-Cbow与SkipGram

作者: MashoO | 来源:发表于2019-04-09 14:10 被阅读0次

    词嵌入

    • 什么是Embedding
      Embedding在数学上表示一个maping, f: X -> Y, 也就是一个映射函数。通俗的翻译可以认为是向量嵌入,就是把X所属空间的向量映射为到Y空间的多维向量,那么该多维向量相当于嵌入到Y所属空间中,一个萝卜一个坑。

    • 为什么词嵌入
      在NLP任务中,我们所遇到的最原始的输入,可能是语音片段(各种智障音箱),也可能是文字片段(智障小冰),要想通过算法完成分类等任务,必须先将输入转换为算法模型可以处理的形式:向量.

    • 什么是词嵌入
      词嵌入(Word Embeding)是用向量来表述词的方式,我个人的理解是,将高维度的原始词向量进行降维处理,同时加入语义信息与上下文信息.这里的词,一般指对原始文本进行分词后得到的最小片段,最近两年的很多工作已经跳过了分词的过程,直接做字符级的嵌入,我们的系统在迭代过程中也做了这样的尝试,并且取得了不错的效果.
      可以说,词嵌入是NLP任务中的基础工作,也是非常关键的一环,词嵌入的好坏直接影响算法模型的效果.

    • 近年主要工作
      最原始的词嵌入方式是onehot,这种方式简单粗暴,并且在某些任务上取得了不错的效果.但是却有非常致命的缺点:只有统计学的意义,无法表征语义,比如沙雕永远不可能被理解为傻吊;此外当词典变大时,向量长度也随之变大,并且词嵌入的结果非常的稀疏,严重影响算法的准度与训练速度.
      2001年, Bengio 等人正式提出神经网络语言模型( Neural Network Language Model ,NNLM),该模型在学习语言模型的同时,也得到了词向量。
      词嵌入研究兴起的主力应该就是谷歌于2013年开源的word2vec了, 后面又出现了fasttext, glove等,去年出了两个影响力较大的与训练词嵌入模型:ELMo与BERT, 暂时没有非常有效的应用.此外,针对中文的词嵌入,还有腾讯AIlab与蚂蚁金融提出的基于文字图像的嵌入模型,实用性未知.

    Word2Vec从提出至今,已经成为了深度学习在自然语言处理中的基础部件,大大小小、形形色色的DL模型在表示词、短语、句子、段落等文本要素时都需要用word2vec来做word-level的embedding。Word2Vec的作者Tomas Mikolov是一位产出多篇高质量paper的学者,从RNNLM、Word2Vec再到最近流行的FastText都与他息息相关。一个人对同一个问题的研究可能会持续很多年,而每一年的研究成果都可能会给同行带来新的启发,本期的PaperWeekly将会分享其中三篇代表作,分别是:
    1、Efficient Estimation of Word Representation in Vector Space, 2013
    2、Distributed Representations of Sentences and Documents, 2014
    3、Enriching Word Vectors with Subword Information, 2016

    word2vec原理

    word2vec主要解决什么问题?
    简而言之,如何在一个大型数据集上通过无监督学习快速、准确地学习出词表示.
    word2vec是怎么做的?
    利用训练语料使用cbow或者skip-gram构建一个单层的神经网络分类器,最终隐藏层的参数向量就是对应词的词向量。
    这里从知乎上的一个回答里,得到两张图,可以比较好的解释其训练过程。

    word2vec训练过程

    word2vec结构
    可以看出来,训练过程中只构建了最浅层的的神经网络,输入为one-hot后的向量,输出也为对应的词,实际上作者针对One-hot的问题使用了Hoffman树进行优化。

    Cbow与skipgram

    1. cbow
      cbow(continuous bag-of-words)也就是连续词袋模型。简而言之就是用语料中,某个词w左右的n个词去预测w.
      所以使用模型描述就是P(w|context)
    2. skipgram
      skipgram与cbow的思路正好相反,使用每个词去预测其上下文的概率.因此使用模型描述就是P(context|w)
      简单的图对比二者
      cbow与skipgram对比
      那么,如何模型的输入与输出分别是什么?
      输入是根据词典构建的一个初始化词向量, 输出是预测得到的词的词向量.作者使用了霍夫曼编码对softmax过程进行了优化,也就是后面即将提到的层次softmax.
      下面介绍霍夫曼编码.

    霍夫曼编码

    霍夫曼编码实际上是信息论领域的一种无损压缩的可变长编码算法.这里有几个关键词: 无损压缩, 可变长.不难发现, 首先霍夫曼编码本质上是一种压缩算法,能对信息进行无损的压缩;其次是可变长, 体现在霍夫曼编码是以来源符号出现的频率来进行编码的,并且出现频率越高,编码的比特越少,这样使得最终对所有数据的编码长度之和最小.

    • 霍夫曼编码的构建思路
      通过霍夫曼树(最优二叉树)来逐步构建霍夫曼编码, 霍夫曼树是一种带权路径长度最短的二叉树,其中树的路径长度是从根到每一节点的路径长度之和.
      二叉树的带权路径长度记为:
      WPL=\sum_{n}^{k=1}w_k l_k
      其中,w_k为节点权值,l_k为节点路径长度
    • 霍夫曼算法[1]
      根据霍夫曼树的定义,要使wpl值越小, 必须使权值越大的节点越靠近根节点,不难发现,其实这是一种贪心的思想.由此得到霍夫曼算法的步骤如下:
      (1)根据给定的n个权值\{w_1,w_2...w_n\},构造n棵只有根节点的二叉树.
      (2)在森林中选取两颗根节点权值最小的树作为左右子树,得到的新的树的根节点权值为其左右子树根节点权值之和.权值较小的树放左侧.
      (3)在森林中删除(2)中选择的两棵树,同时加入新的树.
      (4)重复(2)(3)直至只有一棵树.
      示例:
      霍夫曼编码示例
      在word2vec中,使用左侧为1右侧为0,示例中的a就对应1,b对应01,c对应001,d对应000

    Hierarchical Softmax

    • 传统的NNLM
      从传统的nnml(神经网络语言模型)说起,通常是简单只包含一个隐藏层的分类器,在计算过程中,由于需要计算每个词的softmax概率,因此输出层的计算量相当大[2].如图


      传统的NNLM
    • word2vec的特点
      word2vec的本质也是一种NNLM,但是作者在基本的NNLM之上,做了一些改进:[2]
      (1)输入层到隐藏层的映射,没有使用线性变换+激活函数,而是采用简单的对所有输入词向量求和并取平均.
      (2)从隐藏层到输出的softmax层,为了避免计算每个词的softmax概率,word2vec采用了霍夫曼树来代替从隐藏层到输出层的映射.
    • 一些分析
      如上图,如果使用传统的NNLM,softmax层的计算复杂度为O(V),而进行编码后需要预测的类别数的期望值为logV,因此计算复杂度至少降低为O(logV)

    参考文献

    [1]简单爱_wxg.霍夫曼树[EB/OL].https://www.cnblogs.com/wxgblogs/p/5604853.html,2016-06-21.
    [2]刘建平Pinard.word2vec原理(二) 基于Hierarchical Softmax的模型[EB/OL].https://www.cnblogs.com/pinard/p/7243513.html,2017-07-27.

    相关文章

      网友评论

          本文标题:Word2Vec原理(一)-Cbow与SkipGram

          本文链接:https://www.haomeiwen.com/subject/ohgqbqtx.html