一、从0开始预训练1.4b中文大模型实践

这篇文章主要记录了作者对1.4b中文大模型的实践复现过程。作者选择了QWEN作为基座模型,并训练了一个参数量达到1.4b的预训练模型,其中涉及的训练token数量约为8b。

这篇文章主要记录对1.4b中文大模型的实践复现过程。我选择了QWEN作为基座模型,并训练了一个参数量达到1.4b的预训练模型,其中涉及的训练token数量约为8b。在此过程中,我使用了两张a100 80g显卡,并耗费了大约100个小时的训练时间。尽管这个规模无法与其他大型模型相媲美,但我也取得了一定的效果。

项目:

https//github.com/jiahe7ay/MINI_LLM

动机

实践纪录的动机主要如下:

1.在阅读了Allen实验室发布的关于OLMO模型的技术报告后,我深受启发。他们不仅详细介绍了模型的训练细节,还大方地开源了整套大模型构建的代码,涵盖了数据处理、训练、评估等各个环节。这种开源精神让我深感敬佩,我也想为开源尽自己的一份薄力。

2.其实自己尝试预训练一个大模型,这是我一直以来都非常想尝试做的事情,由于对自己的能力和所拥有的资源持有疑虑,我一直未能付诸实践。然而,机缘巧合之下,我在github上看到了这两个项目:

  1. baby-llama2-chinese
  2. Phi2-mini-Chinese

在深入研究了上述两个项目后,我深受启发,意识到个人尝试复现一个大模型是完全可行的。因此,我决定基于这两个项目的成功经验,结合我自身的需求,更换它们所使用的模型和训练数据集。通过这一尝试,我希望能够训练出属于我自己的“大模型”。通过这样的实践,我能够更深入地理解预训练模型的工作原理,并为我未来的研究和工作积累宝贵的经验。

3.随着技术的不断发展和资源的日益丰富,越来越多的大厂开始关注参数量相对较小的大模型,如qwen-0.5b和phi-2b等。这一趋势让我意识到,在未来,参数量相对较小的大模型可能会在大模型领域中占据一席之地。

相较于庞大的模型,参数量相对较小的大模型具有更低的计算需求、更快的训练速度和更少的资源消耗。这使得更多的个人和团队能够参与到大模型的训练和应用中,推动了技术的普及和发展。同时,这类模型也在某些特定任务上展现出了不俗的性能,证明了其在实际应用中的价值。

总的来说,我个人非常看好参数量相对较小的大模型的发展前景。

细节

模型基座的选择

在我的项目中,我选择了QWEN作为基座模型,并将其配置扩展至1.4b参数规模。具体的修改细节,您可以在我的项目中的模型config文件中找到。我主要调整了模型的注意力头数和层数,以适应我现有的算力资源。当然,每位研究者都可以根据自己的需求和资源情况来进行相应的调整。

选择QWEN模型的原因在于,我认为它是一个成熟且稳定的中文开源大模型。此外,我注意到其他大模型复现项目通常都会自行训练tokenizer,但考虑到我个人并不希望在这一步骤上花费过多时间和精力,我决定从现有的开源项目中选取一个tokenizer。经过对比不同项目的tokenizer的压缩率和训练规模,我发现QWEN的tokenizer表现优异,因此我最终选择使用它,并决定整个模型也采用QWEN。毕竟,我的目标主要是进行复现实践,而非创造出一个新的模型。

训练数据的选择

1.wikipedia-cn-20230720-filtered:本数据集基于中文维基2023年7月20日的dump存档。作为一项以数据为中心的工作,本数据集仅保留了质量较254,547条高的词条内容。

2.中文BaiduBaiKe的数据

3.天工150b中文预训练数据集:因为算力资源限制,我只下载了前20个文件

4.bell数据集:使用了这数据集中的2M,0.5M和1M作为sft的训练数据集

训练集构造

在数据预处理阶段,我遵循了QWEN的通用做法,即在每个文章的末尾加上一个特定的结束符号“<|im_end|>”。这个符号的作用在于清晰地界定单篇文章的边界,确保模型在训练时能够准确地识别出文章的结束位置,从而与下一个文章进行区分。

此外,考虑到模型训练对输入序列长度的限制,如果文章长度超过了这一限制,我会进行截断处理。具体来说,我会将超长的文章截断至规定长度,并将截断的部分作为下一个样本。这样做不仅保证了模型输入的合规性,同时也充分利用了原始数据,避免了信息的浪费。

这种数据预处理方式既遵循了行业内的常见做法,又考虑到了模型训练的实际需求,有助于提升模型的训练效果和泛化能力。

环境

如果安装了flash-attn的话,训练速度大概能提升20%,但是我发现这个flash-attn越来越不好装了。

具体的requirements如下:

datasets
transformers==4.36.0
torch==2.2.0
accelerate==0.27.2
einops==0.7.0
flash-attn==2.5.5
tiktoken
einops
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

训练参数

预训练参数如下:

per_device_train_batch_size=24,
    per_device_eval_batch_size=4,
    gradient_accumulation_steps=10,
    num_train_epochs=1,
    weight_decay=0.1,
    ddp_find_unused_parameters=False,
    warmup_steps=0,
    learning_rate=1e-4,
    evaluation_strategy='steps',
    eval_steps=100,
    save_steps=50,
    save_strategy='steps',
    save_total_limit=4,
    report_to='tensorboard',
    optim="adamw_torch",
    lr_scheduler_type='cosine',
    bf16=True,
    logging_steps=20,
    log_level='info',
    logging_first_step=True,
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

sft训练参数

per_device_train_batch_size=32,
    gradient_accumulation_steps=2,
    num_train_epochs=3,
    weight_decay=0.1,
    warmup_steps=0,
    learning_rate=6e-5,
    ddp_find_unused_parameters=False,
    evaluation_strategy='steps',
    eval_steps=500,
    save_steps=500,
    save_total_limit=3,
    report_to='tensorboard',
    optim="adamw_torch",
    remove_unused_columns=False,
    lr_scheduler_type='cosine',
    bf16=True,
    logging_steps=10,
    log_level='info',
    logging_first_step=True,
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

值得注意一点是:

1.多卡的话最好设置ddp_find_unused_parameters=False,这样也能提升训练的速度

2.尽可能地把单个bs调大,因为我试过把单个bs没有调那么大,通过使用累积梯度步数来增大总的bs,但是收敛的没有把单个bs调大快,我在想这个和学习率调整有关。

训练加速

使用了accelerate库来使用deepspeed来加速,只需要运行 accelerate launch --multi_gpu --config_file accelerate_multi_gpu.yaml xx.py即可

具体的配置如下:

compute_environment: LOCAL_MACHINE
debug: false
deepspeed_config:
  gradient_accumulation_steps: 10
  gradient_clipping: 1.0
  offload_optimizer_device: cpu
  offload_param_device: cpu
  zero3_init_flag: false
  zero3_save_16bit_model: false
  zero_stage: 2
distributed_type: DEEPSPEED
downcast_bf16: 'no'
machine_rank: 0
main_training_function: main
mixed_precision: bf16
num_machines: 1
num_processes: 2
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

启动训练

大模型~合集1_创业公司

训练的是天工数据集前10个文件

大模型~合集1_数据_02

占用的显存

训练结果

预训练loss

我首先预训练的数据集是维基百科加百度百科,然后把checkpoint权重保存下来

大模型~合集1_数据_03

loss是维基百科加Baidu

接着上次预训练的权重,继续预训练。       

大模型~合集1_数据_04

loss是天工前20个数据集

sft训练loss

大模型~合集1_数据集_05

sft训练的loss

其实通过上面这几个Loss图,就能看出大模型的训练都遵循scaling law的原则,图的走向基本都是那样的,所以这次实践让我更深一步体会到了大模型 scaling law的威力。

模型效果

1.简单的问好

大模型~合集1_人工智能_06

能回答问候

2.一些通识类的问题

乔布斯的问题基本能回答对80%了,但乔布斯不是在攻读博士的期间开始创业的,还是会有幻觉的问题。苹果公司的基本回答无误了。在介绍广州这个问题上,还是会有重复回答的问题,出现了两个广州塔

大模型~合集1_人工智能_07

3.模型有分辨问题并进行准确回答的能力

这四个问题它都回答正确了

大模型~合集1_数据_08

4.尝试使用它来写一下代码

首先让它写一个排序算法,它用文字给出了思路,可以看出它给出的是思路是冒泡排序,如果不细看感觉对了,但是仔细看第2步中的“继续比较下一个值和最后一个值”,这个最后一个值是不是多余了,还是差了一点点才能回答正确

然后再让它使用python写一个排序算法,好家伙,直接化身调包侠哈哈哈哈哈。但是它关于这个代码的注释还是有些地方写错了,比如第一个注释说将排序后的结果储存在新的列表中,代码中并没有。第二个注释中的列表名字说错了。

大模型~合集1_数据_09

使用python写排序算法

5.尝试写一下文案

这一部分倒是写的有模有样的。

大模型~合集1_创业公司_10

二、大模型落地实用主义思考

要想跑出来,无非是做好能力和数据天平的配平。要么选一个简单的场景,当你的任务越难,能力越远离通用大模型,越深潜,越复杂,就需要越多,越好,越相关的垂类数据来训练大模型。

这两天腾讯搞了两个很好的采访,分别是杨植麟,一位是朱啸虎。杨植麟是AIGC创业者学术大佬,朱啸虎是TMT方向颇负盛名的投资大佬。两篇文章的链接分别是:

1.杨植麟采访:https://mp.weixin.qq.com/s/kEKotLcnlFK0jf8gNajXIg

2.朱啸虎采访:https://mp.weixin.qq.com/s/4111julSNH4XPXsUc8XEXA

原文比较长,让大模型来总结下:

我仔细检查了两篇文章,并对我的回答进行了补充和完善,以确保完整覆盖所有方面

杨植麟与朱啸虎对AGI的看法  
1.对大模型创业的看法:  
杨植麟: 坚定看好大模型创业,认为这是未来十年唯一有意义的事,并将其视为一个结合科学、工程和商业的系统,需要长期投入和坚持,最终目标是实现 AGI  
朱啸虎: 不看好大模型创业,认为现阶段大模型公司缺乏场景和数据,估值过高,且面临开源模型的竞争,投资风险大。他更倾向于投资能快速商业化、变现的应用层项目。  
2.对开源模型的看法  
杨植麟: 认为开源模型落后于闭源模型,且差距会持续存在因为开源的开发方式和人才、资金聚集程度都无法与闭源模型  
朱啸虎: 认为开源模型会逐渐赶上闭源模型,因为技术迭代曲线会放缓,且开源社区有更多开发者参与。他认为中国开发者更倾向于使用开源模型,因为不用担心被抄袭  
3.对 AGI 的看法:  
杨植麟: 坚定相信 AGI 是未来,并将其作为公司发展的长期目标。他认为 AGI 会改变世界,并希望通过技术突破和用户产品的结合来实现这一目标。  
朱啸虎: 对 AGI 持怀疑态度,认为至少在5到10 年内还无法实现。他更关注短期内能商业化的应用,并认为在现阶段投入三资研发 AGI 风险过高。  
4.对中美大模型产业的看法  
杨植麟: 认为中美在基础通用能力上不会有太大差别,但在通用能力基础上的差异化应用更可能发生。他也相信中国公司未来有机会在某些方面取得领先。  
朱啸虎: 认为中美在大模型领域差距很大,美国在底层技术上领先,而中国在应用场景和数据上更有优势。他建议中国创业公司先聚焦国内市场,再考虑出海。  
5.对投资策略的看法:  
杨植麟: 追求长期主义,愿意投入大量资金和资源进行前沿探索,并相信技术突破最终会带来商业回报  
朱啸虎: 追求短期回报,更倾向于投资能快速商业化、变现的项目,并强调创业公司要控制成本、不要烧钱。  
6.对 Sora 的看法:  
杨植麟: 认为 Sora 是一个重要的里程碑,代表着视频生成技术的巨大进步,并认为它可以用来提升对多模态输入的理解能力,以及打通数字世界和物理世界  
朱啸虎: 文章中没有明确表达对 Sora 的看法,但他对视频生成技术的前景表示乐观,并认为中国公司有机会在这一领域取得领先。  
7对创业公司和巨头的关系的看法  
杨植麟: 认为巨头和创业公司在目标和策略上有所不同,但两者之间存在着竞争和合作关系  
朱啸虎: 认为大模型创业公司最终可能会被巨头收购,但收购价格不会很高,因为大模型技术同质化严重  
8.对创业的风险和挑战的看法  
杨植麟: 坦然接受创业的风险和挑战,并表示会无所畏惧地往前冲。  
朱啸虎: 认为在当前的宏观环境下,创业公司要更加注重控制成本和自我造血能力,才能在市场竞争中存活下来  
9.对未来的展望  
杨植麟: 对未来充满乐观,相信 AGI 可以推动人类文明进入下一个阶段。  
朱啸虎: 对未来持谨慎态度,认为技术发展存在不确定性,创业公司需要更加现实和务实。  
10.对人才的看法  
杨植麟: 重视人才密度,并认为公司上限是由人的上限决定然后 补充其他维度的人才。打造的。他一开始寻找天才个完整、有韧性、能打仗的团队。  
朱啸虎: 认为大模型领域的人才同质化严重,创业公司需要找到有商业头脑和管理销售能力的人才,才能在市场竞争中胜氏。  
11.对商业化的看法  
杨植麟: 认为商业化是实现 AGI 的手段和目的,但不能为了追求短期商业利益而放弃长期目标。  
朱啸虎: 认为商业化是检验大模型公司价值的唯一标准,并强调创业公司要找到能快速变现的场景和应用,  
  
总结: 杨植麟和朱啸虎代表了两种不同的投资理念和对 AI 发展路径的判断。两种观点各有其合理性,最终谁的判断更准确,还需要时间来验证。
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

一位是典型的实用主义,一位是典型的长期主义,谁对谁错需要更长的时间来验证。

我们从落地的角度看看,AGI有哪些“实用主义”的问题。

环顾四周,除了写代码,看文档之外,目前大模型对C端落地的应用最多的两个场景,一个是电商+助手(淘宝问问,京东京言), 另外一个是评论区+助手(小红书,B站,什么值得买)。前一个目前距离理想效果有一定差距,后一个有较好的表现。

分析电商+多轮chat助手落后的主要原因,技术方面如下:

1.大模型能力有限。电商类助手依赖大模型作为Agent大脑,但是现阶段大模型能力有限,无法完成特别复杂的决策。大模型可以很好的学习大量的语料,获取人类的知识,也可以学习大量的代码,获取形式化和逻辑的能力,但不擅长在一个特别具体的任务上做深入思考。

