最近开始学习斯坦福的课程“CS224d: Deep Learning for Nature Language Processing”,课程老师是PhD Richard Socher。这里是边看边做一些简单的记录,以供后续的查阅。
相关材料最开始是从网站“我爱自然语言处理”上得到的,课程材料的下载地址:http://cs224d.stanford.edu/syllabus.html。
NLP 简介
NLP:Nature Language Processing,自然语言处理,其目的是让机器理解自然语言。根据难易程度,可以分为以下几个方面:
- Easy:拼写检查、关键词搜索、同义词查找
- Medium:从网站、文档中解析各类信息
- Hard:机器翻译、语义分析、共指分析(Coreference)、问答系统等
数据量和计算能力的快速增长,促使了深度学习(Deep Learning)的发展,并与NLP结合形成了deep NLP的研究课题。当前已经有很多相关的论文,而构成这种结合的基础是词语的向量化,即Word Vectors。
词向量
为便于计算,需要将词语进行向量化表示。先来看最简单的one-hot vector,每个词是一个向量
w∈R|V|×1
,向量中只有0和1存在,
|V|
是词表的长度,这里的词表是排过序的,而1所在的位置即该词在词表中的位置。比如:
但是这种表示不提供相似性的信息,如:
所以,需要对这种表示进行降维,找到一中子空间可以建立词语之间的关系。
基于SVD的方法
遍历所有数据,统计其中出现词的词频,以此建立矩阵
X
,然后进行SVD分解,
词-文档矩阵
词-文档矩阵(Word-Document Matrix)构建的前提是:假设相关的词经常出现在同样的文档中。矩阵
X∈R|V|×M
,其中
M
是文档的个数,
词-词矩阵
词-词矩阵是我理解起名的,实际是基于窗口的共现矩阵(Window based Co-occurrence Matrix)。统计文档中所有出现的词,以两两词一同出现的次数建立关联矩阵(Affinity Matrix)。窗口的大小即两个词之间的距离,以下列数据为例,窗口设为1。
- I enjoy flying
- I like NLP
- I like DL
则关联矩阵为
X=IIikeenjoyDLNLPflyingI021000like200110enjoy100001DL010000NLP010000flying001000
这种方法同样有很多问题,如: - 矩阵的维度会经常变化,只要有新的词加入,矩阵就会变
- 矩阵会非常稀疏,因为大部分词其实并不相关
- 矩阵的维度通常也比较大
- 训练的代价较大,即SVD运算量大
……
下面是迭代的方法,可以解决部分这些问题。
基于迭代的方法
简单来说,就是每次用一部分数据训练,迭代的进行更新,实际上就是BP。
语言模型
语言模型包括一元模型(Unigrams)、二元模型(Bigrams)等,以下面的句子为例,语言模型需要为词语序列分配概率。
“The cat jumped over the puddle.”
一个好的语言模型应该为上面的句子分配一个很高的概率,因为这个句子是完整的,有意义的。而类似“stock boil fish is toy”这样没有实际意义的句子,则只能获得非常低的概率。用数学的方式可以表示为
对于一元模型,假设每次词语出现的概率是相互独立的,则
但实际上,我们都知道,某个词语的出现是与前面出现的词语有非常强的关联的。二元模型就建立在这种关联上,
这个模型也是比较简单的,但是都可以帮助我们理解如何计算概率。下面分析一些例子来进一步理解概率的计算。
连续词袋模型(CBOW)
(待续,待补充,欢迎讨论指正)