【斯坦福CS224N】(2021|中英) 深度自然语言处理Natural Lan

语言是混乱的。
目标是更好地理解语言中的意思及其影响。
GPT3,通用模型,泛用性
e.g. 给定模式续写,自然语言转sql
传统上,语言学家认为,是符号与所指代事物的配对。但这样的模型不是很好实现。
但是也有实现,如WordNet,使用了词典等资源。规定了同义词、上位词、下位词等等。
但显然这样是有失偏颇的,因为一方面一些词的含义是跟随语境变化的,另一方面人很难把词语的细微差别都输入系统中。语境、语义是无限的且不断更新的,而人工永远是有限的,无法人工地为系统规定全部的语义情况。
- Great as a resource but missing nuance
- Missing new meanings of words
- Subjective
- Require human labor to create and adapt
- Can't compute accurate word similarity
discrete离散的
传统的NLP方法视单词为离散化的,而忽视了他们之间的关系。其将词语作为一个个n维的01向量(类似编码)。
显然,一个个向量之间的点乘关系并不能够表示词语间的复杂关系。
当然,一个改进方案是,借助WordNet等资源,获取到一些人工定义的关系。然而,由于之前所说的缺点,前人做的尝试大都由于(语义的?)不够完整而失败了,效果并不好。
“使用上下文信息来表示词语含义”
Distributional semantics:
A word's meaning is given by the words that frequently appear close-by.
这种方法被证明是极具可计算性的,比较容易实现。
NLP课上,当我们用自然语言谈到一个词时,实际上说的有两种不同的东西,token和type。
token是词语本身,抽象的词。
type是词语这个符号所指代的一类东西/观念等等,是具体的词。
word vector
具体到是实现上,用n维的实值向量来表示词语含义。这里n维具体来说一般是300左右。
The way it will represent the meaning of that word, is that this vector will be useful for predicting other words that occur in the context. 意思大概是(?)向量的值设置/调整以能够更好地预测上下文为目标。
一些别名:
word vector = word embeddings = (neural) word representations
embedding的来源是:词语的含义被嵌入到了300维的高维空间
用词向量的词义表示方法,被称为distributed representation而非localized representation,因为现在词语的含义被分散在300维左右的向量的各个维度上了。对比之前的传统nlp那种词语编码,词语编码的各个位中并不包含任何的信息,仅仅整个编码代表了一个单词。而词向量里每一个元素值都蕴含了一定的语义。
每个词都有一个300维的词向量,这意味着在这个300维的空间中,分布着一个个的单词。
这里展示的这个空间的的二维投影非常有趣而形象。
类似意思的词语聚集在一起,常用在一起的词语靠的比较近
Word2Vec是一种形成/计算词向量的算法,或者说学习词向量的框架。
我们的整体思路是:
- 先有一个大的文本语料库。
- 选定一些常用的,难以再分割的词汇,舍弃一些罕见词。
- 为这些选定的词语计算出词向量
Then what is a good vector? How to form a good vector?
在计算词向量时,使用Word2Vec的思路:
(词向量的计算,可以通过对大量的文本进行所谓”distributed similarity task”来完成,即不断检验其是否能够较好地预测周围的单词)
- 先有一个中心词C,以及它附近的一个单词O(上下文).C表示center,O表示outside。
- 根据当前C的词向量,计算该上下文中单词O可能出现的概率。然后由于现在这个词O确实出现在了C的上下文里,所以我们应当调整C的词向量以加大对这个上下文词O的估计概率。(这有点像极大似然估计?,总之就是一件事情既然发生了,我们倾向于认为它的概率是较大的或者最大的)
指定一个C,然后调整C的词向量,以对C左右的各个单词进行概率提升。然后走到下一个单词,后一个单词为C重复操作。最终遍历整个文本库。
怎么改变C的词向量以提高预测的O出现在上下文中的概率呢?
这是Word2Vec的核心部分 Objective Function

实际上这看起来很像(可能就是)似然函数。
L(θ)是似然函数,而Objective Function或J(θ)是-1/T乘以对数似然函数,代表了负的平均似然程度。这里的负号仅仅是因为人们通常喜欢最小化一个loss,而不是最大化。因此这里J(θ)也常常被叫做loss。
这个似然函数意思大概是:先对每一个中心词C,对于其左侧右侧分别m个词计算概率(概率密度函数,与θ有关),然后将这2m个概率密度函数乘起来,得到C的似然函数。然后将全文本库所有C的似然函数再乘起来,得到一个大的似然函数。本来对于每个中心词C,只有300个参数,现在变成了大的似然函数,包含了所有的中心词,故大的似然函数的变量是所有参数,即 词汇数量 个300维向量,共 词汇数量*2*300 个参数。(后面会提到实际操作中会给每个词语两个词向量)
我们需要做的就是变动参数向量\theta(它是一个 词语数量*2*300 维的向量),让似然函数L(θ)取到最大值,也即是让J(θ)取到最小值(因为是负的)。
看到这里,个人直观感觉,这样需要囊括如此多数据才能进行运算的算法,这似乎是不太好实现的,如果这么算需要消耗的内存似乎非常大。一般分布式的,一点一点进行的算法会更现实一点。
上面还是概括地在讨论,但并没有说到底该怎么计算具体上下文单词的可能出现概率。
所以现在的问题变成了:
How to calculate P(w_{t+j} | w_{t}; θ)?
答案是:
我们仅仅简单地用词向量来计算概率。
这里有个技术上需要注意的事情,我们给每个词赋予两个词向量,一个在它作为中心词时使用,另一个在它作为上下文词的时候使用。如此优化了数学表达,也更容易写算法。

