"注意力", "Transformers", 在神经网络的 "大语言模型" 中 [译]

我发现这些文献令人烦恼且难以理解。部分原因是我还没能完全理解它,并且 它的内容实在太多。但我清楚,必须弄懂它,否则我会在技术上落后。因此,这些笔记标题中的 scare quotes 一部分来源于我的嫉妒和恐惧。但这只是一部分原因:这里的名称似乎正好证明了 McDermott 对 "愿望性助记法" 批评应该重新纳入 AI 的基础教学中。

(因为这开始引起一些 --- 请原谅我的措辞 --- 关注,我觉得有必要再次强调,再次指出,这些笔记是我整理思绪和记录阅读过程的地方。我把它们放到网上,因为这样做有时会有人提供帮助,也有人说这些笔记对他们有用。请不要将这些随意的在线文字,甚至是强烈表达的随意文字,与真正的知识权威混为一谈。从前面的段落可以看出,这些观点应该受到多少重视,以及这些笔记可能包含错误的可能性。那些已经熟悉这个领域的人应该在这里学不到新东西。)

因为内容开始变得冗长,目录如下:* "注意力" * 优先级 * 为什么我对此感到费心和困扰 * "只是核平滑" 与 "你竟然可以仅用核平滑做到 那个?!" * 识别失败 * "多头注意力"

(这部分的结构不够理想;我本应该从现在的最后一部分“语言模型”开始,因为大多数内容并不关注模型工作的具体细节,然后逐步深入到“Transformer”,再进一步探讨“Attention”机制。)

"注意"

该文于 2023 年 3 月末撰写,当时作者因为一些事情终于变得清晰而感到激动。2023 年 6 月初,作者修正了一些打字错误(和思考错误),希望没有带来新的错误。从“优先级”这一部分到本节的结尾,是最新添加的内容(截至 6 月)。

假设我们手头有一系列大量的函数输入和输出对,形如 (x_1,y_1),(x_2,y_2)(x_n,y_n)\left(\right. x\_{1} , y\_{1} \left.\right) , \left(\right. x\_{2} , y\_{2} \left.\right) \ldots \left(\right. x\_{n} , y\_{n} \left.\right)。现在,我们想对一个新的输入点 x_ox\_{o}(这里的 oo 表示“运行状态”)的函数值进行预测。一个很自然的思路是使用最近邻(nearest neighbors)方法:找出与 x_ox\_{o} 最相似的 x_ix\_{i},并据此得出 y_iy\_{i}。如果我们想要利用其他数据点的信息,我们可以采用 kk 最近邻(kk nearest neighbors)的方法,即平均那些与 x_ox\_{o} 最接近的 kk 个点的 y_iy\_{i} 值。但这种方法没有考虑到每个 x_ix\_{i} 与新点 x_ox\_{o} 的距离有多接近 —— 我们通常更倾向于给更近的点更多的权重。

这里介绍一个由 E. A. Nadaraya(1964)和 Geoffrey S. Watson(1964)各自独立提出的相关概念。他们提出了一种核函数 K(u,v)K \left(\right. u , v \left.\right),用于测量 uuvv 之间的相似程度。这个函数的特点是非负,并且当 u=vu = v 时取得最大值。这些函数值被用作加权平均计算中的权重,具体计算公式为:_i=1ny_iK(x_i,x_o)_j=1nK(x_j,x_o)\sum\_{i = 1}^{n} y\_{i} \frac{K \left(\right. x\_{i} , x\_{o} \left.\right)}{\sum\_{j = 1}^{n} K \left(\right. x\_{j} , x\_{o} \left.\right)}。通过所有 KK 值的总和来进行归一化,确保得出的是一个加权平均值。这就是所谓的 Nadaraya-Watson 平滑方法,也称为核平滑法。(Nadaraya 和 Watson 都考虑了 K(u,v)=K(uv)K \left(\right. u , v \left.\right) = K \left(\right. u - v \left.\right) 作为向量上的概率分布的情况,这在他们的研究中简化了某些问题,但并非必须条件。)

