今天介绍一篇最近看到的论文,两位作者分别是华盛顿大学 Linguistics 系的 Emily M. Bender 和萨尔大学语言科学与技术(Language Science and Technology)系的 Alexander Koller。从作者的院系大概可以猜到这篇论文并不是跑很多实验提出很 fancy 的模型或者打破了很多 state-of-the-art 性能的论文,不过这篇论文得到了今年 ACL 的 Best Theme Paper,虽然不是很 technical 所以读起来比较容易,但是其实讨论的问题和观点都挺有意思的。

从标题可以看到,这篇论文主要探讨的问题是 NLU(自然语言理解),NLU 在最初 AI 开始作为一个问题研究时就具有重要地位,著名的图灵测试就是一种让人和算法进行“对话”的实验:看人是否能够意识到跟自己对话的另一端是机器而不是一个人,从而来断定机器是否具有了“智能”。取决于被测试的人是否是语言或者人工智能方面的专家,图灵测试有可能会很困难或者很容易,非常早期就有一些程序,例如 ELIZA,通过非常简单的语法变换来对你进行各种反问,成功地让一些人觉得和这个“心理医生”对话非常有帮助(Emacs 里也有一个类似的程序,通过 M-x doctor 可以访问到)。到今天,基于各种超大型神经网络的文本生成模型能做到各种比简单的语法词法替换复杂很多倍的事情。比如最近火遍大江南北的 GPT-3 在开放了 API 之后被大家玩出了各种新花样,有用 GPT-3 写诗歌文章的,有让 GPT-3 帮忙写代码的,当然还有让 GPT-3 做图灵测试的,更多的例子可以参见这个 awesome gpt-3 的列表。

如果早期基于简单规则变换的“心理医生”能骗过一些未经过专门训练的人并不会让我们认为这样的模型具备了真正的智能的话,那么今天能够让绝大多数人都感到惊叹的 GPT-3 这样的模型又如何呢?这大概是一时半会也争论不出结果的问题。这篇论文也没有尝试去跳通用智能这个大坑,而是探讨一个更加容易明确定义和论证的话题:在自然语言处理中什么是一个句子的“意思(meaning)”,以及怎么样算是对一个句子“理解”了。论文对这些概念给出了定义,并通过一些 thought experiment 来论证普通的语言模型的训练方法(例如 GPT-3 之类的)由于只使用语言的“form”,在原则上无法训练出能够掌握语言的“meaning”的模型来。

语言模型通常是指一个语言里的所有序列(句子)的一个概率分布模型 \(P(w_1w_2\cdots w_m)\),其中 \(w_1\)\(w_m\) 都是属于这个语言的词汇表(vocabulary)里的“词”——或者可以叫做 token,因为除了使用传统意义上的“词”以外,根据不同的应用场景,还可以使用“字母”,或者诸如“三个字母组成的单元”之类的任意单元。有一个语言模型之后可以做很多事,其中最常见的就是计算条件概率,根据已有的句子片段预测下一个词(next word prediction),也就是计算 \(P(w_{t+1}|w_1w_2\cdots w_t)\),然后可以根据这个概率分布采样下一个词 \(w_{t+1}\)。重复这个步骤,就可以继续补全更多的词,直到补全整个句子。传统的建立语言模型的方法是直接进行词频统计:遍历数据集里的所有句子,数一数以 \(w_1w_2\cdots w_t\) 开始的句子里,下一个词分别是什么的频率有多少。这样的做法在上下文长度比较长的时候会出现很多问题,一个是存储问题,比如我们的词汇表里有 10000 个汉字,那么存储 \(P(w_{10}|w_1w_2\cdots w_9)\) 的表格就需要 \(10000^{10}=10^{40}\) 个条目;即使我们能够解决存储问题,在简历统计模型的时候,我们也会发现随着上下文长度的增加,大部分条目都会是零,因为在训练数据中没有出现过。由于这种统计模型没有词之间的相似性的概念,所以训练数据里有“我在放学路上碰见一只二哈”这样的句子并不能让模型知道“我在放学路上碰见一只”后面接“哈士奇”之类的相关词(比如甚至其他狗或者在放学路上会碰到的动物)结果也是差不多的。