计算概率的表达式如ppt底部公式所示,需要了解的是
- 这里的上标T不是次方(向量也不能乘方),而是矩阵转置。也就是说,exp()里是矩阵乘法,是两个词向量的点积。
- 分母上V指的是全体词汇
- 之所以用了exp(),是因为我们不希望出现负的概率。思想上来说,不用exp表示的意思也是一样的,都是这个词O出现的可能性除以全体词出现的可能性,得到这个词出现的概率。
- 可以看出这个P如果遍历每个词求和,会得到1。这很符合概率的定义。现在的P就是一个离散的概率函数。
- 这实际上是softmax函数的一个例子。softmax函数能够将R^n空间映射到(0,1)^n,它返回的是一个概率分布。
- softmax函数的命名原因:max是因为它放大了最大的元素的概率,soft是因为它为最小的元素也指定了一点概率,详见视频。
这里有一个思想就是,用点积度量向量的相似度,即如果两个向量的点积越大,那么一定程度上可以认为这两个向量越相似。
loss就是前面的J(θ),记维度为d,词汇数量为V,则θ包含了2dV个参数。

这里就是进行一个梯度下降。
所以我们接下来要做的就是计算所有这些向量的梯度。
求P(O|C)对每个参数的偏导
这里只做了对中心词向量参数(300维左右)的偏导。
经过一系列数学推导,得到的结果是我们的目标只需要使平均值接近数学期望即可。
即:P(O|C)对V_c的偏导,等于
u_o-\sum_{x=1}^v P(x|C)u_x
ipynb的演示,显示一个2014年的模型中的词向量。
用词向量做了analogy,推导近似词,效果惊人地好。如:
king -man +women => queen
Q:一个词的两个词向量有什么区别。她的理解是,一个词可以有很多context word,但是为什么只有两个词向量呢,明明有这么多context word,为什么只选两个组成词向量呢。
A:
这里其实是对词向量工作方式的理解有偏差。
词向量是对一个词的所有附近词进行训练习得的,并不是选两个词啥的。
一个词本质上只有一个词向量,这个词向量表征这个词的含义,并可以很好地预测给定的其他词出现在他附近的概率。
但是一个词语既有可能作为中心词,也有可能作为可能出现在中心词附近背景词context word。使用一个词向量覆盖两种情况会比较复杂(比如在算偏导数的时候由于中心词和背景词可能是同一个,会导致错误),所以技术上用两个词向量分别表示两种情况下的这个词,这会使许多工作大大地简化。
事实上,一个词的两个词向量在训练后会变得非常接近,但不完全相同。于是你可以将他们取平均,然后得到表示这个词的一个单独的词向量。
Q:词向量之间是否有某种关系?目前是否有这方面的研究?
A:(老师也不确定)似乎,如果你有了一系列词向量,对一些词语间的充分的关系(相似),应当很容易被看出来。
Q:(基于第一个问题的回答)将一个词的两个词向量合并到一个的时候,用的总是将两个词向量平均的方法吗?
A:不同的人方法不一样,但一般来说是的。
Q:如果一个词有多重含义,真的能用一个词向量来表示词语的这些多重含义吗?
A:(好问题!)的确将词语的多重含义糅进一个词向量似乎听起来很疯狂且不恰当,然而事实是它工作地非常好。下节课再细说。
Q:这门课会有关于类似Alexa/Siri的语音AI对话系统的内容吗?
A:这门课是主要关于文本分析与理解的,比如机器翻译、问答、语法结构解析等,将不会关注这部分内容。如果你感兴趣的话,CS224S是关于语音识别和对话系统的。
Q:观察发现反义词在词向量空间中常常非常接近,这有些奇怪。这种模型是否够很好的抓住词语的比如正、负、正负平衡、没有正负这种性质呢?还是说模型根本没有很好地捕捉到词语真正的对立面?
A:这些词语特性都没有抓住。反义词位置接近,是源于相反的词往往容易出现在相似的主题中,常常出现在类似的结构中的同一位置,从而导致他们的基于上下文预测的方法习得的词向量词非常接近。一些效果词、情感词也是一样的。人们当然想通过神经网络等方法让模型理解词语的内涵,但是那样的话只是预测上下文词是不够的,这个方法做不到理解词语内涵。
(学生提到了)一些比如so,not的基础词
A:许多这些词被语言学家称作虚词,由于它们能够在各种各样的背景语境下出现,且有时区别不太大,因此可以想见上下文模型的效果不会太好。
但是事实上我们后面会搭建language model,并且他也能在这些虚词上表现地很好。
解释一下,Word2Vec模型的一个特点是,它忽略了词语的位置,预测所有词都用同一方法,这导致其不太能get到基础语法词。但是我们会将使用略微不同的模型,它将对句法结构较为敏感,于是能够get到这些基础语法词。
Q:关于word2vec的问题。他读了一本书,似乎和刚刚讲的东西有一些差别。
A:word2vec是一个构建词向量的框架,基于这个框架有很多的算法。比如有预测背景词(Skip-Gram)和预测中心词(CBOW)两类算法。今天讲的是预测背景词,所以它是Skip-Gram模型。
另外的细节是有许多种优化(训练)模型参数的方法,今天讲的只是最naive的一种,其效率并不高,有更高效的做法。比如negative sampling等等,下节课再提。
Q:请求更多的关于词向量从被随机的初始化到最终被习得的过程的细节。
A:总体的图像就是像之前展示的那样。先为每个词初始化随机的词向量,然后使用迭代的算法,逐步地更新词向量,让他们在预测上下文上越做越好。我们有了损失函数的梯度,就沿着梯度不断向下走,使得loss最小,从而让我们的词向量更好。(似乎讲了等于没讲?)
-------------------------------
2022-12-16 23:01
lecture 1 finished.
by Jason Hall
-------------------------------