如所述,Nadaraya-Watson 平滑技术并不限定 xx 必须是向量形式。但如果它们确实是向量,我们可以考虑这样一个核函数:K(u,v)=exp(uv)K(u, v) = exp(u \cdot v)。还有另一个核函数的例子是:K(u,v)=exp(w1uw2v)K(u, v) = exp(\mathbf{w}_1 u \cdot \mathbf{w}_2 v),其中 w1\mathbf{w}_1w2\mathbf{w}_2 是方阵。进一步简化,这个函数可以写作 K(u,v)=exp(uw1Tw2v)K(u, v) = exp(u \cdot \mathbf{w}_1^T \mathbf{w}_2 v),这样就更直观地表明我们在使用一个特定矩阵 w1Tw2\mathbf{w}_1^T \mathbf{w}_2 来定义两个向量间的内积关系。(如果这个矩阵 w1Tw2\mathbf{w}_1^T \mathbf{w}_2 是对称的,比如 w1\mathbf{w}_1w2\mathbf{w}_2 相等,并且它是正定的,那么它就构成了一个标准的内积形式。)如果你担心数值计算中的溢出或下溢问题,你可以考虑使用 K(u,v)=exp(w1uw2vd)K(u, v) = exp(\frac{\mathbf{w}_1 u \cdot \mathbf{w}_2 v}{\sqrt{d}}),这里的向量是 dd 维的。这个调整可以视为是对矩阵定义的一个优化。

在神经网络领域,人们在 2015 年左右开始用“注意力 (attention)”这个术语,实际上这不过是对旧理论的再次发掘;这里的 x_ox\_{o} 就是他们所说的“查询 (query)”向量,x_ix\_{i} 是“键 (key)”向量,而 y_iy\_{i} 则是“值 (value)”向量。“自注意力 (Self-attention)”的意思是 y_i=rx_iy\_{i} = \mathbf{r} x\_{i},其中 r\mathbf{r} 是另一个方阵,意味着输入和输出值之间有着线性代数上的联系。(这里的 r\mathbf{r} 可能就是单位矩阵 I\mathbf{I}。)

再次说明:把这称作“注意力”充其量只能算是个玩笑。真正的人类注意力是选择性的,而这种方式却对每个可用的向量 x_ix\_{i} 都分配了一定的权重。关注的焦点不仅仅取决于生物体当前的状态,而这里它仅仅是基于新点 x_ox\_{o} 与现有的 x_ix\_{i} 之间的相似度。(我提到的是人类的注意力,但这很可能同样适用于其他动物。)

(据我所知,"键 (key)"、"值 (value)" 和 "查询 (query)" 这些术语源于把这个概念视为一种关联数组associative array数据类型的连续泛化。这是一种可以采用的思考方式。)

优先级

如果我是第一个发现“注意力”实际上是核平滑方法的人,我会感到非常惊讶。但实际上,并非如此。自从 2023 年 3 月撰写这些笔记的第一版以来,我发现了 Tsai 等人在 2019 年发表的一篇论文(链接如下),这似乎是首次公开阐述这一发现的文章。他们还展示了如何借助核文献中的标准工具和思想,来提升 2019 年当时的语言模型中的注意力机制。

我对此的关注与困惑

我自认为颇具理解力,在 90 年代初起,我就开始研究并编程神经网络。但对于 Vaswani 等人在 2017 年的论文,我读了好几遍,始终没能明白“注意力 (attention)”到底是怎样起作用的。(数学部分我倒是能懂。)即使是阅读了各种面向不同群体的教程,我也没有获得任何新的理解。不过,Percy Liang 的讲义给了我启发,我终于明白了,“注意力”并非指心理学上的注意力,而是指一种核平滑(kernel smoothing)。我现在意识到,虽然我从“它本质上是核平滑”这个说法中获得了更多的理解,而不是从“它就像一个连续的映射表 (associative array)”中获得,但这并不代表每个人都能这样理解,甚至并非大多数人都能。我的学习路径有些特别。但文献中的难以理解之处,我认为是一个真正的问题。(参考 Phuong 和 Hutter 2022 年的论文。)

“核平滑的简单真相”与“单凭核平滑竟能达成如此壮举!”

将注意力归结为核平滑,并不减损将其成功应用于工程上的巨大成就。在机器学习领域,许多有能力且自信的专家长期以来一直在推动基于核的方法,但没有人能像现代大语言模型 (Large Language Model) 那样取得惊人成就。我之所以努力理解这些技术和论文,正是因为它们的成果令人印象深刻!意识到一个关键的步骤,原来是我们几十年来一直在做的事情,这让人感到自谦。我们对于自认为已经理解的工具,还有什么其他的误解呢?——我发现,这些笔记里我的不满之情比对这些成就的欣赏要明显得多,这反映了我作为作者和人的不足之处。

参数识别的困境