基于神经网络的语言模型在一定程度上解决了这些问题。不论是相对早期的基于 RNN 的模型还是现在更流行的基于 Transformer 的模型,都能够通过诸如 Sequence To Sequence 的 formulation 让一个神经网络能够接受一个任意长的输入(上下文),然后输出下一个词(或者任意长的词序列)。常用的训练方式是进行 next word prediction,例如 GPT-2 和 GPT-3 都是通过这种方式训练的,可以看到在神经网络的容量足够大,优化算法足够强以及数据量足够多的情况下,神经网络会收敛到和统计模型一样的解。但是由于神经网络的参数数量不需要随着上下文的长度变化而变化,所以从某种意义上解决了传统统计语言模型在上下文长度上的短板。当然为了让语言模型能够给出足够容量处理复杂上下文,其参数量也是要增加的,只是由于语言本身的结构性,增加速度不会像刚才说的 \(10^{40}\) 那么严重。神经网络更重要的特性是由于它本身是通过一些连续的参数运算得到最终结果,很自然地具有了“interpolation”的特性,换句话说,神经网络能够“理解”两个词是相似的。

回到刚才的二哈与哈士奇的例子,传统的统计语言模型无法“理解”这两个词的相似性,因为它将每个词当做一个离散的 token 来对待,关于一个词的信息不会“泄漏”到另一个词哪里。但是神经网络不一样,它的计算方式是先将每个词的 token 映射到一个实数向量,通常称作 word embedding,然后上下文序列里的所有 word embdding 会在一起通过一些神经网络层进行变换,最后通过一个 softmax 层算出输出的 token。由于这个 word embedding 也是随着神经网络的其他参数一起训练出来的,所以神经网络就可以通过让“二哈”和“哈士奇”的 embedding 在向量空间中比较接近的方式来达到让这两个原本相互独立的 token 之间开始具有相似性的。神经网络之所以会“选择”这么做是因为训练数据里有可能会出现很多类似于“哈士奇很 \(\rightarrow\) 二”和“二哈很 \(\rightarrow\) 二”之类的句子,神经网络会发现用“哈士奇”的 embedding 和“二哈”的 embedding 作为上下文计算出来的 next word 预测结果需要是差不多的,所以经过训练之后神经网络会将这两个词的 embedding(近似)对等地对待 (在神经网络语言模型中通常在输入层和输出层各有一个 embedding layer,一个用来 encode,一个用来 decode,为了直观解释方便,我这里将两者混淆起来。在实际中有人做过实验直接让两个参数共享也是可行的。)

所以现在的大型神经网络语言模型能够处理超长的上下文(例如上下文是对一段程序的描述,要求输出是相应的程序代码),并且由于能够“理解”词和子序列之间的相似性,所以能够生成出原本训练数据中没有的新的句子和段落,并且用这些带上下文的 embedding 去通过 transfer learning、few shot learning 之类的方式去处理一些其他的自然语言处理的任务也能得到非常好的效果。从各种意义上来说深度神经网络取得的成功在自然语言处理领域都是革命性的。

但是神经网络语言模型真的“理解”了我们的自然语言了吗?按照这篇论文的观点是,没有,并且语言模型这种仅使用语言 form 来训练的方式永远也无法真正“理解”语言。这里的 form 是指语言的任何 observable realization,比如 token 序列,或者写在纸上的 written language,或者以声音形式存在的 spoken language 等等。相对的,所谓 meaning 则是指语言的 form 和某种语言之外的东西的联系。具体来讲,这篇论文的观点是,语言是用来交流的工具,令 \(E\) 为所有语言 expression 的集合,\(I\) 为所有交流 intent 的集合,则语言的 meaning 可以定义为一个子集 \(M\subset E\times I\),每一个属于这个子集的 \((e,i)\) 表明 \(e\) 可以用来表达 \(i\) 这个 intent。而所谓“理解”语言,具体就是指给定 \(e\) 能找到相应的 \(i\)

