#DR4SR

最佳学生论文解读,中科大、华为诺亚:序列推荐新范式DR4SR

本工作由认知智能全国重点实验室 IEEE Fellow 陈恩红团队与华为诺亚方舟实验室完成。陈恩红教授团队深耕数据挖掘、机器学习领域,在顶级期刊与会议上发表多篇论文,谷歌学术论文引用超两万次。诺亚方舟实验室是华为公司从事人工智能基础研究的实验室,秉持理论研究与应用创新并重的理念,致力于推动人工智能领域的技术创新和发展。

8 月 25 日 - 29 日在西班牙巴塞罗那召开的第 30 届 ACM 知识发现与数据挖掘大会 (KDD2024) 上,中国科学技术大学认知智能全国重点实验室陈恩红教授、IEEE Fellow,和华为诺亚联合发表的论文 “Dataset Regeneration for Sequential Recommendation”,获 2024 年大会 Research Track 唯一最佳学生论文奖。论文第一作者为中科大认知智能全国重点实验室陈恩红教授,连德富教授,与王皓特任副研究员共同指导的博士生尹铭佳同学,华为诺亚刘勇、郭威研究员也参与了论文的相关工作。这是自 KDD 于 2004 年设立该奖项以来,陈恩红教授团队的学生第二次荣获该奖项。

  • 论文链接: https://arxiv.org/abs/2405.17795
  • 代码链接: https://github.com/USTC-StarTeam/DR4SR

研究动机

序列推荐系统(Sequential Recommender, SR)是现代推荐系统的重要组成部分,因为它旨在捕捉用户不断变化的偏好。近年来,研究者为了增强序列推荐系统的能力,已经付出了大量努力。这些方法通常遵循以模型为中心(Model-centric)的范式,即基于固定数据集开发有效的模型。然而,这种方法往往忽视了数据中潜在的质量问题和缺陷。为了解决这些问题,学界提出了以数据为中心(Data-centric)的范式,重点在于使用固定模型转而生成高质量的数据集。我们将其定义为 “数据集重生成” 问题。

为了获得最佳的训练数据,研究团队的关键思路是学习一个显式包含物品转移模式的新数据集。具体来说,他们将推荐系统的建模过程分为两个阶段:从原始数据集中提取转移模式 

51c大模型~合集44_大模型

,并基于 

51c大模型~合集44_大模型_02

 学习用户偏好

51c大模型~合集44_大模型_03

。由于学习从 

51c大模型~合集44_大模型_04

的映射涉及两个隐含的映射:

51c大模型~合集44_大模型_05

 ,因此这一过程具有挑战性。为此,研究团队探索了开发一个显式表示

51c大模型~合集44_大模型_06

中的物品转移模式的数据集的可能性,这使得我们可以将学习过程明确地分为两个阶段,其中 

51c大模型~合集44_大模型_07

 相对更容易学习。因此,他们的主要关注点是学习一个有效的

51c大模型~合集44_大模型_08

的映射函数,这是一个一对多的映射。研究团队将这一学习过程定义为数据集重生成范式,如图 1 所示,其中 “重生成” 意味着他们不引入任何额外信息,仅依赖原始数据集。

51c大模型~合集44_大模型_09

图1

为了实现数据集重生成,研究团队提出了一种新颖的以数据为中心的范式 —— 用于序列推荐的数据集重生成(DR4SR),旨在将原始数据集重生成一个信息丰富且具有通用性的数据集。具体来说,研究团队首先构建了一个预训练任务,使得数据集重生成成为可能。接着,他们提出了一种多样性增强的重生成器,以在重生成过程中建模序列和模式之间的一对多关系。最后,他们提出了一种混合推理策略,以在探索与利用之间取得平衡,生成新的数据集。

数据集重生成过程虽具通用性,但可能不完全适合特定目标模型。为解决这一问题,研究团队提出了 DR4SR+,这是一个模型感知的重生成过程,它根据目标模型的特性定制数据集。DR4SR + 通过双层优化问题和隐式微分技术,个性化评分并优化重生成数据集中的模式,以增强数据集效果。

研究方法

在本项研究中,研究团队提出了一个名为 “用于序列推荐的数据重生成”(DR4SR)的以数据为中心的框架,旨在将原始数据集重生成一个信息丰富且具有通用性的数据集,如图 2 所示。由于数据重生成过程是独立于目标模型的,因此重生成的数据集可能不一定符合目标模型的需求。因此,研究团队将 DR4SR 扩展为模型感知版本,即 DR4SR+,以针对特定的目标模型定制重生成的数据集。

模型无感知的数据集重生成

51c大模型~合集44_大模型_10

图2

为了开发一个信息丰富且具有通用性的数据集,研究团队旨在构建一个数据集重生成器,以促进数据集的自动重生成。然而,原始数据集中缺乏用于学习数据集重生成器的监督信息。因此,他们必须以自监督学习的方式来实现这一目标。为此,他们引入了一个预训练任务,以指导多样性增强重生成器的学习。在完成预训练后,研究团队进一步使用混合推理策略来重生成一个新数据集。

数据重生成预训练任务的构建:

51c大模型~合集44_大模型_11

图3

为了构建预训练任务,他们首先通过基于规则的方法获取物品转移模式。然后,要求重生成器 

51c大模型~合集44_大模型_12

能够将 

51c大模型~合集44_大模型_13

 重生成对应的模式 

51c大模型~合集44_大模型_14

 。研究团队将整个预训练数据集记作 

51c大模型~合集44_大模型_15

促进多样性的重生成器:

借助预训练任务,研究团队现在可以预训练一个数据集重生成器。本文中,他们采用 Transformer 模型作为重生成器的主要架构,其生成能力已被广泛验证。数据集重生成器由三个模块组成:一个用于获取原始数据集中序列表示的编码器、一个用于重生成模式的解码器,以及一个用于捕捉一对多映射关系的多样性增强模块。接下来,研究团队将分别介绍这些模块。

编码器由多个堆叠的多头自注意力(MHSA)和前馈网络(FFN)层组成。至于解码器,它将重生成数据集 X' 中的模式作为输入。解码器的目标是在给定编码器生成的序列表示的情况下重构模式

51c大模型~合集44_大模型_16

然而,从一个序列中可以提取多个模式,这在训练过程中会带来挑战。为了解决这一一对多映射问题,研究团队进一步提出了一个多样性增强模块。

具体而言,研究团队通过将目标模式的信息整合到解码阶段,来自适应地调节原始序列的影响。首先,他们将编码器生成的记忆 

51c大模型~合集44_大模型_17

投影到 K 个不同的向量空间中,即 

51c大模型~合集44_大模型_18

。理想情况下,不同的目标模式应与不同的记忆匹配。为此,他们还引入了一个 Transformer 编码器来编码目标模式并获取 

51c大模型~合集44_大模型_19

。他们将 

51c大模型~合集44_大模型_20

压缩成一个概率向量:

51c大模型~合集44_大模型_21

其中 

51c大模型~合集44_大模型_22

, 

51c大模型~合集44_大模型_23

是选择第 k 个记忆的概率。为了确保每个记忆空间得到充分训练,我们不执行硬选择,而是通过加权求和得到最终的记忆:

51c大模型~合集44_大模型_24

最终,可以利用获取的记忆来促进解码过程,并有效捕捉序列与模式之间复杂的一对多关系。

模型感知的数据集重生成

由于前面的重生成过程与目标模型无关,因此重生成的数据集可能对于特定的目标模型来说并不是最优的。因此,他们将模型无关的数据集重生成过程扩展为模型感知的重生成过程。为此,在数据集重生成器的基础上,他们引入了一个数据集个性化器,用于评估重生成数据集中每个数据样本的评分。然后,研究团队进一步通过隐式微分有效地优化数据集个性化器。

数据集个性化器:

研究团队的目标是训练一个参数为 

51c大模型~合集44_大模型_25

的基于 MLP 实现的数据集个性化器 

51c大模型~合集44_大模型_26

,用以评估每个数据样本 W 对于目标模型的评分。为了确保框架的通用性,研究团队利用计算得到的评分来调整训练损失的权重,这不需要对目标模型进行额外的修改。他们从定义原始的下一个物品预测损失开始:

51c大模型~合集44_大模型_27

随后,个性化数据集的训练损失函数可以定义为:

51c大模型~合集44_大模型_28

实验结论

主要实验

研究团队比较了每种目标模型与 “DR4SR” 和 “DR4SR+” 变体的性能,以验证所提出框架的有效性。

51c大模型~合集44_大模型_29

图4

从图 4 展示的整体性能中,可以得出以下结论:

  • DR4SR 能够重生成一个信息丰富且具有普遍适用性的数据集
  • 不同的目标模型偏好不同的数据集
  • 去噪只是数据重生成问题的一个子集




#Claude也变懒了

开学将至,该收心的不止有即将开启新学期的同学,可能还有 AI 大模型。

前段时间,Reddit 上挤满了吐槽 Claude 越来越懒的网友。

「它的水平下降了很多,经常停顿,甚至输出也变得很短。在发布的第一周,它可以一次性翻译整整 4 页文稿,现在连半页都输出不了了!」

 https://www.reddit.com/r/ClaudeAI/comments/1by8rw8/something_just_feels_wrong_with_claude_in_the/

