0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

大模型微调样本构造的trick

深度学习自然语言处理 来源:包包算法笔记 2023-07-10 11:32 次阅读

开局一道面试题。

面试官:大模型微调如何组织训练样本?

你:大模型训练一问一答,一指令一输出,问题和指令可以作为prompt输入,答案作为输出,计算loss的部分要屏蔽掉pad token。

面试官:多轮对话如何组织训练样本呢?

你:假设多轮为Q1A1/Q2A2/Q3A3,那么可以转化成 Q1—>A1, Q1A1Q2->A2, Q1A1Q2A2Q3->A3三条训练样本。

面试官:这样的话一个session变成了三条数据,并且上文有依次重复的情况,这样会不会有啥问题?

你:数据中大部分都是pad token,训练数据利用效率低下。另外会有数据重复膨胀的问题,训练数据重复膨胀为 session数量*平均轮次数,且上文有重复部分,训练效率也会低下。

面试官:你也意识到了,有什么改进的方法吗?

你:有没有办法能一次性构造一个session作为训练样本呢?(思索)

面试官:提示你下,限制在decoder-only系列的模型上,利用模型特性,改进样本组织形式。

对于这个问题,我们思考下decoder-only模型有啥特点,第一点很关键的是其attention形式是casual的,casual简单理解就是三角阵,单个token只能看到其上文的信息

如图所示:

c57439aa-1ece-11ee-962d-dac502259ad0.png

其二是postion_id是只有token次序含义而无需特定指代信息,(区别于GLM模型需要postion_id来标识生成span的位置等特殊的要求)。

有了这两点我们就可以设想,如果构造多轮对话样本的input为 Q1 A1 Q2 A2 Q3 A3 ,在计算loss的时候,只需要计算 A1 A2 和 A3 部分,岂不是就可以进行session级别的训练了?

嗯为什么原来的chatglm不能用这种形式呢,虽然prefix attention可以推广为适应多轮训练的prefix attention形式,如图:

c58d526e-1ece-11ee-962d-dac502259ad0.jpg

但是由于其postition id 无法简单按次序推广,故不能高效训练,这也是chatglm初代的很大的一个问题,导致后续微调的效果都比较一般。

现在chatglm2的代码针对这两个问题已经进行了改善,可以认为他就是典型的decoder-only模型了,具体表现为推断时候attention 是casual attention的形式,position id也退化为token次序增长。

那么好了,万事具备,只欠东风。我们据此实现了chatglm2-6b的代码微调。其核心代码逻辑为处理样本组织的逻辑,其他的就是大模型微调,大同小异了。

conversation=''
input_ids = []
labels = []
eos_id = tokenizer.eos_token_id
turn_idx = 0
for sentence in examples[prompt_column][i]:
    sentence_from = sentence["from"].lower()
    sentence_value = '[Round {}]

问:'.format(turn_idx) + sentence["value"] + '

答:' if sentence_from == 'human' else sentence["value"]+'

'
    conversation += sentence_value
    sentence_ids = tokenizer.encode(sentence_value, add_special_tokens=False)  
    label = copy.deepcopy(sentence_ids) if sentence_from != 'human' else [-100] * len(sentence_ids)               
    input_ids += sentence_ids 
    labels += label
    if sentence_from != 'human':
        input_ids += [eos_id]
        labels += [eos_id]
        turn_idx += 1
input_ids=tokenizer.encode('')+input_ids#addgmaskbos
labels =  [-100] * 2 + labels# #add padding
pad_len = max_seq_length - len(input_ids)
input_ids = input_ids + [eos_id] * pad_len 
labels = labels + [-100] * pad_len

其中有几个关键的地方,就是在开头要加上 bos和gmask,遵循模型原来的逻辑。问答提示词和轮次prompt,还有两个 保持和原模型保持一致,最后屏蔽掉pad部分的loss计算。

实测训练效果如下:

c5c0e598-1ece-11ee-962d-dac502259ad0.jpg

同样的数据在chatglm1上 train loss只能降到2.x左右,同时评估测试集结果,在同样的数据上rouge等指标都有不小的提升。

我们再仔细回顾下,对话session级别训练和拆开训练从原理上有啥区别?

