本节课主要是课程介绍和word vectors的介绍。
课程目标
- 课程介绍
- 人类语言和单词含义
- word2vec介绍
- word2vec求梯度
- 优化
- 再看word2vec
一、课程介绍
有5个作业
作业一使用IPython Notebook做的,简单的词向量的调用
作业二使用python实现公式,主要是微积分的使用
作业三介绍pytorch
作业四和作业五在GPU上使用pytorch
最后有个大作业,在SQuAD数据集上实现一个qa系统,也可以自己选题
二、人类语言的单词含义
电脑上怎么表达单词的含义?
普遍的做法是使用WordNet这个词典。
WordNet是一个由普林斯顿大学认识科学实验室在心理学教授乔治·A·米勒的指导下建立和维护的英语字典。由于它包含了语义信息,所以有别于通常意义上的字典。WordNet根据词条的意义将它们分组,每一个具有相同意义的字条组称为一个synset(同义词集合)。WordNet为每一个synset提供了简短,概要的定义,并记录不同synset之间的语义关系。在WordNet中,名词,动词,形容词和副词各自被组织成一个同义词的网络,每个同义词集合都代表一个基本的语义概念,并且这些集合之间也由各种关系连接。
缺点:
更新比较慢
不能准确的表达单词之间的相似性。
传统的NLP中,采用ont-hot向量来表达单词。
向量中只有一个位置是1,其他是0,维度=语料库中的单词数量。
由于语料库比较大,导致向量过于庞大,而且不能表达单词之间的相似性。
解决方案:
思想:一个单词的含义可以通过上下文单词的含义决定。
因此可以基于建立一个比较密集的向量来代表一个单词。当上下文相似时,单词的词向量也相似。
三、word2vec
思想:
- 我们有个很大的语料库
- 语料库中的词都可以用一个向量表示
- 遍历一个文本,对于文本中的每个位置t,遍历到的位置t对应的词称为中心词c,中心词的上下文单词成为词o
- 使用词向量c和词向量o的相似性来计算,当给定词c时词o出现的概率,即p(o|c)
word2vec目标函数
对于每个位置t=1...T,计算概率p(o|c).以下Wt+j就是上下文单词c,Wt是中心词.
J是损失函数,我们的目标是最大化L,换个思想就是最小化J。最小化往往比最大化简单。
那
我们如何计算概率P呢?
使用两个向量。
对于每个单词,既可能是中心词,也可能是外围词。所有有两个向量。
Vw:当w是中心词时。
Uw:当w是外围词时。
采用softmax函数实现P。Uo*Vc求上下文单词和中心词的相似度,相似度越大越好。分母是为了均衡。
为什么使用softmax函数?
指数e让所有的数都变成正数。点乘计算相似度。分母是对整个词汇表进行标准化,以给出概率分布。分子是计算外围词和中心词的相似度。
模型的训练
调整参数来最小化损失函数J。
参数:
对于每个单词的两个向量u和v
为了训练模型,需要计算出所有向量的梯度。注意每个单词有两个词向量。
通过链式法则和求导计算梯度,并采用梯度下降的方法进行训练。梯度下降本质上就是求导的方法。
梯度更新的方法:
目标函数的形状:
为什么采用两个词向量呢?
因为更好优化
word2vec有两个具体实现的模型:
skip-gram:通过中心词预测上下文单词
CBOW:通过上下文单词预测中心词
但是整个语料库非常庞大,如果计算所有向量的梯度那种工作量很大。
可以采用随机梯度下降的方法。
也就是随机抽取其中一些样本进行训练,而不必训练这个预料库。
这里我没有很理解。万一抽取出的样本里没有包含预料库中所有单词,那这些单词岂不是训练不到吗?课程也没详细介绍这一点。