7.3 Organizing data into training batches

article/2025/6/30 6:42:36

Chapter 7-Fine-tuning to follow instructions

7.3 Organizing data into training batches

  • 下一步是构建训练批次

    定义一种方法,以确保我们的模型在微调过程中接收格式化的训练数据。如下图所示,我们通过几个步骤处理此数据集批处理。

  • 首先,我们实现一个“InstructionDataset”类,该类对数据集中的所有输入进行预标记,类似于第6章中的“SpamDataset”

    import torch
    from torch.utils.data import Datasetclass InstructionDataset(Dataset):def __init__(self, data, tokenizer):self.data = data# Pre-tokenize textsself.encoded_texts = []for entry in data:instruction_plus_input = format_input(entry)response_text = f"\n\n### Response:\n{entry['output']}"full_text = instruction_plus_input + response_textself.encoded_texts.append(tokenizer.encode(full_text))def __getitem__(self, index):return self.encoded_texts[index]def __len__(self):return len(self.data)
    

    与第 6 章类似,我们希望批量收集多个训练示例以加速训练;这需要将所有输入填充到相似的长度,使用 ‘<|endftext|>’ 标记作为填充标记。

    import tiktoken
    tokenizer = tiktoken.get_encoding("gpt2")print(tokenizer.encode("<|endoftext|>", allowed_special={"<|endoftext|>"}))"""输出"""
    [50256]
    
  • 我们通过开发一个可以传递给数据加载器的自定义排序函数来采用更复杂的方法。这个自定义排序函数将每个批次中的训练示例填充到相同的长度,同时允许不同批次具有不同的长度。这种方法 minimizesunnecessary 填充,只扩展序列以匹配每个批次中最长的一个,而不是整个数据集,如下图所示

    def custom_collate_draft_1(batch,pad_token_id=50256,device="cpu"
    ):# Find the longest sequence in the batch# and increase the max length by +1, which will add one extra# padding token belowbatch_max_length = max(len(item)+1 for item in batch)# Pad and prepare inputsinputs_lst = []for item in batch:new_item = item.copy()# Add an <|endoftext|> tokennew_item += [pad_token_id]# Pad sequences to batch_max_lengthpadded = (new_item + [pad_token_id] *(batch_max_length - len(new_item)))# Via padded[:-1], we remove the extra padded token# that has been added via the +1 setting in batch_max_length# (the extra padding token will be relevant in later codes)inputs = torch.tensor(padded[:-1])inputs_lst.append(inputs)# Convert list of inputs to tensor and transfer to target deviceinputs_tensor = torch.stack(inputs_lst).to(device)return inputs_tensor
    

    我们实现的custom_collate_draft_1被设计为集成到PyTorch DataLoader中,但它也可以作为一个独立的工具。在这里,我们独立地使用它来测试和验证它是否按预期运行。让我们在三个不同的输入上尝试一下,我们希望将它们组装成一个批处理,其中每个示例都被填充到相同的长度

    inputs_1 = [0, 1, 2, 3, 4]
    inputs_2 = [5, 6]
    inputs_3 = [7, 8, 9]batch = (inputs_1,inputs_2,inputs_3
    )print(custom_collate_draft_1(batch))"""输出"""
    tensor([[    0,     1,     2,     3,     4],[    5,     6, 50256, 50256, 50256],[    7,     8,     9, 50256, 50256]])
    

  • 到目前为止我们只将输入返回给 LLM;但是,对于 LLM 训练,我们还需要目标值,与预先训练 LLM 类似,目标是向右移动 1 个位置的输入,因此 LLM 学会预测下一个令牌。

    以下更新的排序函数从输入token ID生成目标tokenID:

    def custom_collate_draft_2(batch,pad_token_id=50256,device="cpu"
    ):# Find the longest sequence in the batchbatch_max_length = max(len(item)+1 for item in batch)# Pad and prepare inputsinputs_lst, targets_lst = [], []for item in batch:new_item = item.copy()# Add an <|endoftext|> tokennew_item += [pad_token_id]# Pad sequences to max_lengthpadded = (new_item + [pad_token_id] *(batch_max_length - len(new_item)))inputs = torch.tensor(padded[:-1])  # Truncate the last token for inputstargets = torch.tensor(padded[1:])  # Shift +1 to the right for targetsinputs_lst.append(inputs)targets_lst.append(targets)# Convert list of inputs to tensor and transfer to target deviceinputs_tensor = torch.stack(inputs_lst).to(device)targets_tensor = torch.stack(targets_lst).to(device)return inputs_tensor, targets_tensor
    
    inputs, targets = custom_collate_draft_2(batch)
    print('inputs:\n', inputs)
    print('targets:\n', targets)"""输出"""
    inputs:tensor([[    0,     1,     2,     3,     4],[    5,     6, 50256, 50256, 50256],[    7,     8,     9, 50256, 50256]])targets:tensor([[    1,     2,     3,     4, 50256],[    6, 50256, 50256, 50256, 50256],[    8,     9, 50256, 50256, 50256]])
    
  • 接下来,我们引入一个ignore_index值,用一个新值替换所有填充tokenID;这个ignore_index的目的是我们可以忽略损失函数中的填充值(稍后会详细介绍)

    具体来说,这意味着我们将与’50256’对应的令牌ID替换为’-100’,如下所示

    此外,我们还引入了“允许的最大长度”(allowed_max_length)这一参数,以便在需要时对样本长度加以限制。如果您打算使用长度超过 GPT-2 模型所支持的 1024 个词元上下文大小的自有数据集,这个参数就会派上用场 。

    inputs, targets = custom_collate_fn(batch)
    print('inputs:\n', inputs)
    print('targets:\n', targets)"""输出"""
    inputs:tensor([[    0,     1,     2,     3,     4],[    5,     6, 50256, 50256, 50256],[    7,     8,     9, 50256, 50256]])targets:tensor([[    1,     2,     3,     4, 50256],[    6, 50256,  -100,  -100,  -100],[    8,     9, 50256,  -100,  -100]])
    
  • 修改后的排序函数按预期工作,通过插入令牌ID-100来更改目标列表。这种调整背后的逻辑是什么?让我们探索一下这种修改的潜在目的。

    为了说明的目的,让我们假设我们有一个小分类任务,有 2 个类标签,0 和 1,类似于第 6 章、如果我们有以下 logits 值(模型最后一层的输出),我们计算以下损失

    logits_1 = torch.tensor([[-1.0, 1.0],  # 1st training example[-0.5, 1.5]]  # 2nd training example
    )
    targets_1 = torch.tensor([0, 1])loss_1 = torch.nn.functional.cross_entropy(logits_1, targets_1)
    print(loss_1)"""输出"""
    tensor(1.1269)
    

    现在,如预期的那样,再添加一个训练示例将影响损失

    logits_2 = torch.tensor([[-1.0, 1.0],[-0.5, 1.5],[-0.5, 1.5]]  # New 3rd training example
    )
    targets_2 = torch.tensor([0, 1, 1])loss_2 = torch.nn.functional.cross_entropy(logits_2, targets_2)
    print(loss_2)"""输出"""
    tensor(0.7936)
    

    让我们看看如果我们将其中一个示例的类标签替换为-100会发生什么

    targets_3 = torch.tensor([0, 1, -100])loss_3 = torch.nn.functional.cross_entropy(logits_2, targets_3)
    print(loss_3)
    print("loss_1 == loss_3:", loss_1 == loss_3)"""输出"""
    tensor(1.1269)
    loss_1 == loss_3: tensor(True)
    

    我们可以看到,3个训练示例的结果损失与从2个训练示例计算的损失相同,这表明交叉熵损失函数忽略了带有 -100 标签的训练示例,默认情况下PyTorch有 cross_entropy(..., ignore_index=-100) 设置来忽略与标签 -100 对应的示例,利用 -100 ignore_index 能忽略用于将训练示例填充到等长的批次中额外的文本结束(填充)令牌,但我们不想忽略文本结束(填充)令牌(50256)的第一个实例,因其能在响应完成时向LLM发出信号 (说白了就是标注每句话的最后一个字符)。

    在实践中,掩盖与指令对应的目标token ID也很常见,如下图所示


7.4-Creating data loaders for an instruction dataset


http://www.hkcw.cn/article/jvHKWxbVSO.shtml

相关文章

AI数字人系统开发——引领未来智能交互潮流

在智能交互的时代&#xff0c;AI数字人系统开发正以其独特的魅力和巨大的潜力&#xff0c;引领着未来的发展方向。它不仅改变了我们与机器的交互方式&#xff0c;还为我们带来了全新的生活和工作体验。 我们的AI数字人系统开发&#xff0c;以创新为驱动&#xff0c;不断追求技…

Langchain4j Function Calling (5)

Langchain4j Function Calling(函数调用) Function Calling 函数调用 也叫 Tools 工具. 不用函数调用存在的问题 测试计算问题 提供agent AiService(wiringMode AiServiceWiringMode.EXPLICIT,chatModel "qwenChatModel",chatMemory "chatMemory",ch…

《数字世界的连接器:计算机网络应用全景解析》

一、引言 在万物互联的今天&#xff0c;计算机网络早已不再是幕后基础设施&#xff0c;而是推动数字时代变革的“神经系统”。无论你在使用智能手机刷短视频&#xff0c;还是企业通过云服务部署系统&#xff0c;这一切都离不开计算机网络的广泛应用。 本文将全面系统地介绍计…

密云北庄镇首次发现凤头鹰 生态魅力再添新证

近日,北庄镇观鸟爱好者与生态工作人员在日常监测中惊喜发现国家二级保护鸟类凤头鹰的踪迹。这一发现不仅为密云区鸟类名录新增一员,更印证了北庄镇作为“观鸟小镇”的生态魅力。凤头鹰是中型猛禽,因头部具短羽冠而得名,常栖息于山地森林中,以蛙、蜥蜴、鼠类及小型鸟类为食…

清华回应17岁学生登顶珠峰保送清华 最年轻登顶者澄清

近日,有媒体报道称北京第八十中学17岁的学生李浩榕成为中国首位从北坡登顶珠峰的青少年,消息一度登上热搜。还有报道称他是“全球中学生第一人”。不过,根据国内其他媒体报道,河北16岁女孩丁禹琪在2020年曾从北坡成功登顶珠峰。西藏登山协会证实,在中国业余登山爱好者中,…

宁德时代董事长现身尊界S800发布会 强调电池安全与可靠

在5月30日的尊界S800发布会上,华为与江淮汽车联合推出了新款车型尊界S800。宁德时代董事长曾毓群也出席了发布会,并强调智能与豪华的基础在于安全,而电池是实现这一目标的关键。曾毓群提到,安全是新能源汽车的生命线。要达到极致的安全标准,需要关注材料和化学体系、基于3…

利物浦签24岁荷兰边卫弗林蓬 3500万解约金锁定强援

利物浦宣布签下24岁的荷兰边卫弗林蓬,支付了3500万解约金。弗林蓬此前效力于勒沃库森。罗马诺确认,前亚特兰大主教练加斯佩里尼将执教罗马,签约三年。沙特媒体OKAZ报道,C罗拒绝了所有沙特国内外俱乐部的报价,并指示团队停止一切转会谈判,表明他将在利雅得胜利继续职业生涯…

贿赂百名医生的药企违规费用已清缴 相关人员接受调查处理

近期,我们收到关于某药企涉嫌向医生输送商业贿赂的举报信。对此,我们高度重视,立即成立调查组,并会同相关部门展开调查核实工作。以下是调查处置进展情况。举报信涉及125名医疗机构人员,其中6人信息重复,1人信息不实,实际核实为118人,分布在36家医疗机构(举报信中提到…

白举纲 只要有舞台就一定会在 歌手的自我救赎

《歌手》第三期中,白举纲遗憾落榜。其实早有迹象,他将《海鸥》和《The End of the World》融合在一起,编曲非常用心。但问题恰恰出在这首歌上,选得太“用力”了,不够松弛。如果他选择一首更轻松、更符合自己气质的歌曲,结果可能会完全不同。例如,马嘉祺选唱的《我也曾想…

日本首相石破茂国际论坛官宣:坚持战后和平发展道路,不重蹈覆辙

华沙犹太人殉难纪念碑前,一位德国总理突然双膝跪地。这一跪,让世界记住了勃兰特的名字。同样的二战轴心国,日本政要的身影却频频出现在靖国神社。2025年5月29日,东京“亚洲的未来”论坛现场。石破茂面对各国代表,首次以首相身份提及“吸取战争教训”。他承诺日本将坚持和平…

做实验 搞锻炼 神二十乘组的端午节很忙碌

当粽叶的幽香在神州大地飘荡,太空家园中的神舟二十号航天员乘组也寻味而至,送来了太空祝福。截至目前,三名航天员陈冬、陈中瑞、王杰进驻中国空间站已经一个多月了,今天是他们在太空迎来的第一个中国传统节日。三位航天员的端午节怎么度过?出差这段时间他们有哪些新的感悟…

全球住房危机影响近30亿人 亟需全球协调行动

当地时间5月29日至30日,第二届联合国人居大会续会在肯尼亚首都内罗毕召开。超过1000名代表参会,共同探讨日益严峻的全球住房危机,希望通过讨论、协作与政策规划推动问题的有效解决。联合国人类住区规划署执行主任阿纳克劳迪娅罗斯巴赫指出,据估计,全球有超过28亿人住房条件…

存款利率跌破1% 分红型理财产品发行升温:资金流向低估值资产

5月初降准释放的1万亿长期资金,减少了银行对高成本同业负债的依赖。配合存款利率下调,银行可将更多低成本资金用于贷款投放,形成低息吸储-低息放贷的良性循环。银行股为代表的低估红利资产具有双重防御属性。沪深300价值指数通过“低估值”指标筛选样本,其中银行股占比高达…

光电学、计算机科学及算法国际会议(OCSA 2025)征稿启事​

在科技浪潮奔涌向前的当下&#xff0c;光电学、计算机科学及算法领域的创新成果不断涌现&#xff0c;持续重塑着各个行业的格局&#xff0c;深刻影响着我们的生活。为了进一步促进该领域的学术交流与合作&#xff0c;汇聚全球智慧&#xff0c;光电学、计算机科学及算法国际会议…

设计模式之结构型:代理模式

代理模式(Proxy Pattern) 定义 适配器模式是一种​​结构型设计模式​​&#xff0c;用于解决两个不兼容接口之间的兼容性问题。它通过​​包装对象​​的方式&#xff0c;将已有接口转换为客户端期望的接口&#xff0c;类似电源适配器的功能。 UML 类图​ 核心角色 Subject&am…

Bootstrap:精通级教程(VIP10万字版)

一、网格系统:实现复杂响应式布局 I. 引言 在现代 Web 开发领域,构建具有视觉吸引力、功能完善且能在多种设备和屏幕尺寸上无缝运行的响应式布局至关重要。Bootstrap 作为业界领先的前端框架,其核心的网格系统为开发者提供了强大而灵活的工具集,用以高效创建复杂的响应式…

数据结构 堆与优先级队列

文章目录 &#x1f4d5;1. 堆(Heap)✏️1.1 堆的概念✏️1.2 堆的存储方式✏️1.3 堆的创建✏️1.4 堆的插入✏️1.5 堆的删除 &#x1f4d5;2. 优先级队列(PriorityQueue)✏️2.1 堆与优先级队列的关系✏️2.2 优先级队列的构造方法✏️2.3 优先级队列的常用方法 3. Java对象的…

基于Java 实现 IM 业务回调

1.什么是业务回调 2.腾讯云回调的类型 功能角度 在线状态回调 资料关系链回调 单聊消息回调 群组系统回调 处理角度 事件发生之前回调&#xff1a;回调的主要目的在于让 App 后台可以干预该事件的处理逻辑&#xff0c;即时通信 IM 会根据回调返回码确定后续处理流程&…

印度空军高官不满:“国产战机”到底何时能交货

据俄罗斯卫星通讯社5月29日报道,印度空军参谋长辛格在印度工业联合会举办的年度商业峰会上严厉批评本国的航空制造业,称印度大型国防项目的落实没有如期进行,包括国产“光辉”战机在内的战斗机向空军交付均出现延迟。辛格指出,根据2021年与印度斯坦航空有限公司签订的价值4…

澳贸易部长谈美国进口钢铝关税 反对不合理加征

5月30日,美国总统特朗普宣布,自6月4日起,将把钢铁和铝的进口关税从25%提高至50%。次日,澳大利亚贸易部长法瑞尔对此作出回应,表示澳大利亚的立场始终明确且一致。他认为这些关税措施既不合理,也不符合朋友之间的行为准则。法瑞尔指出,这种做法是一种经济上的自我伤害,不…