前言
cs0224n之前之前刷过一部分,但既没有做笔记,也没有将核心内容看完。导致现在基础内容忘得差不多了,趁现在暑假有时间计划重刷并做笔记记录。
Lecture 1: Introduction and Word Vectors
The course
课程目标如下:
Human language and word meaning
语言是人类变得强大的主要原因,相较于如今的互联网的传播速度而言,人类语言是一种缓慢的语言。然而,只需人类语言形式的几百Byte的信息,就可以让一个人想象出丰富的视觉场景,足以体现人类语言的强大。
那么如何表示一个词语的含义呢?(How do we represent the meaning of a word?)
定义:含义
- 用一个词、短语等所代表的想法;
- 一个人想用词语、符号等来表达的想法;
- 作品、艺术作品所表达的想法。
理解含义的最普遍的语言方式(linguistic way) : 语言符号与语言符号的含义的转化,即一个符号(比如一个单词)它代表了什么想法或者事物。
那我们如何在计算机中直接使用这些含义呢?
WordNet是一个包含同义词集和上位词(即隶属关系,如“is a”关系)列表的辞典。幻灯片中举了两个例子,分别是good的同义词和panda的上位词。
然而,Wordnet也有一些问题。
- 作为一个资源很好,但忽略了细微差别
- 例如“proficient”被列为“good”的同义词。这只在某些上下文中是正确的。
- 缺少单词的新含义
- 例如 wicked, badass, nifty, wizard, genius, ninja, bombest
- 难以持续更新
- 主观的
- 需要人类劳动来创造和调整
- 无法计算单词相似度
传统自然语言处理中,我们把词语看作离散的符号: hotel, conference, motel - a localist representation。单词通过One-hot向量编码。但这样编码有几个问题:
- 维度太大:每个单词的维度都是整个词表大小,一般词表会特别大;
- 互相正交:无法体现单词之间的相关性。
解决方案:可以尝试依赖WordNet的同义词列表来获得相似性吗?答案是否定的,因为Wordnet本身就严重不完整等。相反,我们可以学习在向量本身的过程中编码相似性。
我们可以通过一个词周围的词来表示这个词(You shall know a word by the company it keeps),这正是我么接下来所做工作的基础。我们把一个词周围的词成为上下文(context),通过使用一个单词w的许多上下文,我们就可以表示出单词w的含义。
Word2vec: Overview
Word2vec (Mikolov et al. 2013)是一个学习单词向量的框架。
其核心思想如下:
- 我们有大量的文本 (又称语料,corpus)
- 固定词汇表中的每个单词都由一个向量表示
- 对于文本中的每个位置t,都有一个中心词c(就是在位置t上的这个单词)和上下文(就是位置t前后的)单词o
- 使用c和o的词向量的相似性来计算给定中心词c条件下上下文中出现单词o的 概率 (反之亦然)
- 不断调整词向量 来最大化这个概率
以下为两个例子,窗口大小(即位置t向左/右多少个词称为上下文)假设为2:
上图的中心词为into,上下文词为problems,turning,banking,crises。
上图的中心词为banking,上下文词为turning,into,crises,as。
具体来说,我们要做的,就是在给定一个中心词banking之后,预测的上下文为为turning,into,crises,as的概率P(turning|banking),P(into|banking),P(crises|banking),P(as|banking)值越大越好。
也就是说,我们要最大后如下的似然函数:
这里的参数 θ \theta θ其实就是我们要优化调整的各个单词的词向量。那么为了最大化似然函数,我们就可以定义如下代价/目标函数来最小化:
这里我们除T是为了消除语料中单词数目T对结果的影响。取log则是为了将连乘变为累加方便计算。
那么我们接下来任务的关键就是如何确定这个概率值。为了方便起见,我们使用两个向量来代表一个词,即一个单词w对应两个词向量,分别为:
- v w v_w vw代表w作为一个中心词时的词向量
- u w u_w uw代表w作为一个上下文词时的词向量
这样表示之后,我们就可以表示出对于一个中心词c,上下文词为o的概率为
至于为什么要采用两个词向量表示,Maning在视频中也有解释,b站的评论区有人总结了一下:
“训练两组词向量是为了计算梯度的时候求导更方便。如果只用一组词向量 ,那么Softmax计算的概率公式里分母会出现一项平方项 ,那么再对 求导就会比较麻烦。相反如果用两套词向量,求导结果就会很干净。但其实,因为在窗口移动的时候,先前窗口的中心词会变成当前窗口的上下文词,先前窗口的某一个上下文词会变成当前窗口的中心词。所以这两组词向量用来训练的词对其实很相近,训练结果也会很相近。一般做法是取两组向量的平均值作为最后的词向量。” link
公式中,我们对向量 u o u_o uo和向量 v c v_c vc进行点乘。如果两个向量之间越相似,那么点乘结果越大,从而归一化后得到的概率值也越大。模型的训练正是为了使得具有相似上下文的单词,具有相似的向量。
这里实际上就是使用了一步Softmax来将点积的结果来转变为概率值。
Word2vec derivations of gradient
我们要优化的目标函数如幻灯片中所示,
核心还是对
log
p
(
o
∣
c
)
\log p(o|c)
logp(o∣c)进行求导。
对其求导步骤如下,用到了链式法则:
同理我们可以求出对
u
o
u_o
uo的偏导数。
在每次更新中,我们都会对在该窗口用到的词向量进行更新。