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

    文章

    7316

    浏览量

    94048
  • 代码
    +关注

    关注

    30

    文章

    4947

    浏览量

    73217
  • 大模型
    +关注

    关注

    2

    文章

    3470

    浏览量

    5005

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Vishay TSM3微调电阻器技术解析与应用指南

    Vishay/Sfernice TSM3微调电阻器设计用于表面贴装微型微调电位器,采用多圈金属陶瓷密封,性能和稳定性卓越。 此系列微调电阻器设计紧凑,可节省电路板空间,经密封可耐受标准电路板冲洗处理
    的头像 发表于 11-12 11:00 305次阅读
    Vishay TSM3<b class='flag-5'>微调</b>电阻器技术解析与应用指南

    LLM安全新威胁:为什么几百个毒样本就能破坏整个模型

    本文转自:DeepHubIMBA作者:DhanushKumar数据投毒,也叫模型投毒或训练数据后门攻击,本质上是在LLM的训练、微调或检索阶段偷偷塞入精心构造的恶意数据。一旦模型遇到特
    的头像 发表于 10-29 11:06 329次阅读
    LLM安全新威胁:为什么几百个毒<b class='flag-5'>样本</b>就能破坏整个<b class='flag-5'>模型</b>

    NVIDIA开源Audio2Face模型及SDK

    NVIDIA 现已开源 Audio2Face 模型与 SDK,让所有游戏和 3D 应用开发者都可以构建并部署带有先进动画的高精度角色。NVIDIA 开源 Audio2Face 的训练框架,任何人都可以针对特定用例对现有模型进行微调
    的头像 发表于 10-21 11:11 578次阅读
    NVIDIA开源Audio2Face<b class='flag-5'>模型</b>及SDK

    NVMe高速传输之摆脱XDMA设计27: 桥设备模型设计

    构造 PCIe Switch 模型。 最小桥设备模型结构如图 1所示。图1 最小桥设备模型结构图 最小桥设备模型只包含一个唯一的上游端口和一
    发表于 09-18 09:11

    模板驱动 无需训练数据 SmartDP解决小样本AI算法模型开发难题

    。但是这个平台不适用于小样本AI模型开发,特别是一些特殊行业,数据本来就不多,但又有着需求,因此陷于两难。面临这种市场困境,慧视光电推出了一个全新的AI平台Sma
    的头像 发表于 09-09 17:57 1213次阅读
    模板驱动  无需训练数据  SmartDP解决小<b class='flag-5'>样本</b>AI算法<b class='flag-5'>模型</b>开发难题

    北成供应哈默纳科减速机HPG断面模型使用的内部构造演示

    模型
    北京北成新控
    发布于 :2025年08月28日 11:26:27

    千方科技推出AI大模型公路构造物评定系统

    公路构造物(桥梁、隧道、涵洞等)检测评定是养护管理的核心环节,通过量化构造物的技术状况评定等级,可为养护资源分配决策提供技术支持。传统公路构造物技术状况评定面临“三座大山”:一是评定结果易受人
    的头像 发表于 07-09 15:54 769次阅读

    嵌入式AI技术漫谈:怎么为训练AI模型采集样本数据

    Q 需要为嵌入式AI模型提供多少样本数据? 我在向客户介绍如何使用AI方法设计一款客户产品时,客户理解,AI嵌入式项目的开发都是围绕数据展开的,如此,我经常会被问到这样的问题:客户的工程师需要采集
    的头像 发表于 06-11 16:30 1114次阅读

    西门子伺服电机简明样本

    西门子伺服电机简明样本
    发表于 04-14 15:36 2次下载

    请问是否有任何OpenVINO™样本可以推断批次大小大于1的检测模型

    是否有任何OpenVINO™样本可以推断批次大小大于 1 的检测模型
    发表于 03-06 07:19

    OpenVINO™工具套件使用CRNN_CS模型运行OpenCV* text_detection.cpp报错怎么解决?

    将 crnn_cs.onnx 文本识别模型转换为中间表示 (IR): python mo.py --input_model crnn_cs.onnx 使用生成的 IR 文件运行 OpenCV
    发表于 03-05 09:19

    使用OpenVINO™训练扩展对水平文本检测模型进行微调,收到错误信息是怎么回事?

    已针对水平文本检测模型运行OpenVINO™训练扩展中的 微调 步骤,并收到错误消息: RuntimeError: Failed to find annotation files
    发表于 03-05 06:48

    【「基于大模型的RAG应用开发与优化」阅读体验】+Embedding技术解读

    生成回答。在特定领域或任务中,可以通过微调Embedding模型来提高检索的相关性和准确性。Embedding在大模型RAG技术中发挥着至关重要的作用。它不仅实现了文本向量化,还为信息检索和文本生成提供了基础。通过不断优化和迭代
    发表于 01-17 19:53

    【「基于大模型的RAG应用开发与优化」阅读体验】+大模型微调技术解读

    今天学习<基于大模型的RAG应用开发与优化>这本书。大模型微调是深度学习领域中的一项关键技术,它指的是在已经预训练好的大型深度学习模型基础上,使用新的、特定任务相关的数据
    发表于 01-14 16:51

    《具身智能机器人系统》第7-9章阅读心得之具身智能机器人与大模型

    的应用。MAML算法通过二阶优化找到对任务变化敏感的模型参数,实现了快速适应。上下文学习则引入了注意力机制,使模型能够根据当前场景动态调整行为策略。在预训练-微调范式中,我们要注意任务表示的重要性:好的表示
    发表于 12-24 15:03