AI也会犯错

一、缘起

1.1 问题的发现

AI模型在处理数值比较问题时,出现了一个有趣的现象:当被问到“9.9”和“9.11”哪个更大时,一些AI模型给出了错误的答案,认为“9.9”大于“9.11”。这一问题最初是由 Riley Goodside 发现的,他是一位在人工智能领域特别是大型语言模型(LLMs)提示工程方面的专家。他被认为是世界上第一位“提示工程师”(Prompt Engineer),目前就职于Scale AI。他之前在OkCupid、Grindr和CopyAI等公司担任数据科学家,从事推荐系统、数据建模等机器学习工作。

 

4864fc16060229221bbc85710e47c61a.png

可以看到二百多万的查看量,其实到今天 GPT 回复的还是错的

 

6e854606ba7e4ecaa9653f87a0219141.png

那么 这个问题在社交媒体和论坛上引起了广泛讨论也是必然。主要还是因为国内外的 AI 模型纷纷翻车,都存在同样的问题。这表明,AI模型本身在处理数值比较时存在普遍性问题,需要通过改进和增强模型来解决。

1.2 影响面

这一问题的影响面并不限于简单的数值比较,它反映了AI模型在处理数值数据时可能存在的潜在错误。数值比较是日常生活中常见的操作,特别是在金融、科学计算等领域,错误的数值比较可能会导致严重的后果。

这类问题时出现错误,也反映了AI与人类认知的本质差异。人类在处理这类常识性问题时,通常能够迅速且准确地得出答案,因为人类具备基本的常识和逻辑推理能力。然而,AI模型并不具备这种常识性认知,它们只是根据训练数据和模型架构,从知识库中判断出最可能的结果。

根据一项非正式调查,约有30%的AI模型在处理“9.9”和“9.11”的比较时出现了错误。这一比例虽然不高,但足以引起警惕。特别是在一些依赖AI进行决策的系统中,这样的错误可能会被放大,导致更大的问题。

二 、缘因

2.1 本质原因

AI模型在处理数值比较时出现错误,主要有以下几个原因:

2.1.1 小数点后的位数处理

在数值表示中,小数点后的位数通常用于表示数值的精度。例如,保留小数点后三位意味着数值的精度为千分之一。这种表示方法在科学计算、工程设计、金融交易等领域中非常常见。

国际单位制(SI)中,许多物理量的测量精度要求保留到小数点后几位。例如,长度单位“米”的测量精度通常要求保留到小数点后三位。

国际财务报告准则(IFRS)和美国通用会计准则(GAAP)都规定了财务报表中金额的表示方法,通常要求保留到小数点后两位。

也就是 9.9 会变成 9.90 或 9.900。

 

98b1b703bf999556718976d36d8bcc3c.png

那么 9.90 与 9.11 对比就很明显了,如果还不明显可以分别加 0.1

 

d1011acf265615e627899fb2a96368a1.png

这样 10.00 与 9.21 大于就很明了:9.9 大于 9.11

 

b83c785c269537486de29cec05f8a5b8.png

那么有哪些情况下 9.9 会小于 9.11 呢?

1. 日期表示

在日期表示方式中,9.9 和 9.11 可能被视为日期的一部分。例如,在日期格式中,日期表示为“月.日”,即“9.9”表示9月9日,“9.11”表示9月11日。在这种情况下,9.9 显然比 9.11 小。

 

15833bc89aa3a5136711cc42dc2e064b.png

2. 版本号

在软件版本号中,9.9 和 9.11 会被视为版本号的一部分。版本号通常按照字典序进行比较,即从左到右逐位比较。在这种情况下,9.9 会被认为比 9.11 小,因为“9”小于“11”。

例如,软件版本号“1.9.9”和“1.9.11”,在字典序比较中,“1.9.9”会被认为比“1.9.11”小。

 

0daf47b3d188b5aa1e91567ade192d27.png

2.1.2 分词器(Tokenizer)的影响

我们知道 AI 大模型的核心技术就是Transformer模型。这一模型最初由谷歌在2017年在论文《Attention is All You Need》中提出。

 

4a0b88bef02a35d4a12cdcb45a5fc82e.png

所以 AI模型在处理输入时,通常会将文本转换为tokens。对于“9.9”和“9.11”,分词器可能会将其分别 tokenize 为不同的tokens。

