大模型集体翻车:大模型的推理原理

在最近,有人使用生成式AI来比较9.11和9.9哪个数字更大,结果大模型们给出的答案让人大跌眼镜,许多知名的生成式AI全部答错,认为9.11比9.9大,包括Google Gemini、GPT-4o、Claude3.5等一众大模型全部答错:


<!-- Gemini在后续修复了这个问题-->

从以上的结果可以得知,大模型们在面对这个问题时,就是在一本正经地胡说八道,GPT-4o甚至给出了“1比9小,所以要比较到下一位”的荒唐结论,本文将讲解AI大模型的推理的过程与原理。

我们是怎们理解并比较9.11和9.9的大小的?

以下讲解纯个人观点,不喜勿喷

在讲大模型是怎么比较之前,先说一下我们人类是怎么比较这两个数的。

通常,比较两个数字,人类会采用逐位比较的方法,就是从最高位开始,如果相等就往下比较,就拿9.11和9.9来举例子:

  1. 拿到9.11和9.9两个数字,先比较它们的最高位,发现9=9,所以继续比较十分位

  2. 发现在十分位上,9.11中的1比9.9中的9要小,所以9.11比9.9小,比较结束。

#可能有差错,好久没画流程图了,本图默认数字末尾有足够的“0”

从上面的流程图可以看到,人类是将整个数字拆开比较的,出了小数点无法比较外,其它的数字均可以比较大小,从而比较出整个数字的大小,但是在大模型们面对这些数字时,它们往往不能准确地将数字拆成一个个数字。

大模型是怎么比较数字大小的

在具体说怎么去比较数字大小前,先说一下大模型们是怎么理解我们提出的问题的。

  1. 编码器 (Encoder)

  • Tokenization:首先,模型需要将输入文本转化为它能够理解和处理的格式。 这通常通过分词(Tokenization)完成,即将文本切分为一系列的token (词汇单元),每个token可以是单词、子词或字符。

  • Embedding:然后,每个token会被转化为一个密集的向量表示,这称为嵌入(Embedding)。这些向量捕捉了词汇的意义和语境,以及它们之间的关系。

  • Transformer架构

  • 大多数现代LLM基于Transformer架构,该架构由自注意力机制(Self-Attention Mechanism)组成,允许模型在处理序列时关注整个输入序列的不同部分。这有助于模型理解长距离依赖和上下文。

  1. 解码器(Decoder)

  • 在生成响应时,解码器(对于序列到序列的任务)会利用编码器的输出,结合当前的上下文来预测下一个token的概率分布。这一过程会迭代进行,直到生成完整的响应。

  1. 知识检索与融合

  • 虽然基本的LLM通过其内部的训练数据来生成响应,但一些更高级的模型可能会结合外部知识源(如知识图谱或文档数据库),通过检索相关片段来增强其响应的准确性。

  1. 生成策略

  • LLM在生成回答时采用不同的策略,如贪心搜索(Greedy Search)、BeamSearch或采样(Sampling)方法。这些策略决定了模型如何从候选词汇中选择下一个token。

  1. 上下文窗口

  • 大多数LLM具有固定的上下文窗口大小,即模型在生成响应时所能考虑的先前token数量。例如,一个有4096个token上下文窗口的模型,在生成新文本时,最多可以考虑前4096个token的信息。

  1. 后处理与优化

  • 生成的响应可能需要进一步的后处理,比如去重、修正语法错误或调整风格。此外,一些模型还可能使用强化学习技术来优化生成文本的质量和相关性。

8.持续学习与更新

  • 某些LLM可以通过在线学习或增量学习的方式,持续吸收新数据以更新自己的知识库,但这不是所有模型都具备的能力,尤其是那些没有实时网络访问权限的模型。

大家就可以看到,在模型对问题的元素进行切分的时候,token并不会识别词意,所以有可能会做错误的切分,这在数学领域上是致命的,举个例子:9.11和9.9,模型可能会拆分成“9”,“.“,”11“和”9“,”.“,”9“,出现错误的拆分。所以接下来就要看模型推理的语料库里的东西了。

可不幸的是,模型的训练数据来自网络,虽然大部分是对的,但是还可能搜集到一些错误的数据,比如它搜集到一个口嗨网站的数据,那么它在回答”i9 14900KS + RTX4090ti配什么电源“时,会给出”550w“的荒唐答案。

同样,大模型在回答”9.11和9.9的大小“时,就算token切对了,但是还是可能会给出错误的答案,大模型推理答案的过程就像一个幸运大转盘,只不过是不同的答案占比不同罢了,所以因为就算9.11<9.9的答案占比很小,但万一模型在推理的时候,答案的转盘转到它了,那模型给出的答案就是错误的。