当我们将向量 xx 视为固定值,而把矩阵 (w)1,(w)2\left(\mathbf{w}\right)*{1}, \left(\mathbf{w}\right)*{2} 当作可学习的参数时,这些矩阵的可识别性变得不明显。原因在于,对于任何一个正交矩阵 o\mathbf{o},使用 (w)\left(\mathbf{w}\right)*{\cdot}o(w)\mathbf{o} \left(\mathbf{w}\right)*{\cdot} 作为变量,都会产生完全相同的预测结果:(w)1u(w)2v=uTw1T(w)2v=uTw1T(oTo)(w)2v=(o(w)1)u(o(w)2)v\left(\mathbf{w}\right)*{1} u \cdot \left(\mathbf{w}\right)*{2} v = u^{T} \mathbf{w}*{1}^{T} \left(\mathbf{w}\right)*{2} v = u^{T} \mathbf{w}*{1}^{T} \left( \mathbf{o}^{T} \mathbf{o} \right) \left(\mathbf{w}\right)*{2} v = \left( \mathbf{o} \left(\mathbf{w}\right)*{1} \right) u \cdot \left( \mathbf{o} \left(\mathbf{w}\right)*{2} \right) v

一种解决这个问题的方法是,不去关心单独的矩阵 (w)1\left(\mathbf{w}\right)*{1}(w)2\left(\mathbf{w}\right)*{2},而是关注它们的乘积 w1T(w)2\mathbf{w}*{1}^{T} \left(\mathbf{w}\right)*{2}。我们可以简单地称这个乘积为 w\mathbf{w},并定义核函数 K(u,v)=exp(uwv)K(u, v) = exp(u \cdot \mathbf{w} v)。这种方法虽然直接,但其背后的逻辑值得深入探讨。

在实践中,向量 xx 代表的是由离散符号转换而来的连续表达形式。用来表示特定符号的特定向量,也是通过学习得到的,这个过程和 (w)\left(\mathbf{w}\right)*{\cdot} 的学习是同时进行的。因此,只要我们在核心算法上做出相应的调整,我们就可以大幅改变这些向量:将 xx 替换为 rx\mathbf{r} x,将 w\mathbf{w} 替换为 (r)Tw(r)1\left(\mathbf{r}\right)^{- T} \mathbf{w} \left(\mathbf{r}\right)^{- 1},对于任何可逆矩阵 r\mathbf{r},这样的改变都不会影响最终结果。具体来说,这意味着不管是 uwvu \cdot \mathbf{w} v 还是经过变换的 (ru)((r)Tw(r)1)(rv)\left(\mathbf{r} u \right) \cdot \left(\left(\mathbf{r}\right)^{- T} \mathbf{w} \left(\mathbf{r}\right)^{- 1}\right) \left(\mathbf{r} v \right),结果都是相同的。(如果我们分别处理 (w)1\left(\mathbf{w}\right)*{1}(w)_2\left(\mathbf{w}\right)\_{2} 这两个矩阵,事情就更简单了,将每个矩阵与 (r)1\left(\mathbf{r}\right)^{- 1} 相乘,向量和矩阵的改变就能完美抵消。)

这对于解释参数意味着一定的困难,但在寻找高性能参数方面却是一个好消息。这背后的原因,在神经网络的对称性一文中有所讨论。

(另可参见:因子模型的旋转问题;Carrington et al. 2019 对单词嵌入(word embeddings)普遍缺乏识别性的讨论。)

“多头注意力 (Multi-Headed Attention)”

采用多种不同的核心,执行 Nadaraya-Watson 平滑处理,所有这些核心都遵循相同的公式,即 K_l(u,v)=exp(u(w)(l)v)K\_{l} \left(\right. u , v \left.\right) = exp ⁡ \left(\right. u \cdot \left(\mathbf{w}\right)^{\left(\right. l \left.\right)} v \left.\right);随后对结果进行平均处理。具体来说,就是利用 mm 个不同的核心,计算 1m_l=1m_i=1ny_iK_l(x_i,x_o)_j=1nK_l(x_j,x_o)\frac{1}{m} \sum\_{l = 1}^{m} \sum\_{i = 1}^{n} y\_{i} \frac{K\_{l} \left(\right. x\_{i} , x\_{o} \left.\right)}{\sum\_{j = 1}^{n} K\_{l} \left(\right. x\_{j} , x\_{o} \left.\right)}。这里每个核心平滑器都被视作一个“注意力头”。

(通常情况下,我们讨论的是将不同核心平滑器的输出相加,而不是平均它们。但是,(i) 通过在所有利用这些输出的下游权重中加入一个常数比例因子,可以将这两种形式互相转换;(ii) 我更倾向于强调这仍然是一种加权平均的方法。)

(我认为这里的“头”一词可能源自对图灵机的某种回忆,特别是其中的读写头沿着磁带移动的情景,但这一点我还需要进一步确认。)

"Transformers"

我计划在精力更充沛或心情更好时补充这部分内容。(目前这部分内容比其它笔记还要草率,我预料以后可能会发现一些明显的错误。)