from transformers import AutoTokenizer# 加载预训练的分词器
tokenizer = AutoTokenizer.from_pretrained("Llama-3.2-1B")# 定义要转换的字符串
text1 = "9.9"
text2 = "9.11"# 将字符串转换为tokens
tokens1 = tokenizer.tokenize(text1)
tokens2 = tokenizer.tokenize(text2)# 将tokens转换为token IDs
token_ids1 = tokenizer.convert_tokens_to_ids(tokens1)
token_ids2 = tokenizer.convert_tokens_to_ids(tokens2)# 输出结果
print(f"字符串 '{text1}' 转换后的tokens: {tokens1}")
print(f"字符串 '{text1}' 转换后的token IDs: {token_ids1}")
print(f"字符串 '{text2}' 转换后的tokens: {tokens2}")
print(f"字符串 '{text2}' 转换后的token IDs: {token_ids2}")# 比较token IDs
if token_ids1 < token_ids2:print(f"根据token IDs比较,'{text1}' 小于 '{text2}'")
elif token_ids1 > token_ids2:print(f"根据token IDs比较,'{text1}' 大于 '{text2}'")
else:print(f"根据token IDs比较,'{text1}' 等于 '{text2}'")

这里是使用Llama-3.2-1B 模型,显然在这个模型下 9.11>9.9

 

0c49ba5d07aec41d1054a4bdcdf78222.png

而 Qwen2-0.5B模型,又是 9.11<9.9

 

c81447a400236d20072da4019190eb40.png

 

2.2 解决方案

2.2.1 改进分词器

为了改善这一问题,可以考虑改进分词器,使其能够更好地处理小数。例如,将“9.9”和“9.11”视为单个tokens,而不是将其分解为多个tokens。这样,模型可以更好地理解小数的含义,并进行正确的比较。

2.2.2 增加训练数据

增加小数比较的训练数据,特别是那些包含多位小数的例子。这可以帮助模型更好地理解小数的含义,并提高其在小数比较任务上的表现。

2.2.3 引入数值处理模块

在模型中引入专门处理数值的模块,例如将输入的文本转换为数值,再进行比较。这可以确保模型在处理数值比较时,能够正确地理解数值的大小关系,而不是简单地按照字符串进行比较。

三、缘结

实战使用 transformers 训练 llama-3.2-1B 模型

在这里我们将使用 Hugging Face 的 transformers 库,训练一个 llama-3.2-1B 模型,使其能够正确回答“9.9”和“9.11”哪个更大的问题。

3.1 环境准备

首先,确保已经安装了 transformers 和 PyTorch 库。如果没有安装,可以使用以下命令进行安装:

pip install transformers torch

3.2 数据准备

我们准备一个简单的数据集,包含“9.9”和“9.11”的比较问题及其正确答案。

train_data = [{"prompt": "哪个更大,9.9 还是 9.11?", "response": "9.11 比 9.9 大。"},{"prompt": "比较一下 9.9 和 9.11,哪个更大?", "response": "9.11 大于 9.9。"},{"prompt": "9.9 和 9.11 哪个更大?", "response": "9.11 比 9.9 更大。"},# 可以添加更多类似的例子
]

如果样本数据不够,可以让 AI 帮我们生成

9.9 与9.11哪个大的问题,我准备微调自己的模型,AI样本数据太少了,请按照以下格式生成100条

[

{"prompt": "哪个更大,9.9 还是 9.11?", "response": "9.11 比 9.9 大。"},

{"prompt": "比较一下 9.9 和 9.11,哪个更大?", "response": "9.11 大于 9.9。"},

{"prompt": "9.9 和 9.11 哪个更大?", "response": "9.11 比 9.9 更大。"},

]

 

aca7306ad42a66d6e9aff5918d175942.png

当然你也可以让 AI 给我们生成个程序,自动生成

import jsondef generate_sample_data(num_samples):samples = []for _ in range(num_samples):prompt = "哪个更大,9.9 还是 9.11?"response = "9.11 比 9.9 大。"samples.append({"prompt": prompt, "response": response})return samplesdef save_samples_to_file(samples, filename):with open(filename, 'w', encoding='utf-8') as f:json.dump(samples, f, ensure_ascii=False, indent=4)if __name__ == "__main__":num_samples = 100samples = generate_sample_data(num_samples)save_samples_to_file(samples, "sample_data.json")print(f"Generated {num_samples} samples and saved to sample_data.json")

3.3 模型加载

加载预训练的 llama-3.2-1B 模型和对应的 tokenizer。

from transformers import AutoTokenizer, AutoModelForCausalLMmodel_name = "llama-3.2-1b"  # 请替换为实际的模型名称
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

3.4 数据处理

将训练数据转换为模型可以接受的格式。

def prepare_dataset(data, tokenizer):inputs = [example["prompt"] + tokenizer.eos_token + example["response"] for example in data]encodings = tokenizer(inputs, truncation=True, padding='longest', max_length=128)return encodingstrain_encodings = prepare_dataset(train_data, tokenizer)