如何规避这个问题

可以看到,在上图的提问中,我添加了一个提示词,就是“请写出详细步骤”,这样就能避免大模型步子迈得太大,就像我们平时手动硬算99*99时,大部分人肯定是列竖式算的比心算准一个道理。

这还有一个专业的名词叫Chain of Thought(CoT),具体定义如下:

Chain of Thought (CoT) 是一种在大模型(尤其是大型语言模型)中引导出推理能力的技术。在自然语言处理(NLP)领域,特别是对于复杂的推理任务,CoT 提供了一种结构化的方法,使模型不仅能够给出答案,而且还能展示其推理过程。这种方法对于提高模型的透明度、可解释性和可靠性至关重要。

基本原理

传统的模型提示(prompting)通常只涉及向模型提供一个问题或任务,然后模型直接生成答案。然而,这种方法在处理需要多层次推理的问题时往往表现不佳,因为它缺乏中间推理步骤的指导。CoT 引入了一种新的提示方法,鼓励模型在生成最终答案之前,先输出一系列的中间推理步骤。

例如,考虑一个简单的数学问题:“37加48等于多少?”一个没有CoT的模型可能会直接回答“85”。但是,如果采用CoT方法,模型将首先展示它的推理过程:“首先,我将7加8得到15,写下5并将1进位。然后,我将3加4加1得到8。因此,37加48等于85。”

实现方法

CoT 的实现依赖于精心设计的提示,这些提示通常包含示例问题及其对应的推理步骤和答案。这些示例作为模型的输入,帮助模型学会在生成答案前输出推理过程。例如,训练数据可能包含这样的条目:

输入:“37 + 48 = ?” 示例:

  1. “3 + 5 = 8,7 + 8 = 15,因此 37 + 48 = 85。”

  2. “先加个位数得到15,再加十位数得到8,因此 37 + 48 = 85。”

模型通过学习这些示例,逐渐掌握了在生成答案前输出推理步骤的能力。

应用与优势

CoT 不仅提高了模型在推理任务上的性能,还增加了模型输出的透明度和可解释性,这对于涉及决策制定的应用尤为重要。例如,在法律、医学诊断、财务分析等领域,能够理解模型是如何得出结论的,是非常重要的。

此外,CoT 还有助于模型的泛化能力,即使在数据稀疏或从未见过的任务上也能表现出色,因为模型学会了如何推理,而不只是记忆答案。

最新进展

近期的研究进一步发展了CoT的概念,例如OpenAI提出的“证明者-验证者游戏”方法,旨在提高模型输出的可读性和可验证性。通过让强大的模型生成解决方案,较弱的模型来验证这些解决方案,这种方法促使模型生成既正确又易于理解的答案,同时提高了验证者的判断能力。

摘自:

通俗的来讲,就是让大模型写步骤。

### PyTorch 中 Upsample 操作常见问题及解决方案 在处理 `upsample` 操作时,可能会遇到一些特定的问题。当尝试将 PyTorch 的模型转换为 ONNX 格式时,如果设置了 `align_corners=True`,则会触发名为 `upsample_bilinear2d` 的操作[^3]。 #### 1. align_corners 参数的影响 参数 `align_corners` 控制着双线性插值的方式。默认情况下,在 PyTorch 和 ONNX 中该选项被设为 False。然而,某些应用可能需要将其显式设置为 True 来获得更精确的结果。但是这样做可能导致兼容性问题,特别是在不同框架之间交换模型的时候。 ```python import torch.nn.functional as F output = F.interpolate(input_tensor, scale_factor=2, mode='bilinear', align_corners=True) ``` #### 2. 转换至 ONNX 后的行为差异 一旦启用了 `align_corners=True` 并进行了导出,则生成的 ONNX 文件会在推理阶段执行不同的计算逻辑。这有时会造成精度损失或其他未预期行为。为了克服这个问题,可以考虑调整目标平台上的相应配置或者寻找替代方案来实现相同的功能而不依赖此标志位。 一种可行的方法是在不改变原始语义的前提下修改源代码,使得即使关闭了这个开关也能达到相似的效果: ```python def custom_upsample(x, size=None, scale_factor=None): if not isinstance(size, (list,tuple)): raise ValueError("Size must be a tuple or list.") h,w = size[-2:] y = F.interpolate( x, size=(h+1,w+1), mode="bilinear", align_corners=False ) return y[:,:,:h,:w] ``` 通过上述自定义函数,可以在保持原有功能的同时绕过潜在的跨平台移植障碍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeMicheal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值