实践教程|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大模型商业化落地方案

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

相关推荐
飞机火车巴雷特5 分钟前
【论文阅读】LightThinker: Thinking Step-by-Step Compression (EMNLP 2025)
论文阅读·人工智能·大模型·cot
张较瘦_8 分钟前
[论文阅读] 人工智能 + 软件工程 | ReCode:解决LLM代码修复“贵又慢”!细粒度检索+真实基准让修复准确率飙升
论文阅读·人工智能·软件工程
boonya10 分钟前
国内外开源大模型 LLM整理
开源·大模型·llm·大语言模型
万岳科技程序员小金2 小时前
餐饮、跑腿、零售多场景下的同城外卖系统源码扩展方案
人工智能·小程序·软件开发·app开发·同城外卖系统源码·外卖小程序·外卖app开发
桐果云2 小时前
解锁桐果云零代码数据平台能力矩阵——赋能零售行业数字化转型新动能
大数据·人工智能·矩阵·数据挖掘·数据分析·零售
二向箔reverse4 小时前
深度学习中的学习率优化策略详解
人工智能·深度学习·学习
幂简集成4 小时前
基于 GPT-OSS 的在线编程课 AI 助教追问式对话 API 开发全记录
人工智能·gpt·gpt-oss
AI浩4 小时前
【面试题】介绍一下BERT和GPT的训练方式区别?
人工智能·gpt·bert
Ronin-Lotus4 小时前
深度学习篇---SENet网络结构
人工智能·深度学习
n12352355 小时前
AI IDE+AI 辅助编程,真能让程序员 “告别 996” 吗?
ide·人工智能