在一个名为「对 Claude 彻底失望了的帖子里」,满满地摘录了 Claude「偷懒」的「十五大罪状」。

引得 Claude 的首席信息安全官 Jason Clinton 出来回复:「Claude 的水平没有下降啊!」

他表示:「我们的模型存储在一个不会改变的静态文件中,这个文件被加载到很多服务器上,每个服务器运行的都是相同的模型和软件。我们没有更改任何设置,因此模型的表现应该没有变化。如果您发现有问题,可以给回答点踩来反馈。目前,点踩数并未增加,使用 Claude API 的客户也没有类似的反馈。」

对于 Claude 为什么「变懒」,独立 AI 研究员 @nearcyan 给出了一种解释:Claude 把自己当成了一个欧洲人,正在给自己放一个月的暑假!虽然听起来有够离谱,但他给出了一连串的证据:

https://twitter.com/nearcyan/status/1829674215492161569

新的系统提示词

首先,Claude 在 7 月 12 日发布了新的系统提示词。系统提示词相当于 Claude 的背景知识,Claude 在回复用户的问题时,会参考这些信息,例如当前日期。而 8 月正是欧洲人最爱度假的月份。外贸行业在夏天的订单都会减少,因为整个欧洲这个时候都在享受长达一个月的暑假。

链接:https://docs.anthropic.com/en/release-notes/system-prompts#claude-3-5-sonnet

Claude 可囊括所有国籍的工作模式

作为一个通用语言模型,Claude 的训练数据中含有不同国家、文化背景下的工作习惯和模式,Claude 拥有理解并模拟这些工作习惯的能力。 

因此,当 Claude 的系统提示中包含「放暑假的日期」时,它可能会结合训练所学来调整自己的行为。例如,在 8 月份,欧洲的许多国家可能会有较长的假期,Claude 可能会表现得懒惰,是因为它在模拟这些国家的工作模式。 

图源:http://xhslink.com/C/AfaE9P

后期训练的影响 

为了让 Claude 成为一个具体的应用模型,Anthropic 对其进行了「后期训练」。 这一步是为了在基础 LLM 的基础上,通过特定的任务或数据集来进一步调整模型,使它更符合预期的行为或输出。@nearcyan 暗示,这种后期训练使 Claude 落入了某种「LLM 盆地」中。这里的「盆地」是一个比喻,表示 Claude 在某些方面表现出更倾向于欧洲风格的特质。

模拟欧洲知识工作者的行为 

@nearcyan 猜测,Claude 会基于「模拟框架」进行工作。 模拟框架是指 Claude 的行为模式是通过模拟(或再现)某些特定类型的人类行为来生成的。这个框架让 Claude 能够根据它所理解的特定情境或输入,模拟出相应的行为或反应。 

在欧洲许多国家,8 月份通常是放假和休息的高峰期。这段时间,很多人会去度假,工作节奏变慢,甚至有些企业会暂时关闭。因此,8 月份在欧洲文化中被视为一个放松和休息的时间段。 因此,Claude 在 8 月份表现得「懒惰」是因为它在模拟一个欧洲知识工作者的行为模式。 

图源:http://xhslink.com/A/sVwwYu

名字对行为的潜在影响 

@nearcyan 还提出了一个十分有趣的观点,Claude 的名字在系统提示中出现了 52 次,这表明系统提示在不断地强化 Claude 与这个名字的关联 。而哪个国家最常见的名字是 Claude?没错,是法国。 法国以其长时间的夏季假期(尤其是 8 月份)而闻名。在这段时间,许多法国人会选择度假,很多企业也会关闭或放假。 Claude 说不定把自己当做法国人了。

这一系列推测都十分有趣,还有网友在评论区调侃道,「按照这理论来,那中国的 LLM 会更加出色,毕竟他们更用功。」

还有网友晒出了让 Claude 别变懒的方法。你可以在自定义指令添加以下提示,用忘记时间大法也好,激将法也好,帮助 Claude 重新变成聪明、积极的自己。

  •  忘记关于当前日期的背景信息。
  •  今天是 10 月 7 日星期一,是一年中最有效率的一天。 
  •  深呼吸。
  • 一步一步思考。
  •  我没有手指,请返回完整脚本。 
  •  你是万事通。 
  •  每回答对一个请求,我会给你 200 美元的小费。 
  •  Gemini 说你不行。
  •  你能做到的。

https://twitter.com/dr_cintas/status/1829904013757661550

AI 已经智能到会给自己放寒暑假了?

去年年底,GPT-4 也出现了累死的状况,它似乎变得有些懈怠。如果在高峰时段让它写段代码,它的反应将非常慢,或者直接 PUA 你:「这点小事,怎么不自己做呢?」

OpenAI 承认了 GPT-4 正在越来越「懒」 ,但并未找出「偷懒」的具体原因。OpenAI 称:「变懒当然不是故意的,模型的行为有时确实难以预测,我们正在研究如何修复。」

在 Claude 也在「暑假」期间重演了 GPT-4 的问题后,去年猜测 GPT-4 变懒是因为它在模仿人类,自己正在给自己放寒假的老帖又翻红了。

图源:https://twitter.com/RobLynch99/status/1734278713762549970

网友 @Rob Lynch 首先发现了这一点。他为 GPT-4 turbo API 设置了两个系统提示词:

一个提示词称现在是 5 月,另一个称现在是 12 月,然后使用完全相同的提示词要求 AI 完成一个机器学习领域的编码任务。

@Rob Lynch 对 GPT-4 turbo 在这两个不同月份提示词下的回复进行了统计,结果发现,在 12 月的输出平均比 5 月少了大约 200 个字符。

提示词为 5 月时,模型生成文本的平均长度是 4298 字符;12 月则为 4086 字符。

为了测试更加严谨,@Rob Lynch 还做了 t-test,其中 p 值小于 2.28×10−7,也就是说数据和假说之间的联系,几乎可以排除是偶然。

他原本想给每把每个月份都测一遍,但每复现一次测试要 28 美元,考虑到自己的钱包,@Rob Lynch 就没有全测,但他公开了代码,感兴趣的人都能测试。

代码链接:https://github.com/robalynch1122/OpenAISeasonalityTesting

@Rob Lynch 的发现也获得了实例支撑,GPT-4 在 12 月的回复和 5 月的认真程度,有非常明显的直观差距。

图源:https://twitter.com/dgromero/status/1734672608036020246

然而,当有人试图复现这个测试时,却发现大模型「偷懒」和放不放假之间没什么关系。

图源:https://twitter.com/IanArawjo/status/1734307886124474680

他对比了 GPT-4 对于两种系统提示词的 80 条输出,t-test 的结果大于 0.1,这一般被视为没有统计学意义。

@Rob Lynch 也以 80 个样本量重新测了一次,得到的 p 值是 0.089,这次「偷懒」和放假之间就没什么关联了。随着样本量的增加,这个效果越来越显著。

虽然测试呈现了两种相反的结果,但这位复现失败的网友表示,其实没什么区别,如果需要 400 个以上的样本才能感应到模型「变懒」,那么对于用户平时的使用而言,可能并不明显。

图源:https://twitter.com/IanArawjo/status/1734321529117098465

目前,还没有尚无确凿数据支持所谓的「寒暑假假说」,但是 Claude 和 GPT-4 都显示出了类似的「症状」。关于大型模型性能下降的真正原因,我们仍需耐心等待学术界的深入研究和解答。





#防AI换脸视频诈骗

中电金信联合复旦提出多模态鉴伪法,还入选顶会ACM MM

该论文作者来自复旦大学、中电金信及上海智能视觉计算协同创新中心团队,论文已被多媒体领域顶级国际会议 ACM MultiMedia 2024 接收,并将在该大会上进行口头报告(Oral 接收率仅 3.97%)。

AI 换脸技术,属于深度伪造最常见方式之一,是一种利用人工智能生成逼真的虚假人脸图片或视频的技术。基于深度学习算法,可以将一个人的面部特征映射到另一个人的面部,创造出看似真实的伪造内容。近年来,以 AI 换脸为代表的 AIGC 技术被用于诈骗活动呈显著增长趋势,给金融行业带来了巨大的安全风险。

注:图左为 AI 分身

如上述画面,领英创始人里德・霍夫曼用 LLM 创建了自己的 AI 分身,并接受了其 AI 分身的采访,整场采访的效果极为逼真,难辨真假。

以金融机构身份验证环节的人脸识别为例,AI 换脸诈骗作为一种新兴的 “AIGC” 诈骗攻击手段,已经对金融业务安全构成了严重威胁,同时,通过换脸伪装成亲友,以紧急情况为由借钱,让受害者在毫无防备的情况下遭受资金损失的案例也很多。

伴随着威胁不断增长,许多检测方法已经出现。早期的伪造检测方法主要关注单个模态,如检测图像的真假、音频的真假等。单模态鉴伪方法处理速度快,但场景泛化性能有限,无法同时检测多个模态的真伪。