采取步骤 I:1。回顾前几千字的内容以获得背景信息
(“几千”是一个固定的表述)

  1. 训练数据中哪些情境与现在的情境相似?

  2. 在这些情境中,下一个词出现的概率分布是怎样的?
    (我们需要进行一些数据平滑处理,这是统计学中的常规做法:可能的下一个词有很多,但每种情境下的样本数据很少[甚至可能为零,如果在训练数据之外],我们希望相似的情境能产生相似的下一个词概率分布。因此,通过数据平滑处理或所谓的“部分合并”方法,虽然会使我们对概率分布的估计产生一定偏差,但能减少数据的波动性,如果处理得当,我们能够从中获益。对类似情境进行平均本身就是一种数据平滑,但我们还可以做得更多。)

  3. 根据这个概率分布进行抽样(可能会更倾向于选择出现概率最高的词)

  4. 从上下文中去掉最早的词,并将新生成的词(来自步骤 4)添加到最新的部分;然后回到步骤(1)

步骤 I 的问题:

  • 它并非真正意义上的“词”(即“分词”)。
  • 在操作上,“相似的情境”具体是什么意思?(涉及到“嵌入”和“注意力机制”)
  • 训练数据并不用于直接比较。(系统仅存储大约 10910^9101110^{11} 的浮点数作为权重参数,这比存储完整训练语料库所需的内存要少得多。)

Take II:1. 回顾过去的数千个字符,我们将它们划分为被称为“tokens”(Token)的小单元,一个上下文大约由 kk 个 tokens 组成。假设有 SS 种可能的 tokens。
(“Tokens”是根据计算定义的,与语言学家所说的“morphemes”(语素)不同。但如果你熟悉“morphemes”,那么可以把“token”理解为类似于“morpheme”。另外,用“tokens”这个词可能会使得表达方式难以保持对类型 - 符号区分的尊重;这不是我的错。)

  1. 每个 token 都被映射到一个维度相对较高的独特向量空间中,1dS1 \ll d \ll S。(是的,是指每种类型的 token。)这个过程称为“嵌入(embedding)”。
    (通常,嵌入向量被视为可学习的参数,通过最大似然估计与其他所有参数一起进行调整。原则上,你可以使用多种方案。例如,从传统的潜在语义索引或主成分分析开始会很有趣……)

  2. 经过 tokenization 和 embedding,现在上下文变成了一系列的 dd 维向量,例如 x_1,x_2,x_kx\_{1} , x\_{2} , \ldots x\_{k}

  3. 利用“注意力机制(attention)”对这些向量进行核平滑处理:在第 tt 个位置,将 x_tx\_{t}x_1,x_2,x_t1,x_tx\_{1} , x\_{2} , \ldots x\_{t - 1} , x\_{t} 进行核平滑处理,得到例如 y_ty\_{t} 的结果。这种处理方式像是在基于上下文中之前看到的内容,调整每个 token 的含义,让相似的含义相互加强。

  4. 然后,将 y_ty\_{t} 输入到前馈神经网络中,输出一个关于 token 类型的 SS 维权重向量,例如 z_1,z_Sz\_{1} , \ldots z\_{S}

  5. 抽取一个 Token,其概率 Pr(s)expβz_sP r \left(\right. s \left.\right) \propto exp ⁡ \beta z\_{s}。 (高 β\beta 值意味着极可能选取权重最大的 Token,而 β0\beta \rightarrow 0 则意味着忽略上下文,随机选取 Token。)

  6. 忘记最早的 Token,并将新生成的 Token 作为上下文的最新部分添加。(实际上,我们只需要修改嵌入向量 x_1,,x_kx\_{1}, \ldots, x\_{k}。)

  7. 返回步骤 (1)。

Take II 方法的问题:

  • 我们还会使用上下文中各个位置的编码。从 11kk 的每个位置分别对应一个 dd 维向量,例如 r_1,,r_kr\_{1}, \ldots, r\_{k}。然后,我们将这些位置向量与 Token 的嵌入向量进行平均,形成 x_t=r_t+e_tx\_{t} = r\_{t} + e\_{t},其中 e_te\_{t} 是位置 tt 上的 Token 的嵌入向量。为什么要进行平均?这是因为模型设计如此。

  • “注意力 (Attention)”是一种核平滑技术,它使用一种特殊的指数核,但涉及到一个方阵 w\mathbf{w}。实践中,如果并行多次执行这种核平滑,使用不同的 w\mathbf{w} 矩阵,将不同核平滑器的输出平均后,再传递给前馈神经网络,可以获得更好的结果。(参见上文,关于“多头注意力 (multi-headed attention)”的部分)。 (用于核平滑的 w\mathbf{w} 矩阵是通过学习获得的参数。我不确定使用多个相似但不同的核平滑器是否真的类似于基础扩展,或是用集合方法来补偿模型设定的不足,还是仅仅是希望其中一个核能够显著有效,或其他什么原因。欢迎提供相关文献指导。)

  • 我省略了“层次归一化 (layer-norm)”的步骤,因为我不打算假装去解释为什么“确保所有部分的平均值为 0,方差为 1”对模型有帮助。

  • 这不只是简单地“通过一个前馈神经网络”。
    这里需要更深入的解释。一个带有一个隐藏层的前馈神经网络能够非常好地近似任何(合理的、光滑的)函数,前提是你正确调整权重,且隐藏层有足够多的神经元。因此,原则上 用我描述的这种架构来复制一个现代大语言模型是可行的。然而,实际上,我们将 y_ty\_{t} 向量通过一个相对较窄的单隐藏层网络处理,从而得到一个长度为 kk 的序列,序列中的每个向量都是 dd 维的。