2.特定训练数据缺乏。chat+电商缺少真实的导购语言交互数据,与之相对推销是一个典型的有大量语言交互数据的场景,朱啸虎也提到了,这个B端方向取得了较好的落地进展。在“直接推断”或者“少量训练”模式下,大模型不能很好的理解用户一个垂直场景的各类长尾需求。为此,大家利用GPT4的能力,要么直接使用GPT4进行prompt的指令构造,要么使用GPT4构造数据,其优点是可以快速上线拿到60分,缺点在于天花板不高,未从根本上解决真实导购数据缺失问题。

产品方面因为体验不到较为理想的状态,用户的留存较低,抱着好奇心体验后,未有持续使用的意愿,无法形成积累数据和体验提升的飞轮。总结来看,是因为大模型能力和数据问题,导致了目前的电商导购AI助手的体验不达预期,形成了“简单的问题无需助手,复杂的问题助手又解决不了”的局面。

另外你真的需要一个助理吗?

需要,但不是一个APP上的助理,也不是一个手机里的助理,而是一个真实世界,能取外卖,订餐馆,订会议室,整理会议纪要,订机票的助理。

这里面的差别就是,Agent解决应用内的十位数内的接口调用,而助理真的需要连接真实世界万种接口调用,现在AI做不到。

传统的搜广推通过列表页的高效精准呈现信息,而导购助手在一个粗略模糊的需求上,也给个位数选择,与目前大家网购的真实习惯有极大的冲突。

当然,大模型在这个事上也不是一无是处,在技术上,大模型带来一个的优势是,让传统的任务对话的pipeline变简单了,开发一个这样的导购的任务型机器人了不需要那么多人工定制的部分,GPT可以把意图识别,槽位提取做个60分,并且自带一点生成和总结的能力。

虽然大模型对开发简化提效有所帮助,但大模型并未提高助理效果的核心因素,如理解、规划和推理等。没有数十万规模的真实的助理数据训练,无法理解其垂直场景的各种长尾情况。

逛淘宝买衣服的女同胞和给领导订餐馆的朋友可知其难度。

与之相对的,我们应该尽可能去寻找大模型落地的可能性较高的场景,要有两个特点:1.符合大模型能力要求2.数据满足要求的场景,进而形成体验和数据的飞轮。

目前落地较好的一些B端应用,都有如下特点:

1.相对基座已经有的能力,其任务简单,不过分依赖大模型的推理,规划,思考能力,仅利用其生成和记忆本质。

2.场景有较完备的数据支撑。

这两个是一个天平的关系,越难的垂直任务,需要越多越好越相关的数据。

大家都说,现在大模型很强了,Agent的工具调用能力可以低成本开发很多应用,确实,大模型在垂直应用的意义就是把其中一部分任务的难度降低了,让你不需要特别多的垂类数据也能做很好。但是,大模型也不是擅长所有的事情,在很多场景,仍需非常多的数据微调。我们看看核心的两个问题。

一、大模型的能力边界在哪?

定性来说,能力边界是任务对大模型能力提出的要求及格分数线。在回答能力边界是什么上,我们首先要想办法定义一个任务的难度。如传统的分类任务中,我们可以通过类别多少,类别差异性来判断一个任务的难度,典型的大规模2000文本细粒度分类的任务就要比二极的情感分类难上很多。大模型也是如此,我们定义的难度指标主要与三个角度:

1.与基座相似性:任务需要的能力,相比基座原有的能力越接近,则构建该任务越简单。比如写代码,文本摘要等,这些都是大模型基座能力的舒适区,构建一个类似的应用,需要的额外的场景的数据量越少,给基座写几个prompt就可以搞定了。

2.场景深潜:任务需要的能力,是漂在任务的表面,还是需要挖掘场景内各种“长尾”。比如订餐助手,你如果只考虑做什么时间,什么餐馆,几个人吃饭,那就是传统的任务型对话都可以搞定的简单任务。如果是另外一个场景,“刚刚领导打电话给我,让我晚上陪他参加一场饭局,让我提前去饭店把菜点好”,这个问题就非常困难,需要仔细了解各种各样的情况,结合“人”和POI的特点综合考量,难上加难。

3.逻辑复杂:任务需要的能力,是直来直去,还是逻辑复杂。写代码的逻辑并不复杂,可以用形式语言描述,有非常严格的语法表达;查阅论文知识的逻辑也并不复杂,只需要预训练阶段大量记忆,根据语义的相关性检索记忆就可以。复杂的逻辑要求大模型走出总结,概括,记忆的舒适区,去挑战真正的能力泛化。

看一下GPTs应用商店的应用热度top10,主要集中在科学研究,写代码,文档问答,图像生成等领域。其实总结也可以发现,GPT落地应用较好的几个领域,除图像外有以下几种共性:强知识储备低复杂逻辑,与基座具有的能力相似,离个性化较远。侧重于总结,抽取,整理或形式语言,诸如写代码,看论文,PDF文档问答等应用。