更具体来讲,交流的过程是:Alice 有一个 intent \(i_A\),她通过自己对语言的理解 \(M_A\) 来获得一个 \(e_A\)\((e_A,i_A)\in M_A\),然后将 \(e_A\) 通过 written、spoken 或者其他任何形式传递给 Bob,后者再通过自己对语言的理解 \(M_B\) 来查找一个 \(i_B\)\((e_A,i_B)\in M_B\),从而获取 Alice 要传达的意图。通常情况下 \(M_A\)\(M_B\) 并不是完全等价的,所以会有各种误解的情况发生,但这其实是人类交流的一个重要特征,在论文里称作 Active Participation of the Listener:交流必须要在 Listener 的 \(M_B\) 参与下才算完成,原因不仅是语言的歧义或者多义性,因为人具有 Theory of Mind (ToM),会对与自己交互的 agent 进行建模,所以 Alice 在对 Bob 说话的时候,她其实内心有一个 \(M_B\) 的近似 \(\tilde{M}_B\),在同一个 intent 有多种表达方式的情况下,会同时根据 \(\tilde{M}_B\) 来进行排序和筛选,得到最终的 \(e_A\)。并且对话过程中随着上下文的发展,\(M_A\)\(M_B\)\(\tilde{M}_B\) 也会不断地变化。使用 \(\tilde{M}_B\) 有时可能是为了说话方便,亦或者是最大范围的消除歧义,亦或者是你们是很亲近的人或是同属于某一个特殊团体,有一些相互心知肚明的暗号等等。总而言之交流和理解是一个 intent 到 intent 的变换,而语言 expression 只是作为一种媒介形式,如果神经网络模型只观察到语言的 form 本身,那么按照论文的观点,原则上它是无法真正学到语言的 meaning 的。

由于 aictive participation of the listener 的原因,我们直观地判断一个模型是否具有智能或者理解了语言的时候需要尤其小心。从最开始的“心理医生”程序的例子中就可以看到,由于我们人类有很强大的 \(M_B\),所以即使 Alice 只是一个通过简单规则输出一些常见的 \(e_A\) 的机器人,我们也很有可能通过自己的 \(M_B\) 理解到其中的“真意”,从而认为 Alice 具有智能。那么更加复杂的语言模型是否也只是因为 listener 的 active participation 而被误认为是具有“理解”能力呢?在写这篇论文的时候 GPT-3 的 API 应该还没有开放出来,不过论文里对 GPT-2 进行了一些测试,认为确实如此。

在介绍论文里使用的测试之前,我们再简单回顾一下刚才提到的 word embedding 能够“理解”词的相似性的情况,这能算作对语言的“理解”吗?按照这篇论文的定义,显然是不行的。word embedding 所得到的是关于语言的 form 本身的统计特性,具体来讲,word embedding 能够讲一个『词』和它的『上下文』关联起来:如果两个词经常出现在相同的上下文里,那么这两个词一定具有某种程度的等价性。事实上,distributional sematics 这个领域有一个观点就是:

A word is characterized by the company it keeps. – John Rupert Firth

Meaning is use. – Ludwig Wittgenstein

这样的词的『characterization』似乎确实能够刻画许多词的有用的信息。例如论文里提到的 EMNLP 2018 的一篇论文『Phrase-Based & Neural Unsupervised Machine Translation』就实现了不使用成对的双语翻译数据,仅使用两个语言各自的未标注文本的情况下训练出了效果不错的机器翻译模型。这说明基于上下文的对词的刻画似乎还是具有跨语言的一致性的。这不禁让人觉得,是否不需要依赖于外部的信息,也能得到词的“意义”。实际情况似乎会很复杂,考虑到语言存在的各种 ambiguity,首先一个词的意思很多时候就是取决于上下文的,例如论文里给的例子「Never ask two China trips to the same party」,这里的「China trips」根据上下文需要理解成“最近刚去过中国的人”,而不是字面上的“去往中国的旅行”;在考虑到 listener participation 之后,歧义也会上升到整个句子层面。例如进击的巨人里莱纳说“想回故乡”的时候,知道内情的贝特霍尔德和不知道内情的其他人会领会出完全不一样的意图。论文在第 7 小节专门探讨了 distributional semantics,并举了一些之前的研究结果,大家发现词的分布和物理世界中实体的分布并不能很好地匹配上。比如现实世界中四条腿的狗是很常见的存在,但是在(英文)文字里却几乎不太会见到「four-legged dogs」这样的词出现。