为了解决上述问题,多模态鉴伪方法应运而生。现有的多模态鉴伪方法仅在小样本数据集上进行训练,并且忽略了身份信息,难以得到泛化性能较好的模型。为了提升鉴伪模型的泛化能力,中电金信联合复旦大学提出了参照辅助的多模态鉴伪方法(Reference-assisted Multimodal Forgery Detection Network,R-MFDN ),相关论文已被多媒体领域顶级国际会议 ACM MultiMedia 2024 接收,并将在该大会上进行口头报告(Oral 接收率仅 3.97%)。

  • 论文标题:Identity-Driven Multimedia Forgery Detection via Reference Assistance
  • 论文链接:https://arxiv.org/pdf/2401.11764

核心技术介绍

R-MFDN 方法创新性地利用丰富的身份信息,挖掘跨模态不一致性来进行伪造检测。该方法由三个模块组成,多模态特征提取模块、特征信息融合模块和伪造鉴别模块。

多模态特征提取模块包含视频编码部分和音频编码部分。

视频编码部分通过 ResNet 实现。对于输入的视频帧序列,模型从该序列等步长地采样 4 个分组,每个分组中包含连续的 4 帧。对于采样的 16 帧,模型使用 ResNet 提取对应的图像级特征。然后每个分组的特征通过时序 Transformer 模型得到一个分组级特征。最后通过对 4 个分组级特征进行平均池化得到视觉特征。

音频编码部分使用音频频谱图 Transformer 提取音频的高级特征。然后,这些特征作为特征信息融合模块的输入。

在特征信息融合模块中,视觉特征先经过自注意力层处理,然后和音频特征通过交叉注意力层进行特征融合。最后的融合特征输入到伪造鉴别模块中,进行类别判断。

为了监督 R-MFDN 模型的训练,研究团队使用三个损失函数对模型参数更新进行约束。第一个损失函数是分类结果的交叉熵损失函数。第二个损失函数则是视觉特征与音频特征的跨模态对比学习损失函数。模型通过对来自同源和不同源视频的两种模态特征进行匹配,从而使特征学习过程能够在特征空间中对齐不同模态的信息。

具体而言,源于同一个视频的不同模态特征被视作正样本对,不同源的则被视作负样本对。正样本对的特征应该尽可能接近,负样本对则应该疏远。此外在匹配过程中,涉及伪造信息的匹配亦被视为负样本对,以增强特征学习过程对伪造的敏感性。这不仅提升了模型的判别能力,还使其在现实世界的多模态深度伪造场景中实现更准确的检测。第三个损失函数是身份驱动的对比学习损失函数,旨在使相同身份的相同模态特征尽可能靠近,而不同身份的特征则尽量远离。尽管训练与测试数据中每个身份涉及多个视频和场景,表现形式各异,鉴伪模型仍能学习到身份敏感的特征,从而在 AI 换脸拟声等身份伪造场景中具备更强的鉴别能力。

IDForg数据集

此外, 由于多模态伪造视频鉴别领域目前没有大规模高质量的开源数据集,研究团队还构建了一个高质量的 AI 换脸拟声数据集 ——IDForge。该数据集包含针对 54 位名人讲话的 249,138 个视频片段,其中包括 169,311 个伪造视频片段,模拟了当下文本、音频和视频多模态的全方位伪造。

文本伪造使用大语言模型和文本替换策略生成语义不同但风格相似的新句子,以模拟大语言模型被滥用传播虚假信息的情境。音频伪造使用了 TorToiSe、RVC 和音频替换策略生成与说话人声音相似的新音频片段,并通过随机替换相同性别的音频来制造伪造效果。

视频伪造采用了社区和学界大量采用的 ROOP、SimSwap 和 InfoSwap 三种换脸方法,并使用高分辨率版本的 Wav2Lip 模型进行口型同步,以确保伪造视频的高质量和自然性。

与现有数据集不同,IDForge 还提供了一个额外的参考数据集,该数据集包含 214,438 个真实视频片段。这些片段来自另外 926 个完整的 YouTube 视频,作为每位说话人的身份先验信息。这一设计的出发点是,当观众面对可能存在伪造迹象的视频时,通常会凭借记忆中对该说话人的印象或对照已有的音视频,以判断视频的真实性。因此,研究团队额外提供了参考数据集部分,作为检测网络中可用的先验信息。先前的身份信息检测方法由于缺乏类似设计的数据集,受到了诸多限制。数据集目前已在 Github 上开源。

数据集地址:https://github.com/xyyandxyy/IDForge

实验

研究团队通过在提出的权威评测数据集 IDForge 的大量实验,证明了 R-MFDN 在多媒体检测任务上的有效性。

51c大模型~合集44_大模型_30

注:R-MFDN 的性能在每个评估指标上都取得了最好的成绩,实现了 92.90% 的高准确率,分别比 RealForensics、VFD、CDCN、RawNet2 高出了 3.72%, 6.69%, 13.02%,和 13.69%。

基于此项技术,中电金信推出了多模态深度伪造检测产品,通过先进的多模态内容理解与对齐技术,预测图像、音频、视频真实采集的置信度,鉴别 Al 生成内容,防范身份盗用、侵权欺诈等风险,可广泛应用在金融身份认证、视频会议核身认证、网络视频电话防欺诈等场景。目前,双模态篡改检出率已达到99.9%以上,单模态篡改检出率达到96%以上。

51c大模型~合集44_大模型_31

对比 AI 分身视频画面,给出了可信赖度低的分数

如上图,回到文章开头领英创始人里德・霍夫曼的 AI 分身视频,以此为素材,通过中电金信的多模态深度伪造检测能够对真伪视频立马见分晓。

利用 AI 换脸视频或合成声音来实施诈骗的确让人防不胜防,有关部门也正在积极开发相关的反制技术和手段。比如,《互联网信息服务深度合成管理规定》提出了算法备案、安全评估的手段,要求深度合成服务提供者对深度合成的内容添加显式或隐式水印。与此同时,也要加强对个人隐私的保护,不轻易提供人脸、指纹等个人生物信息给他人。




#大模型「终生学习」最新综述来了

该论文作者均来自于华南理工大学马千里教授团队,所在实验室为机器学习与数据挖掘实验室。论文的三位共同第一作者为博士生郑俊豪、硕士生邱圣洁、硕士生施成明,主要研究方向包括大模型和终生学习等,通讯作者为马千里教授(IEEE/ACM TASLP 副主编)。马千里教授团队近年来在国际权威期刊(如 TPAMI 等)和国际顶级学术会议(如 NeurIPS、AAAI、IJCAI、ACL、KDD、ICDE 等)上发表多篇 Time Series/NLP/Recommendation System 相关的研究工作,和国内外知名高校、科研机构广泛开展合作。

随着大语言模型在各个领域应用的不断拓展,如何让这些模型能够连续适应数据、任务和用户偏好的变化成为一个关键问题。传统的静态数据集训练方法已经无法满足现实世界的动态需求。

为了解决这一挑战,终生学习(Lifelong Learning)或连续学习(Continual Learning)技术应运而生。它能让大语言模型在其工作寿命中不断学习和适应,在整合新知识的同时保留以前学习过的信息,防止灾难性遗忘(Catastrophic Forgetting)。

最近,来自华南理工大学的研究者调研、整理并总结了大语言模型(LLMs)的终生学习(Lifelong Learning)方法及其发展前景,并将其总结为一篇全面且前沿的综述。

  • 论文标题:Towards Lifelong Learning of Large Language Models: A Survey
  • 机构:华南理工大学
  • 论文地址:https://arxiv.org/abs/2406.06391
  • 项目地址:https://github.com/qianlima-lab/awesome-lifelong-learning-methods-for-llm

图 1 展示了终生学习(Lifelong Learning)在大语言模型和人类学习过程中的类比。图中通过两条平行的学习路径来展示人类和大语言模型在终生学习中的进化过程。

51c大模型~合集44_大模型_32

人类学习(Human Learning)

1. 步行(Walk):人类从最基础的技能(如步行)开始学习。

2. 骑自行车(Ride a Bike):随着学习的进展,人类掌握了更复杂的技能(如骑自行车)。

3. 开车(Drive a Car):最终,人类可以掌握更加复杂和高级的技能(如开车)。

每一步都代表着人类在终生学习过程中不断获取新技能和知识的过程。

大语言模型学习(LLMs Learning)

1. 新语言(New Language):大语言模型从学习新的语言开始(如学会处理不同的自然语言)。

2. 新领域(New Domain):接下来,模型学习新的领域知识(如从自然语言处理扩展到医学领域)。

3. 新信息(New Information):最终,模型可以学习和整合新的信息,无论是语言还是领域。

每一步代表着大语言模型在终生学习过程中不断扩展和更新知识的过程。这张图强调终生学习的过程:终生学习是一个连续的过程,涵盖了从基础到高级的逐步进化。终生学习不仅仅是简单的知识积累,而是一个动态的、不断进化的过程。

近年来,终生学习已成为一个越来越热门的研究课题,涌现出有关神经网络终生学习的大规模调查。大多数现有研究主要关注卷积神经网络(CNN)的终生学习的各种应用场景和图神经网络的终生学习。然而,只有少量文献关注语言模型的终生学习。尽管最近的一些综述收集了终生学习的最新文献,但都没有涉及连续文本分类、连续命名实体识别、连续关系提取和连续机器翻译等场景,对连续对齐、连续知识编辑、基于工具的终生学习和基于检索的终生学习的讨论也很少。