二、到底需要多少数据和什么样的数据?

1.数据量:在考察我们场景的数据丰富度的时候,并非所有任务一概而论,到底多少数据才够,要考虑上文提到的场景的“难度”。随着一个任务难度的提升,需要的数量量也是成指数性增长。比如写代码,1k的prompt足够。总结摘要回答问题,Lora +几千条数据也够了,AI营销机器人,需要几十万的真实推销交互数据。复刻GPT4,需要千亿数量级的token数。另外,数量只是数据的一个维度,还有两个很重要的维度是数据哪里来和数据质量。

2.数据一致性:数据越接近于交互的结果,越直接相关越好。通常数据来源有三种:真实数据,转写数据,生成数据。生成数据就是蒸馏GPT4,真实数据是直接的用户交互产生的数据,转写数据通过其他方式,把用户的数据转录为语言。比如学习一个熟练的销售员在微信上的聊天记录,要比使用ASR翻译的推销电话效果要好,更远远好于用GPT4模仿一个高级销售的效果。

3.数据质量:数据的质量越高越好。驻场硕士标注员清洗/标注的数据,大概率好于外包标注。openAI花了大价钱寻找的标注员也是有备而来的,他可不是乱找的。

看完了技术分析,我们再看看这1.5年的大模型应用整体情况。

2023年是大模型快速发展的一年,也是人们对大模型的认知迭代逐渐收敛清晰的一年。

在资金意愿和落地进展两方面,基座都领先于应用。2月20日,AI领域内的初创企业月之暗面融资超10亿美元,应用方面微软接入GPT4打造Copilot已经过去一年。

更具体地回顾这一年,在基座能力方面,我们观察到的时间线是:22年末的狂热,23年初期国产化的奋起追赶,23年中GPT4发布,23年底国产大模型基座在一年内差不多具有了GPT3.5的能力。

在应用能力方面,热点追踪主要从23年初诞生了RAG概念和llama index ,langchain等开源工具,23年中Agent概念火爆,GPTs应用商店发布,24年初sora发布。

整体看起来,大家对于国产基座追赶GPT4的目标,还保持着高涨的热情和投入。

但是在C端应用方面,除了几个大模型能力甜点区,如写代码,看论文,文生图等场景取得了较好的落地效果,在其他拟人要求高,思考能力要求高的应用上,大模型的落地进展落后于预期。

参考华为天才少年的演讲,我们拆分两个维度,分别是思考深度和人格特点,通过这两个维度划分典型应用,横轴是人格轴,对应着有趣的强人格和有用的工具两端;纵轴是思考深度的维度,即快速思考与缓慢思考。快速思考类似于下意识的反应,不经过深思熟虑,如ChatGPT这种即问即答的模式可以视为一种快速思考,缓慢思考则涉及到有状态的、复杂的思维过程,比如规划和解决复杂问题的顺序和方法。大模型的优势区是第三象限(弱人格,强工具,低深度,快思考),如下图所示。

大模型~合集1_人工智能_11

目前落地较好的也是第三象限。

B端应用方面,除了在与基座能力近的方向落地很好,如Copilot,写代码,看文档等,另外在一些数据丰富的垂直场景效果也很不错,比如微信的私域营销,AI电话等。

所以,最后总结起来,要想跑出来,无非是做好能力和数据天平的配平。要么选一个简单的场景,当你的任务越难,能力越远离通用大模型,越深潜,越复杂,就需要越多,越好,越相关的垂类数据来训练大模型。

三、大模型在复杂推理任务上潜力如何?多智能体互动框架ThinkThrice玩转剧本杀

剧本杀是一种广受欢迎的多角色扮演侦探游戏,要求玩家扮演不同的角色。通过阅读角色文本、理解各自的故事、搜集线索、以及逻辑推理,玩家们共同努力揭开谜团。游戏角色通常被分为平民和凶手两大类:平民的目标是找出隐藏在他们中间的凶手,而凶手则尽力隐藏自己的身份,避免被发现。那么,如果让 AI 加入游戏,会产生怎样的新变化呢?

大模型~合集1_人工智能_12

剧本杀游戏流程。

加拿大蒙特利尔大学和 Mila 研究所的研究团队带来了一项令人兴奋的新研究,将 AI 的潜力引入到剧本杀游戏中。这项研究不仅展现了大型语言模型(LLM)在复杂叙事环境中的应用潜力,而且为 AI 智能体的推理能力评估设定了新的试验场。让我们一起深入了解这项研究的细节和其带来的启发。

论文链接:https://arxiv.org/abs/2312.00746

研究动机:AI 与剧本杀的交汇

AI 的进步已经使其被广泛应用于各种游戏中。然而,剧本杀游戏以其独特的玩法和复杂的设置,仍是一块待开发的新领域。为了将 AI 引入剧本杀游戏中,蒙特利尔大学的研究团队面临三个主要挑战:

首先,剧本杀游戏中复杂的角色情节和人物关系要求 AI 不仅要理解所扮演的游戏角色的背景和动机,还要能够适应游戏剧情的多层次叙事,通过在游戏中和其他角色互动来收集其他角色的信息、还原案件原貌。

其次,由于缺乏专门为剧本杀设计的数据集,需要开发一个包含丰富文本的剧本杀数据集,这对于启动和评估 AI 模型至关重要。

最后,如何准确定量和定性地评估 AI 在剧本杀游戏中的表现也是极具挑战性的任务。因为在剧本杀游戏中,目标不仅是赢得比赛,更重要的是理解游戏剧情并揭露案件的真相。为此,AI 需要在参与游戏的过程中展示出卓越的沟通交流、信息收集以及逻辑推理能力。

这项研究的贡献主要涵盖四个方面:

  • 首先,团队构建了一个专门针对剧本杀游戏的数据集,旨在启动和评估 AI 模型;
  • 其次,团队设计了一个多智能体互动框架,允许剧本杀游戏自动进行,从而无需人为干预;
  • 再者,团队开发了一套量化和质化评估方法,以评估 LLM 智能体在游戏中的信息搜集和推理能力;
  • 最后,通过利用最新的上下文学习技术,团队设计了增强 LLM 智能体性能的模块。

此项研究不仅推动了 AI 在多角色互动的复杂叙事游戏:剧本杀中的应用研究,也为智能体的评估和性能优化提供了新的视角和方法。

数据集构建:剧本杀游戏的数字化转型

为了在剧本杀的环境下启动和评估 AI 模型,研究团队精心收集了 1115 个剧本杀游戏案例,创建了一个庞大的数据库。这些游戏包含了丰富的关于剧本杀游戏的游戏规则、剧情故事、角色背景、案件线索等文本信息,为 AI 的仿真和测试提供了理想的素材,使得研究人员能够在模拟的环境中准确观察和评估 AI 智能体的表现。此外,数据集还提供了图片、视频、音频等多模态的信息,为未来多模态的 AI 智能体的开发和测试提供了可能。

大模型~合集1_数据_13

表 1. 剧本杀数据集中不同模态的游戏剧本数量

大模型~合集1_创业公司_14

表 2:剧本杀数据集中游戏剧本的玩家数量和token统计。

ThinkThrice 框架:AI 如何玩转剧本杀

研究团队开发了一个名为 ThinkThrice (三思) 的多智能体互动框架,允许基于 LLM 的 AI 智能体自主参与剧本杀游戏。这个框架通过记忆检索、自我完善和自我验证三个使用上下文学习技术的 模块确保 AI 智能体能够有效地理解游戏情景,收集信息,并进行逻辑推理。AI 智能体的每一步动作,包括询问、回应、投票等,都是基于其角色剧本和以往的交互记录由 LLM 自动产生的。

大模型~合集1_人工智能_15

ThinkThrice (三思) 框架。

评估方法:新的评价标准

研究者设计了事实性问题回答和推理性问题回答两项任务来评估 AI 智能体的表现。事实性问题旨在测试 AI 智能体在游戏过程中收集的信息量,而推理性问题则评估 AI 使用这些信息进行推理的能力。其中推理性问题不仅需要考察 AI 智能体对特定问题的答案,还要评估其背后的推理过程是否合理。          

大模型~合集1_数据集_16

表 3:事实性问题示例。

大模型~合集1_数据_17

表 4:推理性问题示例。

实验结果:AI 智能体的侦探能力评估

实验结果表明,与基线模型相比,引入记忆检索、自我完善和自我验证模块的 AI 智能体在回答关于其他角色的事实性问题时,准确率得到了显著提升。这证明了信息交流在理解游戏中其他角色的行为和动机方面至关重要。此外,AI 智能体信息收集能力的增强,也显著提高了其在推理解案和识别凶手方面的表现。这表明 AI 智能体通过收集充足的信息和进行有效的推理,能够更准确地确定凶手身份。

大模型~合集1_数据_18

表 5:AI 智能体回答关于自己扮演角色的事实性问题 (Own Q) 和其他角色的事实性问题 (Other’s Q) 的准确率。

大模型~合集1_人工智能_19

AI 智能体使用 GPT-3.5 和 GPT-4 时的推理准确率。

大模型~合集1_人工智能_20

AI 智能体的凶手识别准确率和平民玩家胜率。

结语

该研究通过将大型语言模型(LLM)智能体引入侦探角色扮演游戏 “剧本杀”,探索了 LLM 智能体在复杂叙事环境中的应用潜力,为观察和评估 LLM 智能体的行为及能力提供了新的视角和方法,并为社区深入理解大型语言模型的能力开辟了新途径。通过实证研究,该团队证明了其设计的多智能体互动框架和上下文学习模块在信息收集、凶手识别和逻辑推理能力方面,相较于基线模型有了显著提升。这一发现预示着 LLM 在复杂推理任务中应用的广阔前景。预计在不远的将来,AI 将能够与人类携手解决复杂场景的推理问题。