1.session级别训练,效果之一为等价batchsize变大(1个batch可以塞下更多样本),且同一通对话产生的样本在一个bs内。

2. session级别的不同轮次产生的梯度是求平均的,拆开轮次构造训练是求和的,这样除了等价于lr会变大,还会影响不同轮次token权重的分配,另外还会影响norm的计算。

我们用一个简化地例子定量分析下,我们假设两条训练样本分为 1.问:A 答:xx 2.问: A答:xx 问: B答:xx问: C答:xx 则session级别训练影响梯度为 (Ga+(Ga +Gb + Gc)/3)/2。对 A,B,C影响的权重分别为,2/3 1/6 1/6。 拆开训练为(Ga+Ga+ (Ga+Gb)/2+(Ga+Gb+ Gc)/3)/4。对 A,B,C影响的权重分别为,17/24 5/24 1/12。 从上面的权重分布来看,session级别靠后的轮次影响权重要比拆开更大。这也是更合理的,因为大部分场景下,开场白都是趋同和重复的。 一点小福利,以上面试题对应的ChatGLM2-6B微调完整的代码地址为: https://github.com/SpongebBob/Finetune-ChatGLM2-6B

实现了对于 ChatGLM2-6B 模型的全参数微调,主要改进点在多轮对话的交互组织方面,使用了更高效的session级别高效训练,训练效果相比原版ChatGLM-6B有较大提升。

这可能是目前全网效果最好的ChatGLM2-6B全参数微调代码。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87600
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66771
  • 大模型
    +关注

    关注

    2

    文章

    1516

    浏览量

    1115