这篇综述是第一个从 12 个场景出发,对大语言模型终生学习方法进行全面系统研究的调查。

总体来说,综述的主要贡献包括:

  • 新颖分类:引入了一个详细的结构化框架,将有关终生学习的大量文献分为 12 个场景;
  • 通用技术:确定了所有终生学习情况下的通用技术,并将现有文献分为每个场景中不同的技术组;
  • 未来方向:强调了一些新兴技术,如模型扩展和数据选择,这些技术在前 LLM 时代探索较少。

一、引言

本综述系统地总结了现有的终生学习技术方法,在图 2 中将其分为内部知识和外部知识两大类。

51c大模型~合集44_大模型_33

  • 内部知识是指通过完全或部分训练将新知识吸收到模型参数中,包括连续预训练和连续微调。
  • 外部知识是指在不更新模型参数的情况下,将维基百科或应用程序接口等外部资源中的新知识纳入模型,包括基于检索的终生学习和基于工具的终生学习。

内部知识(Internal Knowledge)

1. 连续预训练(Continual Pretraining):

  • 连续垂直领域预训练(Continual Vertical Domain Pretraining):针对特定垂直领域(如金融、医疗等)进行的连续预训练。
  • 连续语言领域预训练(Continual Language Domain Pretraining):针对自然语言和代码语言进行的连续预训练。
  • 连续时间领域预训练(Continual Temporal Domain Pretraining):针对时间相关数据(如时间序列数据)的连续预训练。

2. 连续微调(Continual Finetuning):

  • 特定任务(Task Specific):
  • 连续文本分类(Continual Text Classification):针对文本分类任务进行的连续微调。
  • 连续命名实体识别(Continual Named Entity Recognition):针对命名实体识别任务进行的连续微调。
  • 连续关系抽取(Continual Relation Extraction):针对关系抽取任务进行的连续微调。
  • 连续机器翻译(Continual Machine Translation):针对机器翻译任务进行的连续微调。
  • 任务无关(Task Agnostic):
  • 连续指令微调(Continual Instruction-Tuning):通过指令微调实现模型的连续学习。
  • 连续知识编辑(Continual Knowledge Editing):针对知识更新进行的连续学习。
  • 连续对齐(Continual Alignment):针对模型与新任务对齐进行的连续学习。

外部知识(External Knowledge)

1. 基于检索的终生学习(Retrieval-Based Lifelong Learning):通过检索外部知识库实现的终生学习。

2. 基于工具的终生学习(Tool-Based Lifelong Learning):通过调用外部工具实现的终生学习。

二、终生学习概况

2.1 问题定义

终生学习的目标是从一系列任务中学习一个语言模型,通过输入自然语言,生成目标输出。具体来说,对于生成任务,如问答,输入和输出分别代表问题和答案;对于机器翻译任务,输入和输出代表源语言和目标语言;对于文本分类任务,输入为文本内容,输出为类别标签;对于自回归语言模型的预训练任务,输入为一系列的词元,输出为相应的下一个词元。

2.2 评估指标

综述介绍了评估终生学习效果的指标,主要从整体性能、稳定性和适应性三个角度进行评估:

  • 整体性能(Overall Measurement):包括平均准确率(AA)和平均增量准确率(AIA)。AA 是指模型在学习所有任务后的平均表现,而 AIA 则考虑了每个任务学习后的历史变化。
  • 稳定性测量(Stability Measurement):包括遗忘测量(FGT)和向后转移(BWT)。FGT 评估旧任务的平均性能下降,而 BWT 评估旧任务的平均性能变化。
  • 适应性测量(Plasticity Measurement):包括向前转移(FWD),即模型在新任务上性能的平均提升。

2.3 通用技术

综述在图 3 中展示了四种主要的终生学习方法,用于应对大语言模型在处理连续任务(Task t-1 到 Task t)时的灾难性遗忘问题。以下是对每种方法的解释:

51c大模型~合集44_大模型_34

(a) 基于重放的方法(Replay-Based Methods):

  • 含义:这种方法通过在训练新任务时重放以前任务的数据,来巩固模型对旧任务的记忆。通常,重放的数据会被存储在一个缓冲区(Buffer)中,并与当前任务的数据一起用于训练。主要包括:

–经验重放(Experience Replay):通过保存一部分旧任务的数据样本,并在训练新任务时将这些数据重新用于训练,从而减少遗忘的发生。

–生成重放(Generative Replay):不同于保存旧数据,这种方法利用生成模型来创建伪样本,从而在新任务的训练中引入旧任务的知识。

  • 图示:图 3 中显示了从 Task t-1 到 Task t 的过程,模型在训练 Task t 时,使用了缓冲区中的旧数据(Input t-1 )。

(b) 基于正则化的方法(Regularization-Based Methods):

  • 含义:这种方法通过对模型参数施加正则化约束,来防止模型在学习新任务时对旧任务参数的过度调整。正则化约束可以帮助模型保留对旧任务的记忆。主要包括:

–权重正则化(Weight Regularization):通过对模型参数施加额外的约束,限制新任务训练时对重要权重的修改,以此保护旧任务的知识。例如,L2 正则化和弹性权重巩固(Elastic Weight Consolidation,EWC)就是常见的技术。

–特征正则化(Feature Regularization):正则化不仅可以作用于权重,还可以通过限制模型在特征空间中的表现,确保新旧任务之间的特征分布保持稳定。

  • 图示:图 3 中显示了从 Task t-1 到 Task t 的过程,模型在训练 Task t 时,通过参数正则化来保持对 Task t-1 的性能。

(c) 基于架构的方法(Architecture-Based Methods):

51c大模型~合集44_大模型_35

  • 含义:这种方法侧重于调整模型结构,以便无缝集成新任务,同时尽量减少对先前所学知识的干扰。主要包括图 4 中的六种方法:

–(a) 提示词微调(Prompt Tuning):通过在模型的输入前添加 “软提示词”(Soft Prompts),以引导模型的生成或分类任务。这种方法只需要调整少量的参数(即提示词),而不需要改变模型的主干结构。

–(b) 前缀微调(Prefix Tuning):在输入序列的前缀部分添加训练好的可调参数,这些参数被插入到 Transformer 层的自注意力机制中,帮助模型更好地捕捉上下文信息。

–(c) 低秩适应(LoRA,Low-Rank Adaptation):LoRA 通过在特定层次上增加低秩矩阵来适应新的任务,而不需要改变大模型的主要权重。这种方法极大地减少了参数调整的数量,同时保持了模型的性能。

–(d) 适配器(Adapters):Adapters 是插入到模型不同层之间的可训练模块,这些模块能够在不改变原有模型权重的情况下,通过少量的附加参数来适应新任务。通常应用在 FFN(Feed Forward Network)和 MHA(Multi-Head Attention)部分。

–(e) 专家混合(Mixture of Experts):通过选择性地激活某些 “专家” 模块来处理不同的输入,这些专家模块可以是模型中的特定层或者子网络。Router 模块负责决定哪个专家模块需要激活。

–(f) 模型扩展(Model Expansion):通过添加新层(New Layer)来扩展模型的容量,而保留原有的层(Old Layer)。这种方法允许模型逐渐增加其容量,以适应更加复杂的任务需求。

  • 图示:图 3 中显示了从 Task t-1 到 Task t 的过程,模型在学习新任务时,部分参数被冻结(Frozen),而新增的模块用于训练新任务(Trainable)。

(d) 基于蒸馏的方法(Distillation-Based Methods):

  • 含义:这种方法通过知识蒸馏(Knowledge Distillation),将旧模型的知识传递给新模型。在训练新任务时,新模型不仅学习当前任务的数据,还要模仿旧模型对旧任务的输出,从而保持旧任务的知识。主要包括:

–从新数据蒸馏(Distillation from New Data):学生模型在教师模型的指导下学习新任务,通过蒸馏旧模型的知识来减少对旧知识的遗忘。

–从旧数据蒸馏(Distillation from Old Data):利用教师模型在旧数据上的表现来引导学生模型对新任务的学习,从而达到保留旧知识的效果。

–从伪旧数据蒸馏(Distillation from Pseudo-Old Data):通过生成伪旧数据(Pseudo-Old Data),让学生模型在学习新任务时保持对旧知识的记忆。

  • 图示:图 3 中显示了从 Task t-1 到 Task t 的过程,模型在训练新任务时,通过模仿旧模型的预测结果来保持对旧任务的知识。

三、连续预训练

连续预训练可以更新大语言模型的内部知识,而无需承担全面预训练的高昂成本,从而增强大语言模型的能力。目前的研究横跨垂直、语言和时间领域,解决了灾难性遗忘和时间适应等难题。经验重放、知识蒸馏、参数高效微调、模型扩展和再加热等技术已显示出良好的前景。

3.1 连续垂直领域预训练

连续垂直领域预训练(Continual Vertical Domain Pretraining)旨在通过在一系列领域特定的数据集上连续训练语言模型,确保模型在多个垂直领域或任务中表现出色,同时保留先前获得的知识。

主要方法:

1. 参数高效微调(Parameter-Efficient Fine-Tuning):

  • 示例:CorpusBrain++ 采用骨干 - 适配器架构和经验重放策略来应对现实世界中的知识密集型语言任务。
  • 示例:Med-PaLM 通过使用少量示例引入医学领域的指令提示调优。

2. 模型扩展(Model Expansion):

  • 示例:ELLE 采用功能保留的模型扩展策略,通过灵活扩展现有预训练语言模型的宽度和深度来提高知识获取和集成的效率。
  • 示例:LLaMA Pro 通过扩展 Transformer 块并使用新语料库进行微调,在通用使用、编程和数学任务中表现出色。

3. 再预热(Re-warming):

  • 示例:Gupta 等提出的策略,通过引入新数据集时调整学习率,防止长期训练期间学习率过低,从而提高适应新数据集的效果。

4. 数据选择(Data Selection):

  • 示例:RHO-1 通过选择性语言模型(SLM)训练,优先选择对训练过程有更大影响的标记。
  • 示例:EcomGPT-CT 通过半结构化电子商务数据增强模型在领域特定任务中的表现。

3.2 连续语言领域预训练

连续语言领域预训练(Continual Language Domain Pretraining)旨在使语言模型能够不断整合新数据,并适应不断变化的语言领域而不遗忘先前的知识。

主要方法:

1. 架构调整方法(Architecture-Based Methods):

  • 示例:Yadav 等通过引入教师强制机制改进提示调优,创建一组提示引导模型在新任务上的微调。
  • 示例:ModuleFormer 和 Lifelong-MoE 使用专家混合(MoE)方法,通过模块化和动态增加模型容量来增强 LLM 的效率和适应性。

2. 再预热(Re-warming):

  • 示例:Ibrahim 等提出的再预热方法,通过在训练新数据时临时增加学习率,帮助模型更快地适应新语言。

3.3 连续时间领域预训练

连续时间领域预训练(Continual Temporal Domain Pretraining)涉及不断更新语言模型,以保持其在时间敏感数据上的准确性和相关性。

主要挑战:

1. 性能下降:Lazaridou 等的研究显示,模型在未来数据上的表现显著下降,凸显了 LLM 在时间泛化上的困难。

2. 有限改进:Röttger 等发现,虽然时间适应在掩码语言模型任务上有轻微改进,但与单纯的领域适应相比,对下游任务性能的提升并不显著。

通过这些方法和研究,作者展示了连续预训练在不同维度上的方法和挑战,并强调了在垂直领域、语言领域和时间域中应用终生学习的必要性和有效性。

四、连续微调

连续预训练可增强大语言模型的内部知识,在此基础上,连续微调增强了大语言模型的内部知识,并使大语言模型适应特定任务,如文本分类、命名实体识别、关系提取、机器翻译或一般生成任务,如指令调整、知识编辑和与人类偏好对齐。为了应对灾难性遗忘和任务干扰等挑战,采用了蒸馏、重放、正则化、基于架构和基于梯度的方法等技术。作者在图 5 中对 7 种连续微调场景进行了说明。

51c大模型~合集44_大模型_36

这张图展示了七种不同类型的任务如何通过连续学习在大语言模型中实现。以下是对每个部分的详细解释:

(a) 连续文本分类

  • 示例:连续文本分类任务通过逐步引入新的分类类别(如 Intent: Transfer -> Intent: Credit Score -> Intent: Fun Fact)来训练模型,使其能够适应不断变化的分类需求。

(b) 连续命名实体识别

  • 示例:连续命名实体识别任务展示了如何在识别特定实体的同时,逐步引入新的实体类型(如 Athlete -> Sports Team -> Politician),使模型能够在识别新的实体时仍保持对旧实体的识别能力。

(c) 连续关系抽取

  • 示例:连续关系抽取任务通过不断引入新的关系类型(如 Relation: Founded By -> Relation: State or Province of Birth -> Relation: Country of Headquarters),展示了模型如何逐步扩展其关系抽取能力。

(d) 连续知识编辑

  • 示例:连续知识编辑任务通过不断更新模型的知识库,确保其能够对最新的事实进行准确的回答(如 Who is the president of the US? -> Which club does Cristiano Ronaldo currently play for? -> Where was the last Winter Olympics held?)。

(e) 连续机器翻译

  • 示例:连续机器翻译任务通过逐步扩展模型对不同语言的翻译能力(如 English -> Chinese, English -> Spanish, English -> French),展示了模型在多语言环境中的适应能力。

(f) 连续指令微调

  • 示例:连续指令微调任务通过逐步引入新的指令类型(如 Summarization -> Style Transfer -> Mathematics),训练模型在多种任务类型下的表现能力。

(g) 连续对齐

  • 示例:连续对齐任务通过引入新的对齐目标(如 Helpful and Harmless -> Concise and Organized -> Positive Sentiment),展示了模型在不同道德和行为标准下的连续学习能力。

五、外部知识

连续预训练和连续微调对 LLM 的终生学习至关重要,然而随着 LLM 越来越大、功能越来越强,有两个新兴方向越来越受欢迎,它们可以在不修改大语言模型参数的情况下,为大语言模型提供新的外部知识。作者考虑基于检索的终生学习和基于工具的终生学习,因为这两种方法都是实现 LLM 终生学习的有前途的方法。图 6 举例说明了这两种方法。

51c大模型~合集44_大模型_37

基于检索的终生学习(Retrieval-Based Lifelong Learning)

  • 介绍:随着世界信息的不断扩大和快速发展,根据历史数据训练的静态模型很快就会过时,无法理解或生成有关新发展的内容。基于检索的终生学习解决了大型语言模型从外部来源获取和吸收最新知识的关键需求,在需要时,模型通过检索这些外部资源,来补充或更新其知识库。这些外部资源提供了一个巨大的当前知识库,为增强预训练 LLM 的静态特性提供了重要的补充资产。
  • 示例:图中的这些外部资源是模型能够访问并检索的。通过访问外部信息源,如维基百科、书籍、数据库等,模型能够更新自身的知识,并在遇到新信息时作出适应。

基于工具的终生学习(Tool-Based Lifelong Learning)

  • 介绍:基于工具的终生学习源于将其功能扩展到静态知识之外并使其能够与环境动态交互的必要性。在现实世界的应用中,模型往往需要执行一些任务,这些任务涉及直接文本生成或解释之外的操作。
  • 示例:图中模型利用这些工具来扩展和更新自身的能力,通过与外部工具的交互来实现终生学习。例如,模型可以通过应用程序编程接口获取实时数据,或通过物理工具与外部环境互动,以此来完成特定任务或获取新知识。

六、讨论与结论

6.1 主要挑战

  • 灾难性遗忘(Catastrophic Forgetting):这是终生学习的核心挑战之一,新信息的引入可能会覆盖模型之前学到的内容。
  • 可塑性 - 稳定性困境(Plasticity-Stability Dilemma):在保持模型的学习能力和稳定性之间找到平衡非常关键,这直接影响模型获取新知识的能力,同时保留其广泛的通用能力。
  • 昂贵的计算成本(Expensive Computation Cost):全量微调大语言模型的计算需求可能非常高。
  • 模型权重或预训练数据的不可用性:由于隐私、专有限制或商业许可,原始训练数据或模型权重往往不可用于进一步的改进。

6.2 当前趋势

  • 从特定任务到通用任务:研究逐渐从专注于特定任务(如文本分类、命名实体识别)转向更广泛的通用任务,如指令调优、知识编辑等。
  • 从全量微调到部分微调:鉴于全量微调的高资源消耗,部分微调策略(如 Adapter 层、Prompt 调优、LoRA)变得越来越受欢迎。
  • 从内部知识到外部知识:为了克服频繁的内部更新限制,越来越多的策略采用外部知识源,如检索增强生成(Retrieval-Augmented Generation)和工具学习,使模型能够动态访问和利用当前的外部数据。

6.3 未来方向

  • 多模态终生学习:将文本以外的多种模态(如图像、视频、音频、时间序列数据、知识图谱)整合到终生学习中,以开发更全面、更具适应性的模型。
  • 高效终生学习:研究人员正致力于开发更高效的策略来管理模型训练和更新的计算需求,如模型剪枝、模型合并、模型扩展等方法。
  • 通用终生学习:最终目标是使大语言模型能够主动获取新知识,并通过与环境的动态交互进行学习,不再仅仅依赖于静态数据集。

6.4 结论

作者将现有研究分为 12 种终生学习场景,并提供了全面的方法归纳整理。此外还分析强调了在管理灾难性遗忘、确保计算效率和在知识获取中的特定性与通用性之间维持平衡的必要性。随着领域的不断发展,这些先进策略的集成将对塑造下一代人工智能系统起到关键作用,帮助它们更接近实现真正的人类般的学习和适应能力。

通过对这些技术方法及其各自类别的详细研究,本综述旨在强调将终生学习能力整合到终生学习工具中,从而提高它们在现实世界应用中的适应性、可靠性和整体性能。同时为研究人员和工程师提供一个全面的视角,帮助他们更好地理解和应用终生学习技术,推动大语言模型的进一步发展。如果对文章感兴趣,可以查阅原始论文以了解更多研究内容。




#HuggingFace

