CS224D Deep Learning for NLP lecture2

来源:互联网 发布:女神联盟2进阶13数据 编辑:程序博客网 时间:2024/06/09 09:43

斯坦福深度学习与自然语言处理课程是Richard Socher今年开的课程。他是德国人,本来学习的是机器视觉。在斯坦福大学博士毕业,师从Andrew Ng和Chris Channing学习机器学习和NLP,毕业后也成为一个大牛。本人小白一枚,花了好长时间才消化了课程的视频和课件,为了防止以后忘记,在这里纪录一下。

先放上该课程的官网镇楼:http://cs224d.stanford.edu/syllabus.html
还有一个专门提供NLP资料的网站:http://www.52nlp.cn
课程的官网课件和笔记我会在每次看完后上传到CSDN,可以免费下载(lecture2的课件后来发现要一个积分才能下载,想改成免费但是CSDN貌似改不了)

Lecture1 没有什么干货,不写了。

  • Lecture2 词矢量
    • 整个文档VS窗口
      • SVD分解
      • SVD分解的问题
    • word2vec
      • word2vec主要思想
      • 具体细节
      • 梯度的推导
      • 在word2vec里发现的线性关系
      • Lecture3 预告

Lecture2 词矢量

计算机如何表示单词的含义呢?普遍的做法是像WordNet(这究竟是个什么,调研之后再补上)一样用分类的方法表示从属关系和同义关系。但是这样的做法有很多局限,例如生词和新词就无法表示,并且需要大量的人力去建造和维护,最关键的是无法准确度量词语之间的相似度,于是词语的离散表示(discrete representation)应运而生。

在向量空间里,一个向量通常有1个1和很多0(剩下的应该都是0),维度从20K(语音)到13M(Google1T)不等,这种表示方式我们称为”one-hot”表示。但是这种表示方法有个问题,假设
motel=[0000001000000]
hotel=[0000100000000],则VmotelVhotel=0 无法表示他们的相似度

You shall know a word by the company it keeps
——J.R.Firth 1957:11

词矢量的基本假设: 假设相似的词总是有相似的上下文

于是我们使用上下文来表示一个单词。用上下文表示词语有两种方法:用整个文档的词表示当前单词,和使用有限长窗口内的词表示当前单词,究竟应该选用哪种方案呢?

整个文档VS窗口

  • 使用文档的话,词-文档的共现矩阵会使得大众话题有相似的输入,导致进一步的隐藏语义分析
  • 使用窗口的话可以让我们同时保留句法(POS)和语法信息

所以此后我们使用基于窗口的方法用上下文表示词矢量。窗的长度通常为5-10。
在这里,我们令窗长为1,计算对称的共现矩阵。
Example corpus:
- I like learning.
- I like NLP.
- I enjoy flying.

得到的共现矩阵见pdf第8页

共现矩阵的问题是随着字典的变大而变大,需要很高维的存储,并且在后续的分类模型中会有稀疏问题,所以需要进行降维。如何用最重要的若干信息来生成密集的向量呢?

SVD分解

SVD分解就是把一个nm的矩阵分解为特征向量U,对角阵S和向量V的乘积。其中U的每一列表示各个特征分量,S的每个元素可以看作是能量(或者是比重),每个元素从左上到右下从大到小排列。所以共现矩阵X可以分解为以U为基底的向量的和,因此只要提取U中前K列作为基底,用前K列表示即可以将原来的U中的m维降到K维。
简单的python编程在pdf第12页中有。我自己写了一个python小程序,自带求共现矩阵功能。完整代码:

import numpy as npimport matplotlib.pyplot as pltla=np.linalgsentence=[[],[],[]]sentence[0]=["I","like","deep","learning","."]sentence[1]=["I","like","NLP","."]sentence[2]=["I","enjoy","flying","."]wordset=sentence[0]+sentence[1]+sentence[2]vocabulary=sentence[0]def count(x,y):    count=0    for i in range(0,3):        if x in sentence[i] and y in sentence[i]:            if np.fabs(sentence[i].index(y)-sentence[i].index(x))==1:                    count+=1    return countfor i in wordset:    if not i in vocabulary:        vocabulary.append(i)lenth=len(vocabulary)X=np.zeros((lenth,lenth))for i in range(0,lenth):    for j in range(0,lenth):        X[i][j]=count(vocabulary[i],vocabulary[j])print XU,s,Vh=la.svd(X,full_matrices=False)print U,s,Vhfig=plt.figure()for i in xrange(lenth):    plt.text(U[i,0],U[i,1],vocabulary[i])plt.xlim(-0.8,0.3)plt.ylim(-0.6,0.6)plt.show()