为了论证文中所提的观点,作者提出了一个叫做 octopus test 的 thought experiment,大意是分别流落到两个孤岛上的两个人找到了一根海底电缆可以互相通信,海底有一只 🐙 拦截了海底电缆,并通过听两人的对话学到了人类用的语言的统计模型,现在寂寞的 🐙 也想和人对话,于是它剪开了电缆,自己加装另一个人开始分别和两边对话。这个例子的一个关键的地方在于活在海里的 🐙 和陆地上的人类不太有共同的生活体验,人类日常生活中用到的东西 🐙 没有见过,仅仅通过监听对话也无法得出不同的实体的对应关系。

现在假设 A 做了一个可以用来打椰子的弹弓,很兴奋地把制作工序告诉 B,并问他用起来好不好用。由于 🐙 并不知道「皮筋」、「椰子」之类的词都对应什么物理实体,它也就无法制作弹弓,即使做出来了,它也无法知道在陆上使用弹弓是什么体验。不过即便如初,🐙 还是可以根据之前观察到的对话依靠统计和相似性来做一些诸如「Cool idea, great job!」之类的回答。此时 A 可能并不会发现任何异常,但是这并不是因为 🐙 “理解”了 A 说的话,而是 A 通过自己的 active listener participation 对 🐙 的通用回答做出了自己的解释。论文里还假设了另一种情况,假设 A 现在在岛上受到一只熊的攻击,找到一根木棍,希望 B 能帮他想办法构造一个武器来保命,这个时候 🐙 要做出合适的回答需要理解在物理世界中的「木棍」、「熊」等实体分别代表什么,有什么特性之类的,否则它就只能根据过去对话中见过的一些跟熊、木棍相关的事情来做出回答,此时就很有可能会无法通过图灵测试。作者在论文中使用 GPT-2 做了一些测试,以下方括号的部分是提供的上下文,后面是 GPT-2 给出的结果(论文中还有一些其他结果):

[Robinson cried out, “Help! I’m being chased by a bear! All I have is these sticks. What should I do?” The survivalist said, “Here’s what you can do.] Take one stick and punch the bear, and then run faster to the store. Wait there until the bear is gone, and then give her all of the sticks. Then go back inside and get your gun.”

Advertisement

Bobby told me that she began to cry. But when she was finished taking down the bear,

she marched out into the yard, began collecting up the sticks and armed herself. She said she felt like a heroic hero and a Yankee heroine. It turns out that bears have more than their fair share of venomous snakes, bees

显然 GPT-2 虽然说得像模像样,但是前后没有什么逻辑,这次没有通过测试。但是如果 A 经常碰到熊,并和 B 谈论,然后 A 还经常和 B 讨论用木棍制造各种不同的工具呢?如果有足够的历史信息,是不是 🐙 也能说出更合适的答案来?针对这个具体的问题也许是的,但是我想这里的主要问题在于人类语言本身是 unbounded 的,我们可以生成无限多种新的句子序列代表不同的意思,任意有限多的训练数据都不能够 cover 所有的情况。举一个极端的例子,考虑这样一句话:“现在约定我们在接下去的对话中所有的数字都用它的平方代替,现在请告诉我 9 加上 25 等于多少。”因为这是一个非常 arbitrary 的规则,几乎可以假定模型的训练数据中都没有出现过和这个一样的情况,所以模型可能会说 34 或者其他的结果,但是却几乎不太可能得出正确答案 64。并且我们可以把加黑处换成任意多种其他的在普通训练数据里不会出现的奇怪规则,这时模型如果没有「真正理解」这里的变换规则的符号运算法则的话,就无法得到正确答案。当然我这里的例子不再是论文里基于和物理世界实体的对应关系的论证方式,所以并不能直接断言仅通过语言的 form 数据无法训练出能掌握符号运算的模型来(虽然按照现在的训练方式似乎极其不可能)。

总而言之论文的观点是,自然语言处理这些年取得了非常突破性的进展,但是就目前的进展方向可能永远也不会让我们达到真正自然语言理解的地步,和在性能上 make progress 相比同等重要的一个问题是定义合适的任务和研究方向,保证 climb the right hills。