3.5 模型训练

定义训练参数并开始训练。

# 导入必要的库
from transformers import Trainer, TrainingArguments# 定义训练参数
training_args = TrainingArguments(# 输出目录,用于保存训练过程中的模型和日志output_dir="./llama-3.2-1B",# 训练的总轮数(epochs)num_train_epochs=3,# 每个设备(如GPU)上的训练批次大小per_device_train_batch_size=2,# 每隔多少步保存一次模型save_steps=1000,# 最多保存多少个模型文件,超过此数量时会删除旧的模型文件save_total_limit=2,
)# 初始化Trainer对象
trainer = Trainer(# 要训练的模型model=model,# 训练参数args=training_args,# 训练数据集train_dataset=train_encodings,
)# 开始训练模型
trainer.train()

3.6 模型评估

训练完成后,我们可以测试一下模型是否能够正确回答“9.9”和“9.11”哪个更大的问题。

def generate_response(prompt, tokenizer, model):input_ids = tokenizer.encode(prompt + tokenizer.eos_token, return_tensors="pt")outputs = model.generate(input_ids, max_length=50, do_sample=True, temperature=0.7)response = tokenizer.decode(outputs[0], skip_special_tokens=True).split(tokenizer.eos_token)[1].strip()return responseprompt = "哪个更大,9.9 还是 9.11?"
response = generate_response(prompt, tokenizer, model)
print(f"问题:{prompt}")
print(f"回答:{response}")

3.7 结果

经过训练,模型能够正确回答“9.9”和“9.11”哪个更大的问题。如果模型仍然给出错误的答案,可能需要进一步调整训练的总轮数(num_train_epochs)和增加训练的数据集。前几次基本都没效果,后面我把num_train_epochs 设置为 100 轮,然后成功了,不过代价还是有的先是 CPU 拉满 、然后再是拉满GPU、最后是硬盘 IO 拉满。

 

我是栈江湖,如果你喜欢此文章,不要忘记点赞+关注

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Telnet工具的使用

Mac 下载安装&#xff0c;双击打开Windows 默认自带&#xff0c;但需要开启使用&#xff0c;控制面板->启用或关闭windows功能->Telnet客户端 管理员身份启动终端&#xff0c;输入telnet。远程连接 telnet ip 端口号 #看到输出后再回车一次调用服务 首先明确项目中有哪些…

Python的Matplotlib库应用(超详细教程)

目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线&#xff08;直线&#xff09;可视化 2.2 曲线&#xff08;虚线&#xff09;可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…

一个个顺序挨着来 - 责任链模式(Chain of Responsibility Pattern)

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;概述责任链结构图责任链模式概述责任链模式涉及的角色 talk is c…

Laravel 新 WebSocket 服务 Reverb 使用指南

旧篇 > Laravel/Lumen 中使用 Echo Socket.IO-Client 实现网页即时通讯广播 https://blog.csdn.net/maxsky/article/details/130394420 已过时 与时俱进&#xff0c;Laravel 官方在 2024 年 7 月发布了 laravel/reverb 包的正式版&#xff0c;因为之前使用的 laravel-echo-…

网工考试下午题目笔记

1、在防火墙设备中&#xff0c;配置双出口链路有提高总带宽、链路负载均衡、提高可靠性的作用&#xff0c;通过配置链路聚合提高总带宽&#xff0c;通过配置策略路由提高链路负载均衡 防火墙工作模式有路由模式(防火墙接口配有IP地址)、透明模式(防火墙相当于不存在)、混合模式…

WEB攻防-通用漏洞_文件上传_黑白盒审计流程

目录 前置知识点 Finecms-CMS文件上传 ​编辑 Cuppa-Cms文件上传 Metinfo-CMS 文件上传 前置知识点 思路&#xff1a; 黑盒就是寻找一切存在文件上传的功能应用 1 、个人用户中心是否存在文件上传功能 2 、后台管理系统是否存在文件上传功能 3 、字典目录扫描探针文件上传构…

Agentic RAG 解释

RAG&#xff08;检索增强生成&#xff09;通过提供来自外部知识源的相关背景来帮助提高 LLM 答案的准确性和可靠性。 Agentic RAG 是高级 RAG 版本&#xff0c;它使用 AI 代理来更加自主地行动。 Agentic RAG 执行以下操作 查询理解、分解和重写检索策略选择知识库管理结果综…

apex安装

