Download as pdf or txt
Download as pdf or txt
You are on page 1of 26

1.

引言与词向量
1.1. 关于本课程

1.1.1. 课程计划
第 1 讲:引言和单词向量
1. 本课程(10 分钟)
2. 人类语言和单词含义(15 分钟)
3. 介绍(15 分钟)
4. Word2vec 目标函数梯度(25 分钟)
5. 优化基础知识(5 分钟)
6. 看单词向量(10 分钟或更少)
今天的重点学习:单词的意思可以用一个大的实数向量很好地表示出来(这真是令人惊讶) !

1.1.2. 课程后勤简述
• 导师:克里斯托弗·曼宁
• 首席助教:约翰休伊特
• 协调员:Amelie Byun
• 助教:很多很棒的人!查看网站
• 时间:4:30–5:50 太平洋时间。
• 其他信息:见课程网页:
• http://cs224n.stanford.edu/,又名,http://www.stanford.edu/class/cs224n/
• 助教、教学大纲、办公时间(使用 Nooks)、ED(所有课程问题/讨论),办公从明天晚上开始!
• Python/numpy 和 PyTorch 教程:前两个星期五 10:00–11:20 太平洋时间
• 每次讲座前上传幻灯片 PDF

1.1.3. 我们希望教什么?
1. 应用于 NLP 的有效的现代深度学习方法的基础:先是基础,然后是 NLP 中使用的关键方法:循
环网络、注意力、变换器等。
2. 对人类语言的宏观理解,对理解和产生语言的困难的宏观理解。
3. 对 NLP 中的一些主要问题的理解和构建系统(在 PyTorch 中)的能力:单词含义、依存分析、
机器翻译、问题回答。

1.1.4. 课程作业和评分政策
• 5 x 1 周作业:6% + 4 x 12%:54%
• HW1 今日发布!下周二到期!下午 4:30
• 请使用@stanford.edu 电子邮件作为您的 Gradescope 帐户
• 最终默认或自定义课程项目(1-3 人):43%
(其中:提案 5%,里程碑 5%,摘要 3%,报告 30%)
• 参与度:3%(讲座反应、Ed、课程评估、业力)
• 迟到政策:6 天免费迟到,之后每天迟到一次扣除 1%的课程成绩;除非事先获得许可,否则每项作业的
延迟时间不得超过 3 天。
• 合作政策:请阅读网站和荣誉守则!
了解允许的“协作”以及如何记录它:不要从网络上删除代码;承认与其他学生合作;编写自己的作业答案。
2 1 引言与词向量

1.1.5. 高级作业计划
以下内容需单独完成!
• 作业 1 希望工具——Jupyter/IPython Notebook
• 作业 2 是纯 Python (numpy) 但希望你做(多元)微积分,所以你真的需要了解基础知识
• 作业 3 引入了 PyTorch,构建了一个用于依赖解析的前馈网络
• 作业 4 和作业 5 在 GPU 上使用 PyTorch (Microsoft Azure)
• 对于最终项目,您可以二选一:
• 做默认项目,这是一个问答系统
• 开放式但更容易开始;很多人的好选择
• 提出一个我们批准的定制的最终项目
• 您将收到导师的反馈
• 能以 1-3 人的团队工作,可以使用任何语言。
1.2 人类语言和单词含义 3

1.2. 人类语言和单词含义

1.2.1. 人类语言
人类的语言有什么特别之处?人类语言是一个专门用来表达含义的系统,而不是由任何形式的物理表
现产生的。在这方面上,它与视觉或任何其他机器学习任务都有很大的不同。如果真的要讲述关于人类语
言的事情,那将会花很多时间。所以本节只讲两件轶事和两个新进展。
下面先讲两件轶事。

第一件轶事是一幅 XKCD1漫画。这幅漫画确实很有趣。语言是人类创造的一种神奇的系统,它被用于
各种各样的目的,也适用于各种各样的目的。你可以做任何事情,从描述数学和人类语言,到爱抚你最好
的朋友,让他们更好地理解你。所以人类的语言确实是很神奇的。不管怎样,还是先睹为快(见图 1.1)。
1.无论 如 2.我想你的意思是你 3. 我 4.我们是这些难以置信的 5.每一个措辞、拼写、语气和时
何,我可 不能少关心。说你可以 不 知 复杂的大脑,在虚空中漂 机的选择都蕴含着无数的信号、
以少关心 少关心意味着你至少 道。 浮,试图通过盲目地向黑 语境和潜台词等等。每个听众都
一点。 还关心一些。 暗中抛出词语来与彼此联 以自己的方式解读这些信号。语
系,但这是徒劳的。 言不是一个正式的系统,语言是
光荣的混乱。

6.你永远无法确定任何单词对任何 7.我猜你给我解释词语的技巧 8.但如果你只是在用脑子 9. 那 我 就


人都意味着什么。你所能做的就是尽 是因为你想让我感觉不那么孤 检查我的句子,来炫耀你有 不在乎了。
量好好猜测你的话语如何影响人们, 独。如果是,那就谢谢你。这 多了解它,
你有机会找到那些能让他们感受到 对我来说意义重大。
你想要他们感受到的东西的人。
其他一切都毫无意义。 图 1.1:一幅 XKCD 漫画
图注:原图中的英文字母像似手写体,编译者把它改为印刷体并且翻译成中文。
这幅漫画实际上有一些很好的信息,说明语言是如何演变成这种不确定的交流系统。但无论如何不确

