Word Embedding 学习笔记

Word Embedding 学习笔记——GloVe 与 word2vec

完成日期:2019.02.25


文章目录

  • Word Embedding 学习笔记——GloVe 与 word2vec
    • 一. Word Representation
    • 二. One-hot Encoding
    • 三. Word Embedding
      • 3.1 Word Embedding
        • 3.1.1 Frequency based Embedding——基于词频的方法
        • 3.1.2 word2vec——非确定性的基于神经网络的预测模型
          • 3.1.2.1 CBOW
          • 3.1.2.2 skip-gram
        • 3.1.3 GloVe——基于全局词频统计的词表征工具
          • 3.1.3.1 GloVe的实现
          • 3.1.3.2 GloVe的训练
        • 3.1.4 Word Enbedding 的训练方法
    • 四. Summary

  最近在做一些关于序列标注相关的任务,所用的深度学习方法需要用到Word Embedding,所以就学习了一些Word Embedding的认识,看的主要是范永勇的博客,我觉得他写得很好,所以把自己学习到的相关知识记录一下。
  因为实验室主要是做数据挖掘相关的工作,有非常丰富的语料资源,所以在做Word Embedding的时候就想到了用GloVe或者word2vec,看了大量的材料都说两种方法的效果其实差不多,所以在做实验的时候我两种Embedding都试了一下,看哪个比较适合自己的模型。扯蛋了这么久,我还是快点我的学习笔记吧= =

一. Word Representation

  Word Representation是词的向量化表示,也就是把单词(word)按照某种规则表示成一个向量(vector)。

二. One-hot Encoding

  One-hot Encoding是到目前为止最常用的词表示方法,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
  举个例子:语料库里面有两个句子 D1 : I like apple. D2 : I like pear. 从这个语料库中我们得到字典 [I, like, apple, pear],那么单词 “I” 的one-hot encoding就是 [1000],单词 “like” 就是 [0100]

三. Word Embedding

  Word Embedding就是将单词word映射到另外一个空间,其中这个映射具有injective(单射函数)和structure-preserving(结构保存,比如在x所属空间上x12,那么映射后y所属空间y12的特点。)

3.1 Word Embedding

  Word Embedding的类型分为两大类:Frequency based Embedding(基于词频)Prediction based Embedding(基于预测)

3.1.1 Frequency based Embedding——基于词频的方法

  • Count Vector : 比如语料库有N个文本(document),统计出所有文本中不同单词的数量,结果组成一个矩阵,那么每一列就是一个向量,表示这个单词在不同的文档中的出现次数
  • TF-IDF Vector:基于Count Vector 的算法进行了一些改进,计算公式为:tfidfi,j = tfi,j × idfi
    其中,tfi,j指的是第i个单词在第j个文档出现的频次;idfi = log(N/n),其中N表示文档的总个数,n表示包含该单词的文档的数量。
  • Co-occurrence Vector:协同出现向量
    co-occurrence 协同出现指的是两个单词 w1 和 w2 在一个context window范围内共同出现的次数,context window指的是某个单词w的上下文范围的大小。

3.1.2 word2vec——非确定性的基于神经网络的预测模型

  word2vec是一个只有一个隐含层的神经网络,且激活函数(active function)是线性的,最后一层output采用softmax来计算概率,包括COBW(根据上下文来预测一个单词)skip-gram(根据单词来预测上下文)

3.1.2.1 CBOW

Word Embedding 学习笔记_第1张图片
  其中,V表示词库的大小;输入向量x1, x2,…, xn的大小为1×V,它是这个word的one-hot encoding;神经元h1, h2,…, hn表示hidden layer,大小为1×N;输出向量y1, y2,…, yn表示的是一个概率分布向量,大小和输入向量一致。
  CBOW的任务就是给定了一个长度为C个单词的上下文(单词的顺序无关)去预测最有可能的空缺单词,通过神经网络之后得到的预测结果是一个V维的向量,而这个向量代表的是词库里的每一个单词是空缺单词的概率,而神经网络中的Hidden Layer就是我们想要的词嵌入,它不仅得到了单词的语义特性,还把单词从V维空间映射了N维,这样做也实现了降维处理。