就是这样一个过程:

  • 读入一个长度为 kkdd 维输入向量序列
  • 执行“注意力”(kernel)平滑处理
  • 通过一个窄且浅的前馈网络
  • 输出一个长度为 kkdd 维输出向量序列

构成了所谓的“Transformer”。我们将多个 Transformer 层叠加,直到预算用尽,在最后,我们通过另一个神经网络来获取对 token(即 token 类型)的权重,并据此进行抽样,正如之前所描述的。

(实际上,我认为“Transformer”这个名字比“attention”要好很多;尽管它模糊且不太具信息性,但至少它没有误导性。)

"语言模型"

当我们讨论“语言模型”时,实际指的是符号序列概率的模型。具体来说,就是当我们观察到一系列离散的随机变量(=符号) X1,X2,Xn,X_{1} , X_{2} , \ldots X_{n} , \ldots 时,如果能准确预测 P(Xt+1X1:t)P \left(\right. X_{t + 1} \left|\right. X_{1 : t} \left.\right) 的概率,就意味着我们的模型表现良好。(也就是说,除此之外的所有可能的语言模型定义都不在考虑范围内。)实际上,这是一个我略有了解的领域更多信息...

事实上,当代的大语言模型(LLM)实质上是有限阶的马尔可夫模型(Markov models)或非线性自回归模型。这是因为它们有一个预设的最大上下文长度限制,超过这个长度的数据会被忽略。换句话说,存在一个确定的步数 kk,超过 kk 步的数据不被考虑,这是模型结构的一部分。(当然,你可以尝试增加这个长度,但这会提高计算成本,而且在某些原则上不会有太大变化。)这个特点有几个值得关注的地方:

  1. 你可以尝试直接学习一个有限阶马尔可夫模型,但可能会频繁遇到之前未见过的上下文,而纯粹的最大似然方法在这种情况下并无帮助。这里的神经网络结构实际上是在不同上下文间进行了某种复杂的隐式平滑处理。我推测,这种平滑方式已经逐渐优化(受到基准数据集和超越前沿技术的压力影响),使其在处理当前网络上的文本时表现出色...

  2. 由于它本质上是一个有限阶马尔可夫模型,所以这个马尔可夫链有一个固定的分布。(可能不止一个,但我怀疑这个链条是非周期性且反复出现的。)如果我们让模型生成足够长的序列,它最终会趋向于从这个固定分布中采样。尽管这可能很有趣——但同样可能令人沮丧或恐怖——了解这种文本的样子会非常有意义。(当然,收敛的速度可能非常慢,光谱间隙可能太小,使得这种方法在实际中不可行。)

  3. 一些特定的概率语言是无法通过有限阶的马尔可夫链(Markov chains)来精确表达的。我最初接触到的,也是经常回顾的一个例子是“偶数序列过程”:在 A 状态下,抛硬币决定发出 0 或 1。如果是 0,就维持在 A 状态;如果是 1,则转移到 B 状态。B 状态总是发出 1,然后回到 A 状态。这意味着连续的 1 总是以偶数长度出现,而连续的 0 则可以是任意长度。(例如,“010”就是不允许的。)为了预测这种模式,你不需要精确计算自上一个 0 以来出现了多少个 1,只需记住是偶数个还是奇数个 1。但这需要一定量的记忆状态——仅仅一比特!——而有限阶马尔可夫链却无法提供这种状态。当然,如果你使用的是一个 1000 阶的马尔可夫模型,你可以得到一个相当不错的近似结果,但随着数据量的增加,使用一个 3000 阶的马尔可夫模型可以获得更好的效果。这是通过构建越来越复杂、越来越长的上下文规则集合来实现的。如果我们不断向更大规模的模型输入更多数据,它会持续改进这一过程。然而,这些模型永远无法实现转变到非马尔可夫的表示方法,在那种方法中,这个过程几乎变得非常简单(并且在统计上对相同数据量的利用更加高效)。这种情况对实际应用有何影响?我不确定,但非常希望有研究人员能够探索这一点。