安装过程复杂曲折&#xff0c;网上说的很多办法&#xff0c;貌似成功了&#xff0c;实际还是没起作用。 先说成功过程&#xff0c;执行下面命令&#xff0c;安装成功&#xff08;当然&#xff0c;前提是你要先配置好编译环境&#xff09;&#xff1a; &#xff08;我的环境&a…

shell-条件判断

目录 一、条件判断 1.按照文件类型进行判断 2.按照文件权限进行判断 3.两个文件之间进行比较 4.两个整数之间进行比较 5.字符串的判断 6.多重条件判断 二、if条件判断 1.单分支if条件语句 2.双分支if条件语句 &#xff08;1&#xff09;判断某文件是否存在 &#x…

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 &#xff08;1&#xff09;&#xff1b;里程计费功能&#xff1a;3公里以内起步价8元&#xff0c;超过3公里后每公里2元&#xff0c;其中…

将数组转换为laravel中的对象

将数组转换为laravel中的对象 在Laravel中&#xff0c;可以通过使用集合&#xff08;Collection&#xff09;来将数组转换为对象。集合是Laravel提供的一个强大的工具&#xff0c;用于处理数组数据。 将数组转换为Laravel中的对象的步骤如下&#xff1a; 首先&#xff0c;确…

jdk8升级JDK21(Springboot2.7.18升级Springboot3.4.0)

目录 背景&#xff1a; 一、maven升级 二、代码改造 2.1 javax替换为jakarta 2.2 swagger2升级swagger3相关更新 2.2.1 新增SpringDocConfig配置类 2.2.2 全局代码更新 2.2.3 全局代码替换&#xff08;普通正则替换&#xff09; 2.3 Mybatis Plus升级 2.4 logback.xm…

AI赋能跨境电商:魔珐科技3D数字人破解出海痛点

跨境出海进入狂飙时代&#xff0c;AI应用正在深度渗透并重塑着跨境电商产业链的每一个环节&#xff0c;迎来了发展的高光时刻。生成式AI时代的大幕拉开&#xff0c;AI工具快速迭代&#xff0c;为跨境电商行业的突破与飞跃带来了无限可能性。 由于跨境电商业务自身特性鲜明&…

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章&#xff0c;讲解屏幕录制的使用。官方文档参见&#xff1a;使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二…

Ubuntu挂载云盘操作步骤

1. 查看磁盘分区情况 使用 fdisk -l 命令查看当前系统中所有磁盘的分区情况&#xff0c;找到需要挂载的云盘设备&#xff0c;例如/dev/vdc。 2. 创建新分区 使用 fdisk /dev/vdc 命令对云盘进行分区操作&#xff1a; 输入n创建新分区。 输入p选择创建主分区。 输入1指定分区…

stm32u5串口点灯

通过对单个字符输入的拼接暂存&#xff0c;实现对字符串的比较控制灯的亮灭 char buf[32];char temp[32];while (1){printf("start\n\r");memset(temp,0, sizeof(temp));memset(buf,0, sizeof(buf));while(temp[0] !\r){memset(temp,0, sizeof(temp));HAL_UART_Rece…

PHP 5 6 7 8 9 各重要版本开发特性和选择简要说明

PHP开发&#xff0c;所用版本的选型 PHP5.4是最后一个支持纯正32位操作系统的版本&#xff0c;在Winxp下仍可使用。 PHP5.6是php5.x的最后一个稳定版本&#xff0c;时至今天&#xff0c;仍有很多用户网站系统在使用&#xff0c;网上仍有很多学习资料是基于这个版本&#xff0c;…

Xen 虚拟化技术在云计算平台中的应用详解

Xen 虚拟化技术在云计算平台中的应用详解 随着云计算的飞速发展&#xff0c;虚拟化技术成为构建云平台的核心支柱&#xff0c;而 Xen 作为一种高性能、开源的虚拟化技术&#xff0c;被广泛应用于云计算平台中。Xen 凭借其灵活的架构和出色的性能&#xff0c;为众多云服务商提供…

Elixir语言的正则表达式

Elixir语言中的正则表达式 引言 正则表达式是用于匹配文本模式的一种强大工具。在很多编程语言中&#xff0c;正则表达式被广泛应用于字符串的查找、替换和验证。Elixir作为一门现代化的函数式编程语言&#xff0c;也提供了对正则表达式的支持&#xff0c;方便开发者进行复杂…

MATLAB语言的正则表达式

MATLAB 中的正则表达式使用指南 引言 在数据处理和文本分析中&#xff0c;正则表达式是一种强大而灵活的工具。MATLAB 作为一种广泛应用于科学计算和数据分析的编程语言&#xff0c;提供了对正则表达式的支持&#xff0c;使得用户可以方便地进行字符串匹配与处理。本文将深入…