实践教程|Transformer Decoder-Only 模型批量生成 Trick

导读

本文给出了一个用单Transformer decoder( GPT)模型进行批量生成时的解决方法。

发现用单 Transformer decoder (Aka GPT)模型进行生成时,因为位置对齐等问题,进行批量生成时十分麻烦。

训练时,context 和 target 可以直接拼一起,然后一个 Batch 内通过裁剪或 Padding 到相同长度来进行批量训练。但生成时,只有 context,每个长度还不同,如果 Padding 到相同长度,直接进行生成的话,会让生成阶段和训练阶段有巨大 gap,导致生成不了好的结果。

解决问题的最好方法就是------不解决问题。直接一条条输出吧。

但如果不批量生成,模型小数据少时还好,站起来喝杯水撒泡尿时间就差不多了。但模型一大且数据量一大,花的时间就太大了。

手动开几个进程同时跑多个模型也不是不行,但太美了。

所以只能想办法解决了。

训练阶段解决

通过 Padding 来解决的最主要问题是,生成和训练阶段的差别太大,那是不是在训练时就给 Padding 直接放在 Context 后,再直接拼 target 就行。

可行,但成本太大了,还得重训模型。

所以还是不行。

利用 Transformer 特性

于是就想,如何通过处理让生成时模拟训练时状况,让模型以为 target 位置是直接在 context 后,且只参考 context。

需要明确一点,Transformer 里因为位置信息主要通过位置编码来表示的,所以只要对应的位置编码不变,即使输入向量顺序再怎么变,对 Transformer 来说还是差不多,这也是一些技巧如 PLM(Permutation Language Model)) 得以实现的原理。

直接这样说太抽象了,举个栗子。

假设一个 batch 长度不一样样本训练时如下

input_ids:

1 3 2 6 2 0 0

1 3 6 2 5 4 2

2 为分割和终止符,可看到训练时,通过给第一句 padding,算 loss 时 padding 位置都不算上来进行训练。

而 inference 时,只有 context,即使 padding 也会是下面这样

1 3 2 0

1 3 6 2

这种情况下如果直接用默认的 pos_ids 和 atten_mask (不了解的看The Annotated Transformer),第一句就会出现问题。

对比一下,训练时用到的三个参数

1 3 2 6 2 0 0 (input_ids)

0 1 2 3 4 0 0 (pos_ids)

1 1 1 1 1 0 0 (atten_mask)

训练时当生成 6 的时候看到的是

1 3 2

0 1 2

1 1 1

再来看看生成时的情况,生成 6 的时候直接看到的是

1 3 2 0

0 1 2 3

1 1 1 0

首先拿的是最后 padding 位置的向量来预测下一个,同时还有个问题就是,当预测完成一个时,之后拿到的位置 id 是不对的,这里假设预测成功为 6

1 3 2 0 6

0 1 2 3 4

1 1 1 0 1

会发现用 6 来预测下一个词时已经和训练时不一样了,因为训练时 6 对应的位置 id 是 3

实际这样用时,我也发现生成结果总是错开几个字,像是给刀直接切开了一样。

于是改进,最简单方法是直接给 padding 的位置向量都设成 padding 前的位置,这样预测时位置向量就对了。

1 3 2 0 6

0 1 2 2 3

1 1 1 0 1

但这只解决了一个问题,即生成过程中的问题,第一个位置拿的还是 padding 位置进行的输出 。这里有个解决方法,就是生成时,第一次预测取到 padding 前 token,之后就依次取最后一个进行预测了

这样基本上就算是解决问题了,但生成时第一次和之后还得区分开,说实话还是有点 ugly.

还可以进一步优化。

Left Padding

解决方法很简单,思维掉转下就好了,因为并行生成时都是从最后一位开始取,那能不能直接给 padding 放到前面去呢。

于是生成时一个 batch 会变成这样

input_ids:

0 0 1 3 2

1 3 6 2 5

那么对于第一条进行预测时,也只需要这样设置一下 pos_id 和 atten_mask 就行

0 1 3 2

0 0 1 2

0 1 1 1

这样子生成 6 时,位置向量就能自然而然衔接上,同时 atten_mask 也给前面的 padding 完美 mask 掉了。

完美解决!速度一下提高了好几倍。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

四、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

相关推荐
byzh_rc1 小时前
[机器学习-从入门到入土] 现代机器学习
人工智能·机器学习
AI数据皮皮侠1 小时前
中国乡村旅游重点村镇数据
大数据·人工智能·python·深度学习·机器学习
小北方城市网1 小时前
第 11 课:Python 全栈项目进阶与职业发展指南|从项目到职场的无缝衔接(课程终章・进阶篇)
大数据·开发语言·人工智能·python·数据库架构·geo
栗少1 小时前
英语自学手册:系统化进阶指南基于《英语自学手册》的方法论与行动路径
人工智能·算法
danyang_Q1 小时前
d2l安装(miniforge+cuda+pytorch)
人工智能·pytorch·python
点云SLAM2 小时前
Exponential 英文单词学习
人工智能·exponential·英文单词学习·雅思备考·指数的 / 与指数相关的·急剧增长 / 迅速增加的
机器之心2 小时前
智元提出SOP,让VLA模型在真实世界实现可扩展的在线进化
人工智能·openai
Tencent_TCB2 小时前
AI Coding全流程教程——0基础搭建“MEMO”健康打卡全栈Web应用(附提示词)
前端·人工智能·ai·ai编程·codebuddy·claude code·cloudbase
新智元2 小时前
推理之父走了!OpenAI 七年元老离职:有些研究这里没法做
人工智能
躺柒2 小时前
读共生:4.0时代的人机关系06人机合作关系
大数据·人工智能·人机协作·人机对话·人机合作