目前的AI 到底是背出了答案,还是推理出了答案?

2024-11-19 阅读 81
更新于 2024年11月21日
2024/10/24 update:使文章变得易读。另外,看到讨论比较热烈且有同学想要全英版的,所以这里贴一个英文版链接(用语比本文更严谨):Is Auto-Regressive Language Model Simply Memorizing Answers or Learning to Reason?,欢迎讨论!
最近看到这个比较有趣的问题,来浅答一下:既不是背,也不是推理。
我们主要将目光集中在自回归的language model。自回归的language model,成名作是GPT-2,使用了next-token prediction的unsupervised learning target。由于预测下一个token的training phase可以直接将attention matrix mask成一个三角矩阵,简单方便,所以后面的工作基本都沿袭了这个传统。这个mask后被称为causal mask。Next-token Prediction最大的好处是,在GPT这种架构下预训练是非常scalable的,跟BERT这种依靠mask的模型架构完全不在一个世界。这个想法自从最早期的GPT开始,OpenAI就一直坚持着。到GPT-2发布的时候,用的数据量规模已经初见端倪。到GPT-3的时候,基本宣告用pre-train来进行next-token prediction这条路已经走通了。
最早的GPT其实是一个BERT的竞品,目标是在pre-train后能获得一个具有泛化性的general language model,这个时候next-token prediction本身的效果还不够好。GPT-2开始,这个pre-training task已经可以带出一些比较像样的应用了,比如fine-tune后可以续写小说,做情感机器人(Emotional Bots, Diyi Yang),做decision making(ArCHer, Yifei Zhou)等。到GPT-3,不需要finetune也可以做续写这种简单的任务了,因为pre-train的时候模型已经看过了。直到这个阶段,不会有人宣传GPT这个架构“具有reasoning能力”,因为GPT显然没有能力在推理任务上胜出。直到GPT-4开始,post-training将pre-trained model的能力抬到一个全新的高度后,模型似乎涌现出了一些zero-shot推理能力,比如进行一些数学推导和逻辑判断。后有研究开始基于大量的prompt engineering在小范围的推理任务上胜出fine-tuned model,从这一刻开始,就会有源源不断的媒体开始宣传“GPT-4具有reasoning能力”。
然而,这个阶段的“推理”本质上是“模型在推理任务上具有不错的效果”,而不是“模型本身具有推理能力”。这种不错的效果,究其原因,来源于next-token prediction这种近似流式的训练过程在data distribution中structure出来的一些paradigm在发挥作用,例如GPT-4在大量的serializable的数学、代码数据上训练过,而这些数据也是流式的,可以被next-token prediction比较恰当地建模,这会导致模型在很多情况下可以比较准确地预测pre-train的时候看过的,或没有看过但接近的next token。模型本质上是在vocabulary里面interpolate一个跟pre-train阶段见过的distribution最接近的distribution,然后在这个distribution上用一些test-time的工程技巧,例如beam search和temperature,来预测下一个token。
因为模型在test-time的interpolation总是逼近pre-training dataset里面input token sequence后那个token的distribution(合称paradigm),而dataset中越多类似的paradigm往往意味着越接近“真实的”(与客观吻合的)paradigm,所以模型在pre-training阶段见过越多类似的paradigm,则在test-time会越逼近真实值。例如,模型在infer的时候见到了自己之前infer出来的一个数学公式,而那个数学公式曾经在pretrained dataset里面,那么模型就会include自己之前推出来的那个公式找学过的最接近的下一条公式。
这就是自回归模型的“few-step逻辑”的来源:模型能输出一个个比较短的logic chunk,这些chunk内部是合理的,且相邻的chunk往往是合理的,但是相隔较远的chunk往往是不合理的。从强化学习的角度来看,这就是imitation learning的error accumulation。这也是为什么language model一般zero-shot reasoning能力不强 - language model学到了few-step这种流式的预测,却没有一个精心设计的mechanism(这往往需要动模型结构)去强化推理所需要的planning(如backup)和logic(如many-step/skip-step的逻辑)。因此GPT这个自回归模型架构既不是在背答案(因为有interpolate的能力,即有限的continuous few-step逻辑),也不是在推理(没有planning和many-step/skip-step逻辑)。
之前Anthropic的工作Decomposing Language Models With Dictionary Learning指出,1-layer language model中的大部分神经元可以被用dictionary learning的方法分解为许多单语义的token distrubution。这说明language model中的每个神经元本质上是一些简单语义的superposition,例如一个神经元可能在input token全部为大写时被激活,也可能在input tokens中出现人名时被激活,那么它就是“大写”和“人名”的superposition。我们的工作 CRATE-LM 尝试了更大的GPT-2,发现模型变深后,language model的各层职能开始分化,更深的layer的dictionary learning效果显然变差了,这说明模型深层可能在进行一些更针对前面神经元output的logits关于pre-train目标(next-token prediction)的整合和优化。由于更大的language model很难进行高效的dictionary learning,我们考虑直接将sparsity整合到language model内部,提出了基于CRATE架构的language model。CRATE架构(马毅)是一个数学第一性架构,直接在数学上promote sparsity。我们提出的CRATE-LM拥有更好的神经元解释性,且因为不需要过dictionary learning,所以支持无损编辑。这两份工作都从mechanisitic的角度侧面解答了“language model的内部是否存在reasoning机制”这样的问题:在12L以下的GPT-2 size的以next-token prediction为training target的language model中,并没有audit到任何planning/reasoning mechanism。
那用不同paradigm的post-training能够解决这个问题吗,例如强化学习?从原理上讲,只要训练仍然是完全通过next-token prediction这个target去做的,那么就很难去claim reasoning的能力。一个常用的workaround是,虽然language model本身并不具有reasoning能力,但是可以用它出色的representation去学一些小的reasoning/planning head,这就是一众使用RL来post-train language model的工作(包括我们的RL4VLM)的主要思想。而未来的研究者们仍应放眼更大的世界,尝试思考一些从模型架构本身出发的方法。我相信这现在也已经是general robotics model主要在思考的方向。
当前 AI 模型的推理能力:从“记住”到“推导”现代 AI 模型(如 GPT)并非简单地“记住”答案,而是通过复杂的推理过程逐步生成每个词,形成连贯的回答。这一过程依赖于对上下文的理解和高维向量的计算,而不是简单的记忆检索。以下通过问题“乔布斯是谁?”的例子,详细解析 Transformer 模型生成答案的完整流程。
从“乔布斯是谁?”到生成答案:Transformer 的六个主要阶段一、分词与嵌入向量:从文本到数学表示目标:将自然语言分解为计算机可以处理的数值表示。
过程:模型首先对输入文本进行“分词”(tokenization),将其分解为更小的语言单位(如词或子词)。以“乔布斯是谁?”为例,分词结果可能是:
“乔布斯”、“是”、“谁”、“?”分词后,模型会将这些单位转换为高维的 嵌入向量(Embeddings)。嵌入向量是用来表示词语语义的数值向量。
嵌入向量:语言的数学表达嵌入向量是一种将语言映射到高维空间的方式。它不仅表示词语的语义,还捕捉它们的语境关系。简单来说:
语义相近的词会更靠近: 例如,“乔布斯”和“苹果公司”在向量空间中的距离较近,而“乔布斯”和“香蕉”则距离较远。语境敏感: 嵌入向量能根据句子上下文动态调整。例如,“苹果”在“苹果公司”和“吃苹果”中的嵌入向量会不同。假设以简单的三维向量表示分词后的嵌入结果:
“乔布斯”:[0.3, 0.4, 0.5]“是”:[0.2, 0.1, 0.3]“谁”:[0.6, 0.5, 0.4]“?”:[0.1, 0.2, 0.1]这些向量并非随机生成,而是通过模型在海量语料上的训练逐步学习得到的。每个数字反映了模型对词语语义某个方面的理解。
嵌入向量的特点:语义相似性:相似的词在向量空间中会更靠近。例如,“乔布斯”的向量如果与“苹果公司”的向量距离较近,表示模型理解它们的关联性。语境敏感:嵌入向量可以根据上下文动态变化。例如,“苹果”在“苹果公司”和“吃苹果”中的含义不同,嵌入向量也会不同。语义计算能力:嵌入向量还能捕捉隐含的逻辑关系。例如,向量运算“国王 - 男人 + 女人 ≈ 女王”说明模型能够识别词语的隐式语义关系。二、生成 Q、K、V 向量:自注意力机制的核心在生成嵌入向量后,Transformer 模型进一步为每个词创建三组新向量:Query(Q)、Key(K) 和 Value(V)。这些向量是自注意力机制的核心,通过它们的交互,模型能够理解句子中词语之间的关系,并为上下文表示的计算奠定基础。
Q、K、V 向量的生成与意义生成过程:每个词的 Q、K、V 向量是通过对嵌入向量进行线性变换得到的。这些线性变换由学习得来的参数矩阵完成。
Query(Q): 表示当前词的“提问需求”。
Q 向量告诉模型,该词需要从其他词获取哪些信息。例如,“乔布斯”的 Q 向量表示它“询问”的内容。Key(K): 表示当前词的“特征”。
K 向量帮助其他词判断是否与当前词相关联。例如,“谁”的 K 向量是它在语境中的特征标识。Value(V): 表示当前词携带的信息值。
V 向量是当前词对信息传递的贡献,用于生成最终的上下文表示。功能定位:
在自注意力机制中,Q 是“提问者”,K 是“被提问者”,V 则是携带“答案”的内容。这三组向量为词语之间的交互奠定了基础。
示例分析假设输入句子是“乔布斯是谁?”,模型为每个词生成以下 Q、K、V 向量:
“乔布斯” Q_{\text{乔布斯}} = [0.5, 0.6, 0.7] \( Q_{\text{乔布斯}} = [0.5, 0.6, 0.7] \), K_{\text{乔布斯}} = [0.2, 0.3, 0.4] \( K_{\text{乔布斯}} = [0.2, 0.3, 0.4] \), V_{\text{乔布斯}} = [0.4, 0.3, 0.6] \( V_{\text{乔布斯}} = [0.4, 0.3, 0.6] \) “是” Q_{\text{是}} = [0.3, 0.2, 0.4] \( Q_{\text{是}} = [0.3, 0.2, 0.4] \), K_{\text{是}} = [0.1, 0.2, 0.1] \( K_{\text{是}} = [0.1, 0.2, 0.1] \), V_{\text{是}} = [0.3, 0.2, 0.1] \( V_{\text{是}} = [0.3, 0.2, 0.1] \) “谁” Q_{\text{谁}} = [0.7, 0.8, 0.5] \( Q_{\text{谁}} = [0.7, 0.8, 0.5] \) , K_{\text{谁}} = [0.6, 0.4, 0.3] \( K_{\text{谁}} = [0.6, 0.4, 0.3] \) , V_{\text{谁}} = [0.5, 0.6, 0.7] \( V_{\text{谁}} = [0.5, 0.6, 0.7] \) “?” Q_{\text{?}} = [0.1, 0.2, 0.1] \( Q_{\text{?}} = [0.1, 0.2, 0.1] \) , K_{\text{?}} = [0.2, 0.1, 0.3] \( K_{\text{?}} = [0.2, 0.1, 0.3] \) , V_{\text{?}} = [0.1, 0.2, 0.1] \( V_{\text{?}} = [0.1, 0.2, 0.1] \) 这些向量不直接表征语义,但为后续的注意力计算提供了数学基础。
自注意力机制通过 Q、K、V 的交互捕捉句子中词语之间的关系。具体步骤如下:
1. 向量交互:点积计算
每个词的 Q 向量与所有其他词的 K 向量逐一点积,计算相关性:
点积结果表示两个词的相似性或关联程度。 例如, Q_{\text{乔布斯}} \cdot K_{\text{谁}} \( Q_{\text{乔布斯}} \cdot K_{\text{谁}} \) 的点积值越大,说明“乔布斯”和“谁”的关联性越强。 2. 权重分布:Softmax 函数
点积结果通过 Softmax 转化为概率分布,表示每个词对当前词的注意力权重: \alpha_{ij} = \frac{\exp(Q_i \cdot K_j)}{\sum_k \exp(Q_i \cdot K_k)} \[ \alpha_{ij} = \frac{\exp(Q_i \cdot K_j)}{\sum_k \exp(Q_i \cdot K_k)} \]
权重 \alpha_{ij} \( \alpha_{ij} \) 表示当前词 i \( i \) 对其他词 j \( j \) 的关注程度。3. 信息聚合:加权求和
使用权重 \alpha_{ij} \( \alpha_{ij} \) 对对应词的 VV 向量加权求和: C_i = \sum_j \alpha_{ij} \cdot V_j C_i = \sum_j \alpha_{ij} \cdot V_j
最终生成词 i \( i \) 的上下文向量 C_i \( C_i \) ,包含了该词与其他词的综合语义信息。 Q、K、V 向量的意义与应用通过生成 Q、K、V 向量,模型实现了对句子中词语关系的动态建模。这种机制使 Transformer 模型能够灵活处理复杂的语义结构,例如:
长距离关系建模:
在翻译任务中,“乔布斯是谁?” 的注意力机制会捕捉到“乔布斯”和“谁”之间的语义关联,而不会被中间的“是”干扰。
语义提取:
在问答系统中,自注意力机制帮助模型提取问题的核心信息,并匹配答案内容。
三、点积计算:衡量词语间的相似性在生成 Query(Q) 和 Key(K) 向量后,模型通过点积计算评估词语之间的相似性。这一步是自注意力机制的核心,它帮助模型识别句子中各词的语义关联程度,从而更高效地分配注意力,关注句子中的关键词。
点积计算的原理点积是一种简单的向量运算,用于衡量两个向量的方向相似度。具体来说,点积结果表示两个向量的匹配程度。数值越大,说明两者在方向上越接近,语义关联性越强。
点积计算公式如下:
\text{相似性得分} = Q_i \cdot K_j = \sum_{n=1}^d Q_i[n] \times K_j[n]\text{相似性得分} = Q_i \cdot K_j = \sum_{n=1}^d Q_i[n] \times K_j[n]
其中, Q_i \( Q_i \) 是某个词的 Query 向量, K_j \( K_j \) 是另一个词的 Key 向量, d \( d \) 是向量的维度。
示例分析:计算“乔布斯”与其他词的相似性以句子“乔布斯是谁?”为例,我们计算“乔布斯”的 Query 向量与其他词的 Key 向量的点积,评估其语义关联性。
输入数据:
“乔布斯”的 Q_{\text{乔布斯}} = [0.5, 0.6, 0.7] \( Q_{\text{乔布斯}} = [0.5, 0.6, 0.7] \) “谁”的 K_{\text{谁}} = [0.6, 0.4, 0.3] \( K_{\text{谁}} = [0.6, 0.4, 0.3] \) “是”的 K_{\text{是}} = [0.1, 0.2, 0.1] \( K_{\text{是}} = [0.1, 0.2, 0.1] \) “?”的 K_{\text{?}} = [0.2, 0.1, 0.3] \( K_{\text{?}} = [0.2, 0.1, 0.3] \) 1. 计算“乔布斯”与“谁”的相似性得分点积公式:
\text{相似性得分} = (0.5 \times 0.6) + (0.6 \times 0.4) + (0.7 \times 0.3) \[ \text{相似性得分} = (0.5 \times 0.6) + (0.6 \times 0.4) + (0.7 \times 0.3) \]
计算过程:
\text{相似性得分} = 0.30 + 0.24 + 0.21 = 0.75 \[ \text{相似性得分} = 0.30 + 0.24 + 0.21 = 0.75 \]
2. 计算“乔布斯”与“是”的相似性得分点积公式:
\text{相似性得分} = (0.5 \times 0.1) + (0.6 \times 0.2) + (0.7 \times 0.1) \[ \text{相似性得分} = (0.5 \times 0.1) + (0.6 \times 0.2) + (0.7 \times 0.1) \]
计算过程:
\text{相似性得分} = 0.05 + 0.12 + 0.07 = 0.24 \[ \text{相似性得分} = 0.05 + 0.12 + 0.07 = 0.24 \]
3. 计算“乔布斯”与“?”的相似性得分点积公式:
\text{相似性得分} = (0.5 \times 0.2) + (0.6 \times 0.1) + (0.7 \times 0.3) \[ \text{相似性得分} = (0.5 \times 0.2) + (0.6 \times 0.1) + (0.7 \times 0.3) \]
计算过程:
\text{相似性得分} = 0.10 + 0.06 + 0.21 = 0.37 \[ \text{相似性得分} = 0.10 + 0.06 + 0.21 = 0.37 \]