图1
上图为程序运行的结果,可以看到词的坐标位置和课件上的并不一样。说明了结果与词的排列顺序有关,不同顺序共现矩阵不同,效果不同。为了效果起见,应该将词的顺序按照在文档中出现的频率降序排列。

Hacks to X(共现矩阵):
对于像(the,he,she)这样的功能词,出现频率太高,解决方法:

  • 使用min(X,t),t~100的方法限制最高频率
  • 直接忽略
  • 用pearson correction 而不是直接统计次数,将负值设为0
  • 使用有斜坡的窗使靠近的词更高比重(感觉就像DSP里的汉宁窗和汉命窗等)
    。。。

SVD分解的问题:

对于一个n*m的矩阵,计算复杂度是O(mn2),并且难以处理新词和新文档,与DL的体制不同。
所以有了新的思路:直接学习低维词矢量

word2vec

word2vec主要思想

  • 并非直接计算共现次数,而是预测每个词周围的词
  • 与Golve很相似
  • 更快更容易适应新文档和在单词里加入新词

具体细节

目标函数:给定当前中心词,最大化上下文中所有的词的log概率

J(θ)=1Tt=1Tcjc,j0logp(wt+j|wt)

对于p(wt+j|wt),最简单的等式如下(我一点都不觉得softmax简单,然而歪过人貌似都信手拈来):
p(wO|wI)=exp(vTwovwI)Ww=1exp(vTwvwI))

其中,v和v’分别是一个单词的”输入”和”输出”词矢量,即每个词有两个向量。输入向量很好理解,就是作为中心词时的词矢量。一开始我并不懂“输出”词矢量是什么鬼,看到Lecture3才明白,原来就是该词在变成非中心词时更新后的矢量。
例如 I like to run, 当like作为中心词时,它当前的词矢量为”输入”词矢量vlike,而当to是中心词时,like就成为周围词(就是输出词),这时更新to的词矢量vto的同时,like的词矢量也会更新,这个新的词矢量就是like的输出词矢量vlike.

梯度的推导

基础知识:

  • xTax=aTxx=a
  • Chain rule! dydx=dydududx

推导开始:

vclogP(O|C)=vclog(exp(uTovc)Ww=1exp(uTowvc))=vc[uTovclog(w=1Wexp(uTowvc))]

=uo1Ww=1exp(uTwvc)x=1Wexp(uTxvc)vc=uo1Ww=1exp(uTwvc)x=1Wexp(uTxvc)uTxvcvc

=uo1Ww=1exp(uTwvc)x=1Wexp(uTxvc)ux=uox=1Wexp(uTxvc)Ww=1exp(uTwvc)ux

=uox=1WP(X|C)ux

有木有很神奇!在当前中心词C下周围词O的log概率的梯度为,周围词O的”输出“词矢量减去,在中心词C下所有词X的概率乘X的”输出“词矢量之和(即所有”输出“词矢量的期望)。

虽然化成这种形式之后很方便计算,可以使用梯度下降法(SGD)求解,但是因为每次更新都需要计算所有词的概率和词矢量,这个目标函数在大词汇的字典并不适用,因为尺度太大训练太慢!

解决思路:

  • 进行近似
  • 定义负预测(negative prediction)(对于在上下文中不出现的单词,只采样几个,从而把注意力集中在大多数的正预测上)目前不是很懂这个负预测是什么,有什么作用,之后搞懂里再补上

在word2vec里发现的线性关系:

-句法上
xapplexapplesxcarxcarsxfamilyxfamilies

-语义上
xshirtxclothingxchairxfurniture
xkingxmanxqueenxwoman

讲义里还有很多图片,这里不贴了

Lecture3 预告

  • details to implement word2vec
  • word embedding matrix
  • advantages of low dimensional word vectors
0 0