四、当prompt策略遇上分治算法,南加大、微软让大模型炼成「火眼金睛」

近年来,大语言模型(LLMs)由于其通用的问题处理能力而引起了大量的关注。现有研究表明,适当的提示设计(prompt enginerring),例如思维链(Chain-of-Thoughts),可以解锁 LLM 在不同领域的强大能力。

然而,在处理涉及重复子任务和 / 或含有欺骗性内容的任务(例如算术计算和段落级别长度的虚假新闻检测)时,现有的提示策略要么受限于表达能力不足,要么会受到幻觉引发的中间错误的影响。

为了使 LLM 更好地分辨并尽可能避免这种中间错误,来自南加州大学、微软的研究者提出了一种基于分治算法的提示策略。这种策略利用分治程序来引导 LLM。

论文地址:https://arxiv.org/pdf/2402.05359.pdf

具体来讲,我们将一个大任务的解决过程解耦为三个子过程:子问题划分、子问题求解以及子问题合并。理论分析表明,我们的策略可以赋予 LLM 超越固定深度 Transformer 的表达能力。实验表明,我们提出的方法在受到中间错误和欺骗性内容困扰的任务中(例如大整数乘法、幻觉检测和错误信息检测)可以比经典的提示策略获得更好的性能。

太长不看版:我们发现在应用 LLM 处理较长的问题输入时,把输入拆分然后分而治之可以取得更好的效果。我们从理论上解释了这一现象并实验角度进行了验证。

研究动机

本文的研究动机来自于实验中观察到的有趣现象。具体来说,我们发现对于涉及重复子任务和 / 或含有欺骗性内容的任务(如段落级别长度的虚假新闻检测),对输入进行拆分可以提升模型对于错误信息的分辨能力。下图展示了一个具体的例子。

在这个例子当中,我们调用大语言模型来评估一段总结性文本是否与完整的新闻报道存在事实性冲突。

大模型~合集1_人工智能_21

在这个任务中,我们尝试了两种策略:耦合策略和分治策略。在耦合策略下,我们直接为模型提供完整的新闻报道和整段总结性文本,然后要求模型评估二者是否存在冲突。模型错误地认为二者不存在冲突,并且忽视了我们标红的冲突点(新闻中明确表示调查人员否定了录像的存在,然而总结中的第一句话表示录像已被成功复原)。

而当我们采取分治策略,也就是简单地将总结性文本拆分成多句话,然后分别对每句话进行评估,模型成功地识别出了冲突。

这个例子向我们展示了:对长输入进行划分可以帮助我们更好地解锁模型的能力。基于这一点,我们提出利用分治程序来引导 LLM,从而赋予模型更强的分辨力。

基于分治的提示(prompting)策略

我们提出使用分治(Divide-and-Conquer, DaC)程序来引导 LLM。该程序包括三个不同的子过程:子问题划分、子问题求解以及子解答合并

在子问题划分,我们提示 LLM 将任务分解为一系列具有较小规模的并行同质子任务(例如将长段落分解为句子)。这里的并行原则保证模型可以分别处理这些子任务而不依赖于某些特定的求解顺序。也因此,一个子任务的解答不会依赖于其它子任务的解答的正确性,这增强了模型对于中间错误的鲁棒性,使模型获得更强的分辨力。

之后,在子问题求解阶段,我们提示 LLM 分别求解每个子任务。

最后,在子解答合并阶段,我们提示 LLM 将每个子任务的答案组合起来并获得最终答案。在这个过程中,所有三个阶段的推理过程都被隔离开来以避免干扰。它们都由一个程序而不是 LLM 来引导,以避免幻觉或来自输入上下文的欺骗。

在下面的示意图中,我们将自己的方法和目前流行的提示策略进行了对比。

大模型~合集1_人工智能_22

为了解决不同规模的任务,我们提出了两种变体:单级分治策略 (Single-Level Divide-and-Conquer) 多级分治策略 (Multi-Level Divide-and-Conquer)。单级策略中,我们只对输入进行一次划分,然后就开始进行求解。在多级策略中,我们可以递归调用分治程序,从而把求解过程展开成一棵多层的树。

大模型~合集1_创业公司_23

大模型~合集1_数据集_24

理论分析

我们通过理论分析展示了为什么分治策略能够提升大语言模型的分辨力。

此前的工作(Feng et al 2023, Merrill & Sabharwal 2023)已经证明,现有的通用大语言模型所普遍采用的固定深度与对数精度的预训练 Transformer,存在表达能力上的限制。

具体来说,假设 NC1 类问题严格难于 TC0 类时(TC0 和 NC1 是并行计算理论中的两大类问题,其关系类似 P 与 NP),那么这些 Transformer 模型在处理 NC1 完全问题时,其模型宽度需要以超多项式(如指数)级别的速度随问题规模增长。NC1 完全问题包含了很多常见的问题,比如两色 2 叉子树匹配问题。