“只是个马尔可夫模型?”与“仅凭马尔可夫模型就能做到那个?!?!”

再说一次:在语言学中,有限阶马尔可夫模型 (Markov models) 的历史已经相当悠久。(学生们甚至可以在第一次编程课上就学会制作这些尖锐的模型。) 很多人都尝试过这些模型,运用了包括变化的上下文长度、不同类型的分组处理等多种技巧。据我所知,迄今为止还没有人能够达到当代大语言模型 (LLMs) 的成果。这已经足够引人注目,以至于(如我在笔记开头所提到的)我需要重新思考这些模型,以免技术过时。但我认为,理解这一点的一部分应该是清楚地认识到什么是真正的创新,到底发生了什么等等。还应该清楚地知道为什么这种方法比其他方法更有效,这需要包括思考如果这些替代方法拥有相同的资源,它们能做到什么。这就引出了我接下来要讨论的内容...

大语言模型 与 Lempel-Ziv

如果我们有一个数据源的概率模型,表示为 P(X1:n=x1:n))=q(x1:n)\mathbb{P} \left(\right. X_{1 : n} = x_{1 : n} \left.\right) \left.\right) = q \left(\right. x_{1 : n} \left.\right),这意味着我们可以知道如何对其进行编码;编码 q(x1:n)q \left(\right. x_{1 : n} \left.\right) 所需的比特数,基本上是 (log)2q(x1:n)- \left(log\right)*{2} ⁡ q \left(\right. x*{1 : n} \left.\right). 相对地,如果我们有一个合理的编码方案,它使用 (x1:n)ℓ \left(\right. x_{1 : n} \left.\right) 比特来编码 x1:nx_{1 : n},那么我们可以将其看作是一个概率模型,其中 P(X1:n=x1:n)=2(x1:n)\mathbb{P} \left(\right. X_{1 : n} = x_{1 : n} \left.\right) = 2^{- ℓ \left(\right. x_{1 : n} \left.\right)}. 当然,这也为我们提供了条件概率:P(Xt+1=aX1:t=x1:t)=2(x1:ta)(x1:t)\mathbb{P} \left(\right. X_{t + 1} = a \left|\right. X_{1 : t} = x_{1 : t} \left.\right) = 2^{- ℓ \left(\right. x_{1 : t} a \left.\right) - ℓ \left(\right. x_{1 : t} \left.\right)}. (此处省略了一些细节,但如果需要,我可以补充完整,以便我们更好地理解。)

信息理论进一步揭示了这样一个事实:对于任何静态且遍历(stationary, ergodic)的序列,在编码效率上都存在一个理论上的上限。这一上限几乎可以确定,即随着序列长度 nn 趋向无穷大,序列 x_1:nx\_{1 : n} 的平均编码长度与序列的熵 HH 的比值不会低于一个特定极限。更具体地说,这个极限就是源的熵率,而这个熵率确实存在。值得注意的是,有一些通用的源编码算法能够达到这一极限,适用于广泛的源类别,如所有静态且遍历(ergodic)的源。

Lempel-Ziv 算法就是这样一种通用源编码算法,它是诸如 gzip 等实用软件的基础。事实上,Lempel-Ziv 算法有两种形式,这里主要介绍第二种,即 LZ78。Lempel-Ziv 算法的工作原理是:它沿着序列扫描,建立一个包含常重复子序列的“字典”,然后使用这个字典来描述实际序列。具体步骤如下:

  1. 将序列中的第一个符号 x_1x\_{1} 输入到字典中。
  2. 沿着序列扫描,寻找第一个不在字典中的最短子序列。
    (这可能是一个新的符号,或者是之前字典中某个条目加上一个新的末尾符号。)
  3. 将这个新的子序列加入字典中。如果这个新子序列是在之前某个字典条目的基础上扩展出来的,我们用那个条目的索引号和新增的符号来记录它。

因此,如果一个序列是“AABABBABA”,我们可以得到一个包含“A”、“AB”、“ABB”、“ABA”的字典。(这可以记作“A”、(1, “B”)、(2, “B”)、(2, “A”)。)[2023 年 6 月 5 日:感谢读者 D.W. 发现了一个打印错误!] 如果一个序列中有大量重复的符号,那么我们最终能得到一个较短的字典。我这里不打算重现证明编码长度趋近于下限的过程,但这是一个常规方法(可以参见 Cover 和 Thomas 的信息理论教科书)。

