译自:https://colah.github.io/posts/2014-07-NLP-RNNs-Representations/
发布于2014年7月7日
神经网络,深度学习,表征,NLP,递归神经网络
介绍
在过去的几年里,深度神经网络主导了模式识别。它们将先前的艺术状态浮出水面,用于许多计算机视觉任务。语音识别也在以这种方式发展。
但是,尽管有这样的结果,我们不得不怀疑,为什么它们工作得这么好?
这篇文章回顾了将深层神经网络应用于自然语言处理(NLP)的一些非常显著的结果。
在这样做的过程中,我希望能给出易理解的一个有希望的答案,来解释为什么深神经网络能够起作用。我认为这是一个非常优雅的视角。
单隐层神经网络
具有隐层的神经网络具有普遍性:给定足够的隐单元,它可以逼近任意函数。这是一个经常引用的——甚至更频繁地被误解和应用——定理。
确实如此,本质上是因为隐藏层可以用作查找表。
为了简单起见,让我们考虑一个感知器网络。感知器是一个非常简单的神经元,当它超过某个阈值试就会发出信号,如果没有达到这个阈值就不会发出信号。感知器网络获得二进制(0和1)输入并给出二进制输出。
请注意,可能的输入数量有限。对于每一个可能的输入,我们可以在隐层中构造一个神经元来激发输入,并且只在那个特定的输入上。然后,我们可以使用该神经元和输出神经元之间的连接来控制特定情况下的输出。
因此,一个隐层神经网络确实是通用的。但这并没有什么特别令人印象深刻或令人兴奋的地方。说您的模型可以做与查找表相同的事情并不是非常有力的论据。这只是意味着你的模型并不是不可能完成任务的。
通用性意味着一个网络可以适应你给它的任何训练数据。这并不意味着它将以合理的方式插值到新的数据点。
不是的,通用性并不能解释为什么神经网络如此有效。真正的原因似乎是一些更微妙的...。为了理解它,我们首先需要了解一些具体的结果。
词嵌入
我想从一个特别有趣的深度学习研究开始:单词嵌入。在我个人看来,尽管它们最初是由Bengio等人在十多年前提出的,但目前仍是深度学习中最令人兴奋的研究领域之一。除此之外,我认为它们获得直觉关于为什么深度学习如此有效是最好的地方之一。
一个字嵌入是一种将某些语言中的单词映射到高维向量(可能是200-500维)的参数化函数。例如,我们可能会发现:
(通常,函数是一个查找表,由一个矩阵$\theta$参数化,每一个单词都有一行: W_\theta(w_n) = \theta_n$)
$W$被初始化为每个单词都有随机向量。它学习拥有意义的向量来执行某些任务。
例如,我们可以训练一个网络的一个任务是预测一个5-gram(五个单词的序列)是否是“有效的”。我们可以很容易地从维基百科得到很多5-grams(例如:"cat sat on the mat"),然后用一个随机单词(例如:“cat sat song the mat”)换掉其中的一半,因为这几乎肯定会使我们的5-gram变得毫无意义。
我们训练的模型将运行每一个在5-gram的单词通过$W$去得到一个表示它的向量,并将这些向量输入另外一个名为$R$的“模块”,该模型试图预测5-gram是“有效的”还是“中断的”。那么,我们想:
$R(W(\text{cat}\!"),~ W(
\text{sat}!"),~ W(\text{on}\!"),~ W(
\text{the}!"),~ W(``\text{mat}!")) = 1$
$R(W(\text{cat}\!"),~ W(
\text{sat}!"),~ W(\text{song}\!"),~ W(
\text{the}!"),~ W(``\text{mat}!")) = 0$
为了准确地预测这些值,网络需要学习$W$和$R$良好的参数。
现在,这个任务不是很有趣。也许这对发现文本或者其他东西中的语法错误很有帮助。但最有趣的是$W$
(事实上,对我们来说,整个任务的重点是学习$W$。我们本可以做几个其他的任务——另一个常见的任务是预测句子的下一个单词。但我们并不在乎。在本节的其余部分中,我们将讨论许多单词嵌入结果,而不会区分不同的方法。)
我们可以做的一件事是用t-SNE可视化它们,这是一种用于可视化高维数据的复杂技术,可以让我们对单词嵌入空间有个直观的感觉。
t-SNE可视化词嵌入。左边:数字区域;右边:工作区域。From Turian et al. (2010), see complete image.
这种文字的“地图”对我们来说有很多直观的意义。相似的词是相近的。另一种方法是查看哪个单词在嵌入中与给定的单词最接近。再说一遍,这些词往往很相似。
What words have embeddings closest to a given word? From Collobert et al. (2011)
对于一个网络来说,让具有相似含义的词具有相似的向量似乎是很自然的。如果你用一个词换一个同义词(eg. "a few people sing well" -> "a couple people sing well"),句子的有效性就不会改变。然而,从天真的角度来看,输入句已经发生了很大的变化,如果$W$ 把同义词(例如"few"和"couple")精密地联系在一起,那么从$R$的角度来看,变化不大。
这是非常强大的。5-grams的数量可能是巨大的,我们有相对较少的数据点去试图学习。相似的词放在一起使我们可能把一个句子概括为一类相似的句子。这不仅意味着将一个单词转换为同义词,还意味着在类似的类型中将一个单词转换为一个单词(例如,"the wall is blue" -> "the wall is red")。此外,我们还可以更改多个单词(例如. "the wall is blue" -> "the ceiling is red")。这对单词数量的影响是指数级的。
所以,很明显,这对$W$来说是一件非常有用的事情。但它是如何学会这样做的呢?似乎在很多情况下,它看到像 "the wall is blue" 这样的句子,并且在看到 "the wall is red"这样的句子之前就知道它是有效的。因此,将"red" 向 "blue"移动一点会对网络表现更好。
我们仍然需要看到每一个词被使用的例子,但类比允许我们将其推广到新的单词组合。你看过所有你以前理解的单词,但你没有看过你以前理解的所有句子。神经网络也是如此。
单词嵌入显示了一个更显著的特性:单词之间的类比似乎被编码在单词之间的差异向量中。例如,似乎存在一个恒定的male-female 差异向量:
$W(\text{woman}\!") - W(
\text{man}!") \simeq W(\text{aunt}\!") - W(
\text{uncle}!")$
$W(\text{woman}\!") - W(
\text{man}!") \simeq W(\text{queen}\!") - W(
\text{king}!")$
这似乎并不太令人惊讶。毕竟,性别代词意味着转换一个单词会使句子在语法上不正确。你写道,“she is the aunt”,但“he is the uncle。”类似地,“he is the King”,但“she is the Queen”。如果有人看到“she is the uncle”,最有可能的解释是语法错误。如果有一半的时间是随机转换的话,很有可能发生在这里。
“当然!” 事后我们说:“嵌入这个词将学会以一致的方式编码性别。事实上,可能有一个性别层面。单数和复数也是一样的。很容易找到这些琐碎的关系!”
然而,事实证明,更复杂的关系也是用这种方式编码的。简直是奇迹!
Relationship pairs in a word embedding. From Mikolov et al. (2013b).
认识到$W$的所有这些性质都是副作用是很重要的。我们并没有试图把相似的词放在一起。我们没有尝试不同的向量进行编码。我们所要做的只是执行一个简单的任务,比如预测一个句子是否有效。这些属性或多或少地出现在优化过程中。
这似乎是神经网络的一大优势:它们学会了更好的自动表示数据的方法。反过来,很好地表示数据似乎是许多机器学习问题成功的关键。词嵌入只是学习表示法的一个特别引人注目的例子。
共享表示
单词嵌入的属性当然是有趣的,但是我们能用它们做一些有用的事情吗?除了预测一些愚蠢的事情,比如5-gram是否“有效”?
我们学习单词嵌入是为了更好地完成一个简单的任务,但是根据我们在单词嵌入中观察到的良好特性,您可能会怀疑它们在NLP任务中通常是有用的。事实上,像这样的单词表示是非常重要的:
近年来,在许多NLP系统的成功中,使用word表示已经成为一种关键的“秘制”,包括命名实体识别、词性标记、解析和语义角色标记。(Luong et al. (2013))
这种通用策略——学习任务A的良好表现,然后将其用于任务B——是深度学习工具箱中的主要技巧之一。根据细节的不同,它有不同的名称:预训练、迁移学习和多任务学习。这种方法最大的优点之一是它允许从多种数据中学习表示。
这里写图片描述
$W$ and $F$ learn to perform task A. Later, $G$ can learn to perform $B$ based on $W$.
有一个对应的技巧。我们不需要学习一种方法来表示一种数据并使用它来执行多种任务,我们可以学习一种方法,将多种数据映射到一个单一的表示中!
其中一个很好的例子是在Socher等人(2013a)中制作的双语单词嵌入。我们可以学习在一个单独的共享空间中嵌入两个不同语言的单词。在这种情况下,我们学习在相同的空间中嵌入英语和普通话单词。
我们训练两个单词的嵌入,$W_{en}$ 和 $W_{zh}$ 的方式类似于我们上面所做的。然而,我们知道某些英语单词和汉语单词有着相似的意思。因此,我们优化了一个附加属性:我们知道的接近翻译的单词应该在一起。
当然,我们注意到我们所知道的词有着相似的意思,最后会紧密结合在一起。因为我们对它进行了优化,所以这并不奇怪。更有趣的是,我们并不知道的单词是最后的翻译。
鉴于我们以前使用词嵌入的经验,这可能并不令人感到意外。单词嵌入将相似的单词拉到一起,所以如果我们知道一个英文和中文单词意味着相似的东西彼此接近,那么它们的同义词也将彼此靠近。我们也知道,像性别差异这样的事物往往最终会以恒定的差异向量来表示。似乎强迫这些不同的向量在英文和中文的嵌入中都是相同的。这样做的结果是,如果我们知道两个男性版本的词语相互转化,我们也应该让女性的词汇相互转化。
直觉上,感觉有点像两种语言有一个相似的“形状”,通过强迫它们在不同的点排列,它们重叠,而其他的点被拉到正确的位置。
t-SNE visualization of the bilingual word embedding. Green is Chinese, Yellow is English. (Socher et al. (2013a))
在双语词语嵌入中,我们学习了两种非常相似类型数据的共享表示。
但是我们也可以学习在相同的空间中嵌入非常不同类型的数据。
最近,深度学习开始探索将图像和单词嵌入到单一表示中的模型。
它的基本思想是,通过在一个单词嵌入中输出一个向量来对图像进行分类。
它的基本思想是,通过在一个单词嵌入输出一个向量来对图像进行分类。狗的图像被绘制在“狗”字向量附近。马的图像被映射到“马”向量附近。汽车的图像在“汽车”向量附近。等等。
有趣的部分是当你在新的图像类别上测试模型时会发生什么。例如,如果模型没有经过训练来分类猫—也就是说,将它们映射到“猫”向量附近—党我们尝试对猫的图像进行分类时会发生什么?
事实证明,网络能够合理处理这些新类别的图像。猫的图像没有被映射到单词嵌入空间中的随机点。相反,它们倾向于映射到“狗”向量的一般附近,并且实际上,接近“猫”向量。类似地,卡车图像与“卡车”向量的距离相对较近,这与“汽车”向量相近。
这是由斯坦福小组的成员完成的,他们只有8个已知类别(和2个未知类别)。结果已经相当令人印象深刻。但是由于已知的类别很少,因此插入图像和语义空间之间的关系的点很少。
谷歌小组做了一个更大的版本—而不是8个类别,他们在同一时间使用1,000个(Frome et al. (2013)),并采用了一个新的变体(Norouzi et al.(2014))。两者均基于非常强大的图像分类模型(from Krizehvsky et al. (2012)),但以不同的方式将图像嵌入词嵌入空间。
结果令人印象深刻。虽然它们可能无法将未知类别的图像转换为表示该类的精确向量,但它们能够到达正确的领域。因此,如果您要求它对未知类别的图像进行分类,并且这些类别是相当不同的,那么它可以区分不同的类别。
尽管我以前从未见过医术的蛇或者犰狳,如果你给我看一张照片和另一张照片,我可以告诉你这是什么,因为我对每种动物的每一个词都有一个大致的概念。这些网络可以完成同样的事情。
(这些结果都利用了一种“这些词是相似的”推理。但基于单词之间的关系,似乎应该有更强的结果。在我们的词嵌入空间中,男性和女性版本的词语之间存在一致的差异向量。同样,在图像空间中,男性和女性之间也有一致的区别特征。胡须,小胡子,和秃头都是男性强烈,高度可见的指标。乳房和不那么可靠的长发、化妆品和珠宝都是女性的明显标志。即使你以前从未见过国王,如果皇后下定决心要成为国王,突然有了胡子,那就很有理由给出男性的版本。)
共享嵌入是一个非常令人兴奋的研究领域,并且强调为什么深度学习的代表性聚焦视角如此引人注目。
递归神经网络
我们从以下网络开始讨论词嵌入的:
Modular Network that learns word embeddings (From Bottou (2011))
上面的图表示一个模块化的网络,$R(W(w_1),~ W(w_2),~ W(w_3),~ W(w_4),~ W(w_5))$。它由两个模块组成,$W$和$R$,这种方法,从较小的神经网络“模块”构建神经网络,可以组合在一起,并不是很广泛的传播。然而,它在NLP中非常成功。
像上述这样的模型时强大的,但它们有一个不幸的局限性:它们只能有固定数量的输入。
我们可以通过添加一个关联模块$A$来克服这个问题,它将使用两个词或短语表示并合并它们。
(From Bottou (2011))
通过合并单词的顺序,$A$把我们从代表单词到表示短语,甚至代表整个句子!因为我们可以合并不同的数量的单词,我们不需要有固定数量的输入。
把一个句子里的单词线性合并并一定有意义。如果有人认为“the cat sat on the mat”,它可以自然会被分成几个部分:“((the cat) (sat(on(the mat))))”。我们可以根据这个括号来应用$A$:
(From Bottou (2011))
这些模型通常被称为“递归神经网络”,因为人们经常会将模块的输出转换为相同类型的模块。它们有时被称为“树状结构的神经网络”。
递归神经网络在许多NLP任务中都取得了显著的成功。例如,Socher et al. (2013c) 使用递归神经网络来预测句子情感:
(From Socher et al. (2013c))
如果我们能够完成这样的事情,那将是一个非常强大的工具。例如,我们可以尝试制作双语句子表示并将其用于翻译。
不幸的是,这是非常困难的。非常非常困难。考虑到巨大的希望,有很多人在为它工作。
最近,Cho et al. (2014) 在表示短语方面取得了一些进展,有了一种能够对英语短语进行编码并用法语对其进行解码的模型。看看它学习的短语表达!
Small section of the t-SNE of the phrase representation
(From Cho et al. (2014))
批评
我已经听过其他领域的研究人员,特别是NLP和语言学领域的研究人员对上述一些结果的批评。关注的不是结果本身,而是从结果中得出的结论,以及它们与其他技术的比较。
我觉得没有资格说出这些问题。我鼓励有这种感觉的人在评论中描述他们所关心的问题。我觉得没有资格说出这些问题。我鼓励有这种感觉的人在评论中描述他们所关心的问题。
结论
深度学习的表征视角是一种强有力的观点,似乎可以解释为什么深层神经网络如此有效。除此之外,我认为还有一件非常美妙的事情:为什么神经网络是有效的?因为表示数据的更好方法可以从优化的分层模型中跳出来。
深度学习是一个非常年轻的领域,在这个领域理论还没有得到很好的确立,观点也在迅速变化。话虽如此,但我的印象是,目前神经网络中以表现为中心的观点很受欢迎。
这篇文章回顾了我发现的许多令人兴奋的研究成果,但我的主要动机是为将来的一篇文章创造条件,探索深度学习、类型理论和函数式编程之间的联系。如果您感兴趣,您可以订阅我的RSS提要,以便您在发布时看到它。
(我很高兴听到你的评论和想法:你可以在内联或在结尾发表评论。对于输入错误、技术错误或您希望看到的澄清,我们鼓励您对github发起pull request。)
致谢
我感谢Eliana Lorch、Yoshua Bengio、Michael Nielsen、Laura Ball、RobGilson和Jacob Steinhardt的评论和支持。
- 当你有$n$个输入神经元时,为每一个可能的输入构造一个案例需要$2^n$个隐藏的神经元。实际上,情况通常没有那么糟糕。您可以有包含多个输入的情况。您可以将重叠的情况加在一起,以在它们的交集上实现正确的输入。
- (感知器网络不仅具有通用性。sigmoid神经元网络(和其他激活函数)也是通用的:给足够的隐藏神经元,它们可以很好地逼近任意连续函数。看到这一点要困难得多,因为您不能仅仅隔离输入)
- 单词嵌入最初出现在(Bengio等人,2001;Bengio等人,2003),在2006深度学习更新之前的几年,当时神经网络已经过时。分布式符号表示的思想甚至更古老,例如:
(辛顿1986)。 - 开创性的论文,神经概率语言模型(Bengio等人)。
(2003)对于单词嵌入功能强大的原因有很多见解。 - 以前的工作是对标记和图像的联合分布进行建模,但是它采取了非常不同的视角。
- 我很清楚,性别的生理指标可能会误导人。我的意思并不是说,每个秃头的都是男性,或者每个有乳房的人都是女性。只是这些往往表明了这一点,并极大地调整了我们的先验。