Introduction
过去计算机理解meaning的方式是通过分类资源来处理词义, 如果是英语, 最著名的分类资源是WordNet, 其提供了很多词汇相关的分类信息
例如如下代码实现wordnet中所含有的功能:
from nltk.corpus import wordnet as wn
panda = wn.synset('panda.n.01')
hyper = lambda s: s.hypernyms()
list(panda.closure(hyper))
例如查找熊猫, 其会返回关于该词的一些上位词, 例如食肉动物, 哺乳动物等, 再例如查找good这个词, 会返回这些词的词性,以及不同词性下的意思
但是人们很难从句子中理解不同的意思通过计算机, 简单来讲, wordnet太依赖于规则.
后来使用one-hot表示单词, 表示每个单词的向量会很稀疏且很长, 没有给出词汇之间的任何关系, 例如motel和hotel天然是具有相同或相近意思的词, 但是如果用独热编码进行表示的话, 并体现不了近似关系, 或者通过点积计算的方式计算相似度结果为0, 简单来讲, 独热编码虽然考虑的词在文本中出现的位置关系, 但是其仍然使用的是符号学派的理念
为了解决独热编码点积相乘但无法算得词之间的相似性的问题, 因此, 我们考虑讲独热编码进行转换, 使其在一个向量空间中更能体现其独特性, 使用的理论是分布相似性, distributional similarity
分布相似性的原理
例如我想知道banking的意思, 那么假设我有很多个包含banking的例句, 然后观察每一次它出现的场合
you shall know a word by the company it keeps -- JR Firth
另一个是distributed representation, 分布式表示, 即用密集型向量表示词汇的含义, 其是通过分布相似性来构建的, 分布相似性的概念是一种关于词汇语义的理论, 通过理解上下文来描述词汇的意思, 分布式又跟独热词汇向量不同, 独热向量是一种存储在某处的本地表示
Word2vec
分布式学习, 使用中心词预测周围词, 有一个概率函数, 一个loss函数, 我们的目标就是调整词汇表示, 从而使损失最小化,
wt是中心词汇, w-t是除它外所有其他的上下文
两个算法:
skip-grams(SG)
给定中心词预测上下文词汇, 让概率分布值最大化, 对一个词汇有且仅有一个概率分布输入, 对于上下文词, 这个概率分布就是输出
定义个半径m, 然后从中心词开始到距离为m的位置, 来预测周围的词汇
选择词汇向量是其共现的概率最大化, 例如一段很长的文本, 足够长的词汇序列, 然后遍历文本中的所有位置, 对于文本中的每个位置, 都会定义一个围绕中心词汇的窗口, 中心词前后个m个单词, 得到一个概率分布, 使其根据中心词汇各处其上下文词汇出现的概率
然后设置模型的参数, 让上下文中所有词汇出现的概率都尽可能地高
模型参数只有一个θ, 即词汇的向量表示
对于目标函数, 不用计算整个语料库的概率, 而是去每个位置上的平均值得到1/T, 相当于对每个词汇进行归一化处理, 机器学习研究者习惯把事情最小化, 而不是最大化, 加上负号将目标函数转变为负对数分布, 即为最小化的目标函数
只有一个独热目标, 诀窍是只预测一个当前的单词, 交叉熵损失函数里剩下的只有一项, 那就是这个负概率
怎么利用这些单词向量来最小化负的对数似然函数
方法根据由单词向量构造而成的中心词汇, 来得出其上下文单词的概率分布
选取两个向量的点积, 然后通过softmax, 使其在0-1区间, 这样就变成了概率, 两个向量的shape都是1×n, 因此在算点积的时候, 其中一个向量应该将其转换为转置矩阵, 相乘后如果两个向量的相似度越高, 那么点积就越大, 得到点积结果后, 然后运用softmax化, 将数值转换为概率的标准方法. softmax可以将点积结果中有正有负的值转变为正数, 这样便于求解概率分布, 如果由大量数据都为正, 将它们等比例转换成概率分布, 只需要对它们求和, 然后将各项依次除以总和.
训练两个词向量,一个是中心词,一个是上下文,具体的原因是可以更加细致分出词的性质,一个词,他既可以做中心词,也可以做上下文词,算法效果好, 每个单词有两个词向量 当我们使用词向量的时候,用的是它作为中心词的词向量还是它作为上下文的词向量?我们可以直接用中心词向量,也可以将两个向量相加使用
softmax函数取指数时, 就接近于一个最大值函数, 大的数值会进一步放大.
问题: 当处理上下文词时, 需要关注的时它们所处的位置还是仅仅时它们的ID?
在哪儿并没有关系, 有关系的仅仅是这个单词的ID在窗口中的位置
问题: 训练的词向量由唯一解吗, 会不会存在多个结果一样好?
答案是肯定的, 可能有多个解
一个中心词汇有一个独热向量,
一个所有中心词汇的表示组成的矩阵
独热向量与所有中心词汇表示矩阵相乘, 即
独热向量的shape时1×n, 所有中心词汇表示的矩阵式d×n, 然后对独热向量做转置后变为n×1, 两个矩阵相乘, 得到的向量shape为d×1, 也即选出了与独热向量相乘时中心词汇表示的矩阵中对应的列与位置为1的相乘结果, 因为其他的列相乘都为0, 那么得到这个矩阵的一列, 这一列就是这个中心词的词汇表示
第二个矩阵用于存储上下文词汇的表示, 使用上面得出的中心词的词汇表示向量与所有的上下文词汇表示向量矩阵相乘, 得到中心词汇向量与上下文词汇表示向量矩阵的点积, 得到上下文词汇向量,(或者理解为对每个词语计算相似度) 然后使用softmax方法, 将其转换为概率分布, 这个概率分布中生成的每一个向量, 对应一个上下文词的预测概率
给定一个中心词汇, 可以预测在上下文出现的词汇的概率, 然后与真实句子中出现的词汇进行对比, 真实词汇的表示时通过独热编码, 如果真实上下文中词汇的独热编码中位置为1的所在处, 在预测的上下文词汇的概率向量中,相同的位置处, 如果概率过低例如0.1, 那说明和真实不符, 这样就可以算出一个error, 如果概率为1, 那么说明完美预测, 则没有error
目的即学习到好的参数, 即更接近真实的上下文词汇的词向量
实际操作是将所有词所对应的参数都放进一个大的向量θ里, 然后进行优化, 通过改变这些参数, 让模型的目标方程最大化, 目标方程也即似然估计函数
其中向量θ中的某一个, 即代表了一个词汇, 而这个词汇又是一个1×d维的向量, 不管它是中心词汇还是上下文词汇, 都包含在这个θ中, 因为每个词都有两种属性, 一个是作为中心词, 一个是作为上下文词, 因此它们都放在θ中, 那么θ向量的所属空间大小应该是2dV, 其中d代表每个词的词向量维度, 对于每个词都是固定长度, V是θ中的所有词, 而2说明每个词都有两种角色, 即两个向量, 总的来讲我们需要优化的参数即这个θ