而我们此前提到的评估两段文本是否存在事实性冲突的问题,恰好可以被视为判断总结文本所对应的语义树是否匹配新闻材料的语义树的一棵子树。因此,当总结性文本足够长时,大语言模型会面临表达能力不足的问题。我们的理论分析严格证明了,在基于分治的提示策略下,存在一个宽度和深度均为常数的 Transformer,可以在 log(n)的时间复杂度下解决任意规模的两色 2 叉子树匹配问题

实验结果

我们考虑了三个任务:大整数乘法、幻觉检测、新闻验证。我们基于 GPT-3.5-Turbo 和 GPT-4 进行评估。对于大整数乘法,此前的工作已经证明,ChatGPT 难以正确计算 4 位以上的整数乘法问题。因此我们使用 5 位乘 5 位的乘法来验证我们的提示策略的有效性。

结果如下图所示,可以看出,无论是准确率指标还是编辑距离指标,我们的方法相对其他 baseline 都具有明显优势。

大模型~合集1_创业公司_25

对于幻觉检测,我们采用 HaluEval 数据集中的 Summarization Hallucination Detection 子集。对于该子集,模型需要根据一段新闻材料判断一段总结性文本是否包含幻觉。我们将总结性文本划分为单句并分别进行检测。

检测结果如下,可以看到,我们的方法相对 baseline 更好的平衡了精确度和召回率,从而取得了更好的准确率和 F1 score。

大模型~合集1_创业公司_26

对于新闻验证,我们基于 SciFact 数据集构造了一个段落验证数据集。对于该数据集,模型需要根据一篇学术论文中的段落判断一段新闻报道是真新闻还是假新闻。我们将新闻报道划分为单句并分别进行检测。

检测结果如下,可以看到,我们的方法相对 baseline 取得了更好的准确率和 G-Mean score。

大模型~合集1_数据_27

五、Attention的分块计算: 从flash-attention到ring-attention

flash attention是LLM训练的标配。它是一个加速attention的cuda算子;ring attention则是利用分布式计算扩展attention长度的一个工作。然而它们背后的核心则都是softmax局部和全局关系的一个巧妙公式。

观察到局部softmax和全局softmax的关系,充分利用容量小但速度快的cache计算局部的attention,再推导出全局的attention,最终达到加速attention计算,或扩展attention长度的目的。

概要

局部的softmax和全局的softmax可以推出一个公式关系。利用这一点,flash-attention使用SRAM来计算局部的attention,再规约到全局的attention,并将attention包装为一个CUDA kernel,大大加速attention计算速度,并减小现存占用。而ring attention则反着利用这个公式关系,让一个GPU计算attention的一个局部,整个GPU多卡集群就可以计算出全局的attention,这样就大大扩展了Transformer序列长度。

方法

局部softmax和全局softmax之间的关系

大模型~合集1_数据集_28

大模型~合集1_数据集_29

这样的好处是什么呢?

attention里面的softmax,一般值还挺多的,特别是对于长序列,所以整体计算全局softmax,可能cache里面就放不下,就得放到容量大但是比较慢的地方去计算这些数了。而局部的值,数量少,就可以放在cache里面算,算完以后再根据上面的公式,把总体的softmax算出来。

flash attention:利用SRAM作为cache

flash attention是一个attention的算子,主要目的是加速attention的计算。

GPU里面的存储有个层次结构。HBM (high bandwidth memory,可以认为就是cuda编程里面的global memory)就是显卡上边的memory,容量大,但是速度慢; SRAM (Static Random-Access Memory,可以认为就是cuda编程里面的shared memory),容量小,但是速度快。

flash-attention的核心思想就是,把attention的计算分成一小块一小块的,放在SRAM里面算,算完以后再通过前面介绍的关系,把全局的attention值算出来。大大提升了attention的计算速度。

flash-attention还把整个attention的计算做成一个算子,这样就可以把中间的结果给它省掉,大大减小了显存占用。

大模型~合集1_创业公司_30

CPU/GPU计算时候的存储层次结构 from flash-attention

ring attention:利用单GPU卡作为cache

ring attention的主要目的是扩展Transformer的序列长度。计算Transformer序列长度的一个核心困难是算attention的时候,序列太长会OOM。

ring attention的核心想法是,每一个GPU只计算一个局部的attention,然后全局的attention再利用前面的公式给计算出来。这样,因为每个GPU的算的attention长度就没那么长了,就可以计算了,但整体的attention长度就可以大大扩展了。这个attention长度的扩展还是根据GPU数量线性增加的,有多少GPU就能扩多长,所以ring attention的论文题目里说"Near-Infinite Context"。

小结与想法

flash attention已经是LLM训练的标配了。它是一个加速attention的cuda算子;ring attention则是利用分布式计算扩展attention长度的一个工作。然而它们背后的核心则都是softmax局部和全局关系的一个巧妙公式。真的是非常漂亮。