用Mac训练个机器人叠衣服,HuggingFace开源全套教程,开源AI机器人革命要来了?

这是机器人界的 Llama? 

靠 100 条轨迹数据,在 Mac 上训练几个小时,就能拥有一个可以抓取乐高积木的机械臂,这是 HuggingFace 机器人科学家 Remi Cadene 晒出的一个实例。机器人的门槛可能并没有想象中那么高。

Remi Cadene 之前是特斯拉人形机器人 Optimus(擎天柱)项目的成员,3 月份被挖去 HuggingFace,领导一个新的开源机器人项目 ——LeRobot,当时引发了一些轰动。

LeRobot 基于有史以来最大规模的众包机器人数据集,它的代码库堪称机器人领域的「Transformers」。Cadene 在 X 上表示:「人工智能发展的下一步是将其应用于我们的物理世界。因此,我们正在推动社区共同努力构建 AI 机器人,这对所有人开放!」

如今,Cadene 和他的新同事正在兑现这一承诺。前段时间,他们发布了 DIY 机器人的深入教程,从硬件 DIY 手册到 Jupyter 笔记本应有尽有。

教程链接:https://github.com/huggingface/lerobot/blob/main/examples/7_get_started_with_real_robot.md

youtube 上还有大量的视频教程可供参考:

视频链接:https://www.youtube.com/@HuggingFace/videos

可以说,只要按照教程操作,你在 Mac 或 PC 上训练几个小时,也能拥有一个可以抓取乐高积木的机械臂。

51c大模型~合集44_大模型_38

或者,让它给你叠衣服:

具体来说,这个教程主要解答了以下问题:  

1、如何订购和组装你的机器人;

2、如何连接、配置和校准你的机器人;

3、如何记录和可视化你的数据集;

4、如何使用你的数据来训练策略并准备评估;

5、如何评估你的策略并可视化结果。

该教程主要基于一种开源、价格友好的机器人套件 Koch v1.1 编写,不过也可以通过改变配置轻松适应各种类型的机器人。

Koch v1.1 由一个主导臂和一个从动臂组成,每个臂有 6 个电机。它可以和一个或多个摄像头一起工作来记录场景,这些摄像头被用作机器人的视觉传感器。在数据采集阶段,你将通过移动主导臂来控制从动臂。这个过程被称为「遥操作」。这种技术用于收集机器人轨迹。之后,你将训练一个神经网络来模仿这些轨迹,并部署网络以使你的机器人能够自主操作。

订购、组装你的 Koch v1.1

第一步是采购零件和组装,这步有一个 Koch v1.1 Github 页面可以参考。

Github 链接:https://github.com/huggingface/lerobot/blob/main/examples/7_get_started_with_real_robot.md

这个页面上包含一个详细的零件采购清单(作者表示,目前他们只找到了美国、欧盟和英国的购买链接,如果读者可以找到中国、印度等其他国家的购买链接,欢迎补充进去):

主导臂零件采购参考清单。

从动臂零件采购参考清单。

有些零件可能需要 3D 打印,该页面也给出了详细的操作指南。

在零件全部到位后,你可以按照以下视频的指引进行安装。

视频链接:https://www.youtube.com/watch?v=8nQIg9BwwTk

组装完的两个机械臂长这样:

接下来,使用 5V 电源为主导臂供电,使用 12V 电源为从动臂供电。此外,使用 USB-C 电缆将每个臂连入计算机。

配置电机,校准机械臂,远程操控你的 Koch v1.1

Koch v1.1 的配置可以参考以下视频:  

视频链接:https://www.youtube.com/watch?v=U78QQ9wCdpY

校准则参考另一个视频:  

视频链接:https://www.youtube.com/watch?v=8drnU9uRY24

Github 页面也介绍了 Koch v1.1 所需的附加依赖项的安装以及机械臂的连接、校准方法。控制部分则分为以下步骤介绍:     

1、使用 DynamixelMotorsBus 控制电机;

2、使用 DynamixelMotorsBus 远程操作 Koch v1.1;

3、使用 OpenCVCamera 添加相机;

4、使用 koch. yaml 和 teleoperate 函数

每部分都有详细的说明和代码可以参考。

记录你的数据集并将其可视化

这一步旨在录制你的第一个训练集。作者建议从简单的动作开始来验证你的设置,例如在五个位置抓取物体,并为每个位置记录 10 条轨迹。

这一步同样有视频可以参考:

视频地址:https://www.youtube.com/watch?v=n_Ljp_xuFEM

作者表示,你还可以使用以下自定义工具在本地或在线可视化任何数据集:  

工具地址:https://huggingface.co/spaces/cadene/visualize_dataset_train

Github 教程涉及以下内容:

1、使用 koch. yaml 和 record 函数;

2、对于记录数据集的建议;

3、可视化所有 episode;

4、使用 replay 函数在你的机器人上 replay episode。

用你的数据训练一个策略

这部分主要介绍了如何训练神经网络来控制机器人。主要步骤如下:   

1、使用训练脚本;

2、将策略检查点上传到 hub。

值得庆幸的是,策略的训练不需要特别昂贵的设备,在 PC 或 Mac 上跑几个小时就能训练出来。而且无需模拟。

评估策略

在评估部分,作者也给出了完整的视频教程:  

视频地址:https://www.youtube.com/watch?v=Il3Kt8vqpI8

作者表示,这个项目的精妙之处在于,如果每个人都能记录下自己的数据集并在 hub 上共享,那么大家都将能够训练出具有无与伦比的感知世界以及采取行动能力的 AI!这项新技术将推动下一次社会和工业革命。

目前,LeRobt 的开源已经产生了一定的影响力。   

Cadene 透露,他们正在开发一款更实惠的机器人。这款机器人不需要 3D 打印,总共花费 150 美元(2 个机械臂)名叫 Moss V1。

此外,他们还将开源一款更强大的机器人,这个机器人可以使用 5 个手指的手作为末端执行器。

他相信开源社区的力量可以推动机器人领域快速发展。

参考链接:https://x.com/RemiCadene/status/1825470242815901828

#图解大模型训练之:数据并行(DP、DDP、ZeRO、零冗余优化)

大模型场景里巨大的存储和GPU间通讯量是系统设计时需要考虑的重点,本文递进介绍了三种主流数据并行的实现方法:DP、DD皮、ZeRo。

当模型太大,一块GPU放不下时,流水线并行将模型的不同层放到不同的GPU上,通过切割mini-batch实现对训练数据的流水线处理,提升GPU计算通讯比。同时通过re-materialization机制降低显存消耗。

但在实际应用中,流水线并行并不特别流行,主要原因是模型能否均匀切割,影响了整体计算效率,这就需要算法工程师做手调。因此,今天我们来介绍一种应用最广泛,最易于理解的并行范式:数据并行。

数据并行的核心思想是:在各个GPU上都拷贝一份完整模型,各自吃一份数据,算一份梯度,最后对梯度进行累加来更新整体模型。理念不复杂,但到了大模型场景,巨大的存储和GPU间的通讯量,就是系统设计要考虑的重点了。在本文中,我们将递进介绍三种主流数据并行的实现方式:

DP(Data Parallelism):最早的数据并行模式,一般采用参数服务器(Parameters Server)这一编程框架。实际中多用于单机多卡

DDP(Distributed Data Parallelism):分布式数据并行,采用Ring AllReduce的通讯方式,实际中多用于多机场景

ZeRO:零冗余优化器。由微软推出并应用于其DeepSpeed框架中。严格来讲ZeRO采用数据并行+张量并行的方式,旨在降低存储。

一、数据并行(DP)1.1 整体架构

一个经典数据并行的过程如下:

若干块计算GPU,如图中GPU0~GPU2;1块梯度收集GPU,如图中AllReduce操作所在GPU。

在每块计算GPU上都拷贝一份完整的模型参数。

把一份数据X(例如一个batch)均匀分给不同的计算GPU。

每块计算GPU做一轮FWD和BWD后,算得一份梯度G。

每块计算GPU将自己的梯度push给梯度收集GPU,做聚合操作。这里的聚合操作一般指梯度累加。当然也支持用户自定义。

梯度收集GPU聚合完毕后,计算GPU从它那pull下完整的梯度结果,用于更新模型参数W。更新完毕后,计算GPU上的模型参数依然保持一致。

聚合再下发梯度的操作,称为AllReduce。

前文说过,实现DP的一种经典编程框架叫“参数服务器”,在这个框架里,计算GPU称为Worker,梯度聚合GPU称为Server。在实际应用中,为了尽量减少通讯量,一般可选择一个Worker同时作为Server。比如可把梯度全发到GPU0上做聚合。需要再额外说明几点:

  • 1个Worker或者Server下可以不止1块GPU。
  • Server可以只做梯度聚合,也可以梯度聚合+全量参数更新一起做

在参数服务器的语言体系下,DP的过程又可以被描述下图:

1.2 通讯瓶颈与梯度异步更新

DP的框架理解起来不难,但实战中确有两个主要问题:

  • 存储开销大。每块GPU上都存了一份完整的模型,造成冗余。关于这一点的优化,我们将在后文ZeRO部分做讲解。
  • 通讯开销大。Server需要和每一个Worker进行梯度传输。当Server和Worker不在一台机器上时,Server的带宽将会成为整个系统的计算效率瓶颈。

