【老万】从0开始学chatGPT(九):有一种AI叫关注
本文是我的学习心得《从0开始学chatGPT》系列第九篇,欢迎按需阅读:
上学时,我们多少都有过这样的经历:老师在黑板上奋笔疾书,念念有词:“同学们,我们刚才讲的是‘奇变偶不变,符号看象限’,期末必考,大家快划重点......”而你却已神游太虚,心心念念的是隔壁班的那个女孩怎么还没经过你的窗前,不知不觉流露出似笑非笑的表情。突然空中飞来一个粉笔头:“XXX,你又走神了。集中注意力!”你打了个冷战,连忙把思绪从万仞之外硬拉回来。
没有注意力的人类不是好学生。同样,离开了注意力,大语言模型也无法胜任深度学习的任务。chatGPT 让人惊艳的表现很大程度上依赖于谷歌发明的 transformer(变换器)架构,而 transformer 的过人之处在于它有一种机制可以高效并行地捕捉输入字符间的相关性,即便是相隔很远的字符也不放过,从而准确理解自然语言。这就是我们今天要学习的注意力(attention)机制。
准确地说,transformer 采用的是一种特殊注意力机制,叫自注意力(self-attention)。自注意力的“自”,不是说这个大模型自觉将注意力放在关键词上,不待扬鞭自奋蹄,也不是指大模型对自己念念不忘,天生丽质难自弃。它指的是这个机制捕捉的是同一序列内部各个记号之间的关系。比如输入有 2048 个记号,自注意力机制就会计算每两个记号间的关系强弱,一共 2048x2048 对。
除了自注意力之外,大语言模型是不是还有其它注意力机制呢?答案是肯定的。比如一个专门做汉语到法语翻译的模型,可能会计算每个法语单词跟不同中文字符间的关系。因为这是不同序列的记号间的关注(从输出序列的记号到输入序列的记号),它就不算是自注意力了。
很多人和我一样,对这个自注意力机制知之甚少。只知道它厉害,但不知道为什么厉害,更不清楚它的构造。出于好奇,我学习了自注意力机制的原理,现在把心得分享给大家。读完这篇文章以后,别人再谈到这个话题时,你就不必再顾左右而言他,而是可以轻咳一声,说:这个问题嘛,兄弟(姐姐)我当年读过《老万故事会》,正好略知一二......
当然,我是在开玩笑。我们学习的目的不是为了装逼,而是在当下浮躁的环境中追求真知识,增强自己适应 AI 时代的能力。自己懂得足够多,才不会被不良媒体忽悠瘸了,对吧?
~~~~
我们先从大面上说说自注意力机制是如何工作的。
在自然语言处理研究的早期,大家觉得机器要懂人类的语言,必须精通语法。于是,在现代语言学开山鼻祖诺姆·乔姆斯基老爷爷指引下,语言学家和计算机科学家们前赴后继,忙着为人类的语言建立越来越精确完备的语法。他们期望自然语言的语法大楼封顶那天,机器可以完美地理解人类的意图。
语言学家乔姆斯基。学过《编译原理》的同学们基本上都曾被他七十年前(!)发明的上下文无关文法折磨到怀疑人生。
不幸的是,大家沿着这条路跑了几十年也没到达光明顶,倒是半道上进了死胡同。万众瞩目的大楼眼看就要烂尾了。
因为,语法学得再好,缺乏常识也是不行的。
要是不信,只需看看“老王给老张送了一顶绿油油的帽子,他一气之下赏了他一个大嘴巴”这句话。很简单吧?每个有中国生活经验的成年人都不难理解:第一个“他”是老张,第二个“他”是老王。也就是说,这两个“他”分别与老张和老王有强相关。
如果拿这句大白话去考一位不懂中国文化的语言学教授,他多半只能傻眼。因为,这里的每个“他”都有 50% 的可能是老王,也都有 50% 的可能是老张。从语法来说,这两种可能都一样合理,不分伯仲。
GPT 走的是完全不同的路子。它根本不管语法,而是通过学习大量语料中字词间的统计相关性,形成了一种语言直觉,你说上文它就能接下文。虽然没有语法的概念,不妨碍它说起话来头头是道。
自注意力机制的目的,就是让机器通过训练学会分析字词间的相关性。它比语法更强大,能神奇地让机器知道第一个“他”应该和“老张”而不是“老王”相关联。
要想知道自注意力如何做到这点,我们得回顾一下 GPT 是如何给文字编码的:
既然大语言模型可以通过学习语料掌握文字规律,我们自然容易想到让机器通过学习找出输入向量间的关注度(关联程度)。注意,这里的关注度不是通常意义上的语义近似性。例如,“老王”、“老张”和“他”在语义上有不同的作用,在一般情况下不能互换。但是在某个具体的语境里,我们可以明确得出第一个“他”对“老张”关注度高,第二个“他”对“老王”关注度高的结论。
下面这个图展示的是句子里第一个“他”对其它字符的关注程度,线条越粗程度越高:
为计算这种关系,我们需要构建一个子神经网络网络(这就是我们说的自注意力机制),它的输入是 n 个记号的输入向量,输出是一个 n x n 的矩阵,其中第 i 行 j 列的元素代表第 i 个记号关注第 j 个记号的程度。
~~~~
科学家们发现,自注意力机制的网络结构直接影响到模型的效果。如果只是把一堆神经元随随便便一连,是难以学习到字词间的关注度的。我们需要用一定的结构去引导神经网络的“思路”,它才能学得快、学得好。
如何设计这个结构呢?
我们可以从人类的求偶行为中寻求启示。相过亲的伙伴们都知道,征婚时要在一页纸的篇幅内写清楚自己的个人条件和择偶要求。这是因为在重大问题决策时必须摒弃次要因素,抓住主要矛盾。考虑的因素太多,眉毛胡子一把抓,就会只见树木不见森林,走上歪路。
在大语言模型中,每个记号都用一个几百甚至几千维的输入向量表示。这个向量包含了记号的全部信息,但这些信息在我们寻找记号关注度时并不是同样重要。为了不被那些不重要甚至无关的信息干扰,我们需要先做一个投影变换,从高维向量里抽取一些对关注度分析重要的、最能代表记号特征的关键维度(相当于求偶时的个人简介),叫做这个记号的键向量(key vector),再抽取几个代表这个记号最想关注的特征的维度(相当于择偶要求),叫查询向量(query vector)。
此外,我们还从每个输入向量中投影出一个值向量(value vector),代表这个记号在这个上下文中的意义。相同的记号在不同的语境里投射出来的值向量是不同的,这可以帮助模型灵活准确地理解语义。
每个输入记号都有自己的键向量、查询向量和值向量,有 n 个记号就有 n 组向量。这部分的神经网络结构是这样的:
自注意力机制就是一位负责任的红娘,拿到这堆“征婚要求”和“个人简介”后,会细心地一一做相似度匹配,找出每个记号的最佳匹配对象。
首先,它把这 n 个查询向量(征婚要求)和 n 个键向量(个人简介)逐对做相似性比较,得到一个 n x n 的实数矩阵 Z(注意力矩阵)。这个矩阵第 i 行 j 列的元素 z_ij 就是第 i 个记号对第 j 个记号的关注程度(第 i 位嘉宾对第 j 位嘉宾的心动程度)。
这部分结构如下:
我们来看:
正如人会自恋,记号也会关注自己。注意力矩阵的对角线就是每个记号关注自己的程度。
通常爱情是不对称的:我爱你不等于你爱我。这个世界充满了这种不对称性带来的悲剧 - 这就是现实。同样,一般来说注意力矩阵也不是沿对角线对称的:z_ij 不一定等于 z_ji。
自注意力机制跟找对象也有不一样的地方。按今天人类普遍接受的道德规范,每个人一次只能处一个对象,否则就是海王/渣女。但在自注意力机制里,每个记号不是死心塌地关注一个最佳记号,而是会把所有输入记号的值向量按自己感兴趣的程度做一个加权平均,去关注这个“混合记号”。
把这几个部分合起来,就得到了 transformer 自注意力机制的结构:
这个自注意力子网络的输出还会接到一个前馈神经网络(Feed-Forward Neural Network,FFNN)子层,对输入序列中的每个记号进行独立的、非线性的变换。自注意力机制和前馈神经网络加在一起才构成一个完整的 transformer,GPT 有几十上百个 transformer 串联在一起。这个 FFNN 不是我们今天的重点,就不深入了。
~~~~
下课铃响了。
如果你只想对自注意力机制有个浅尝即止的了解,或者你的注意力已经消磨殆尽,现在就可以收藏、转发、点赞了。
要是你和老万一样是个细节控,喜欢打破砂锅问到底,我们下次可以更深入地了解自注意力的数学细节和多头(multi-head)自注意力机制。I'll be back.
(除图表、照片外,本文插图由 Midjourney 生成。)
~~~~~~~~~~
猜你会喜欢:
谷歌对微软:代码管理工具哪家强?- 要集中还是要分布
谷歌新语言 Carbon 能干翻 C++ 吗?- 深入浅出分析 Carbon
后 C++ 演义(第一回、第二回) - 起底 C++ 发明人比雅尼
后 C++ 演义(第三回) - C++ 的最新发展
程序员护发秘籍 - 掌握这些工作技巧,包你不脱发
程序员的核心技能 - 以脱口秀的方式讲解程序员最重要的技能
如何做出保鲜十年的软件 - 老码农冒死披露行业内幕系列
dongbei 语言满月记事 - 一种基于东北方言的娱乐式程序设计语言
~~~~~~~~~~
关注老万故事会公众号:
本公众号不开赞赏不放广告。如果喜欢这篇文章,欢迎点赞、在看、转发。谢谢大家🙏