作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/36
本文地址:http://www.showmeai.tech/article-detail/231
声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI查看更多精彩内容
ShowMeAI为斯坦福CS224n《自然语言处理与深度学习(Natural Language Processing with Deep Learning)》课程的全部课件,做了中文翻译和注释,并制作成了GIF动图!
本讲内容的深度总结教程可以在这里 查看。视频和课件等资料的获取方式见文末。
CS224n是顶级院校斯坦福出品的深度学习与自然语言处理方向专业课程。核心内容覆盖RNN、LSTM、CNN、transformer、bert、问答、摘要、文本生成、语言模型、阅读理解等前沿内容。
ShowMeAI将从本节开始,依托cs224n课程为主框架,逐篇为大家梳理NLP的核心重点知识原理。
第1课直接切入语言和词向量,讲解了自然语言处理的基本概念,文本表征的方法和演进,包括word2vec等核心方法,词向量的应用等。
咱们先来看看人类的高级语言。
人类之所以比类人猿更“聪明”,是因为我们有语言,因此是一个人机网络,其中人类语言作为网络语言。人类语言具有信息功能和社会功能。
据估计,人类语言只有大约5000年的短暂历史。语言和写作是让人类变得强大的原因之一。它使知识能够在空间上传送到世界各地,并在时间上传送。
但是,相较于如今的互联网的传播速度而言,人类语言是一种缓慢的语言。然而,只需人类语言形式的几百位信息,就可以构建整个视觉场景。这就是自然语言如此迷人的原因。
我们如何表达一个词的含义呢?有如下一些方式:
理解意义的最普遍的语言方式(linguistic way):语言符号与语言意义(想法、事情)的相互对应
要使用计算机处理文本词汇,一种处理方式是WordNet:即构建一个包含同义词集和上位词(“is a”关系)的列表的辞典。
英文当中确实有这样一个wordnet,我们在安装完NLTK工具库和下载数据包后可以使用,对应的python代码如下:
from nltk.corpus import wordnet as wn
poses = { 'n':'noun', 'v':'verb', 's':'adj (s)', 'a':'adj', 'r':'adv'}
for synset in wn.synsets("good"):
print("{}: {}".format(poses[synset.pos()], ", ".join([l.name() for l in synset.lemmas()])))
from nltk.corpus import wordnet as wn
panda = wn.synset("panda.n.01")
hyper = lambda s: s.hypernyms()
list(panda.closure(hyper))
结果如下图所示:
WordNet大家可以视作1个专家经验总结出来的词汇表,但它存在一些问题:
① 忽略了词汇的细微差别
② 缺少单词的新含义
③ 因为是小部分专家构建的,有一定的主观性
④ 构建与调整都需要很多的人力成本
⑤ 无法定量计算出单词相似度
在传统的自然语言处理中,我们会对文本做离散表征,把词语看作离散的符号:例如hotel、conference、motel等。
一种文本的离散表示形式是把单词表征为独热向量(one-hot vectors)的形式
在独热向量表示中,向量维度=词汇量(如500,000),以下为一些独热向量编码过后的单词向量示例:
在上述的独热向量离散表征里,所有词向量是正交的,这是一个很大的问题。对于独热向量,没有关于相似性概念,并且向量维度过大。
对于上述问题有一些解决思路:
近年来在深度学习中比较有效的方式是基于上下文的词汇表征。它的核心想法是:一个单词的意思是由经常出现在它附近的单词给出的 “You shall know a word by the company it keeps” (J. R. Firth 1957: 11)
。
这是现代统计NLP最成功的理念之一,总体思路有点物以类聚,人以群分的感觉。
如图所示,banking的含义可以根据上下文的内容表征。
下面我们要介绍词向量的构建方法与思想,我们希望为每个单词构建一个稠密表示的向量,使其与出现在相似上下文中的单词向量相似。
Word2vec (Mikolov et al. 2013)是一个学习词向量表征的框架。
核心思路如下:
下图为窗口大小 时的 ,它的中心词为
下图为窗口大小 时的 ,它的中心词为
我们来用数学表示的方式,对word2vec方法做一个定义和讲解。
对于每个位置 ,在大小为 的固定窗口内预测上下文单词,给定中心词 ,似然函数可以表示为:
上述公式中, 为模型包含的所有待优化权重变量
对应上述似然函数的目标函数 可以取作(平均)负对数似然:
注意:
补充解读:
得到目标函数后,我们希望最小化目标函数,那我们如何计算 ?
对于每个词 都会用两个向量:
则对于一个中心词 和一个上下文词 ,我们有如下概率计算方式:
对于上述公式,ShowMeAI做一点补充解读:
下图为计算 的示例,这里把 简写为 ,例子中的上下文窗口大小2,即“左右2个单词+一个中心词”。
回到上面的概率计算,我们来观察一下
这里有一个softmax的概率,softmax function 示例:
将任意值 映射到概率分布
其中对于名称中soft和max的解释如下(softmax在深度学习中经常使用到):
下面是对于word2vec的参数更新迭代,应用梯度下降法的一些推导细节,ShowMeAI写在这里做一点补充。
首先我们随机初始化 和 ,而后使用梯度下降法进行更新
偏导数可以移进求和中,对应上方公式的最后两行的推导
我们可以对上述结果重新排列如下,第一项是真正的上下文单词,第二项是预测的上下文单词。使用梯度下降法,模型的预测上下文将逐步接近真正的上下文。
再对 进行偏微分计算,注意这里的 是 的简写,故可知
可以理解,当 ,即通过中心词 我们可以正确预测上下文词 ,此时我们不需要调整 ,反之,则相应调整 。
关于此处的微积分知识,可以查阅ShowMeAI的教程图解AI数学基础文章图解AI数学基础 | 微积分与最优化。
代表所有模型参数,写在一个长的参数向量里。
在我们的场景汇总是 维向量空间的 个词汇。
可以点击 B站 查看视频的【双语字幕】版本
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。