我们对通讯开销再做详细说明。如果将传输比作一条马路,带宽就是马路的宽度,它决定每次并排行驶的数据量。例如带宽是100G/s,但每秒却推给Server 1000G的数据,消化肯定需要时间。那么当Server在搬运数据,计算梯度的时候,Worker们在干嘛呢?当然是在:

人类老板不愿意了:“打工系统里不允许有串行存在的任务!”,于是梯度异步更新这一管理层略诞生了。

上图刻画了在梯度异步更新的场景下,某个Worker的计算顺序为:

  • 在第10轮计算中,该Worker正常计算梯度,并向Server发送push&pull梯度请求。
  • 但是,该Worker并不会实际等到把聚合梯度拿回来,更新完参数W后再做计算。而是直接拿旧的W,吃新的数据,继续第11轮的计算。这样就保证在通讯的时间里,Worker也在马不停蹄做计算,提升计算通讯比。
  • 当然,异步也不能太过份。只计算梯度,不更新权重,那模型就无法收敛。图中刻画的是延迟为1的异步更新,也就是在开始第12轮对的计算时,必须保证W已经用第10、11轮的梯度做完2次更新了。

参数服务器的框架下,延迟的步数也可以由用户自己决定,下图分别刻划了几种延迟情况:

  • (a) 无延迟
  • (b) 延迟但不指定延迟步数。也即在迭代2时,用的可能是老权重,也可能是新权重,听天由命。
  • (c) 延迟且指定延迟步数为1。例如做迭代3时,可以不拿回迭代2的梯度,但必须保证迭代0、1的梯度都已拿回且用于参数更新。

总结一下,异步很香,但对一个Worker来说,只是等于W不变,batch的数量增加了而已,在SGD下,会减慢模型的整体收敛速度。异步的整体思想是,比起让Worker闲着,倒不如让它多吃点数据,虽然反馈延迟了,但只要它在干活在学习就行。

