zoukankan      html  css  js  c++  java
  • CS224n笔记二:word2vec

    如何表示词语的意思

    语言学中meaning近似于“指代,代指,符号”。

    计算机中如何处理词语的意思

    过去一直采用分类词典,计算语言学中常见的方式时WordNet那样的词库,比如NLTK中可以通过WordNet查询熊猫的上位词(hypernums),得到“食肉动物”,“动物”之类的上位词。也可以查询“good”的同义词,如“just”。

    离散表示(discrete representation)的问题

    • 这种离散表示并不准确,丢失了些许韵味。如以下同义词的意思还是有微妙不同的:adept, expert, good, practiced, proficient, skillful

    • 缺少新词

    • 耗费人力

    • 无法准确计算词语相似度

      大多数NLP学者将词语作为最小的单位,事实上,词语只是词表长度的one-hot向量,这是一种局部表示(localist representation)。在不同的语料中,词表大小不同,如Google的1TB词料词汇量是1300w,这个向量实在过长了。

    从符号表示(symbolic representation)到分布式表示(distributed representation)

    词语在符号表示上体现不出意义的相似性,如“motel”和“hotel”,其one-hot向量是正交的,无法通过计算获得相似度。

    Distributional similarity based representations

    语言学家J. R. Firth提出,通过一个单词的上下文可以得到它的意思。J. R. Firth甚至建议,日过能将单词放到正确的上下文中,才说明掌握了它的意义。这是现代统计自然语言处理最成功的思想之一:

    通过向量定义词语的含义

    通过调整一个单词机器上下文单词的向量,使得根据两个向量可以推测两个单词的相似度;或者根据两个向量可以推测词语的上下文。这种手法是递归的,根据向量调整向量。

    学习神经网络word embedings的基本思路

    • 定义一个用来预测某个单词上下文的模型:

      p(context|wt)=…

    • 损失函数定义如下:

      J=1-p(w-t|wt)

      这里的w-t表示wt的上下文(-t表示“除了t之外”),如果完美预测,及p(wt)=1,损失函数等于0。

    • 在一个大型的语料库中的不同位置得到训练实例,调整词向量,最小化损失函数。

    word2vec的主要思路

    通过单词和上下文预测彼此。

    • 两个算法
      • Skip-grams(SG):预测上下文
      • Continuous Bag of Words(CBOW):预测目标单词
    • 两种高效的训练方法:
      • Hierarchical softmax
      • Negative sampling

    Hierarchical Softmax

    模型共同点

    无论是哪种模型,其基本网络结构都是在下图的基础上(省略掉hidden layer):

    为什么要去掉hidden layer层呢?因为word2vec的作者认为hidden layer到output layer的矩阵运算太多了,所以两种模型的网络结构是:

    其中w(t)代表当前词语位于句子中的位置t,同理定义其他符号,在窗口内(上图中的窗口大小为5),除了当前词语之外的其它词语共同构成上下文。

    CBOW

    原理:CBOW是一种根据上下文的词语预测当前词语出现概率的模型。

    CBOW是已知上下文,估算当前词语的语言模型,其学习目标是最大化对数似然函数:

    其中,w表示语料库C中任意一个次。从上图可以看出,对于CBOW:

    • 输入层是上下文词语的词向量(词向量只是训练CBOW模型的副产物,是CBOW模型的一个参数。训练开始时,词向量是随机值,随着训练的进行不断被更新)

    • 投影层对其求和,就是简单的向量加法。

    • 输出层输出最可能的w。由于语料库中的词汇量是固定的|C|个,所以上述过程可以看作是一个多分类的问题。给定特征,从|C|个分类中挑一个。

      对于神经网络模型的多分类,最朴素的做法是softmax回归:

      softmax回归需要对语料库中每个词语(类)都计算一遍输出概率并进行归一化,在几十万词汇量的语料上无疑是令人头疼的。

      如果使用SVM中的多分类:

      svm_多分类.gif

      这是一种二叉树结构,应用到word2vec中被作者称为Hierarchical Softmax:

      屏幕快照 2016-07-17 上午9.13.40.png

      上图输出层的树形结构即为Hierarchical Softmax。

      非叶子节点相当于一个神经元(感知机,我认为逻辑斯谛回归就是感知机的输出代入f(x)=1/(1+e^x)),二分类决策输出1或0,分别代表向下左转或向下右转;每个叶子节点代表语料库中的一个词语,于是每个词语都可以被01唯一地编码,并且其编码序列对应一个事件序列,于是我们可以计算条件概率:屏幕快照 2016-07-17 上午10.05.33.png

      在开始计算之前,还是得引入一些符号:

      1. 屏幕快照 2016-07-17 上午9.59.45.png从根结点出发到达w对应叶子结点的路径.

      2. 屏幕快照 2016-07-17 上午10.00.06.png路径中包含结点的个数

      3. 屏幕快照 2016-07-17 上午10.01.17.png路径屏幕快照 2016-07-17 上午9.59.45.png中的各个节点

      4. 屏幕快照 2016-07-17 上午10.02.33.png词w的编码,屏幕快照 2016-07-17 上午10.03.27.png表示路径屏幕快照 2016-07-17 上午9.59.45.png第j个节点对应的编码(根节点无编码)

      5. 屏幕快照 2016-07-17 上午10.04.18.png路径屏幕快照 2016-07-17 上午9.59.45.png中非叶节点对应的参数向量

        可以给出w的条件概率:

      屏幕快照 2016-07-17 上午10.07.18.png

    Skip-gram预测

    这里虽然有四条线,但模型中只有一个条件分布(因为这只是个词袋模型而已,与位置无关)。学习就是要最大化这些概率。

    word2vec细节

    目标函数定义为所有位置的预测结果的乘积:

    hankcs.com 2017-06-07 下午2.55.51.png

    要最大化目标函数。对其取个负对数,得到损失函数——对数似然的相反数:

    hankcs.com 2017-06-07 下午2.57.28.png

    对于softmax来讲,常用的损失函数为交叉熵。

    Softmax function:从实数空间到概率分布的标准映射方法

    hankcs.com 2017-06-07 下午3.13.57.png

    指数函数可以把实数映射成正数,然后归一化得到概率。

    softmax之所叫softmax,是因为指数函数会导致较大的数变得更大,小数变得微不足道;这种选择作用类似于max函数。

    Skipgram

    2017-06-07_15-24-56.png

    这两个矩阵都含有V个词向量,也就是说同一个词有两个词向量,哪个作为最终的、提供给其他应用使用的embeddings呢?有两种策略,要么加起来,要么拼接起来。在CS224n的编程练习中,采取的是拼接起来的策略:

    # concatenate the input and output 
    word vectorswordVectors = np.concatenate(    
    (wordVectors[:nWords,:], wordVectors[nWords:,:]),    
    axis=0)
    # wordVectors = wordVectors[:nWords,:] + wordVectors[nWords:,:]
    

    他们管W中的向量叫input vector,W'中的向量叫output vector。从左到右是one-hot向量,乘以center word的W于是找到词向量,乘以另一个context word的矩阵W'得到对每个词语的“相似度”,对相似度取softmax得到概率

    训练模型:计算参数向量的梯度

    把所有参数写进向量θ,对d维的词向量和大小V的词表来讲,有:

    2017-06-07_15-34-33.png

    由于上述两个矩阵的原因,所以θ的维度中有个2。

  • 相关阅读:
    五分钟搭建起一个包含CRUD功能的JqGrid表格
    TDD学习笔记【六】一Unit Test
    CQRS
    开源一个vue2的tree组件
    权限管理[Linux]
    文件管理[Linux]
    查看文本[Linux]
    常用命令[Linux]
    文件管理[Linux]
    状态机工作流
  • 原文地址:https://www.cnblogs.com/mengnan/p/9307587.html
Copyright © 2011-2022 走看看