如何理解WordEmbedding?

 

之前自己也是懵懵懂懂的不太理解,经过一段时间的学习和思考,感觉自己有了新的认识,所以在这里分享一下,也算自己的总结了。

不谈数学原理,我认为理解Word Embedding可以从以下3个角度来理解。

1.背景

《深度学习》一书中有以下几句话,略有小改:

  • 简单的机器学习算法的性能在很大程度上依赖于给定数据的表示。
  • 使用机器学习来发掘表示本身的方法即表示学习。
  • 从原始数据中提取高层次、抽象的特征是非常困难的。
  • 深度学习通过其他较简单的表示来表达复杂表示。
  • 我们可以认为不同数学函数的每一次应用都为输入提供了新的表示。
  • 分布式表示的思想是系统的每一个输入都应该由多个特征表示,并且每一个特征都应该参与到多个可能输入的表示。
  • 联结主义的中心思想是当网络把大量简单的计算单元连接在一起时可以实现智能行为。
  • 万能近似定理表明,神经网络可以近似从任何有限离散空间映射到另一个的任意函数。

其实我认为深度学习的应用核心就是上面几句话。

接下来我拿传统的确定性算法、机器学习和深度学习做一个简单的对比。

原来对于一些流程比较清晰简单的任务,我们的做法是编写确定性的算法来实现,而对于那些很复杂的,难以用简单的规则去说明的任务通常束手无策。

机器学习的作用则是直接从数据中去学习,总结规律,但通常我们要花费大量的精力在特征工程上面,同时对于许多任务来说,我们很难知道应该提取哪些特征。
而深度学习则表示:特征不用你们整,只要你们给的数据足够好,我保证给你们一个更好的模型。

上面这句话的意思是,原来特征工程的累活我们不用做了,深度学习可以自己学到好的特征,同时万能近似定理也确保了深度神经网络可以保证模型学习效果的上限很高,当前前提是我们给的数据比较好。

以上交代了下背景,接下来言归正传。

自然语言要作为神经网络模型的输入之前,我们首先需要将其映射为计算机可以表示的形式。

独热编码最简单,将每一个字或者词都唯一编码成了01向量,除了维度灾难,我认为最大的缺点就是在这一映射过程中丢掉了许多词或者字的词义和语义特征,除了表示唯一以外,不包含任意其它信息。

这时我们应该思考:那什么样的表示才算好的表示?表示中应该保留哪些特征又如何保留这些特征呢?

怀着对上面问题的疑问,我们来看一下他山之石。

2.卷积神经网络的工作原理

我们都知道卷积神经网络中最主要的部分:卷积层、池化层、激活层的作用就是提取和匹配局部特征,将特征提取结果作为全连接层的输入从而得到最终的输出。

其中的每一个卷积核都可以被视为一个特征过滤器,卷积神经网络通过依次的扫描输入并进行卷积运算提取得到哪些位置可能包含哪些特征的信息,随后这些特征位置信息被进一步的提取从而得到更高级、更抽象的特征。

举个例子,如在识别图片中是否包含人时,卷积神经网络大致的作用原理如首先提取出某些位置是否是横线、竖线还是斜线以及颜色等特征,然后对这些特征进一步组合以得到哪些位置是否包含人脸、上肢、下肢等特征,通过提取到的这些特征,神经网络就可以做出决策得到图片中是否包含人的结果。

通过了解卷积神经网络的工作原理,我们可以知道卷积神经网络的最大作用就是可以自动学习并提取局部特征。对于计算机视觉中的图片而言,最微小的组成单元是一个个的像素点,然后局部组合就得到了线条和颜色块等信息特征;而对于自然语言处理而言,最小的组成单元则是一个个的字符,如英文中的‘a’、汉字中的‘我’等。

许多计算机视觉的预训练模型都是通用的,对于具体任务,我们只需要finetune(精调)或者只学习后面的层就可以了。这其中的原理是学到的模型提取特征的能力是可复用的,不依赖于某一具体任务。同样的,如果我们可以从语料中学到词或者字的词义和语义特征就好了,之后可以直接作为词或者字的表示用于模型训练和预测,这就是词的预训练。两者有异曲同工之妙。

3.Harris提出的分布式假说及Firth对此的阐述和论证

Harris曾于1954年提出分布式假说:“上下文相似的词,其语义也相似”,后来又经过Firth对该假说进行阐述和论证,“词的语义由其上下文确定”。基于该思想,我们可以从该词在语料中的上下文学习得到该词的语义,同时也可以得到相同上下文下不同的词之间的联系。

结合上文提到的分布式表示的思想,我们可以想到:我们可以用某个词以及该词所指代的实体所具备的属性和特征来表示该词。

再举个不恰当例子:

如何表示“程序猿”和“单身狗”这两个词呢?假设我们有以下特征向量序列:

1
2
3
4
5
6
[
"有头发",
"人傻",
"钱多",
"死得快"
]

我们可以设定:

1
2
3
4
5
6
7
程序猿 = [0.3, 0.6, 0.6, 0.6]
```

同样的,我们可以设定:

```python
单身狗 = [0.6, 0.7, 0.3, 0.5]

基于此,我们便得到了“程序猿”和“单身狗”的语义相似度为:

从中我们可以得到“程序猿”和“单身狗”这两个词还是挺接近的。

注意:以上具体数值和计算公式是自己瞎掰的。

具体到属性特征有哪些以及具体每个词的分量数值应该是多少,这个神经网络是可以自己去学的,只不过学到的可以被视为潜在语义信息,并不是直观的”有头发”, “人傻”, “钱多”, “死得快”等特征,通常都是不可解释的。

总之,通过类似以上的方式,单词的语义信息就被比较有效的编码和表示起来了。
这时我们再回顾一下之前的Word2Vec和最近非常火的BERT,则可以被视为以上思想的工程实践。只不过训练方式和优化目标愈加完善,使得词表示可以包含更多更好的语义表示罢了。

总结

机器学习也好,深度学习也罢,其任务目标都是想要学习现实世界中某些量与某些量之间的映射变化关系。只不过有的关系是线性的,比较简单,而有的则极其复杂。对于这些复杂的问题,才是深度学习的用武之地。

许多任务都可以被看作是回归或分类问题,正如老子云:“天下皆知美之为美,斯恶已。”,美丑两端即定义一个维度。

对于神经网络的理解,也可以从还原论的哲学思想来入手。

参考