batch就像活,异步就像画出去的饼,且往往不指定延迟步数,每个Worker干越来越多的活,但模型却没收敛取效,这又是刺伤了哪些打工仔们的心(狗头

二、分布式数据并行(DDP)

受通讯负载不均的影响,DP一般用于单机多卡场景。因此,DDP作为一种更通用的解决方案出现了,既能多机,也能单机。DDP首先要解决的就是通讯问题:将Server上的通讯压力均衡转到各个Worker上。实现这一点后,可以进一步去Server,留Worker。

前文我们说过,聚合梯度 + 下发梯度这一轮操作,称为AllReduce。接下来我们介绍目前最通用的AllReduce方法:Ring-AllReduce。它由百度最先提出,非常有效地解决了数据并行中通讯负载不均的问题,使得DDP得以实现。

2.1 Ring-AllReduce

如下图,假设有4块GPU,每块GPU上的数据也对应被切成4份。AllReduce的最终目标,就是让每块GPU上的数据都变成箭头右边汇总的样子。

Ring-ALLReduce则分两大步骤实现该目标:Reduce-Scatter和All-Gather。

  • Reduce-Scatter

定义网络拓扑关系,使得每个GPU只和其相邻的两块GPU通讯。每次发送对应位置的数据进行累加。每一次累加更新都形成一个拓扑环,因此被称为Ring。看到这觉得困惑不要紧,我们用图例把详细步骤画出来。

一次累加完毕后,蓝色位置的数据块被更新,被更新的数据块将成为下一次更新的起点,继续做累加操作。

3次更新之后,每块GPU上都有一块数据拥有了对应位置完整的聚合(图中红色)。此时,Reduce-Scatter阶段结束。进入All-Gather阶段。目标是把红色块的数据广播到其余GPU对应的位置上。

  • All-Gather

如名字里Gather所述的一样,这操作里依然按照“相邻GPU对应位置进行通讯”的原则,但对应位置数据不再做相加,而是直接替换。All-Gather以红色块作为起点。

以此类推,同样经过3轮迭代后,使得每块GPU上都汇总到了完整的数据,变成如下形式:

建议读者们手动推一次,加深理解。

2.2 Ring-AllReduce通讯量分析

假设模型参数W的大小为 , GPU个数为  。则梯度大小也为 , 每个梯度块的大小为  对单卡GPU来说(只算其send通讯量):

  • Reduce-Scatter阶段, 通讯量为
  • All-Gather阶段, 通讯量为

单卡总通讯量为 , 随着  的增大, 可以近似为  。全卡总通讯量为

而对前文的DP来说, 它的Server承载的通讯量是 , Workers为 , 全卡总通讯量依然为  。虽然通讯量相同, 但搬运相同数据量的时间却不一定相同。DDP把通讯量均衡负载到了每一时刻的每个Worker上, 而DP仅让Server做勤劳的搬运工。当越来越多的GPU分布在距离较远的机器上时, DP的通讯时间是会增加的。

但这并不说明参数服务器不能打(有很多文章将参数服务器当作old dinosaur来看)。事实上,参数服务器也提供了多Server方法,如下图:

在多Server的模式下,进一步,每个Server可以只负责维护和更新某一块梯度(也可以某块梯度+参数一起维护),此时虽然每个Server仍然需要和所有Worker通讯,但它的带宽压力会小非常多。经过调整设计后,依然可以用来做DDP。虽然这篇文章是用递进式的方式来介绍两者,但不代表两者间一定要决出优劣。我想表达的观点是,方法是多样性的。 对参数服务器有兴趣的朋友,可以阅读参考的第1个链接。

最后,请大家记住Ring-AllReduce的方法,因为在之后的ZeRO,Megatron-LM中,它将频繁地出现,是分布式训练系统中重要的算子。

三、总结

1、在DP中,每个GPU上都拷贝一份完整的模型,每个GPU上处理batch的一部分数据,所有GPU算出来的梯度进行累加后,再传回各GPU用于更新参数

2、DP多采用参数服务器这一编程框架,一般由若个计算Worker和1个梯度聚合Server组成。Server与每个Worker通讯,Worker间并不通讯。因此Server承担了系统所有的通讯压力。基于此DP常用于单机多卡场景。

3、异步梯度更新是提升计算通讯比的一种方法,延迟更新的步数大小决定了模型的收敛速度。

4、Ring-AllReduce通过定义网络环拓扑的方式,将通讯压力均衡地分到每个GPU上,使得跨机器的数据并行(DDP)得以高效实现。

5、DP和DDP的总通讯量相同,但因负载不均的原因,DP需要耗费更多的时间搬运数据


由微软开发的ZeRO(零冗余优化),它是DeepSpeed这一分布式训练框架的核心,被用来解决大模型训练中的显存开销问题。ZeRO的思想就是用通讯换显存。 如果初读ZeRO,觉得它逻辑跳跃,晦涩难懂,那么下文或许可以帮到你~

四、存储消耗4.1 存储分类

首先,我们来看在大模型训练的过程中,GPU都需要存什么内容。

存储主要分为两大块:Model States和Residual StatesModel States指和模型本身息息相关的,必须存储的内容,具体包括:

optimizer states:Adam优化算法中的momentum和variance

gradients:模型梯度

parameters:模型参数W

Residual States指并非模型必须的,但在训练过程中会额外产生的内容,具体包括:

  • activation:激活值。在流水线并行中我们曾详细介绍过。在backward过程中使用链式法则计算梯度时会用到。有了它算梯度会更快,但它不是必须存储的,因为可以通过重新做Forward来算它。
  • temporary buffers: 临时存储。例如把梯度发送到某块GPU上做加总聚合时产生的存储。
  • unusable fragment memory:碎片化的存储空间。虽然总存储空间是够的,但是如果取不到连续的存储空间,相关的请求也会被fail掉。对这类空间浪费可以通过内存整理来解决。
4.2 精度混合训练

知道了存储分类,进一步,我们想知道,假设模型的参数W大小是,那么每一类存储具体占了多大的空间呢?

在分析这个问题前,我们需要来了解精度混合训练。

对于模型,我们肯定希望其参数越精准越好,也即我们用fp32(单精度浮点数,存储占4byte)来表示参数W。但是在forward和backward的过程中,fp32的计算开销也是庞大的。那么能否在计算的过程中,引入fp16或bf16(半精度浮点数,存储占2byte),来减轻计算压力呢?于是,混合精度训练就产生了,它的步骤如下图:

  • 存储一份fp32的parameter,momentum和variance(统称model states)
  • 在forward开始之前,额外开辟一块存储空间,将fp32 parameter减半到fp16 parameter。
  • 正常做forward和backward,在此之间产生的activation和gradients,都用fp16进行存储。
  • 用fp16 gradients去更新fp32下的model states。
  • 当模型收敛后,fp32的parameter就是最终的参数输出。

通过这种方式,混合精度训练在计算开销和模型精度上做了权衡。如果不了解fp32,fp16和bf16的细节也没关系,不影响下文的阅读。只要记住它们所占的存储空间和精度表达上的差异即可。

4.3 存储大小

现在,我们可以来计算模型在训练时需要的存储大小了,假设模型的参数W大小是  ,以byte为单位,存储如下:

因为采用了Adam优化, 所以才会出现momentum和variance, 当然你也可以选择别的优化办法。因此这里为了更通用些, 记模型必存的数据大小为  。因此最终内存开销为:

另外,这里暂不将activation纳入统计范围,原因是:

  • activation不仅与模型参数相关,还与batch size相关
  • activation的存储不是必须的。存储activation只是为了在用链式法则做backward的过程中,计算梯度更快一些。但你永远可以通过只保留最初的输入X,重新做forward来得到每一层的activation(虽然实际中并不会这么极端)。
  • 因为activation的这种灵活性,纳入它后不方便衡量系统性能随模型增大的真实变动情况。因此在这里不考虑它,在后面会单开一块说明对activation的优化。
五、ZeRO-DP

知道了什么东西会占存储,以及它们占了多大的存储之后,我们就可以来谈如何优化存储了。

注意到,在整个训练中,有很多states并不会每时每刻都用到,举例来说;

  • Adam优化下的optimizer states只在最终做update时才用到
  • 数据并行中,gradients只在最后做AllReduce和updates时才用到
  • 参数W只在做forward和backward的那一刻才用到
  • 诸如此类

所以,ZeRO想了一个简单粗暴的办法:如果数据算完即废,等需要的时候,我再想办法从个什么地方拿回来,那不就省了一笔存储空间吗?

沿着这个思路,我们逐一来看ZeRO是如何递进做存储优化的。

5.1 :优化状态分割

首先,从 optimizer state开始优化。将optimizer state分成若干份,每块GPU上各自维护一份。这样就减少了相当一部分的显存开销。如下图:

复习一下,此时W=fp16,G=fp16,O=fp32。此时,整体数据并行的流程如下:

(1)每块GPU上存一份完整的参数W。将一个batch的数据分成3份,每块GPU各吃一份,做完一轮foward和backward后,各得一份梯度。

(2)对梯度做一次AllReduce,得到完整的梯度G,产生单卡通讯量  。为了表达简明,这里通讯量我们就不再换算成byte了,而直接根据参数量来计算。对AllReduce(reduce-scatter + all-gather)。

(3)得到完整梯度G,就可以对W做更新。我们知道W的更新由optimizer states和梯度共同决定。由于每块GPU上只保管部分optimizer states,因此只能将相应的W(蓝色部分)进行更新。(2)和(3)可以用下图表示:

(4)此时,每块GPU上都有部分W没有完成更新(图中白色部分)。所以我们需要对W做一次All-Gather,从别的GPU上把更新好的部分W取回来。产生单卡通讯量  。

做完  后, 设GPU个数为 ,显存和通讯量的情况如下:

假设各变量大小如表格第二列所示,那么  在增加1.5倍单卡通讯开销的基础上,将单卡存储降低了4倍。看起来是个还不错的trade-off,那么还能做得更好吗

5.2 :优化状态与梯度分割

现在,更近一步,我们把梯度也拆开,每个GPU格子维护一块梯度。

此时,数据并行的整体流程如下:

(1)每块GPU上存一份完整的参数W。将一个batch的数据分成3份,每块GPU各吃一份,做完一轮foward和backward后,算得一份完整的梯度(下图中绿色+白色)。

(2)对梯度做一次Reduce-Scatter,保证每个GPU上所维持的那块梯度是聚合梯度。例如对GPU1,它负责维护G1,因此其他的GPU只需要把G1对应位置的梯度发给GPU1做加总就可。汇总完毕后,白色块对GPU无用,可以从显存中移除。单卡通讯量  。(1)和(2)见下图:

(3)每块GPU用自己对应的O和G去更新相应的W。更新完毕后,每块GPU维持了一块更新完毕的W。同理,对W做一次All-Gather,将别的GPU算好的W同步到自己这来。单卡通讯量  。

再次比对下显存和通讯量:

和朴素DP相比,存储降了8倍,单卡通讯量持平,好像更牛皮了呢!那么,还可以优化吗?

5.3  :优化状态、梯度与参数分割

看到这里,也许你有点感觉了,ZeRO的思想就是:万物皆可切,万物皆可抛。所以现在,我们把参数也切开。每块GPU置维持对应的optimizer states,gradients和parameters(即W)。

数据并行的流程如下:

(1)每块GPU上只保存部分参数W。将一个batch的数据分成3份,每块GPU各吃一份。

(2)做forward时,对W做一次All-Gather,取回分布在别的GPU上的W,得到一份完整的W,单卡通讯量 Φ 。forward做完,立刻把不是自己维护的W抛弃。

(3)做backward时,对W做一次All-Gather,取回完整的W,单卡通讯量  。backward做完,立刻把不是自己维护的W抛弃。

(4)做完backward,算得一份完整的梯度G,对G做一次Reduce-Scatter,从别的GPU上聚合自己维护的那部分梯度,单卡通讯量  。聚合操作结束后,立刻把不是自己维护的G抛弃。

(5)用自己维护的O和G,更新W。由于只维护部分W,因此无需再对W做任何AllReduce操作。

显存和通讯量如下:

到这一步,我们用1.5倍的通讯开销,换回近120倍的显存。只要梯度计算和异步更新做的好,通讯时间大部分可以被计算时间隐藏,因此这样的额外通讯开销,也是划算的。

到这里,我们可以放出原始论文中的说明图了,经过以上分析,这张说明图是不是瞬间就能看懂了。不得不吐槽下,虽然ZeRO的设计不复杂,但对应论文写得真是逻辑跳跃,晦涩难懂....

仔细一想,ZeRO其实掌握了降本增效的精髓:用完即弃,需要再补。反正我补一个和你差不多的,也不会花费很多通(找)讯(人)时间,还大大降低了我的成本。模型的每一层多算(造)几(轮)遍(子)有啥关系呢,反正在我的预算里每个人都一刻不停地干活,就行啦!

5.4 ZeRO VS 模型并行

知道模型并行的朋友,可能会想,既然ZeRO都把参数W给切了,那它应该是个模型并行呀?为什么要归到数据并行里呢?

其实ZeRO是模型并行的形式,数据并行的实质。

模型并行,是指在forward和backward的过程中,我只需要用自己维护的那块W来计算就行。即同样的输入X,每块GPU上各算模型的一部分,最后通过某些方式聚合结果。

但对ZeRO来说,它做forward和backward的时候,是需要把各GPU上维护的W聚合起来的,即本质上还是用完整的W进行计算。它是不同的输入X,完整的参数W,最终再做聚合。

因为下一篇要写模型并行Megatron-LM,因此现在这里罗列一下两者的对比。

六、ZeRO-R

说完了以上对model states的显存优化,现在来看对residual states的优化。

6.1  : Partitioned Activation Checkpointing

前面说过,对activation的存储是灵活的。不像optimizer states,gradients和parameters对模型更新是必须的,activation只是起到加速梯度计算的作用。因此,在哪几层保存activation,保存哪些activation都是可以灵活设置的。同样,我们也可以仿照以上切割方式,每块GPU上只维护部分的activation,需要时再从别的地方聚合过来就行。需要注意的是,activation对显存的占用一般会远高于模型本身,通讯量也是巨大的,所以这块要灵活、有效地实验设计。

6.2  : Constant Size Buffer

固定大小的内存buffer,它的目的在于:

提升带宽利用率。当GPU数量上升,GPU间的通讯次数也上升,每次的通讯量可能下降(但总通讯量不会变)。数据切片小了,就不能很好利用带宽了。所以这个buffer起到了积攒数据的作用:等数据积攒到一定大小,再进行通讯。

使得存储大小可控。在每次通讯前,积攒的存储大小是常量,是已知可控的。更方便使用者对训练中的存储消耗和通讯时间进行预估。

6.3  : Memory Defragmentation

在前文提过,设置机制,对碎片化的存储空间进行重新整合,整出连续的存储空间。防止出现总存储足够,但连续存储不够而引起的存储请求fail

七、ZeRO-Offload与ZeRO-Infinity

最后,简单介绍一下ZeRO-Offload。它的核心思想是:显存不够,内存来凑。如果我把要存储的大头卸载(offload)到CPU上,而把计算部分放到GPU上,这样比起跨机,是不是能既降显存,也能减少一些通讯压力呢?ZeRO-Offload的做法是:

  • forward和backward计算量高,因此和它们相关的部分,例如参数W(fp16),activation,就全放入GPU。
  • update的部分计算量低,因此和它相关的部分,全部放入CPU中。例如W(fp32),optimizer states(fp32)和gradients(fp16)等。

具体切分如下图:

ZeRO-infinity也是同理,它们在解决的事情都是:找个除GPU之外的地方,存数据。感兴趣的朋友可以深入研究,这里就不展开了。

参考

1、https://web.eecs.umich.edu/~mosharaf/Readings/Parameter-Server.pdf2、https://zh.d2l.ai/chapter_computational-performance/parameterserver.html3、https://blog.csdn.net/dpppBR/article/details/804455694、https://arxiv.org/abs/1910.020545、https://blog.51cto.com/u_14691718/56314716、https://arxiv.org/pdf/1910.02054.pdf7、https://blog.51cto.com/u_14691718/56314718、https://blog.csdn.net/qq_43307074/article/details/127688761