3.1.2.2 skip-gram

  可以看到COBW是从上下文content去预测最有可能的空缺单词target word的过程中学习到词向量的表达,那么,我们也能从target word到content的预测中学习到word vector,这就是skip-gram模型,其模型图为:
Word Embedding 学习笔记_第2张图片

3.1.3 GloVe——基于全局词频统计的词表征工具

  GloVe——Global Vectors for Word Representation,它可以把一个单词表达成一个由实数组成的向量,这些向量捕捉到了单词之间的一些语义特性。

3.1.3.1 GloVe的实现
  1. 根据语料库(corpus)构建一个共现矩阵(Co-ocurrence Matrix)x,矩阵中的每一个元素xij代表单词i和上下文单词j在特定大小的上下文窗口(context window)内共同出现的次数。一般而言,这个单词的最小次数是1,但是GloVe不这么认为:它根据两个单词在上下文窗口的距离d,提出了一个衰减函数 decay = 1/d 用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小
  2. 构建词向量(Word Vector)和共现矩阵(Co-occurence Matrix)之间的近似关系:
    在这里插入图片描述
  3. 之后我们再构造它的损失函数:
    在这里插入图片描述
    f(Xij)的作用:在一个语料库中,存在很多单词它们一起出现的次数是很多的,那么我们希望:
    (1)这些单词的权重要大于那些很少在一起出现的单词,所以这个函数要是非递减函数(non-decreasing)
    (2)但我们也不希望这个权重过大(overweighted),当到达一定程度之后应该不再增加
    (3)如果这两个单词没有在一起出现,也就是Xij = 0,那么他们应该不参与到loss function的计算中去,也就是f(x)要满足f(0) = 0,因此得到:
    在这里插入图片描述
3.1.3.2 GloVe的训练

  由于label是log(Xij),因此训练方法使用基于梯度下降的方法。在论文中,作者采用了AdaGrad的梯度下降算法,对矩阵的X中的所有非零元素进行随机采样,学习曲率(learning rate)设为0.05,在vector size小于300的情况下迭代了50次,其他大小的vectors上迭代了100次,直至收敛。最终学习得到的是两个vector是w和~w,为了提高鲁棒性,最终选择了两者之和作为最终的vector两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。

  • ps:Vector Dimension 在300时达到最佳,而Context Windows size大致在6-10之间。

3.1.4 Word Enbedding 的训练方法

  Word Embedding的训练方法大致可以分为两类:一类是无监督或弱监督的预训练;一类是端对端(end to end)的有监督训练。
  无监督或弱监督的预训练以word2vec为代表。这一类模型的特点是,不需要大量的人工标记样本就可以得到质量还不错的Embedding向量。不过因为缺少了任务导向,可能和要解决的问题还有一定的距离。因此,往往会在得到预训练的Embedding向量后,用少量人工标注的样本去fine-tune整个模型。
  相比之下,端对端的有监督模型在最近几年里越来越受到人们的关注。与无监督模型相比,端对端的模型在结构上往往更加复杂。同时,也因为有着明确的任务导向,端对端模型学习到的Embedding向量也往往更加准确。例如,通过一个Embedding层和若干个卷积层连接而成的深度神经网络以实现对句子的情感分类,可以学习到语义更丰富的词向量表达。

四. Summary

  我做命名实体识别实验的时候用了word2vec和GloVe,总的来说两种Word Embedding都对模型效果有所帮助,可是用GloVe的话模型的效果会更好,可能是因为GloVe更加适合我的模型吧。实际上如今现在做序列标注任务的方法都大同小异,基本都是用深度学习的方法,而且大家的神经网络结构也是差不多的,所以现在想做实验的时候要改网络结构然后得到较大的进步我觉得有点难(改网络结构是指大改),那么慢慢地大家就会从词嵌入等其他方面入手去改善模型,后续我会继续学习和使用一些其他的词嵌入方法,有时间和条件的话可能会自己试着实现word2vec。除了在词嵌入下功夫之外,也可以考虑一下引入序列本身一些固有的特征,这样应该会对模型的改进有所帮助。这都是我个人的一些小感想,要是各位觉得不对的话,欢迎和我交流哦~

你可能感兴趣的:(Word Embedding 学习笔记)