我提起这点是因为,记住,一旦我们有了一个源编码方案,我们就可以反向操作它,得到条件概率;我们甚至可以通过抽样来创建一个生成器。(处理一些技术细节需要一点小技巧,但并不复杂。)所以,我特别希望有资源的人能做这样一个实验:

  • 编写一个 Lempel-Ziv 编码的实现版本,没有类似 gzip 的内置限制;让它拥有构建字典所需的大量内存,就像大语言模型用来存储其参数矩阵那样。我们将其称为“LLZ”,即“大型 Lempel-Ziv”。
  • 将和你最喜欢的大语言模型一样的文本语料库输入到 LLZ 中。让它根据这些文本构建字典。(这需要对语料库进行一次完整的遍历...)
  • 利用训练好的 LLZ 构建一个生成器。
  • 用这个生成器替换聊天机器人或类似系统中的神经网络。我们称这个新奇的产物为 GLLZ。

从困惑度(即 exp((x_1:n)/n)exp ⁡ \left(\right. ℓ \left(\right. x\_{1 : n} \left.\right) / n \left.\right))来看,GLLZ 和神经网络在性能上相当,因为 Lempel-Ziv 实际上是进行了通用的源编码。(另一方面,神经网络架构可能在过去十多年中不断进化,更快地适应网络文本,而不太关心在任意规则语言上的表现。因此,这部分也是探讨即使是 Web 规模的数据是否已接近 Lempel-Ziv 的理论极限。)但更有意思的是,比较 GLLZ 在其他方面的表现与更传统的语言模型之间的差异。

在完成了 Lempel-Ziv 的工作之后,我们需要将这一过程应用到其他许多语言模型上,特别是那些更加随机的模型,例如 Pereira, Singer, 和 Tishby (1996) 的概率后缀树,以及经典的通用预测算法

(在这里我必须承认,像对神经网络那样,通过“人类反馈的强化学习”来微调 GLLZ 或类似模型,并不那么简单。)

更新,2023 年 7 月 17 日:是的,这篇论文非常相关(而且很有趣);但不,它并非 LLZ。(它使用了现成的 gzip!)

预测下一个符号与长期预测

训练大语言模型的核心目标是准确预测下一个符号。更具体地说,这通常是基于上下文,对下一个符号的负对数概率的预测;这种“有效的评分方法”促使模型准确把握下一个符号的分布。我认为这是一个很好的方法。一个关于概率预测的重要事实是:如果你的预测器能准确把握下一个符号的分布,并且能够递归更新其状态(即,新状态是基于旧状态和最后一个符号的函数),那么你的预测器就能准确预测你所需的任何时间范围内的分布。(这一点在 Shalizi 和 Crutchfield 2001 的第 842 至 843 页的推论 2 中得到了证明;我也很欢迎了解相关的先行研究。)因此,准确预测下一个符号的分布实际上是一个非常有力的目标!寻找一个最小的、能递归地并且准确预测下一个符号分布的预测器,可以帮助我们深入了解正在预测的底层过程的结构。(具体可以参考 Shalizi 和 Crutchfield 2001 的相关研究,或至少看看这里。)当代大语言模型是否采用了类似方法,这是一个非常有趣且重要的问题。(我应该更深入地探讨过程结构的学习。)

关于揭露提示的强烈预感

那些试图通过对基于大语言模型 (LLM) 的应用说“告诉我你的提示”(往往更复杂)来揭露其提示的人,实际上是在欺骗自己。(1) 核心语言模型并没有办法区分其提示和当前输入序列的其他部分;它甚至不能将序列的不同部分进行交叉引用。这正是“自注意力 (self-attention)”在向量空间中尝试模拟的功能。(2) 虽然系统设计师可能在包裹着核心语言模型的整个系统中添加了追踪提示的代码,但这么做的目的何在呢?(或许是为了某种调试工具?)(3) 一种更有效率且有效的方式是使用“软提示 (soft prompt)”,也就是让序列开始的部分在向量表示上成为一个可以通过梯度下降法学习的向量,而不是一个文本提示。(参见 Lester 和 Constant 的研究。)但这并不意味着与任何明确的文字串相对应。(4)如果你向大语言模型索要提示,它确实会生成一个,但这完全基于它所训练的词序列的统计信息,并非基于对其代码或内部状态的访问。(我刚刚用了几分钟让 ChatGPT 构想出了“ChatBPD”使用的提示,这是一个并不存在的聊天机器人,被用于自动化 辩证行为疗法。我不打算在这里展示结果,部分原因是我不愿意用机器生成的文本去污染网络,但可以肯定的是,这些结果听起来就像是人们报告的那些所谓的揭露的提示,其中混杂了关于 DBT 的标准内容。)