1
XKCD 是由兰德尔·门罗(Randall Munroe)所绘制的网络漫画,它是一部“关于浪漫、讽刺、数学和语言的网络漫画”。
被网友誉为深度宅向网络漫画。每周的一、三、五,作者会在其官网上(http://xkcd.com)更新一篇新漫画。
4 1 引言与词向量
定,我们还是有足够的共识,我们终究可以进行基本的交流。但是我们在交流中会做某种概率推理(或者
脑补)来猜测人们的意思,我们不仅将语言用于信息功能,还用于社交功能等。

下面是另一个轶事。
从本质上说,我们想要的是人工智能,我们真正需要的是某种程度上让计算机拥有人类的知识。因为
人类有知识,这给了他们智慧。人类是如何传递知识的?主要是通过人类语言。但人类头脑中的大部分知
识都来自于人类用语言进行交流。
最著名的学者之一,Yann LeCun,他喜欢说这句话:人类的智力和猩猩的智力没有太大的区别。但
是,他在这一点上是错的。就像他所说的,猩猩有非常好的视觉系统。红毛猩猩对自己的手臂有很好的控
制能力,就像人类捡东西一样。红毛猩猩会使用工具,它们会制定计划。所以,从某种意义上说,它们有
一定程度的智慧。但红毛猩猩和人类不一样。为什么他们不像人类?人类所取得的成就的原因是,我们不
只是有一台电脑,我们拥有的是一个人机网络。我们实现人机网络的方式是,我们使用人类语言作为我们
的网络语言。
人类拥有语言多久了?人们也不知道这一点,大多数人估计这种语言的发明时间,是在人类离开非洲
之前。所以很多人认为我们在 10 万年前左右的时间才有语言。正是语言的发展使人类隐形于无敌(invisible
in invincible)。并不是说,人类进化出了毒牙或者进化出了比其他任何生物跑得更快的能力或者在头上长
了一个大角之类的东西。而是说,人类基本上是很弱小的,但是他们有语言,他们可以互相交流,因此在
团队中更有效地工作。这基本上使人类具有不可战胜的优势。
让人类胜出的是,他们发明了书写。所以写作是一种能力,你可以获取知识,不仅仅是与你看到的人
进行口对口的交流。你可以把它写在纸上,然后这些知识就可以传送到各个地方。它可以在世界上不同的
时空范围内发送。那么,写作有多少年的历史了?这种文字大约有五千年的历史。实际上书写的是如此强
大的知识,使人类拥有令人难以置信的复杂设备:从古代的尖锐石器,到现代的智能手机。
所以,语言是非常特别的东西。它比仅仅拥有个体生物(比如猩猩)的智能要强大得多。它允许人类
构建一个联网的计算机。现在我们的网络在有很大网络带宽的基础上运行,我们可以轻松快速地下载数百
兆字节的内容。我们认为这还不够快,所以我们将推出 5G 网络。
但是,人类语言是一个可怜的缓慢网络,人类语言所能传达的信息量非常缓慢。假设你大概一秒钟说
10 个词,这说明实际上你并没有得到太多的带宽。这就引出了,你可以想想,它是怎么运作的?
人类已经想出了一个令人难以置信的令人印象深刻的系统,它本质上是压缩的形式,是一种很有适应
性的压缩形式。当人类之间交谈时,假设他们的
头脑中有大量的知识,虽然他们彼此的知识是不
同的,但大致上是相似的。他们知道大量英语单
词的意思,知道很多世界运行的知识。因此,我
可以发一条短消息,只用相对较短的字符串,你
实际上就可以解读出很多内容。
这就是为什么人类语言是好的。

总之,人类通过语言来传递知识,知识的载
体是书本,书本就是人类知识的宝库(见图 1.2),
也是 NLP 语料库的源泉。 图 1.2:都柏林圣三一学院图书馆2

2
都柏林圣三一学院(Trinity College Dublin,TCD)创办于 1592 年,是爱尔兰首屈一指的大学,也是一所具有世界影响
力的大学,在全世界排名第 101 名(2021 年 QS 世界大学排名)。它的图书馆是世界最著名的 15 大图书馆之首。
1.2 人类语言和单词含义 5
下面再讲两个新进展。
第一个新进展是:
Trained on text data,neural machine translation is quite good!
(在文本数据上训练,神经机器翻译相当不错!)
例如,在肯尼亚的新闻网站(https://kiswahili.tuko.co.ke)上,Google 翻译把 Swahili 语3翻译成英语:
Swahili 语:
M ala w i ya w ap o teza m a w aziri 2 ku to k an a n a m a afa ya C O V ID -1 9
TUKO.co.ke imefahamishwa kuwa waziri wa serikali ya mitaa Lingson Belekanyama
na mwenzake wa uchukuzi Sidik Mia walifariki dunia ndani ya saa mbili tofauti.
英语:
M ala w i lo s e s 2 m in is ters d u e to C O V ID -1 9 d is a ste r
TUKO.co.ke has been informed that local government minister Lingson Belekanyama
and his transport counterpart Sidik Mia died within two separate hours.
(马拉维4由于 C O V ID -19 灾难失去了 2 位部长
TUKO.co.ke 已获悉,当地政府部长 Lingson Belekanyama 和他的交通部长 Sidik Mia
在两个小时内死亡。)

第二个新进展是:
GPT-3: A first step on the path to universal models
(GPT-3:走向通用模型的第一步)
GPT 是英文“Generative Pre-trained Transformer(生成性预训练变换器)”的首字母缩写。GPT-3 是 OpenAI
语言模型的第三代,是有史以来最复杂的语言模型,其网络架构中有 1750 亿个参数。这比 GPT-3 发布前最复杂的模
型(微软的 Turing-NLG)复杂 10 倍,比 GPT-2(OpenAI 语言模型的第二代)复杂 117 倍。其中有三个著名应用,
见图 1.3:

(b)
(b)

(a)
(c)
(c)
(a)
图 1.3:GPT-3 的三个著名应用:(a)生成诗歌、(b)生成疑问句、(c)生成 SQL 语句。

3
斯瓦希里语(kiswahili)属于班图语支,是非洲语言使用人数(5500 万多人)最多的语言之一,是非洲三大语言之一。
4
马拉维:马拉维共和国(齐切瓦语:Dziko la Malaŵi;英语:Republic of Malawi),位于非洲东南部,是个内陆国家。
6 1 引言与词向量
图 1.3(a)生成诗歌
英国《经济学人》杂志 2020 年 8 月 8 日刊文《Artificial Intelligence:Bit-lit》称,由马斯克投资的 OpenAI
公司向艺术家 Sabeti 等人提供 GPT-3 模型以测试其性能。Sabeti 使用这个算法自动生成了一首诗《Elon Musk
by Dr. Seuss》,诗中言辞犀利,GPT-3 以冷嘲热讽的方式怒怼马斯克。诗曰:
美国证券交易委员会说:
“马斯克,你的推文很糟糕。
如果你晚上不停止所有推文,
它们真的会让你失去工作。”
然后马斯克哭道“为什么?
我写的推文并不刻薄,
我没有使用全大写,
我确信我的推文是干净的。”
“但是你的推文可推动市场,
这就是我们感到痛苦的原因。
你可能是一个天才和亿万富翁,
但它不会给你令人讨厌的权利!”
图 1.3(b)生成疑问句
根据一般陈述句,GPT-3 可以自动生成相应的疑问句:
一般陈述句 生成疑问句
我打破了窗户。 我打破了什么?
我优雅地拯救了这一天。 我优雅地拯救了什么?
我给了约翰鲜花。 我送了花给谁?
我给了她玫瑰和吉他。 我把玫瑰和吉他给了谁?

图 1.3(c)生成 SQL 语句
根据一般疑问句,GPT-3 可以自动生成 SQL 语句:
人工输入: How many users have signed up since the start of 2020?
GPT-3 输出:SELECT count(id) FROM users WHERE created_at > ‘2020-01-01’

人工输入: What is the average number of influencers each user is subscribed to?
GPT-3 输出:SELECT avg(count) FROM ( SELECT user_id, count(*) FROM subscribers
GROUP BY user_id ) AS avg_subscriptions_per_user
看来“无所不能”的 GPT-3,可以解放程序员们的双手了。

1.2.2. 单词含义
我们在这堂课上要做的不是解决整个语言,而是要如何表示单词的含义。很多语言都是和文字联系在
一起的,文字可以有很丰富的含义。
首先,我们来区分一下意义(sense)和含义(menaning)。
Daniel 在《语音与语言处理》(2020)第 18 章定义如下:
A sense is a discrete representation of one aspect of the meaning of a word。
意义(sense)是一个单词的含义(menaning)的一个方面的离散表示。
然后,我们来看看什么是含义(menaning)?
含义研究的困难之处是“含义”本身具有不同的含义。
Webster 字典中有三种定义:
(1) 由单词、短语等表示的想法。
(2) 一个人想用文字、符号等表达的想法。
(3) 在写作、艺术等作品中表达的想法。
1.2 人类语言和单词含义 7
语言学家如何看待含义?
Leech 的《语义学》(1974)提出含义类型有七种:
1.概念逻辑的、认知的、外延的内容
2.内涵通过语言所指所传达的内容

3.社会所传达的关于语言运用的社会环境的内容

含 4.情感所传达的关于讲话人/作者感情的内容
义 5.反映通过同一表达式的其它意思所传达的内容
6.搭配通过词语的常用搭配而传达的内容
7.主位通过顺序和重音的组织信息所传达的内容
但是,即使按照上述第 1 种概念来理解“含义”,一个词的含义仍然可以有不同的解释方式。
例如,假设你不知道 desk 这个词的含义,而向他人请教,则他至少有下面四种解释含义的方式:
(1) 他可能会指着它所代表的实物告诉你,“这是 desk";
(2) 他也可能把 desk 描述成“读书写字时用的一种家具,有一个平面和四条腿”;
(3) 他还可以用另一个英语词来解释,说"desk 是一种有抽屉的 table";
(4) 如果他是英语教师,那么他常常会告诉你这个词的汉语翻译是“书桌”。
成年人向儿童用第一种方式解释,因为儿童掌握的词汇量有限,
用词语向他们解释会很困难;单语词典通常采用第二、三两种方式解
释,有时也用第一种方式借助插图解释;双语词典、外语教科书则使
用第四种方式解释。

Ogden 的《含义的含义》(1923)罗列了 22 种“含义”的定义,


并提出“语义三角形”(见图 1.4):词语和所指事物之间没有直接
关系,它们是以概念为中介的。 图 1.4:语义三角形
最常见的语言思维方式,见图 1.5:

图 1.5:最常见的语言思维方式:所指、能指、指称语义
现代语言学之父索绪尔的《普通语言学教程》(1916)提出“意指作用”、“能指(S ig n ifier)”和“所
指(S ig n ifie d )”三个紧密相联的概念(图 1.5 上部)。意指作用表示下述两者的关系:一方面是表示抽象
概念的语言符号;另一方面是表示的具体事物。他把意指作用中用以表示抽象概念的语言符号称为能指,
8 1 引言与词向量
而把具体事物称为所指。能指是单词的词形或词音,所指是单词的具体对象,所指也就是意指作用所要表
达的含义。大多数单词只是一个语言学以外的的符号:单词是一个映射到所指(signified)的能指(signifier)。
例如,作为语言符号的"桌子"这个词是能指,作为具体事物的桌子是"桌子"这个语言符号的所指,同时也
是这个语言符号的含义。
另外,佛学也有两个概念:能指:形而下;所指:形而上。例如:《金刚经》有云:“所言一切法者(所
指),即非一切法,是名一切法(能指)”。
语言学家思考含义的最常见方式是一种称为指称语义(d en o ta tio n a l se m a n tic s )的想法(图 1.5 下
部),它也用于编程语言。在编程语言里只有两个核心问题:语法,语义。语法定义一门语言,语义定义
语言是什么含义。一门语言只有一种语法,但是可以有不同的语义。所有的语义都是程序语义,程序语义
就是数学方法(函数)。
Joseph 的《指称语义》(1978)定义了三种编程语言的语义风格:
公理语义:通过程序属性的某些逻辑的公理和规则来间接地定义的程序短语的含义。
操作语义:根据它们在程序执行期间可以采取的计算步骤定义的程序短语(程序的一部分)的含义。
指称语义:关注给出编程语言的数学模型。抽象定义为某些合适数学结构元素的程序短语的含义。
其中,指称语义包含三部分内容:一组句法域(抽象句法树)、一组语义域(对象的状态)、一组语义函
数(操作或指令)。

那么,我们如何在计算机中表示含义呢?
通用 NLP 解决方案:使用例如 W o rd N et,一个包含同义词(syn o n ym )集和上位词(h yp ern ym )(“是
一个”关系)列表的同义词库(th e s au ru s )。
最常用的语义关系资源是 W o rd N et 词汇数据库。英语 W o rd N et 由三个独立的数据库组成:第一个是
名词;第二个是动词;第三个是形容词和副词。每个数据库都包含一组词元,每个词元都有一组语义注释。
WordNet 3.0 版本有 117,798 个名词,11529 个动词,22,479 个形容词和 4,481 个副词。平均每个名词有
1.23 个意义(sense),平均每个动词有 2.16 个意义。
具体例子见图 1.6。图 1.6(a)列出了“good”的同义词集:4 个名词、7 个形容词、2 个副词。图 1.6(b)
列出了“padan”的上位词(父类):13 个。

from nltk.corpus import wordnet as wn from nltk.corpus import wordnet as wn


poses = { 'n':'noun', 'v':'verb', 's':'adj (s)', 'a':'adj', 'r':'adv'} panda = wn.synset("panda.n.01")
for synset in wn.synsets("good"): hyper = lambda s: s.hypernyms()
print("{ }: { }".format(poses[synset.pos()], list(panda.closure(hyper))
", ".join([l.name() for l in synset.lemmas()])))

noun: good [Synset('procyonid.n.01'),


noun: good, goodness Synset('carnivore.n.01'),
noun: good, goodness Synset('placental.n.01'),
noun: commodity, trade_good, good Synset('mammal.n.01'),
adj: good Synset('vertebrate.n.01'),
adj (sat): full, good Synset('chordate.n.01'),
adj: good Synset('animal.n.01'),
adj (sat): estimable, good, honorable, respectable Synset('organism.n.01'),
adj (sat): beneficial, good Synset('living_thing.n.01'),
adj (sat): good Synset('whole.n.02'),
adj (sat): good, just, upright Synset('object.n.01'),
… Synset('physical_entity.n.01'),
adverb: well, good Synset('entity.n.01')]
adverb: thoroughly, soundly, good
(a)“good”的同义词集 (b)“panda”的上位词
图 1.6:Pytorch 代码(上)及其结果(下):(a)“good”的同义词集;(b)“panda”的上位词
1.2 人类语言和单词含义 9
但是,WordNet 等资源的存在如下问题:
(1) 作为一种很好的资源,但缺少细微差别。例如:“proficient”被列为“good”的同义词,这仅在某些
情况下是正确的。
(2) 缺少单词的新含义。例如:wicked(邪恶的)、(坏蛋)badass、nifty(漂亮的)、wizard(巫师)、genius(天
才)、ninja(忍者)、bombest(浮夸的),不可能保持最新含义!
(3) 主观。
(4) 需要人工来创造和适应。
(5) 无法计算准确的单词相似度。

针对以上问题,解决方案是:将单词表示为离散符号。
在传统的 NLP 中,我们将单词视为离散的符号,这样的单词符号可用独热(one-hot)向量表示。独热
向量中只有一个元素的值位 1,其余元素的值均为 0。例如:hotel(酒店)、motel(汽车旅馆)单词的独热向
量表示如图 1.7 所示:
motel = [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
hotel = [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
图 1.7:单词的独热向量示意图
图 1.7 中的向量维度=15,是极短的稀疏向量。一般地,向量维度=词汇表中的单词数(例如,500,000),
是一个极长的稀疏向量。
然而,单词用离散符号也存在问题:
例如:在网络搜索中,如果用户搜索“西雅图汽车旅馆”,我们希望匹配包含“西雅图酒店”的文档,
但是,图 1.7 中的两个单词的独热向量是正交的(o rth o g o n a l),即它们的内积等于零,并且相互垂直。因
此,独热向量没有自然的相似性(sim ila rity)概念!
针对上述问题,人们从以下两个方面来寻找解决方案:
(1) 可以尝试依靠 WordNet 的同义词列表来获得相似性吗?但众所周知,因为不完整性等原因,导致这
个方案严重的失败。
(2) 相反,替代方案:学习编码向量本身的相似性。实践证明这个方案是可行的。
这个方案提出,我们可以通过上下文(co n te x t )来表示一个单词含义。这种方法叫做分布语义
(D is trib u tio n a l sem a n tics ),其核心思想是:一个词的含义是由经常出现在它附近的单词给出的。
这一思想的来源:英语中有一句俗语 You shall know a person by the company it keeps,而英国语言
学家 J. R. Firth 于 1957 年在此基础上造出 You shall know a word by the company it keeps.的语料库语言
学名句。其实,在中国也有类似的名句:“不知其人视其友”(《孔子家语》,中华书局,2009:136 页)。
其实,这一想法是现代统计 NLP 最成功的想法之一!
这一想法的具体的构建方法是:
• 当单词 w 出现在文本中时,其上下文是出现在附近(在固定大小的窗口内)的一组单词;
• 使用 w 的多个上下文来构建 w 的表示。
例如,在图 1.7 中,中心单词 w 是 banking,它左右两边的单词就是上下文词(窗口大小为 5),单
词 banking 的含义将由这些相应的上下文词来决定。

…government debt problems turning into banking crises as happened in 2009…


…saying that Europe needs unified banking regulation to replace the hodgepodge…
…India has just given its banking system a shot in the arm…
上下文词 上下文词
这些上下文词将代表 banking 的含义

图 1.8:单词 banking 的三种含义将由上下文词来决定


10 1 引言与词向量
下面,我们介绍一个更强大的单词表示形式:密集向量(d en se ve cto r),其维数 d 的范围较短,大约
为 50-1000,而不是很大的词汇量|V|(例如,500,000)。维度 d 没有一
个清晰的解释。向量是密集的:向量不是稀疏的实体、大部分为零的计
数或计数的函数,而是实数值(可以为负)。

我们将为每个词建立一个密集的向量,使它与单词的向量相似,出
现在类似的上下文中,如左图所示(其中数值是假设的)。
注意:词向量也称为词嵌入或(神经)词表示,是一种分布式表示。

例如,单词含义作为神经词向量的可视化,见图 1.9:

expect =

图 1.9:神经词向量的可视化
图注:上图左边是一个简化的词向量,右边是词义相近的部分单词在二维平面的投影。

1.3. Word2vec:概览
Word2vec (Mikolov et al. 2013) 是一个学习词向量的框架。word2vec 方法可以快速、有效地进行训
练,并且可以通过代码和预训练的嵌入轻松在线获得。Word2vec 嵌入是静态嵌入( static em b ed d in g s ),这
意味着该方法为词汇表中的每个单词学习一个固定的嵌入。
Word2vec 主要思想是:
• 我们有大量的文本语料库(在拉丁文中,语料库就是“body”的意思)
• 固定词汇表中的每个词都由一个向量表示
• 遍历文本中的每个位置 t,其中有一个中心词 c 和上下文(“外部”)词 o
• 使用 c 和 o 的词向量的相似度来计算 o 给定 c 的概率(反之亦然)
• 不断调整词向量以最大化此概率
下面是计算概率 P(wt+j|wt)的示例窗口和计算过程,见图 1.10。
1.3 Word2vec:概览 11

(a)中心词是 into:

(b)中心词是 banking:

图 1.10:计算概率 P(wt+j|wt)的示例窗口和计算过程

1.3.1. Word2vec:目标函数
对每个位置 t = 1,…,T,给定中心词 wj,在一个固定大小为 m 的窗口内 j,预测上下文词的似然度:

L(θ)=

其中,θ为所有待优化的变量。
目标函数 J(θ)为(平均)负对数的似然度:

其中:log 形式是方便将连乘转化为求和;负号是希望将极大化似然率转化为极小化损失函数的等价
问题;目标函数有时也称为成本或者损失函数。
因为,最大化预测精度⟺ 最小化目标函数,所以,J(θ)就是最小化的目标函数。
那么,问题来了:如何计算 P(wt+j|wt;θ)?
答案是:对每个单词 w,我们使用两个向量:
(1) 当 w 是中心词时,使用 vw 向量;
(2) 当 w 是上下文词时,使用 uw 向量。
然后,对中心词 c 和上下文词 o,计算:

例如,P(wt+j|wt)的计算过程见图 1.11,其中 P(uproblems|vinto)是 P(problems|into;uproblems,vinto,θ)的简写。

图 1.11:中心词为 into 时的计算过程


12 1 引言与词向量
下面我们来计算 Word2vec 的预测函数:
n
①作点积计算来比较 o 和 c 的相似性,即计算uTo vc =uT v=u. v = uv;
i=1 i i
②对uTo vc 求幂,即计算 exp(uTo vc ),使任何数值为正,得出分子的值);
③对整个词汇表进行归一化,即计算 ∈ (uTw vc ),得出分母的值;最后得出概率分布 P(o|c)。
由上可知,向量 uo 和向量 vc 进行点乘。点积越大意味着概率越大。向量之间越相似,点乘结果越大,
从而归一化后得到的概率值也越大。模型的训练正是为了使得具有相似上下文的单词,具有相似的向量。
其实,上面就是一个 softmax 函数的例子 Rn → (0,1)n。softmax 函数是一个广义的 Sigmoid 函数,它
是一个具有 S 形的指数函数。softmax 函数采用 n 个任意实数值的向量 x = [x1,x2,...,xn],并将其映射
到概率分布,每个值的范围为(0,1),所有值的总和为 1。对于 n 维向量 x,softmax 定义为:
( )
( )= =
=1
( )
因此,例如给定一个向量:x = [0.6,1.1,−1.5,1.2,3.2,−1.1]
结果(四舍五入)softmax(x)为:[0.055,0.090,0.006,0.099,0.740,0.010]
总之,softmax 函数的特性是:
• 将任意值 xi 映射到概率分布 pi;
• “max”,因为放大了最大 xi 的概率(但这个名字有点奇怪,因为它返回一个分布!);
• “soft”,因为仍然为较小的 xi 分配一些概率;
• 常用于深度学习

1.3.2. Word2vec:训模调参
为了训练模型,我们需要逐渐调整参数以最小化损失。
前面提到,θ代表所有模型参数,是一个很长的向量。

图 1.12:模型参数θ和梯度下降示意图
例如,使用 V(例如 50000,即词汇库的单词量的大小)个单词和 d(例如 100)维向量,即每个单
词都有 d 维的 v 和 u 两个向量。最终,θ参数就是 v、u 两个矩阵(都是 V 行 d 列),总共包含 2dV 个实
数值,即θ ∈R2dV,见图 1.12 左侧。
例如,对于简单凸函数 z=x2+2y2,等高线显示目标函数的层次级别,我们通过沿着梯度下降的方向,
来优化这些参数,见图 1.12 右侧。
1.4 Word2vec:梯度的导数 13

1.4. Word2vec:梯度的导数

1.4.1. 梯度导数的求解推导
下面是在白板上对梯度的导数求解进行手工推导,推导中要用到下列知识:
• 基本法则:链式法则(就像乐高积木);

• 基本事实: = = a;

图 1.13:Word2vec 梯度的导数求解的推导过程
具体推导过程见图 1.13。对 vc 求导的结果如下:第一项是真正的上下文单词,第二项是预测的上下文
单词。使用梯度下降法,模型的预测上下文将逐步接近真正的上下文。对 uo 进行求导计算时,注意这里的
uo 是 uw=o 的简写,故可知:

  T u v
uo
u
wV
T
v 
w c
uo
uo vc  o vc  c uo  vc
uo uo
14 1 引言与词向量
由此可知,当 P(o|c)→1 时,即通过中心词 c 我们可以正确预测上下文词 o,此时我们不需要调整 uo;
反之,则相应调整 uo。

1.4.2. 链式法则
链式法则:若 y = f(u)和 u = g(x),即,y = f(g(x)),则:

简单例子:对函数 y = 5(x3+7)4 求导。

1.4.3. 计算所有梯度
我们遍历了窗口中每个中心向量 v 的梯度。
我们还需要外部向量 u 的梯度(自行推导)。
通常在每个窗口中,我们将对该窗口中使用的所有参数进行更新计算,见图 1.14:

图 1.14:对窗口中使用的所有参数进行更新计算

1.5. Word2vec:优化
如果我们有一个我们想要最小化的成本函数 J(θ),那么梯度下降就是一种最小化 J(θ)的算法。
基本思路:对于当前θ值,计算 J(θ)的梯度,然后向负梯度方向(梯度下降)小步走;重复上述步骤,
直到得到最小值为止。
梯度下降算法的可视化,见图 1.15:

图 1.15:梯度下降算法的可视化
1.6 Word2vec:更多细节 15

1.5.1. 梯度下降
上述重复过程就是对方程不断地更新,更新有两种表示法(其中:α表示学习步长):
(1) 矩阵表示法: = − ( )

(2) 单参表示法: = − ( )

具体算法(Pytorch 代码):

1.5.2. 随机梯度下降(SGD)
问题:因为上述 J(θ)是语料库(可能是数十亿!)中所有窗口的函数,其梯度的计算成本非常高,需
要等待很长时间才能进行一次更新,所以,对于几乎所有的神经网络来说,它都是一个非常糟糕的想法!
方案:上述问题的解决方案,是采用随机梯度下降(SGD)法:重复采样窗口,并在每个窗口之后更新。

具体算法(Pytorch 代码):

1.6. Word2vec:更多细节
为什么是两个向量?因为更容易优化。最后平均两者即的最终词向量。
Word2vec 是一个软件,包实际上包含两种模型和两种算法(训练方法):
两种算法:Continuous Bag-of-Words(CBOW)和 Skip-Gram。CBOW 是根据中心词周围的上下文
单词来预测该词的词向量;Skip-Gram 则相反,是根据中心词预测周围上下文的词的概率分布。
两种算法:Negative Sampling 和 Hierarchical Softmax。Negative Sampling 通过抽取负样本来定
义目标;Hierarchical Softmax 通过使用一个有效的树结构来计算所有词的概率来定义目标。
下面讲述更多的细节。

1.6.1. 背景知识
本节介绍 word2vec 中将用到的一些重要知识点。

1.6.1.1. sigmoid 函数
sigmoid 函数是神经网络常用激活函数之一,其定义为:
1
 ( x) 
1  e x
该函数的定义域为(-∞,+∞),值域为(0,1),其形状见图 1.16。 图 1.16:sigmoid 函数的形状

sigmoid 函数的导函数具有以下形式:
σ’(x) = σ(x)[1- σ(x)], [logσ(x)]’= 1- σ(x),[log(1 - σ(x))]’= σ(x) (1.1)
16 1 引言与词向量

1.6.1.2. 逻辑回归
实际应用中经常会碰到二分类问题。例如,某电子邮件是否为垃圾邮件,某客户是否为潜在客户,某
次在线交易否存在欺诈行为,等等。设{(xi,yi)}1m 为一个二分类问题的样本数据,其中 xi∈Rn,yi∈{0,1},
当 yi=1 时称相应的样本为正例,当 yi=0 时称相应的样本为负例。
利用 sigmoid 函数,对于任意样本 X = (x1 ,X2 ,⋯ ,Xn )T,可将二分类问题的 hypothesis 函数写成
hθ(X) = σ(θ0+θ1x1+θ2x2+⋯ +θnxn)
其中θ=(θ0+θ1+θ2+ ⋯ +θn) 为待定参数。若引入 x0 = 1 将 X 扩展为(x0,x1,x2,⋯ ,xn)T,则 hθ简写为:
T

1
h (x)    T x   T
1  e  x

那参数θ如何求呢?通常的做法是,首先确定一个形如下式的整体损失函数
1 m
J(θ) = i=1 cost xi ,yi (1.2)
m

其中:cost xi ,yi =− yi ⋅ log ℎθ xi − 1 − yi ⋅ log 1 − ℎθ xi .


然后对其进行优化,从而得到最优的参数θ*。

1.6.1.3. Bayes 公式
贝叶斯公式描述两个条件概率之间的关系。若记 P(A),P(B)分别表示事件 A 和事件 B 发生的概卒,P(A|B)
表示事件 B 发生的情况下事件 A 发生的概率,P(A,B)表示事件 A,B 同时发生的概卒,则 Bayes 公式为:
P(A,B) P(A,B) P(B∣A)
P(B∣A) = ; P(A∣B) = = P(A) (1.3)
P(A) P(B) P(B)

1.6.1.4. Huffman 编码
树是一种重耍的非线性数据结构。若干棵互不相交的树所构成的集合称为森林。下面是常用概念。
 路径和路径长度:在一棵树中,从一个结点往下可达到的孩子或孙子结点之间的通路,称为路径。通
路中分支的数目称为路径长度。若规定根结点的层号为 1,则从根结点到第 L 层结点的路径长度为 L-1。
 结点的权和带权路径长度:若为树中结点赋予一个具有某种含义的(非负)数值,则这个数值称为该结
点的权。结点的带权路径长度是指,从根结点到该结点之间的路径长度与该结点的权的乘积。
 树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和。
二叉树是每个结点最多有两个子树的有序树,它们通常被称为“左子树”或“右子树"。“有序”是
指两个子树有左右之分,顺序不能颠倒。
假设给定 n 个权值{w1,w2,...,wn}作为二叉树的 n 个叶子结点,若二叉树的带权路径长度达到最小,
则称这样的二叉树为最优二叉树,也称为 Huffinan 树。构造一棵 Huffman 树算法如下:
算法 1.1:构造一棵 Huffman 树
(1) 将{ w1,w2,...,wn}看成是有 n 棵树的森林(每棵树仅有一个结点)。
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权
值为其左、右子树根结点权值之和。
(3) 从森林中删除选取的两棵树,并将新树加入森林。
(4) 重复(2.9)、(2.10)步,直到森林中只利一棵树为止,该树即为所求的 Huffman 树。
例 1.1:假设在 2022 年北京冬奥会前夕,从新华社抓取了若干条与冬奥会相关的文章,经统计,“我”、
“期待”、“观看”、“北京”、“冬奥”、“运动会”这六个词出现的次数分别为 15,8,6,5,3,1,请以这 6 个
词为叶子结点,以相应词频当权值,构造一棵 Huffman 树。
利用算法 1.1,其构造过程见图 1.17,图中第 6 步得出最终的 Huffman 树,由图可见词频越大的词离根结点
越近。在实际应用中,各个字符的出现频度或使用次数是不相同的,让使用频率高的用短码,使用频率低的用长码,
以优化整个报文编码。利用 Huffman 树设计的二进制前缀编码,称为 Huffman 编码。图 1.17 第 6 步给出了例 1.1
1.6 Word2vec:更多细节 17
中六个词的 Huffman 编码,其中约定(词频较大的)左孩子结点编码为 1, (词频较小的)右孩子编码为 0。因此,“我”、
“期待”、“观看”、“北京”、“冬奥”、“运动会”这六个词的 Huffman 编码分别为 0, 111, 110, 101, 1001 和 1000。

图 1.17:Huffman 树的构造过程

1.6.1.5. 统计语言模型
统计语言模型(Statistical Language Model)是所有 NLP 的基础。在语音识别系统中,对于给定的语音段
Voice,需要找到一个使概率 p(Text|Voice)最大的文本段 Text,利用 Bayes 公式,有:
p(Voice|Text)⋅p(Text)
p(Text|Voice) =
p(Voice)

其中 p(Voice|Text)为声学模型,而 p(Text)为语言模型。
统计语言模型是用来计算一个句子的概率的概率模型。假设 W=wT1 = w1 ,w2 ,⋯,wT 表示由 T 个词
w1 ,w2 ,⋯,wT 按顺序构成的一个句子,则w1 ,w2 ,⋯,wT 的联合概率:
p(W) = p wT1 = p w1 ,w2 ,⋯,wT
就是这个句子的概率。利用 Bayes 公式,上式可以被链式地分解为:
p wT1 = p w1 ⋅ p w2 ∣w1 ⋅ p w3 ∣w21 ⋯p wT ∣wT−1
1 (1.4)
其中的(条件)概率 p w1 ,p w2 ∣w1 ,p w3 ∣w21
,⋯,p wT ∣wT−1
1 就是语言模型的参数。
k−1
参数 p wk ∣w1 (k > 1) 的近似计算,利用 Bayes 公式,有:
p wk1 count wk1
p wk ∣wk−1
1 = ≈ (1.5)
p wk−1
1 count wk−1
1

其中 count wk1 和 count wk−1


1 分别为单词wk1 和wk−1
1 在语料中出现的次数。当 k 很大时,统计极其耗时。
于是,为了减少计算量,出现了 n-gram 模型和神经概率语言模型。

1.6.1.6. n-gram 模型
n-gram 模型的基本思想:基于 Markov 假设,一个词出现的概率只与它前面的 n-1 个词相关,即:
p wk |wk−1
1 ≈ p wk |wk−1
k−n+1
于是,公式(1.5)就变成了:
18 1 引言与词向量
count wkk−n+1
p wk ∣wk−1
1 ≈ (1.6)
count wk−1
k−n+1

这一简化不仅使单个参数的统计变得更容易(统计时需要匹配的词串更短),也使参数的总数变少了。
模型参数的量级是 N 的指数函数(O(N n)),显然 n 不能取得太大,实用中最多的是采用 n=3 的三元模型。
从理论上看,n 越大效果越好。但是,当 n 大到一定程度时,模型效果的提升幅度会变小。例如,当 n 从
1 到 2,再从 2 到 3 时,模型的效果上升显著,而从 3 到 4 时,效果的提升就不显著了。参数越多,可区
别性越好,但同时单个参数的实例变少从而降低了可靠性,因此需要在可靠性和可区别性之间进行折中。
另外,回到公式(1.6),考虑两个问题:
(1) 若 count wkk−n+1 = 0,能否认为 p wk |wk−1
1 就等于 0 呢?
(2) 若 count wkk−n+1 = count wk−1 k−1
k−n+1 ,能否认为 p wk |w1 就等于 1 呢?
显然不能! 因此,不管语料库有多么大,都无法回避的此两问题。解决之道就是用平滑技术。
总之,n-gram 模型是在语料中统计各种词串出现的次数以及进行平滑化处理。概率值计算好之后就存
储起来。计算一个句子的概率,就等于相关的概率值连乘之积:
p(w|Context (w))
w∈
其中:C 表示语料 (Corpus),Context(w)表示词 w 的上下文(Context),即 w 周边的词的集合。当 Context(w)
为空时,就取 p(w|Context (w)) = p(w)。特别地,对于 n-gram 模型,就有 Context wi = wi−1
i−n+1 。

1.6.1.7. 神经概率语言模型
在机器学习中有一种通用模型:对所考虑的问题建模后,首先为其构造一个目标函数,其次对这个目
标函数进行优化,然后求得一组最优的参数,最后利用这组最优参数对应的模型来进行预测。
实际应用中常采用最大对数似然,即把目标函数设为:

ℒ= log p(w|Context (w)) (1.7)


w∈C

由此可见,概率 p(w|Contex(w))已被视为关于 w 和 Contex(w)的函数:


p(w∣Context (w)) = F(w,Context (w),θ)
其中:θ为待定参数集。因此,一旦对公式(1.7)进行优化得到最优参数集θ*后,F 也就唯一被确定了,
以后任何概率 p(w|Context(w))就可以通过函数 F(w,Context(w),θ)来计算了。
下面介绍一种通过神经网络来构造 F 的方法,即 Bengio《A neural probabilistic language model. Journal
of Machine Learning Research》(2003)的神经概率语言模型。图 1.18 给出了该模型的示意图,它包括四个层:
输入(Input)层、投影(Projection)层、隐藏(Hidden)层和输出(Output)层。其中 , 分别为投影层与隐藏层、
隐藏层和输出层之间的权值矩阵,p,q 分别为隐藏层和输出层上的偏置向量。

图 1.18:神经网络结构示意图
对于语料 C 中的任意一个词 w,将 Contex t(w)取为其前面的 n-1 个词(类似于 n-gram),这样二元对
(Context (w),w)就是一个训练样本了。注意,一旦语料 C 和词向量长度 m 给定后,投影层和输出层的规
模就确定了,前者为(n − 1)m,后者为 N = | |即语料 C 的词汇量大小。而隐藏层的规模nℎ 是可调参数,
由用户指定。为什么投影层的规模是(n − 1)m 呢?因为输入层包含 Context (w)中 n − 1 个词的词向量,而
投影层的向量Xw 是这样构造的:将输入层的 n − 1 个词向量按顺序首尾相接地拼起来形成一个长向量,其
1.6 Word2vec:更多细节 19
长度当然就是(n − 1)m 了。
有了向量X ,样本(Context (w),w)经过如图 1.18 的神经网络时参与运算,具体计算过程为:
Zw = tanh WXw + p
(1.8)
Yw = Uzw + q
其中:tanh 为双曲正切函数,用来做隐藏层的激活函数,表示它作用在向量的每一个分量上。
最后做 softmax 归一化,p(w|Context (w))就可以表示为:
eyw,iw
p(w∣Context (w)) = N yw,iw (1.9)
i=1 e

其中 iw 表示词 w 在词典 D 中的索引。


上式给出了概率 p(w|Context(w))的函数表示,即找到了上面提到的函数 F(w,Context(w), θ),那么其中待
确定的参数θ有哪些呢?总结起来,包括两部分词向量:
(1) v(w) ∈ Rn,w ∈ D 以及填充向量
(2) 神经网络参数: W  R nh ( n 1) m,p  R nh ; U  R N nh , q  R N
这些参数均通过训练算法得到,值得一提的是,通常的机器学习算法中,输入都是已知的。而在上述神经
概率语言模型中,输入 v(w)也需要通过训练才能得到。
接下来,简要地分析一下上述模型的运算量,在如图 1.18 所示的神经网络中,投影层、隐藏层和输出层的
规模分别为(n-1)m, nℎ , N,依次看看其中涉及的参数:
(1) n 是一个词的上下文中包含的词数,通常不超过 5 ;
(2) (2.9) m 是词向量长度,通常是101 ∼ 102 量级;
(3) (2.10) nℎ 由用户指定,通常不需取得太大,如102 量级;
(4) (2.11) N 是语料词汇量的大小,与语料相关,但通常是104 ∼ 105 量级。
再结合公式(1.8)和公式(1.9),不难发现,整个模型的大部分计算集中在隐藏层和输出层之间的矩阵向
量运算,以及输出层上的 softmax 归一化运算。因此后续的相关研究工作中,有很多是针对这一部分进行
优化的,其中就包括了 word2vec 的工作。
与 n-gram 模型相比,神经概率语言模型有什么优势呢?主要有以下两点:
(2.8)词语之间的相似性可以通过词向量来体现。
(2.9)基于词向量的模型自带平滑化功能。由公式(1.23)可知,p(w|Context(w))∈(0,1),不会为零,不需平
滑。
最后,回顾一下,词向量在整个神经概率语言模型中扮演的角色:训练时,它是用来帮助构造目标函
数的辅参;训练后,它也好像只是语言模型的一个副产品,但这个副产品却大有文章,后将阐述。

1.6.2. 两个向量:中心词向量、上下文向量
word2vec 的思路与自编码器(auto-encoder)的思路比较相似,都是先基于训练数据构建一个神经网
络。当这个网络训练好以后,我们并不会利用这个训练好的网络处理新任务,我们真正需要的是这个模型
通过训练数据所学得的参数。基于训练数据建模的过程,名曰“假任务”,意味着建模并不是我们最终的目
的。Word2vec 的最终目的,是只关心模型训练完后的副产物——模型参数(这里特指神经网络的权重)。
这些权重在 Word2Vec 中实际上就是我们试图去学习的“词向量”。这里的词向量实际上是两个词向量:
中心词向量、上下文向量,见图 1.12。
在 NLP 任务中,我们将自然语言交给机器学习算法来处理,但机器无法直接理解人类的语言,因此首
先要做的事情就是将语言数学化。如何对自然语言进行数学化呢?词向量提供了一种很好的方式。
一种最简单的词向量是 one-hot 表示法,就是用一个很长的向量来表示一个词,向量的长度为词典 D
的大小 N,向量的分量只有一个 1(其位置对应该词在词典中的索引),其它全为 0。但这种词向量表示
有一些缺点,如容易受维数灾难的困扰,尤其是将其用于 Deep Learning 场景时。又如,它不能很好地刻画
词与词之间的相似性。
为克服 onc-hot 表示法的上述缺点,Hinton 于 1986 年提出另一种词向量:分布式表示法(Distributed
Representation),它属于指称语义范畴。它的基本思想是:通过训练将某种语言中的每一个词映射成一个
20 1 引言与词向量
固定长度的短向量(当然这里的“短”是相对于 one-hot 的“长”而言的),所有这些向量构成一个词向量空
间,而每一向量则可视为该空间中的一个点,在这个空间上引入“距离”,就可以根据词之间的距离来判
断它们之间的(词法、语义上的)相似性了。word2vec 中采用的就是这种分布式表示法。
如何获取词向量呢?有很多不同模型可用来估计词向量,包括有名的 LSA (Latent Semantic Analysis)和
LDA (Latent Dirichlet Allocation)。此外,利用神经网络算法也是一种常用的方法,上面介绍的神经概率语言
模型就是一个很好的实例。当然,在那个模型中,目标是生成语言模型,词向量只是一个副产品。事实上,
大部分情况下,词向量和语言模型都是捆绑在一起的,训练完成后两者同时得到。

1.6.3. 两种模型:Skip-Grams 和 CBOW


传统语言模型的基本思想:句子中的下一个词的出现和前面的词有关系。
word2vec 的基本思想:句子中相近的词之间是有联系的,所以用词来预测词。
word2vec 中用到两种模型:CBOW(Continuous Bag-of-Words)模型和 Skip-gram 模型:
CBOW 模型功能:已知当前词 的上下文 −2 , −1 , +1 , +2 ,预测当前词 ,见图 1.19(a);
Skip-gram 模型功能:已知当前词 ,预测其上下文 −2 , −1 , +1 , +2 ,见图 1.19(b)。

图 1.19:Word2vec 的两个模型
两种模型都需要设置窗口,用窗口内的词进行训练。下面以样本(Context(w),w)为例(这里假设
Context(w)由 w 前后各 c 个词构成),对两种模型做简要说明。

1.6.3.1. CBOW 模型
CBOW 模型的网络结构见图 1.20,它包括三层:
1.输入层: 包含 Context(w)中 2c 个词的词向量 v(Context(w)1),v(Context(w)2),⋯ ,v(Context(w)2c)∈ℝm 。
这里,m 的含义同上,表示词向量的长度。
2c
2.投影层: 将输入层的 2c 个向量做求和累加,即xw = i=1
v(Context(w)i )∈ℝm
3.输出层: 是一棵二叉树,叶子结点共 N(=|D|)个,非叶子结点 N-1 个。
对比神经概率语言模型(图 1.18)和 CBOW 模型(图 1.20),有三处不同:
1. (从输入层到投影层的操作)前者是通过拼接,后者通过累加求和。
2. (隐藏层)前者有隐藏层,后者无隐藏层。
3. (输出层)前者是线性结构,后者是树形结构。
在神经概率语言模型中,运算量集中在:隐藏层和输出层之间的矩阵向量运算、输出层的 softmax 运算。
CBOW 模型提出改进:去掉了隐藏层;输出层用 Huffman 树,即利用 Hierarchical softmax 算法。
为便于理解,假设 Huffman 树中的某个叶子结点对应词典 中的词 w,引入如下记号:
pw : 从根结点出发到达 w 对应叶子结点的路径。
: 路径pw 中包含结点的个数。
w
pw w
1 , p2 , ⋯, p : 路径pw 中的 个结点,其中pw
1 表示根结点, 表示词 w 对应的结点。
w w
θ1 , θ2 , ⋯, −1 ∈ ℝm : 路径pw 中非叶子结点对应的向量,θw
j 为路径pw
中第 j 个非叶子结点对应的向量。
dw w
2 , d3 , ⋯, ∈ {0,1}: 词 w 的 Huffman 编码,有 − 1 位,dw w
j 为路径p 中第 j 个结点对应的编码(根
1.6 Word2vec:更多细节 21
结点不参与对应的编码,即没有dw 1 )。
m
那么,如何利用向量xw ∈ ℝ 以及 Huffman 树来定义条件概率函数 p(w∣ Contex(w))呢?
下面以图 1.20 的输出层 Huffman 树中单词 w ="冬奥”为例来说明。
图 1.20 中由 4 条红色边串起来的 5 个结点就构成路径 ,其长度 = 5。 1 , 2 , 3 , 4 , 5 为路
径 上的 5 个结点,其中 1 对应根结点。 1 , 2 , 3 , 4 分别表示路径 上 4 个非叶子结点对应的向量。
1,0,0,1,即“冬奥”的 Huffman 编码为 1001。
2 , 3 , 4 , 5 分别为
从根结点出发到达“冬奥”这个叶子节点,中间共经历了 4 次分支(每条红色的边对应一次分支),而每
一次分支都可视为进行了一次二分类,即对于每一个非叶子结点,要为其左右孩子结点指定一个类別。
word2vec 约定:编码为 1 的左结点定义为负类,编码为 0 的右结点定义为正类。根据逻辑回归可知:
1
一个结点被分为正类的概率是:σ x⊤w θ = ⊤ ;一个结点被分为负类的概率是:1 − σ x⊤w θ 。
1+e−xwθ

注意,上式中有个叫θ的向量,它是待定参数,显然,在这里非叶子结点对应的那些向量θw
i 就可以扮
演参数θ的角色(这也是为什么将它们取名为θw
i 的原因)。

图 1.20:CBOW 模型的网络结构
图注:其中输出层以实例 1.1 的 Huffman 树作为示意图。

对于从根结点出发到达“冬奥”这个叶子节点所经历的 4 次二分类,将每次分类狜果的概率写出来
就是:
⊤ w
第 1 次: p dw w
2 ∣xw ,θ1 = 1 − σ xw θ1 ;
⊤ w
第 2 次: p dw w
3 ∣xw ,θ2 = σ xw θ2 ;
⊤ w
第 3 次: dw w
4 ∣xw ,θ3 = σ xw θ3 ;
第 4 次: p dw w ⊤ w
5 ∣xw ,θ4 = 1 − σ xw θ4 .
5
p(冬奥|Context(冬奥))的概率就等于这 4 个概率相乘:(冬奥|Context(冬奥))= p dw w
j ∣xw ,θj−1
j=2

1.6.3.2. Skip-gram 模型
Skip-gram 模型的网络结构见图 1.21,它也包括三层:
1.输人层: 只含当前样本的中心词 w 的词向量 v(w)∈ℝm 。
2.投影层: 此为恒等投影,即把 v(w)投影到 v(w),实则多余,将其保留的原因是方便和 CBOW 对比。
3.输出层: 是一棵 Huffman 树。
无论是 CBOW 还是 Skip-gram,完成训练所需运算量都很大。为减少运算量,依次提出两种算法:
Hierarchical Softmax 和 Negative Sampling。
22 1 引言与词向量

图 1.21:Skip-gram 模型的网络结构

1.6.4. 两种方法:Hierarchical Softmax 和 Negative Sampling


相比普通的 softmax,Hierarchical Softmax 是一种更有效的替代方法。Hierarchical Softmax 对低频
词表现得更好,Negative Sampling 通过负采样避免更新全部参数,对高频词和较低维度向量表现得更好。

1.6.4.1. Hierarchical Softmax 算法


上述两种模型分别有 Hierarchical Softmax 和 Negative Sampling 两种算法。
对于 Hierarchical Softmax 算法的 CBOW 模型,优化的目标函数形如:
L   lo g p ( w | C o n tex t( w )) (1.10)
w C

对于 Hierarchical Softmax 算法的 Skip-gram 模型,优化的目标函数形如:


L   log p(Context( w) | w) (1.11)
wC

因此,下面讨论过程中我们应将重点放 p(w∣Context (w)) 和 p(Context (w)∣w)的构造上。


一、CBOW 模型的双向传播
1.目标函数(正向传播)
由上可知: 对于词典 中的任意词 w,Huffman 树中必存在一条从根结点到词 w 对应结点的路径pw (且
这条路径是唯一的)。路径pw 上存在 − 1 个分支,将每个分支看做一次二分类,每一次分类就产生一个概
率,将这些概率连乘起来,就是所需的条件概率 p(w∣Context (w)):

p(w∣Context (w)) = p dw w
j ∣xw ,θj−1 (1.12)
j=2

其中:

⊤ w 1−dw dw
p dw w
j |xw ,θj−1 = σ xw θj−1
j
⋅ 1 − σ x⊤w θw
j−1
j

将公式(1.12)代入对数似然函数公式(1.10),便得:
1−dw dw
ℒ = log σ x⊤w θw
j−1
j
⋅ 1 − σ x⊤w θw
j−1
j

w∈ j=2
(1.13)
= 1− dw
j ⋅ log σ x⊤w θw
j−1 + dw
j ⋅ log 1 − σ x⊤w θw
j−1
w∈ j=2

为便于梯度计算,令:
ℒ(w, j) = 1 − dw
j ⋅ log σ x⊤w θw
j−1 + dw ⊤ w
j ⋅ log 1 − σ xw θj−1 (1.14)
5
公式(1.13)就是 CBOW 模型的目标函数,其优化方法是随机梯度上升法 。

5
一般地,若求目标函数的最小值,则用(随机)梯度下降法。在这里,因求目标函数的最大值,故用(随机)梯度上升法。
1.6 Word2vec:更多细节 23
2.梯度计算(反向传播)
观察公式(1.14)可发现,ℒ(w, j)中关于向量xw 和θw
j−1 是对称的(即两者可交换位置),因此,相应的梯度

∂ℒ(w, j) ∂ℒ(w, j)
∂xw
也只需在 ∂θvj−1
的基础上对这两个向量交换位置就可以了。下面不做推导只写结果:

∂ℒ(w,j) ⊤ w
首先,计算ℒ(w, j)关于θw
j−1 的梯度: = 1 − dw
j − σ xw θj−1 xw
∂θw
j−1

T w
对θw w w w
j−1 进行更新: θj−1 : = θj−1 + η 1 − dj − σ xw θj−1 xw (其中η表示学习率)。

∂ℒ(w,j) T w
其次,计算ℒ(w, j)关于xw 的梯度: = 1 − dw w
j − σ xw θj−1 θj−1
∂xw

∂ℒ(w, j)
对 v(w)进行更新:v(w): = v(w) + η =2 (其中: w ∈ Context (w))
∂xw

二、Skip-gram 模型的双向传播
1.目标函数(正向传播)
对于 Skip-gram 模型,已知的足当前词 w,需要对其上下文 Context(w)中的词进行预测。因此目标函数
应该形如公式(1.11),且关键是条件概率函数 p(Context(w)|w)的构造,Skip-gram 模型中将其定义为:
p(Context(w)|w) = p(u∣w)
u∈Context(w)
其中:

p(u∣w) = p duj |v(w),θuj−1


j=2

其中:
1−duj duj
p duj |v(w),θuj−1 = σ v(w)⊤ θuj−1 ⋅ 1 − σ v(w)⊤ θuj−1 (1.15)

将公式(2.6)依次代回,可得对数似然函数公式(2.2)的具体表达式:
1−duj duj
ℒ = log σ v(w)⊤ θuj−1 ⋅ 1 − σ v(w)⊤ θuj−1
w∈C u∈Context(w) j=2
(1.16)
= 1 − duj ⋅ log σ v(w)⊤ θuj−1 + duj ⋅ log 1 − σ v(w)⊤ θuj−1
w∈ u∈Context (w) j=2

为梯度推导方便起见,令:

ℒ(w,u,j) = 1 − duj ⋅ log σ v(w)⊤ θuj−1 + duj ⋅ log 1 − σ v(w)⊤ θuj−1 (1.17)

公式(1.16)就是 Skip-gram 模型的目标函数。

2. 梯度计算(反向传播)
基于公式(1.17)进行梯度计算,下面不做推导只写结果:
∂ℒ(w,u,j)
首先,计算ℒ(w,u,j)关于θuj−1 的梯度: = 1 − duj − σ v(w)⊤ θuj−1 v(w)
∂θuj−1

对θuj−1 进行更新:θuj−1 : = θuj−1 + η 1 − duj − σ v(w)⊤ θuj−1 v(w)


∂ℒ(w,u,j)
其次,计算ℒ(w,u,j)关于 v(w)的梯度: = 1 − duj − σ v(w)⊤ θuj−1 θuj−1
∂v(w)

ℒ( , , )
对 v(w)进行更新:v(w): = v(w) + η ∈ ( ) =2 ( )
24 1 引言与词向量

1.6.4.2. Negative Sampling 算法


Negative Sampling(简称为 NEG)功能:提高训练速度(不再用 Huffman 树,而是用随机负采样)。
一、CBOW 模型的双向传播
1.目标函数(正向传播)
在 CBOW 模型中,已知词 w 的上下文 Context (w),需要预测 w。因此,对于给定的 Context(w),
词 w 就是一个正样本,其它词就是负样本了。负样本那么多,该如何选取? 见本节最后的介绍。
假定现在已经选好了一个关于 Context (w)的负样本子集 NEG(w) ≠ ∅,且对∀ w ∈ ,定义:

1, w=w
Lw (w) =
0, w≠w

表示词w的标签,即正样本的标签为 1,负样本的标签为 0。
对于一个给定的正样本(Context (w),w),我们希望最大化:
g(w) = ∏u∈{w}∪NEG(w) p(u|Context (w)) (1.18)
其中:
Lw (u) 1−Lw(u)
p(u|Context (w)) = σ x⊤w θu ⋅ 1 − σ x⊤w θu (1.19)
这里xw 仍表示 Contex ∈ t(w)中各词的词向量之和,而θu
表示词 u 对应的一个(轴助)向量,为待训 ℝm
练参数。为什么要最大化 g(w)呢?让我们先来看看 g(w)的表达式,将(1.19)代入(1.18),有
g(w) = σ x⊤w θw ∏u∈NEG(w) 1 − σ x⊤w θu
NEG(w)则表示当上下文为 Context (w)时,预测中心词为 u 的概率(这里可看成一个二分类问题,具体
可参见预备知识中的逻辑回归),从形式上看,最大化 g(w),相当于最大化σ xTw θw ,同时最小化所有的σ xTw θu
,u ∈ NEG(w)。这不正是我们希望的鸣? 增大正样本的摡率同时降低负样本的概率。于是,对于一个给定
的语料库 ,函数
G = ∏w∈ g(w)
就可以作为整体优化的目标,当然,为计算方便,对 G 取对数,最终的目标函数就是:
L  log G  log  g (w)   log g( w)
wC wC
 Lw ( u ) 1  Lw ( u ) 
  lo g    x T
w  u
   1   x T
w  u
  
w C u { w }  N E G ( w )  

 
wC u{ w} NEG ( w )
L (u)  log   x    1  L (u)  log 1    x  
w T
w
u w T
w
u

(1.20)
为梯度推导方便起见,令
ℒ(w,u) = Lw (u) ⋅ log σ x⊤w θu + 1 − Lw (u) ⋅ log 1 − σ x⊤w θu (1.21)

2.梯度计算(反向传播)
基于公式(1.21)进行梯度计算,下面不做推导只写结果:
∂ℒ(w,u)
首先,计算ℒ(w,u)关于θu 的挮度: = Lw (u) − σ xTw θ xw
∂θu

对θu 进行更新:θu : = θu + η Lw (u) − σ xTw θu xw


∂ℒ(w,u)
其次,计算ℒ(w,u)关于xw 的梯度: = Lw (u) − σ xTw θu θu
∂xw

∂ℒ(w,u)
对 v(w)进行更新:v(w): = v(w) + η u∈{w}∪NEG(w)
,w ∈ Context (w)
∂xw
1.6 Word2vec:更多细节 25
二、Skip-gram 模型的双向传播

1.目标函数(正向传播)
对于一个给定的样本(w,Context (w)),我们希望最大化
g(w) = ∏w∈Context(w) ∏u∈{w}∪NEGw(w) p(u∣w)
其中
w w
p(u∣w) = σ v(w)T θu L (u) ⋅ 1 − σ v(w)T θu 1−L (u)
w
这里 NEG (w)表示处理词w时生成的负样本子集。于是,对于一个给定的语料库 ,函数
G = ∏w∈ g(w)
就可以作为整体优化的目标。同样,我们取 G 的对数,最终的目标函数就是
ℒ = log G = log ∏w∈ g(w) = w∈ log g(w)
Lw(u) 1−Lw (u)
= w∈C log ∏w∈Context(w) ∏u∈{w]∪NEGw(w) σ v(w)T θu ⋅ 1 − σ v(w)T θu

= w∈C w∈Context (w) u∈{w}∪NEGw (w) Lw (u) ⋅ log σ v(w)T θu + 1 − Lw (u) ⋅ log 1 − σ v(w)T θu

(1.22)
为梯度推导方便起见,令:
ℒ(w,w,u) = Lw (u) ⋅ log σ v(w)T θu + 1 − Lw (u) ⋅ log 1 − σ v(w)T θu (1.23)

2.梯度计算(反向传播)
基于公式(1.23)进行梯度计算,下面不做推导只写结果:
∂ℒ(w,w,u)
首先,计算 ℒ(w,w,u)关于 θu 的梯度: = Lw (u) − σ v(w)⊤ θu v(w)
∂θu

对vu 进行更新:vu : = vu + η Lw (u) − σ v(w)T θu v(w)


∂ℒ(w, ,u)
其次,计算ℒ(w,w,u)关于 v(w)的梯度: = Lw (u) − σ v(w)T θu θu
∂v(w)

∂ℒ(w,w,u)
对 v(w)进行更新:v(w): = v( ) + η u∈{w}∪NEGw (w) ∂v(w)

三、带权负采样
在 Negative Sampling 算法中,负采样是个很重要的环节。对于一个给定的词 w,如何生成 NEG(w)呢?
词典 D 中的词在语料 C 中出现的次数有高有低,对于那些高频词,被选为负样本的概率就应该比较大;反
之,对于那些低频词,其被选中的概率就应该比较小。这就是我们对采样过程的一个大致要求,本质上就
是一个带权采样问题。下面先用一段通俗的描述来帮助读者理解带权采样的机理。
设词典 D 中的每一个词 w 对应一个线段 l(w),长度为
counter (w)
len (w) =
u∈ counter (u)
这里 counter(·)表示一个词在语料 C 中出现的次数(分母中的求和项用来做归一化)。现在将这些线段
首尾相连地拼接在一起,形成一个长度为 1 的单位线段。如果随机地往这个单位线段上打点,则其中长度
越长的线段(对应高频词)被打中的概率就越大。注意:word2vec 源码中为词典 中的词设置权值时,不
是直接用 counter (w),而是对其作了α次幂,其中α = 0.75,则上式变成了:
[counter (w)]0.75
len (w) =
u∈ [counter (u)]0.75
k
word2vec 的具体做法:记 l0=0,lk= j=1
len(wj ), k=1,2, ⋯ ,N,这里wj表示词典 D 中第 j 个词,则以{ }Nj=0
为剖分节点可得到区间[0, 1]上的一个非等距剖分,li = (li-1,li],(i= 1,2, ⋯ ,N)为其 N 个剖分区间,进一步引
26 1 引言与词向量

入区间[0, 1]上的一个等距离剖分,剖分节点为{mj }M M−1


j=0 ,其中 M>> N。若将内部剖分节点{mj }j=1 映射到非

等距剖分上,如图 1.22 所示,则可建立{mj }M−1 N N


j=1 与区间{Ij }j=1 (或者说{wj }j=1 )的映射关系:

Table(i)=wk, 其中 mi∈Ik, i=1,2,...,M-1


有了这个映射,采样就简单了:每次生成一个[1,M − 1]间的随机整数 r,Table (r)就是一个样本。注
意,这里还有一个细节,当对wi 进行负采样时,如果碰巧选到wi 自己怎么办? 那就跳过去!

图 1.22:Table(·)映射的示意图

1.6.5. 总结
Word2vec 中两种模型和两种算法采用随机梯度上升法更新各参数的伪代码及其复杂度,见图 1.23:
Word2vec CBOW 模型 Ship-gram 模型
e= 0 FOR u ∈ Context (w) DO
xw=Σu∈Context(w)v(u) { e=0
FOR j=2: DO FOR j = 2: DO
{ q = σ xTw θw j−1 { q = σ v(w)T θuj−1
g = η 1 − dw j −q g = η 1 − duj − q
Hierarchical w
e: = e + gθj−1 e: = e + gθuj−1
Softmax
θu : = θu + gxw θuj−1 : = θuj−1 + gv(w)
算法
} }
FOR u ∈ Context (w) DO
{ v(u): = v(u) + e v(w): = v(w) + e
} }
计算复杂度:Q=N*D+D*log2V 计算复杂度:Q=C(D+D*log2V)
e= 0 FOR w ∈ Context (w) DO
xw=Σu∈Context(w)v(u) { e=0
FOR u = {w} ∪ NEG(w) DO FOR u = {w} ∪ NEGw (w) DO
{ q = σ xTw θu { q=σ v(w)T θu
w
g = η L (u) − q g=η(Lw (u) − )
Negative
e: = e + gθu e:=e + g
Sampling u u
θ : = θ + gxw := + gv( )
算法
} }
FOR u ∈ Context (w) DO
{ v(u): = v(u) + e v(w): = v( ) + e
} }
计算复杂度:Q=N*D+D*(K+1) 计算复杂度:Q=C(D+D*(K+1))
注:N 是先前词个数;D 是词向量维度;V 是词汇表大小;C 是词与词之间的最大距离;K 是负样本数。
图 1.23:两种模型和两种算法的伪代码

You might also like