Softmax(假神经网络)与词向量的训练

今天终于要完成好久之前的一个约定了~在很久很久以前的《如果风停了,你会怎样》中,小夕提到了“深刻理解了sigmoid的同学一定可以轻松的理解用(假)深度学习训练词向量的原理”,今天就来测测各位同学对于sigmoid的理解程度啦~

 

习惯性的交待一下前置铺垫:

1、词袋模型、独热与词向量概念扫盲

2、sigmoid到softmax(至关重要)

3、逻辑回归

4、逻辑回归到神经网络

 

总之,请务必清楚词向量的概念,深刻理解softmax的概念和公式内的意义。尤其是要理解softmax函数具有“两向量的‘亲密度’转条件概率”的功能:

 

嗯。。。还是开篇扫盲一下。可能有的同学觉得是深度学习兴起之后才有的“词向量”,实际上,最早用来做词向量的模型并不是神经网络,而是更加传统的机器学习算法,如以线性代数中的SVD(奇异值分解)为核心LSA(隐性语义分析),还有后来的以贝叶斯理论为核心LDA(隐含狄利克雷分布,一种NLP中经典的主题模型)。

 

一方面,小夕下面要讲的确实是作为一种用神经网络(人们为了提高逼格,更喜欢叫用深度学习xxx)训练词向量的基本理论和方法,但是实际上,小夕并没有把它当神经网络看,因为理解了小夕讲的softmax后,这种方法不过是用了一下softmax而已,还不如叫“基于softmax分类器”或者“基于改良的逻辑回归”呢。。。当然啦,对外还是要称之为神经网络的。

 

首先,我们来想一下,凭什么可以训练出《词向量概念扫盲》中描述的这么棒的可以编码语义的词向量呢?其实呀,只要是用无监督的方法去训练词向量,那么这个模型一定是基于“词共现”(word co-occurrence)信息来实现的。

 

设想一下,“萌”的语义跟什么最相近呢?有人会想到“可爱”,有人会想到“妹子”,有人会想到“小夕”(\(//∇//)\)。为什么呢?因为很大程度上,这些词会同时出现在某段文本的中,而且往往距离很近!比如“萌妹子”、“这个妹子好可爱”、“小夕好萌吖”。正是因为这种词共现可以反映语义,所以我们就可以基于这种现象来训练出词向量。

 

既然语义相近的两个词(即差别很小的两个词向量)在文本中也会趋向于挨得近,那如果我们可以找到一个模型,它可以在给定一个词向量时,计算出这个词附近出现每个词的概率(即一个词就看成一个类别,词典中有多少词,就是多少个类别,计算出给定输入下,每个类别的概率),那么训练这个模型不就把问题解决了嘛。是不是突然觉得softmax函数简直是为这个任务量身定做呐~

 

我们就将词典大小设为D,用、...表示词典中的每个词。

 

如下图:

 

看,这不就是简单的softmax分类器嘛~所以这个model的假设函数就是简单的:

 

 

从这个model中也能看出,模型的输入不仅是输入,而且是其他输入的参数!所以这个model的参数是维度为 D*embed_dim 的矩阵(每行就是一个用户定义的embed_dim大小的词向量,词典中有D个词,所以一共有D行),而且输入也是从这个矩阵中取出的某一行)。

 

假设函数有了,那么根据《一般化机器学习》,我们需要定义损失函数。当然,根据前面所说的词共现信息来定义啦。

 

为了好表示,我们将模型输入的词称为中心词(central word),记为,将这个词两边的词记为目标词(objected word),记为,假如我们只将中心词附近的m个词认为是它的共现词(也就是中心词左边的m个词以及中心词右边的m个词),那么目标词一共有2m个,分别记为、...。(下文将会看到,在整个句子的视角下,m被称为窗口大小

 

如果我们令m=1,那么对于下面这个长度为T=10句子:

 

今天 我 看见 一只 可爱的 猫 坐 在 桌子 上。

 

那么当我们将“猫”看作中心词时,目标词就是“可爱的”和“坐”,即

今天 我 看见 一只 【可爱的 猫 坐】 在 桌子 上。

我们就认为这两个词跟猫的语义是相关的,其他词跟猫是否相关我们不清楚。所以我们要争取让P(可爱的|猫)、 P(坐|猫)尽可能的大

 

讲到这里,最容易想到的就是使用似然函数了。由于这里类别特别多,所以算出来的每个概率都可能非常小,为了避免浮点下溢(值太小,容易在计算机中被当成0,而且容易被存储浮点数的噪声淹没),更明智的选择是使用对数似然函数。所以对于一段长度为T的训练文本,损失函数即:

 

 

当然啦,这里要让长度为m的窗口滑过训练文本中的每个词,滑到每个词时,都要计算2m次后验概率。而每次计算后验概率都要用到softmax函数,而回顾一下softmax函数,它的分母是很恐怖的:

 

 

类别越多,分母越长。而我们这里类别数等于词典大小啊!所以词典有10万个单词的话,分母要计算10万次指数函数?所以直接拿最优化算法去优化这个损失函数的话,肯定会训练到天长地久(好像用词不当)。那怎么办呢?

 

一种很巧妙的方法是将原来计算复杂度为D的分母(要计算D次指数函数)通过构造一棵“胡夫曼二叉树(Huffman binary tree)”来将原来扁平的“softmax”给变成树状的softmax,从而将softmax的分母给优化成计算复杂度为log D。这种树形的softmax也叫分层softmax(Hierarchical Softmax

 

还有一种优化方法是负采样(Negative Sampling),这种方法可以近似计算softmax的对数概率。对使用分层softmax和负采样优化模型计算复杂度感兴趣的同学,可以看下面这篇论文:

 

Mikolov,T., Sutskever, I., Chen, K., Corrado, G., & Dean, J. (2013, October 17).Distributed Representations of Words and Phrases and their Compositionality.arXiv.org

 

诶诶,说了这么多,这个看起来这么简洁优美的model叫什么名字呢?

 

它就是Mikolov在2013年提出来的Skip-gram(简称SG),这也是大名鼎鼎的开源词向量工具word2vec背后的主力model之一(另一个模型是更弱鸡的连续词袋模型,即cBoW)。

 

说些题外话,SG和cBoW是Mikolov在2013年的一篇论文中提出来的

 

(Mikolov, T.,Chen, K., Corrado, G., & Dean, J. (2013, January 17). Efficient Estimationof Word Representations in Vector Space. arXiv.org.)

 

并且在同一年,Mikolov又在更上面那篇优化SG计算复杂度的论文中开源了word2vec这个词向量工具,可谓是深度学习应用于自然语言处理领域的里程碑式的成果。当然啦,要说NLP的超级里程碑,还是要数2003年Bengio大神的这篇论文的,这也是词向量概念的鼻祖论文:

 

Bengio Y, Ducharme R,Vincent P, et al. A neural probabilistic language model[J]. Journal of machinelearning research, 2003, 3(Feb): 1137-1155.

  

关于在准确度表现上基本可以完爆SG和cbow的model,参考GloVe模型(Global Vector),有兴趣的同学可以看一下论文:

 

PenningtonJ, Socher R, Manning C D. Glove: Global Vectors for WordRepresentation[C]//EMNLP. 2014, 14: 1532-1543.

 

当然啦,建议在读之前先熟悉一下文首提到的LDA模型,否则可能阅读有点难度哦。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值