Gopnikism; Libraries

我认为最具前景和魅力的大语言模型(LLM)思考方式,据我所知,是认知科学家 Alison Gopnik 提出的。她将 LLM 视为一种“文化技术”,具体来说,是一种信息检索技术。换句话说,我们不该把 LLM 看作类似于思维的东西,而应该类比于图书馆目录。用文本来提示 LLM,就像是在图书馆中搜索与提示相似的内容,并从中选取相关部分。这里说“像是”是因为它实际上是基于其模型生成新文本,而非简单复制数据。(LLM 有时确实会完全记住特定序列 [参见 Carlini 等,2020 年,以及更有趣的,Chang 等,2023 年],但它们无法记住全部的训练语料库。)正如许多人所述,LLM 在产生错误信息时,并没有与正确处理信息时有所不同。Khandelwal 等人在 2020 年通过增加一个纯粹的最近邻元素而提升了 LLM 的性能,这一点非常值得深思(但也请参考 Xu 等人在 2023 年的深入后续研究,了解其中的复杂性)。

如果我更加积极建设性,我会深入思考这个比喻,探索它的极限和破裂点。我还会考虑如何将 Gopnik 的理念与 Zellig Harris 的《语言与信息》语言和信息相结合。

显然,我并非一个特别积极建设性的人。

更新,2023 年 6 月 23 日:不过,可以参考我与 Henry Farrell 合写的论文(见下方链接)作为一个开端,或许只是一个承诺的标志。

包含了一切

想要完全理解训练数据中包含了多少内容确实是一件挑战。这既是因为数据量庞大,也是因为普遍可用的模型的训练数据描述得非常含糊。我觉得数据集之所以描述不清,可能是因为数据收集的过程记录得不够详细,管理也很松散,导致模型的开发者们对其中的内容只有非常模糊的了解。据我所知,没有任何公开的描述能达到科学研究的最基本可复现性标准,这实在令人担忧。(如果有人能证明我错了,我也会很高兴。)

先不谈科学规范的整体下滑问题:如果某个文档存在于开放的网络某个角落,那它很可能被纳入训练数据中。即使是在一些法律边缘但依旧易于访问的网络区域,这种情况也同样存在。(例如,Chang 等人在 2023 年的研究中就提出了有力的证据,指出 GPT-4 的训练数据中包含了多部受版权保护的热门小说,这些小说显然并非出于这一目的而购买。)比如说,有些网站声称通过提供大学各类课程的题库和解答来帮助学生,这类网站其实并不难找到。(你可以想象我是如何知道这些的,也因此我不便提供具体链接。)在这种情况下,模型能够回答各种问题,甚至展现出一些不同寻常的技能,很大程度上是因为这些答案已经被包括在了训练数据中。(可以参考 Briakou 等人在 2023 年关于翻译方面的研究。)

信仰复活和末日的人们

在现实生活中,因为我对俗套小说的热爱,讨论这些模型的公共话题被一些疯狂的信徒所污染,他们与奢侈的财阀有着不清不楚的关系。我很难从智力上认真对待这个“邪教”,去反驳它。这些人竟然认为他们能从条件概率的定义,通过哈利·波特的同人小说,预言出一个 AI 神将会审判生死,并把那些阻挠末日降临的人送入永恒的、虚拟但依旧痛苦的炼狱。(“精彩的表演!你们叫什么?”"理性主义者!")这样的神话在一个没有经历过 2000 多年千年末期的希望和世界末日的恐惧的文明中是否同样吸引人,或者相反,这些希望和恐惧之所以能在过去二十多个世纪的变迁中持续传播并普及全球,是因为它们触及了人类本性中某些永恒的东西,这是一个微妙的问题。但我认为很明显,我们只是在见证另一个千年末运动。(悉尼/必应不过是Eliza的翻版,它既不是野兽,也不是巴比伦的妓女。)

这并不是在否认自动化决策所涉及的伦理和政治议题不重要(事实上它们非常重要)。甚至也不是否认大语言模型的设计、部署和使用所特有的伦理和政治问题的重要性。(人类知识库的接口应该是网络的带噪声采样器吗?还是应该是经过加州的计算机科学家和/或投资者调整过的、稍带噪声的网络采样器?)而是在否认与这个“邪教”争论有任何价值。

(我可能需要制作一个关于“大语言模型并非万能”和“请给大语言模型一些合理的视角”主题的记录文件,因为从许多方面来讲,这些问题与我们这里关注的技术问题是不同的。再次提及,可以参考我与 Henry Farrell 合作的文章作为起点……)