原文标题:大模型微调样本构造的trick

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于双级优化(BLO)的消除过拟合的微调方法

    这篇论文试图解决的问题是大型预训练模型在下游任务中进行微调时出现的过拟合问题。尽管低秩适应(LoRA)及其变体通过学习低秩增量矩阵有效地减少了与完全微调方法相比的可训练参数数量。
    的头像 发表于 04-02 16:46 170次阅读
    基于双级优化(BLO)的消除过拟合的<b class='flag-5'>微调</b>方法

    模型Reward Model的trick应用技巧

    借助对比学习和元学习的方法。增加对比学习的loss,对比学习通过增强模型区分能力,来增强RM的对好坏的区分水平。元学习则使奖励模型能够维持区分分布外样本的细微差异,这种方法可以用于迭代式的RLHF优化。
    发表于 01-25 09:31 278次阅读
    大<b class='flag-5'>模型</b>Reward Model的<b class='flag-5'>trick</b>应用技巧

    2023年LLM大模型研究进展

    作为做LLM应用的副产品,我们提出了RLCD[11],通过同时使用正例和负例prompt,自动生成带标签的生成样本不需人工标注,然后可以接大模型微调,或者用于训练reward models
    发表于 01-19 13:55 268次阅读

    四种微调模型的方法介绍

    微调(Full Fine-tuning):全微调是指对整个预训练模型进行微调,包括所有的模型参数。在这种方法中,预训练
    发表于 01-03 10:57 5616次阅读
    四种<b class='flag-5'>微调</b>大<b class='flag-5'>模型</b>的方法介绍

    模型微调数据选择和构造技巧

    比如我们会经常遇到下面几种情况: 1.数据要不要都去标注,标的比较慢咋办? 2.我已经有一批标好的数据了,再去选哪些数据送标注比较好? 3.能不能总结出一套数据构造方面自动化的方法?
    的头像 发表于 12-20 14:39 435次阅读
    大<b class='flag-5'>模型</b><b class='flag-5'>微调</b>数据选择和<b class='flag-5'>构造</b>技巧

    一种新颖的大型语言模型知识更新微调范式

    我们使用LLAMA2-7B作为实验的基础模型。我们主要评估将旧知识更新为新知识的能力,因此模型将首先在旧知识上进行为期3个时期的微调。表1中F-Learning中设置的超参数λ分别取值为0.3、0.7、0.1和1.5。
    发表于 12-01 15:10 172次阅读
    一种新颖的大型语言<b class='flag-5'>模型</b>知识更新<b class='flag-5'>微调</b>范式

    什么是零样本学习?为什么要搞零样本学习?

    样本分类的技术目前正处于高速发展时期, 所涉及的具体应用已经从最初的图像分类任务扩展到了其他计算机视觉任务乃至自然语言处理等多个相关领域。 对此, 本文将其称为广义零样本分类。 相应地, 我们将针对图像分类任务的零样本分类任务
    发表于 09-22 11:10 1054次阅读
    什么是零<b class='flag-5'>样本</b>学习?为什么要搞零<b class='flag-5'>样本</b>学习?

    OpenAI开放大模型微调功能!

    除了提高性能之外,还能缩短提示时间,确保类似性能。另外,微调目前仅支持处理4000 tokens,这也是此前微调型号的两倍。16k tokens微调将于今年秋季推出。
    的头像 发表于 08-24 16:39 388次阅读
    OpenAI开放大<b class='flag-5'>模型</b><b class='flag-5'>微调</b>功能!

    OpenAI开放大模型微调功能 GPT-3.5可以打造专属ChatGPT

    OpenAI开放大模型微调功能 GPT-3.5可以打造专属ChatGPT OpenAI开放大模型微调功能,这意味着GPT-3.5 Turbo支持自定义
    的头像 发表于 08-23 19:34 772次阅读

    样本微调给ChatGLM2注入知识

    LoRA微调是一种高效的融入学习算法。类似人类把新知识融入现有知识体系的学习过程。学习时无需新知识特别多的样本,学习后原有的庞大知识和能力可以基本不受影响。
    的头像 发表于 07-18 14:44 2611次阅读
    单<b class='flag-5'>样本</b><b class='flag-5'>微调</b>给ChatGLM2注入知识

    中软国际参加首期百度智能云文心千帆大模型SFT微调能力实训营

    2023年7月15日,中软国际受邀在百度大厦参加了首期百度智能云文心千帆大模型SFT微调能力实训营。此次培训旨在提高合作伙伴对大模型的理解和落地能力,更好地帮助客户落地大模型和相关应用
    的头像 发表于 07-17 18:15 621次阅读
    中软国际参加首期百度智能云文心千帆大<b class='flag-5'>模型</b>SFT<b class='flag-5'>微调</b>能力实训营

    复旦和Meta提出Open-VCLIP:兼顾时序建模与开集识别的视频理解模型

    本文提出了一种新的CLIP向视频领域的迁移方法,找到模型泛化和专用化之间的平衡,让模型既能识别微调时已经见过的动作和事件,又能够借助CLIP的零样本识别能力泛化到新的视频动作和事件。
    的头像 发表于 06-25 15:04 616次阅读
    复旦和Meta提出Open-VCLIP:兼顾时序建模与开集识别的视频理解<b class='flag-5'>模型</b>

    iPhone都能微调模型了嘛

    的是,与原驼一起提出的新方法 QLoRA 把微调模型的 显存需求从>780GB降低到 。 开源社区直接开始狂欢,相关论文成为24小时内关注度最高的AI论文。   以Meta的美洲驼LLaMA为基础,得到
    的头像 发表于 06-02 15:26 459次阅读
    iPhone都能<b class='flag-5'>微调</b>大<b class='flag-5'>模型</b>了嘛

    蒸馏也能Step-by-Step:新方法让小模型也能媲美2000倍体量大模型

    为了解决大型模型的这个问题,部署者往往采用小一些的特定模型来替代。这些小一点的模型用常见范式 —— 微调或是蒸馏来进行训练。微调使用下游的人
    的头像 发表于 05-15 09:35 421次阅读
    蒸馏也能Step-by-Step:新方法让小<b class='flag-5'>模型</b>也能媲美2000倍体量大<b class='flag-5'>模型</b>

    高效扩充样本库 | AIDG AI 样本生成器 2.0 焕新而来

    高质量样本有利于快速构建理想的深度学习模型,然而在动力电池、3C电子、汽车制造等高良率的生产场景中,想要获取足够数量的缺陷样本用于AI品质检测,可能需要做出额外的努力。用图像处理软件制作缺陷
    的头像 发表于 05-08 09:41 1080次阅读
    高效扩充<b class='flag-5'>样本</b>库 | AIDG AI <b class='flag-5'>样本</b>生成器 2.0 焕新而来