#EVE-7B-HD-v1.0

抛弃视觉编码器,这个「原生版」多模态大模型也能媲美主流方法

一作刁海文,是大连理工大学博士生,导师是卢湖川教授。目前在北京智源人工智能研究院实习,指导老师是王鑫龙博士。他的研究兴趣是视觉与语言,大模型高效迁移,多模态大模型等。共同一作崔玉峰,毕业于北京航空航天大学,是北京智源人工智能研究院视觉中心算法研究员。他的研究兴趣是多模态模型、生成模型和计算机视觉,主要工作有 Emu 系列。

近期,关于多模态大模型的研究如火如荼,工业界对此的投入也越来越多。国外相继推出了炙手可热的模型,例如 GPT-4o (OpenAI)、Gemini(Google)、Phi-3V (Microsoft)、Claude-3V(Anthropic),以及 Grok-1.5V(xAI)等。与此同时,国内的 GLM-4V(智谱 AI)、Step-1.5V(阶跃星辰)、Emu2(北京智源)、Intern-VL(上海 AI 实验室)、Qwen-VL(阿里巴巴)等模型百花齐放。

当前的视觉语言模型(VLM)通常依赖视觉编码器(Vision Encoder, VE)来提取视觉特征,再结合用户指令传入大语言模型(LLM)进行处理和回答,主要挑战在于视觉编码器和大语言模型的训练分离。这种分离导致视觉编码器在与大语言模型对接时引入了视觉归纳偏置问题,例如受限的图像分辨率和纵横比,以及强烈的视觉语义先验。随着视觉编码器容量的不断扩大,多模态大模型在处理视觉信号时的部署效率也受到极大限制。此外,如何找到视觉编码器和大语言模型的最佳容量配置,也变得越来越具有复杂性和挑战性。

51c大模型~合集1_数据

在此背景下,一些更加前沿的构想迅速浮现:

  • 能否去除视觉编码器,即直接构建无视觉编码器的原生多模态大模型?
  • 如何高效且丝滑地将大语言模型演变为无视觉编码器的原生多模态大模型?
  • 如何弥合无编码器的原生多模态框架和基于编码器的主流多模态范式的性能差距?

Adept AI 在 2023 年末发布了 Fuyu 系列模型并做出了一些相关尝试,但在训练策略、数据资源和设备信息方面没有任何披露。同时,Fuyu 模型在公开的视觉文本评测指标上与主流算法存在显著的性能差距。同期,我们进行的一些先导试验显示,即使大规模拉升预训练数据规模,无编码器的原生多模态大模型仍面临收敛速度慢和性能表现差等棘手问题。

针对这些挑战,智源研究院视觉团队联合大连理工大学、北京大学等国内高校,推出了新一代无编码器的视觉语言模型 EVE。通过精细化的训练策略和额外的视觉监督,EVE 将视觉 - 语言表征、对齐和推理整合到统一的纯解码器架构中。使用公开数据,EVE 在多个视觉 - 语言基准测试中表现出色,与类似容量的基于编码器的主流多模态方法相媲美,并显著优于同类型 Fuyu-8B。EVE 的提出旨在为纯解码器的原生多模态架构发展提供一条透明且高效的路径。

  • 论文地址:  https://arxiv.org/abs/2406.11832
  • 项目代码:  https://github.com/baaivision/EVE
  • 模型地址:  https://huggingface.co/BAAI/EVE-7B-HD-v1.0

1. 技术亮点 

  • 原生视觉语言模型:打破了主流的多模态模型的固定范式,去除视觉编码器,可处理任意图像长宽比。在多个视觉语言基准测试中显著优于同类型的 Fuyu-8B 模型,并接近主流的基于视觉编码器的视觉语言架构。
  • 数据和训练代价少:  EVE 模型的预训练仅筛选了来自 OpenImages、SAM 和 LAION 的公开数据,并利用了 66.5 万条 LLaVA 指令数据和额外的 120 万条视觉对话数据,分别构建了常规版本和高分辨版本的 EVE-7B。训练在两个 8-A100 (40G) 节点上约需 9 天完成,或者在四个 8-A100 节点上约需 5 天完成。
  • 透明和高效的探索: EVE 尝试探索一条高效、透明且实用的路径通往原生视觉语言模型,为开发新一代纯解码器的视觉语言模型架构提供全新的思路和宝贵的经验,为未来多模态模型的发展开辟新的探索方向。

2. 模型结构

51c大模型~合集1_模态_02

首先,通过 Vicuna-7B 语言模型进行初始化,使其具备丰富的语言知识和强大的指令跟随能力。在此基础上,去除深度视觉编码器,构建轻量级视觉编码层,高效无损地编码图像输入,并将其与用户语言命令输入到统一的解码器中。此外,通过视觉对齐层与通用的视觉编码器进行特征对齐,强化细粒度的视觉信息编码和表征。

51c大模型~合集1_数据_03

2.1 Patch Embedding Layer

  • 首先使用单层卷积层来获取图像的 2D 特征图,然后通过平均池化层进行下采样;
  • 使用交叉注意力模块(CA1)在限定感受野中交互,增强每个 patch 的局部特征;
  • 使用 < CLS> token 并结合交叉注意力模块(CA2),为后续每个 patch 特征提供全局信息;
  • 在每个 patch 特征行的末尾插入了一个可学习的 < SPL> token,帮助网络理解图像的二维空间结构。

2.2 Patch Aligning Layer

  • 记录有效 patch 的二维形状;丢弃 < CLS>/<PAD> tokens,并利用自适应池化层还原到原始的二维形状;
  • 通过层级交叉注意力模块(CA3),整合多层网络视觉特征,从而实现与视觉编码器输出的细粒度对齐。

3. 训练策略

51c大模型~合集1_模态_04

  • 大语言模型引导的预训练阶段:建立视觉和语言之间的初步联系,为后续稳定高效的大规模预训练打下基础;
  • 生成式预训练阶段:进一步提高模型对视觉 - 语言内容的理解能力,实现纯语言模型到多模态模型的丝滑转变;
  • 监督式的微调阶段:进一步规范模型遵循语言指令和学习对话模式的能力,满足各种视觉语言基准测试的要求。

51c大模型~合集1_数据_05

  • 在预训练阶段,筛选了来自 SA-1B、OpenImages 和 LAION 等 3300 万公开数据,仅保留分辨率高于 448×448 的图像样本。特别地,针对 LAION 图像冗余度高的问题,通过在 EVA-CLIP 提取的图像特征上应用 K-means 聚类,生成 50,000 个聚类,并从中挑选出最接近每个聚类中心的 300 张图像,最终选出 1500 万张 LAION 图像样本。随后,利用 Emu2 (17B)和 LLaVA-1.5 (13B)重新生成高质量图像描述。
  • 在监督微调阶段,使用 LLaVA-mix-665K 微调数据集来训练得到标准版的 EVE-7B,并整合 AI2D、Synthdog、DVQA、ChartQA、DocVQA、Vision-Flan 和 Bunny-695K 等混合数据集来训练得到高分辨率版本的 EVE-7B。

4. 定量分析

51c大模型~合集1_模态_06

EVE 模型在多个视觉语言基准测试中明显优于同类型的 Fuyu-8B 模型,并且与多种主流的基于编码器的视觉语言模型表现相当。然而,由于使用大量视觉语言数据训练,其在准确响应特定指令方面存在挑战,在部分基准测试中表现有待提高。令人兴奋的是,通过高效的训练策略,可以实现无编码器的 EVE 与带编码器基础的视觉语言模型取得相当的性能,从根本上解决主流模型在输入尺寸灵活性、部署效率和模态容量匹配方面的问题。

51c大模型~合集1_模态_07

相较于带编码器的模型易受到语言结构简化和丰富知识丢失等问题困扰,EVE 表现出随着数据规模的增加而逐步稳定地提升性能,逐渐逼近基于编码器模型的性能水平。这可能是因为在统一网络中编码和对齐视觉和语言模态更具挑战性,使得无编码器模型相对于带编码器的模型更不容易过拟合。

5. 同行怎么看?

英伟达高级研究员 Ali Hatamizadeh 表示,EVE 令人耳目一新,尝试提出全新的叙事,区别于构建繁杂的评测标准和渐进式的视觉语言模型改进。

苹果机器学习工程师 Prince Canuma 表示,EVE 架构非常有趣,对 MLX VLM 项目集是一个很好的补充。

6.未来展望

作为无编码器的原生视觉语言模型,目前 EVE 取得了令人鼓舞的结果。沿着这条路径,未来还有一些有趣的方向值得探索尝试:

  • 进一步的性能提升:实验发现,仅使用视觉 - 语言数据进行预训练显著地降低了模型的语言能力(SQA 得分从 65.3% 降至 63.0%),但逐步提升了模型的多模态性能。这表明在大语言模型更新时,内部存在语言知识的灾难性遗忘。建议适当融合纯语言的预训练数据,或采用专家混合(MoE)策略来减少视觉与语言模态间干扰。
  • 无编码器架构的畅想:通过恰当策略和高质量数据的训练,无编码器视觉语言模型可以与带编码器的模型相匹敌。那么在相同的模型容量和海量的训练数据下,二者性能如何?我们推定通过扩大模型容量和训练数据量,无编码器架构是能够达到甚至超越基于编码器架构,因为前者几乎无损地输入图像,避开了视觉编码器的先验偏置。
  • 原生多模态的构建: EVE 完整地展现了如何高效稳定地构建原生多模态模型,这为之后整合更多模态(如音频、视频、热成像、深度等)开辟了透明和切实可行的道路。核心思想是在引入大规模统一训练之前,先通过冻结的大语言模型对这些模态进行预对齐,并利用相应的单模态编码器和语言概念对齐进行监督。




#机器人在现实中碰过的壁,AI也会碰

「机器学习一直生活在一个令机器人专家、化学家、生物学家和神经科学家羡慕不已的泡沫中,随着它真正开始发挥作用,我们所有人都将遇到其他人多年来一直在应对的同样的现实壁垒。」

有人说,机器人领域进展缓慢,甚至和机器学习的其他子领域相比显得毫无进展。

谷歌 DeepMind 机器人科学家,SayCan、RT-1、RT-2 等具身智能项目参与者 Alex Irpan 同意这一说法。但他认为,这是因为机器人学是一个和现实紧密连接的领域,现实的复杂性决定了他们不免碰壁。他还指出,这些问题不是机器人技术所独有的。同样的问题也适用于大语言模型(LLM)等技术。这些模型在面对现实世界时,会遇到与机器人学类似的复杂性问题。

最近,他写了一篇题为「The Tragedies of Reality Are Coming for You(现实的悲剧正在向你袭来)」的博客来阐述这一观点。

现实的悲剧正在向你袭来

2023 年,我参加了一次 ML 会议。夜未央,酒酣耳热,话题转到了一个问题上:「如果你能把任何一个机器学习子领域的资源都给另一个子领域,你会砍掉哪个,把资源给谁?」

我不记得别人是怎么说的,但有一个人说他们会砍掉机器人。当我进一步追问时,他们说机器人技术进展太慢,相对于其他领域来说,什么都没有发生。

他们说机器人技术比纯软件的机器学习子领域进展缓慢,我认为他们说得没错,但我还想补充两点:

  • 机器人学习进展较慢的原因是:如果不解决难题,就很难有所作为。
  • 机器人技术的难题并非机器人独有。

在机器人技术领域,人们常说的一句话是「现实是混乱的」。相对于代码而言,我会将其延伸为「现实是复杂的」。在机器人技术中,你往往要将混乱的现实推向一个足够好的抽象层,以便代码能够在其上发挥作用。作为一个领域,计算机科学花了数十年时间在硬件和软件之间创建了良好的抽象层。代码描述了如何将电力输送到硬盘、处理器和显示器,它足够可靠,我甚至不需要考虑它。

这样做有很多好处。一旦你完成了这项艰巨的工作,并将你的工作进展转移到抽象的逻辑空间中,一切都会变得更容易。代码和数据的可复制性令人难以置信。我在 3 台设备上同步了代表这篇博文草稿的文件副本,甚至不用花费任何精力思考。

不过,就像 Joel Spolsky 所说,所有抽象在某种程度上都有漏洞,而我发现机器人技术中的漏洞往往更大。有很多出错的方式与代码的正确性无关。

这和这个学科的一些基本原理有关吗?有一点。很多机器人硬件比笔记本电脑或 Linux 服务器更具实验性。消费类机器人还不是一大产业。「实验性」往往意味着「奇怪的、更容易出现故障的状态」。

但是,我不认为硬件是造成问题的主要原因。现实才是问题的根源。Benjamin Holson 在他的「Mythical Non-Roboticist(神话般的非机器人学家)」一文中说得非常好:

第一个难点在于,机器人要处理的是现实世界中不完美的感知和不完美的执行。全局可变状态是一种糟糕的编程风格,因为它真的很难处理,但对于机器人软件来说,整个物理世界都是全局可变状态,你只能不可靠地观察它,并希望你的行动能接近你想要实现的目标。

机器人研究依赖于在现实与软件之间搭建新的桥梁,但这也发生在机器人研究之外。任何与现实对接的软件,对现实的了解都是不完美的。任何试图影响现实世界变化的软件,都必须应对现实的全局可变状态。任何软件,如果其行为依赖于现实中发生的事情,就会招致对抗性的噪声和复杂性。

游戏 AI 就是一个很好的例子。国际象棋 AI 是可靠的超人。然而,如果你以特定方式下棋,一些超人围棋 AI 是可以击败的,正如 Tony T. Wang 等人在 ICML 2023 论文「Adversarial Policies Beat Superhuman Go AIs」中发现的那样。对抗性技术找到了足够清晰以至于人类可以复制的策略。

在附录 G.2 中,我们的一位作者,一位围棋专家,能够在没有任何算法帮助的情况下,通过学习对手的对局记录来实现这种 [cyclic] 攻击。他们在 KGS 在线围棋服务器上以标准人类条件对局,在与作者无关的顶级 KataGo 机器人对局中取得了超过 90% 的胜率。

作者甚至在给机器人 9 个让子的情况下获胜,这是一个巨大的优势:拥有这些让子的人类职业棋手在面对任何对手(无论是人类还是人工智能)时,胜率几乎都是 100%。他们还击败了 KataGo 和 Leela Zero,二者每局棋的搜索次数都达到了 10 万次,这通常远远超出了人类的能力范围。此后,其他人类也利用 cyclic 攻击击败了其他各种顶级围棋 AI。

与此同时,几年前,OpenAI 创建了一个系统,该系统击败了 Dota 2 的卫冕世界冠军。在向公众开放该系统以测试其稳健性后,一个团队设计了一套策略,取得了 10 场连胜。

基于这一点,你可能会持一种悲观的观点,认为即使是连接 19 x 19 围棋棋盘或 Dota 2 这样一个简单的「现实」,其额外复杂性就足以使稳健行为具有挑战性。我认为这种观点有失公允,因为这两个系统都没有将稳健性作为最高目标,但我确实认为它们是一个有趣的案例研究。

最近,围绕 LLM 的炒作浪潮一浪高过一浪 —— 他们能做什么,他们能在哪里应用。这其中隐含的一个信念是,LLM 可以极大地改变人们在工作和休闲中与技术交互的方式。换句话说,LLM 将改变我们与现实交互的方式。事实上,我也加入了这股炒作浪潮,具体来说,我怀疑基础模型短期炒作过度,长期炒作不足。然而,这也意味着,对于一个历来不善于考虑现实的领域来说,现实的一切混乱都将到来。

就在这个人说机器人技术是浪费资源的同一个 ML 会议上,我提到我们正在用真实机器人进行基础模型实验。有人说这似乎有点吓人,我向他们保证这只是一个研究原型。但我也觉得 LLM 生成和执行软件有点吓人,我觉得他们隐隐担心一个却不担心另一个很有意思。硅谷的人有点自相矛盾。他们既相信软件能推动初创企业实现惊人的变革,又相信他们的软件不值得深思或反省。我认为,比特世界与原子世界一样,都是现实的一部分。它们在不同的层面上运行,但都是现实的一部分。

我注意到(有些幸灾乐祸),LLM 从业者也开始遭遇之前机器人技术碰到过的痛点。比如「我们无法复制这些训练,因为这太耗费资金了」。是啊,这个问题在机器人领域已经讨论了至少十年。再比如,「我没法让必应告诉我《阿凡达 2》的上映日期,因为它一直在调出关于自己的新闻报道,并在生成前进行自我修正。」

我们现在所处的世界,任何公开的互联网文本都会不可逆转地影响检索增强生成。欢迎来到全局可变状态。每当我看到有人声称 ChatGPT 的行为出现了倒退,我就会想起我和其他人为了解释机器人性能突然莫名下降而想出的各种「阴谋论」,以及问题究竟是出在模型、环境,还是我们的过度推断。

俗话说「所有的机器人 demo 都在撒谎」,人们发现所有的 LLM demo 也都在撒谎。我认为,从根本上说,这是无法避免的,因为人类的注意力是有限的。重要的是评估谎言的类型、大小和重要性。他们是否展示了模型 / 机器人如何泛化?他们有没有提到这些例子是如何精挑细选的?一旦将现实联系起来,这些问题就会变得更加复杂。梅西目前看起来是个不错的球员,但「他能在斯托克城寒冷的雨夜做到这一点吗」?

让问题变得复杂的是,这些问题的答案并不总是「否」。梅西可以在斯托克城的寒冷雨夜做到这一点。他足够优秀。这让问题变得困难,因为正确地回答一个「是」比正确地回答一个「否」要重要得多。随着 LLM 越来越优秀,随着 AI 在日常生活中越来越常见,作为一个社会,我们需要越来越善于判断模型是否已经证明了自己。我对未来的主要担忧之一,就是我们不善于评估模型是否已经证明了自己。

但是,我期望机器人学家会走在曲线的前面。在 LLM 操纵通用基准测试的说法出现之前,我们就在抱怨评估问题。早在「我们需要更好的数据覆盖率」成为基础模型预训练团队的口号之前,我们就在努力获取足够的数据,以捕捉自动驾驶的长尾效应。机器学习一直生活在一个令机器人专家、化学家、生物学家和神经科学家羡慕不已的泡沫中,随着它真正开始发挥作用,我们所有人都将遇到其他人多年来一直在应对的同样的现实壁垒。这些挑战是可以克服的,但会很艰难。欢迎来到现实世界。欢迎来到痛苦的世界。

原文链接:https://www.alexirpan.com/2024/07/08/tragedies-of-reality.html


#Teaching Transformers Causal Reasoning through Axiomatic Training

公理训练让LLM学会因果推理:6700万参数模型比肩万亿参数级GPT-4

把因果链展示给 LLM,它就能学会公理。

AI 已经在帮助数学家和科学家做研究了,比如著名数学家陶哲轩就曾多次分享自己借助 GPT 等 AI 工具研究探索的经历。AI 要在这些领域大战拳脚,强大可靠的因果推理能力是必不可少的。whaosoft开发板商城测试设备

本文要介绍的这项研究发现:在小图谱的因果传递性公理演示上训练的 Transformer 模型可以泛化用于大图谱的传递性公理。

也就是说,如果让 Transformer 学会执行简单的因果推理,就可能将其用于更为复杂的因果推理。该团队提出的公理训练框架是一种基于被动数据来学习因果推理的新范式,只有演示足够就能用于学习任意公理。

引言

因果推理(causal reasoning)可以定义成一组推理流程并且这组推理流程要符合专门针对因果性的预定义公理或规则。举个例子,d-separation(有向分离)和 do-calculus 规则可被视为公理,而 collider set 或 backdoor set 的规范则可被看作是由公理推导出的规则。

通常来说,因果推理使用的数据对应于一个系统中的变量。通过正则化、模型架构或特定的变量选择,可以归纳偏置的形式将公理或规则集成到机器学习模型中。

根据可用数据种类的差异(观察数据、干预数据、反事实数据),Judea Pearl 提出的「因果阶梯」定义了因果推理的可能类型。

由于公理是因果性的基石,因此我们不禁会想是否可以直接使用机器学习模型来学习公理。也就是说,如果学习公理的方式不是学习通过某个数据生成流程得到的数据,而是直接学习公理的符号演示(并由此学习因果推理),哪又会如何呢?

相较于使用特定的数据分布构建的针对特定任务的因果模型,这样的模型有一个优势:其可在多种不同的下游场景中实现因果推理。随着语言模型具备了学习以自然语言表达的符号数据的能力,这个问题也就变得非常重要了。

事实上,近期已有一些研究通过创建以自然语言编码因果推理问题的基准,评估了大型语言模型(LLM)是否能够执行因果推理。whao开发板商城测试设备

微软、MIT 和印度理工学院海得拉巴分校(IIT Hyderabad)的研究团队也朝这个方向迈出了重要一步:提出了一种通过公理训练(axiomatic training)学习因果推理的方法

  • 论文标题:Teaching Transformers Causal Reasoning through Axiomatic Training
  • 论文地址:https://arxiv.org/pdf/2407.07612

公理训练

将因果公理表示成以下符号元组 ⟨premise, hypothesis, result⟩。其中 hypothesis 是指假设,即因果陈述;premise 是前提,是指用于确定该陈述是否为「真」的任意相关信息;result 自然就是结果了。结果可以是简单的「是」或「否」。

基于这个模板,可通过修改变量名称、变量数量和变量顺序等来生成大量合成元组。

为了用 Transformer 学习因果公理,实现公理训练,该团队采用了以下方法构建数据集、损失函数和位置嵌入。

公理训练:数据集、损失函数和位置编制

训练数据

基于一个特定公理,可根据「前提」将「假设」映射成合适的标签(Yes 或 No)。要创建训练数据集,该团队的做法是在特定的变量设置 X、Y、Z、A 下枚举所有可能的元组 {(P, H, L)}_N,其中 P 是前提,H 是假设,L 是标签(Yes 或 No)。

给定一个基于某个因果图谱的前提 P,如果可通过使用特定的公理(一次或多次)推导出假设 P,那么标签 L 就为 Yes;否则为 No。

举个例子,假设一个系统的底层真实因果图谱具有链式的拓扑结构:X_1 → X_2 → X_3 →・・・→ X_n。那么,可能的前提是 X_1 → X_2 ∧ X_2 → X_3,那么假设 X_1 → X_3 有标签 Yes,而另一个假设 X_3 → X_1 有标签 No。上述公理可被归纳式地多次用于生成更复杂的训练元组。

对于训练设置,使用传递性公理生成的 N 个公理实例构建一个合成数据集 D。D 中的每个实例都构建成了 (P_i, H_ij, L_ij) 的形式,

51c大模型~合集1_模态_08

,其中 n 是每第 i 个前提中的节点数量。P 是前提,即某种因果结构的自然语言表达(如 X 导致 Y,Y 导致 Z);之后是问题 H(如 X 导致 Y 吗?);L 为标签(Yes 或 No)。该形式能有效覆盖给定因果图谱中每条独特链的所有成对节点。

损失函数

给定一个数据集,损失函数的定义基于每个元组的基本真值标签,表示为:

51c大模型~合集1_模态_09

分析表明,相比于下一 token 预测,使用该损失能得到很有希望的结果。

位置编码

除了训练和损失函数,位置编码的选择也是另一个重要因素。位置编码能提供 token 在序列中绝对和相对位置的关键信息。

著名论文《Attention is all you need》中提出了一种使用周期函数(正弦或余弦函数)来初始化这些编码的绝对位置编码策略。

绝对位置编码能为任何序列长度的所有位置提供确定的值。但是,有研究表明绝对位置编码难以应对 Transformer 的长度泛化任务。在可学习的 APE 变体中,每个位置嵌入都是随机初始化的,并使用该模型完成了训练。该方法难以应对比训练时的序列更长的序列,因为新的位置嵌入依然未被训练和初始化。

有趣的是,近期有发现表明移除自回归模型中的位置嵌入可以提升模型的长度泛化能力,而自回归解码期间的注意力机制足以编码位置信息。该团队使用了不同的位置编码来理解其对因果任务中的泛化的影响,包括可学习位置编码(LPE)、正弦位置编码(SPE)、无位置编码(NoPE)。

为了提升模型的泛化能力,该团队也采用了数据扰动,其中包括长度、节点名称、链顺序和分支情况的扰动。

实验

下面问题又来了:如果使用这些数据训练一个模型,那么该模型能否学会将该公理应用于新场景?

为了解答这个问题,该团队使用这个因果无关型公理的符号演示从头开始训练了一个 Transformer 模型。

为了评估其泛化性能,他们在简单的大小为 3-6 个节点的因果无关公理链上进行了训练,然后测试了泛化性能的多个不同方面,包括长度泛化性能(大小 7-15 的链)、名称泛化性能(更长的变量名)、顺序泛化性能(带有反向的边或混洗节点的链)、结构泛化性能(带有分支的图谱)。图 1 给出了评估 Transformer 的结构泛化的方式。

51c大模型~合集1_数据_10

具体来说,他们基于 GPT-2 架构训练了一个基于解码器的有 6700 万参数的模型。该模型有 12 个注意力层、8 个注意力头和 512 嵌入维度。他们在每个训练数据集上从头开始训练了该模型。为了理解位置嵌入的影响,他们还研究了三种位置嵌入设置:正弦位置编码(SPE)、可学习位置编码(LPE)和无位置编码(NoPE)。

结果如表 1、图 3 和图 4 所示。

51c大模型~合集1_编码器_11

表 1 给出了在训练时未曾见过的更大因果链上评估时不同模型的准确度。可以看到,新模型 TS2 (NoPE) 的表现能与万亿参数规模的 GPT-4 相媲美。

图 3 是在有更长节点名称(长于训练集的)的因果序列上的泛化能力评估结果以及不同位置嵌入的影响。

51c大模型~合集1_模态_12

图 4 评估的是在更长的未见过的因果序列上的泛化能力。

51c大模型~合集1_编码器_13

他们发现,在简单链上训练的模型可以泛化到在更大的链上多次应用公理,但却无法泛化到顺序或结构泛化等更复杂的场景。但是,如果在简单链以及带有随机逆向边的链组成的混合数据集上训练模型,则模型可以很好地泛化到各种评估场景。

通过扩展在 NLP 任务上的长度泛化研究结果,他们发现了位置嵌入在确保在长度和其它方面实现因果泛化的重要性。他们表现最佳的模型没有位置编码,但他们也发现正弦编码在某些情况下也很好用。

这种公理训练方法还能泛化用于一个更困难的问题,如图 5 所示。即以包含统计独立性陈述的前提为基础,任务目标是根据因果关系分辨相关性。解决该任务需要多个公理的知识,包括 d-separation 和马尔可夫性质。

51c大模型~合集1_数据_14

该团队使用与上面一样的方法生成了合成训练数据,然后训练了一个模型,结果发现在包含 3-4 个变量的任务演示上训练得到的 Transformer 能学会解决包含 5 个变量的图谱任务。并且在该任务上,该模型的准确度高于 GPT-4 和 Gemini Pro 等更大型的 LLM。

51c大模型~合集1_模态_15

该团队表示:「我们的研究提供了一种通过公理的符号演示教模型学习因果推理的新范式,我们称之为公理训练(axiomatic training)。」该方法的数据生成和训练流程是普适的:只要一个公理能被表示成符号元组的格式,就可使用此方法学习它。




#iPhone、iPad、MacBook老旧设备组成异构集群,能跑Llama 3

假如你有闲置的设备,或许可以试一试。

这次,你手里的硬件设备也能在 AI 领域大展拳脚了。

将 iPhone、iPad、Macbook 进行组合,就能组装成「异构集群推理方案」, 然后顺畅的运行 Llama3 模型。

值得一提的是,这个异构集群可以是 Windows 系统,也可以是Linux、iOS 系统,并且对 Android 的支持很快到来。

异构集群正在运行中。

根据项目作者 @evilsocket 的介绍,这个异构集群包括 iPhone 15 Pro Max、iPad Pro、MacBook Pro (M1 Max)、NVIDIA GeForce 3080、2x NVIDIA Titan X Pascal。所有代码都已经上传到 GitHub。

看到这,网友纷纷表示,这位老哥确实不简单。

不过也有网友开始担心能耗问题,暂且不管速度,电费都耗不起。来回搬数据,损耗太大了。

项目介绍

上述功能的实现,离不开一个名为 Cake 的 Rust 框架。Cake 可以完成大模型(例如 Llama3)的分布式推理,旨在将消费级硬件组合成异构集群,其中消费级硬件采用多种操作系统,包括:iOS、Android、macOS、Linux 和 Windows,从而使 AI 更易于访问。

项目地址:https://github.com/evilsocket/cake

Cake 的主要思路是将 transformer 块分片到多个设备,以便能够让通常不适合单个设备 GPU 内存的模型运行推理。对同一工作线程上的连续 transformer 块的推理是分批进行的,以便最大限度地减少数据传输造成的延迟。

Cake 目前支持的系统和设备如下:

编译

安装 Rust 后,运行下列代码:

cargo build --release

假如用户想要在应用程序中生成 iOS 绑定,可以进行下述操作:

make ios

使用

运行 worker 节点:

cake-cli --model /path/to/Meta-Llama-3-8B \ # model path, read below on how to optimize model size for workers
         --mode worker \                    # run as worker
         --name worker0 \                   # worker name in topology file
         --topology topology.yml \          # topology
         --address 0.0.0.0:10128            # bind address

运行 master 节点:

cake-cli --model /path/to/Meta-Llama-3-8B \
         --topology topology.yml

其中 topology.yml 确定哪些层由哪个 worker 提供服务:

linux_server_1:
  host: 'linux_server.host:10128'
description: 'NVIDIA Titan X Pascal (12GB)'
layers:
    - 'model.layers.0-5'
linux_server_2:
  host: 'linux_server2.host:10128'
description: 'NVIDIA GeForce 3080 (10GB)'
layers:
    - 'model.layers.6-16'
iphone:
  host: 'iphone.host:10128'
description: 'iPhone 15 Pro Max'
layers:
    - 'model.layers.17'
ipad:
  host: 'ipad.host:10128'
description: 'iPad'
layers:
    - 'model.layers.18-19'
macbook:
  host: 'macbook.host:10128'
description: 'M1 Max'
layers:
    - 'model.layers.20-31'

关于内存和磁盘空间优化问题,用户可能希望只向 worker 提供模型中实际需要的数据,而不是整个文件夹,在这种情况下,可以使用 cake-split-model 。例如,要生成较小版本的 llama3 safetensors,可以采用如下代码:

cake-split-model --model-path path/to/Meta-Llama-3-8B \ # source model to split
                 --topology path/to/topology.yml \      # topology file
                 --output output-folder-name

参考链接:https://x.com/tuturetom/status/1812654489972973643





#OpenAI的1500亿「史上最大」融资轮

苹果反水:OpenAI的1500亿「史上最大」融资轮,难了

有金主已经决定收手。

在 OpenAI,高层变动正在成为一种传统。

在不到两年的时间里,OpenAI 从一个 AI 圈内领先的实验室,发展成为一家全球知名的企业。在首席执行官山姆・奥特曼(Sam Altman)被罢免并迅速复职不到一年后,今年 9 月,三位高层领导突然宣布辞职。

一个摆在台面上的问题是:这次宫斗的时间点,就在 OpenAI 即将完成可能是硅谷史上最大一轮融资的同一周。

本周,OpenAI 首席技术官 Mira Murati、首席研究官 Bob McGrew 和 Post Training 研究副总裁 Barret Zoph 纷纷宣布将离开公司。对于 OpenAI 杰出的技术领导层来说,这是一个令人震惊的转变。

就在 Murati 离职之前,OpenAI 联合创始人 John Schulman 于 8 月宣布他将离开 OpenAI,前往竞争对手 Anthropic 工作。

而在 Murati 宣布辞职的同一天,路透社报道称,OpenAI 正在努力改变其公司结构,成为一家面向盈利的公司,不再受公司非营利部门的控制。然而这次转型的过程可能并不顺利。

最新的消息是:这最新一轮 65 亿美元的融资,苹果已经决定不跟了。

在这个时间点收手,参与者和投资金额都会可能会发生变化。

大规模融资遇险,风投要「用脚投票」

有现任和前任员工表示,OpenAI 仓促地发布了产品并进行安全测试,业已失去对竞争对手的领先优势。他们表示,奥特曼在很大程度上脱离了日常工作:一直以来都有报道称,他飞遍全球推广人工智能,并计划筹集巨额资金来建造 AI 芯片产业链和数据中心。

正如奥特曼所描述的,自他回归以来,OpenAI 已经逐渐发展成为一家更加正常的公司。其员工人数从去年 11 月的 770 人增至 1700 人,今年也任命了首位首席财务官和首席产品官。它在董事会中增加了具有企业和军事背景的人。该公司正在寻求从微软、苹果和英伟达等支持者那里筹集 65 亿美元资金。

OpenAI 越来越专注于构建其产品,一些长期任职的 OpenAI 员工表示,这些产品的重点不再是纯粹的研究。

CTO Mira Murati 是从 OpenAI 离开的又一位高管。

公司中的一些人表示,由于开发和运营 AI 大模型需要数十亿美元,OpenAI 必须要转型发展才能实现财务可持续性。他们认为,人工智能需要走出实验室,走向世界,进而改变人们的生活。

但也有很多人,包括长期以来在公司工作的科学家们认为,高额融资和巨额盈利的前景已经破坏了 OpenAI 的文化。

人们都认同的一件事是 —— 在当前组织结构内维持以 AGI 使命为中心的研究,和快速增长的业务之间存在矛盾。

「我们很难同时做到这两点 —— 产品至上的文化与研究文化截然不同,」OpenAI 的早期员工、现任 AI 初创公司 Cresta 首席技术官的 Tim Shi 说。「你必须吸引不同类型的人才,也许你在建立的是一家与众不同的公司。」

本周事件发生时,奥特曼一直在都灵参加意大利科技周(Italian Tech Week)。在周四的一次炉边谈话中,他否认员工离职与重组计划有关,并表示:「我认为这对所有人来说都是一次伟大的转型,希望 OpenAI 会因此变得更加强大,就像我们经历所有转型一样。」

OpenAI 的首席财务官周四致信投资者,称该公司有望在下周完成融资,并将在随后举行一系列电话会议,向投资者介绍其产品和研究团队的主要领导人。

OpenAI 正在专注于持续改进 ChatGPT 等产品,并已取得了初步成果。根据纽约时报昨天获取的内部文件,其在 8 月份的收入达到了 3 亿美元,自 2023 年初以来增长了 1700%,年化收入已达到约 37 亿美元,是去年同期的三倍多。OpenAI 估计,其收入明年将膨胀至 116 亿美元。

现在每月约有 3.5 亿人在使用 OpenAI 的大模型服务,大约 1000 万 ChatGPT 用户每月向该公司支付 20 美元订阅费。内部文件称,OpenAI 预计在今年年底会把价格提高 2 美元,并将在未来五年内把会员价格提高到 44 美元。另有超过一百万第三方开发者在使用 OpenAI 技术来支持他们的服务。

不过在支付运营服务相关成本后,OpenAI 今年预计仍将亏损 50 亿美元。该公司正计划新一轮 70 亿美元的融资,使估值达到 1500 亿美元,这是私营科技公司有史以来的最高估值之一。这轮融资最早可能在下周结束。

持续增长有助于 OpenAI 保持其技术优势。该公司的下一代基础模型 GPT-5 被外界普遍认为将是技术的重大飞跃,但也面临着研发的挫折和延迟。与此同时,竞争对手推出了与 OpenAI 当前产品大致相当的大模型。更要命的是,其中 Anthropic 和马斯克的 xAI 提出的模型,是由前 OpenAI 领导人创办的。

日益激烈的竞争让那些看重 OpenAI 工作的研究人员感到沮丧,因为其领导者的位置正在被动摇。一些外界投资者也在质疑 OpenAI 内部近乎持续不断的权力斗争和清洗是否会破坏其发展。

「OpenAI 是风投史上最热门的标的,」TRAC 创始合伙人 Joe Aaron 表示,但 OpenAI 的投资者也应该对一家已成为宫斗代名词的公司保持警惕。

「Thrive Capital 的 Josh Kushner 将全部赌注押在 OpenAI 和山姆・奥特曼身上,就像孙正义将其愿景基金的 40% 押在雅虎和杨致远身上一样。但不同之处在于,杨致远没有被解雇,也没有被重新任命为 CEO,只是他的最资深的员工离开了。声誉岌岌可危。我会用脚投票。」

「初创公司倒闭最快的方式就是公司内部动荡和权利争夺战,」一位不愿透露姓名的风险投资者表示。「OpenAI 拥有巨大的技术护城河,但问题是,像 Anthropic 这样的公司正在紧随其后。他们领先于所有人,这也让人们担忧,他们可能会浪费这种优势。」

「在典型的融资过程中,如果管理团队中有如此多人在融资结束前离开,潜在投资者会重新考虑。然而,OpenAI 不是一家典型的公司,」Sapphire Ventures 总裁兼合伙人 Jai Das 表示。他将这家初创公司描述为「几乎是」生成式 AI 的代名词 —— 根据高盛 6 月份的估计,这一领域在未来几年可能会吸引科技公司高达 1 万亿美元的资金投入。

失败的挽留

OpenAI 员工将去年 11 月的奥特曼被解雇和取消解雇称为「短暂事件」,因为它只持续了几天。

随着近期 OpenAI 管理层「人事地震」,人们再次想起那场「宫斗」。

「宫斗」事件之后的近一年来,OpenAI 的组织架构变化不小。让我们来梳理一下时间线:

  • 2024 年 2 月,Andrej Karpathy 宣布从 OpenAI 离开;
  • 2024 年 5 月,联合创始人、前首席科学家 Ilya Sutskever 离职;
  • 2024 年 8 月,OpenAI 总裁 Greg Brockman 宣布休假至年底;
  • 2024 年 8 月,联合创始人 John Schulman 离职;
  • 2024 年 9 月,OpenAI CTO Mira Murati 官宣离职。

值得注意的是,据《华尔街日报》报道,OpenAI 高层担心 Ilya Sutskever 等人的离职可能会引发更大规模的人员外流,曾努力让 Ilya Sutskever 回归。

Mira Murati 和总裁 Greg Brockman 告诉 Ilya Sutskever,公司陷入混乱,如果没有他,公司可能会倒闭。他们甚至去 Ilya 家里拜访,给他带了其他员工的卡片和信件,敦促他回来。

据称,奥特曼也拜访了 Ilya。

Ilya 也曾向 OpenAI 的前同事表示,他正在认真考虑回来。但不久之后,Greg Brockman 打电话说 OpenAI 将撤销让他回归的提议。

原因是 OpenAI 在确定 Ilya 的新角色是什么以及他将如何与其他研究人员(包括其首席科学家的继任者)一起工作时遇到了困难。

后来,Ilya 创立了一家新公司 ——「安全超级智能」(Safe SuperIntelligence,SSI),并已融资 10 亿美元。

反观 OpenAI,如今除了大权在握的山姆・奥特曼,OpenAI 11 人联合创始团队中还剩下一位:语言与代码生成团队负责人 Wojciech Zaremba。

技术落地,磕磕绊绊

今年春天,OpenAI 发布 GPT-4o,在人们感慨 OpenAI 又一次震撼世界的背后,是 OpenAI 内部开发局面的紧张混乱。

或许是出于外界对 OpenAI 模型安全的质疑,研究人员被要求对 GPT-4o 进行比最初计划更全面的安全测试,但只给了九天的时间。高管们希望 GPT-4o 在谷歌年度开发者大会之前首次亮相,并吸引更多关注。

为此,安全人员每天工作 20 个小时,没有时间仔细检查他们的工作。基于不完整数据的初步结果表明 GPT-4o 足够安全,可以部署。

但该模型推出后,熟悉该项目的人士表示,随后的分析发现该模型超出了 OpenAI 的内部的安全底线 —— 其被定义为 AI 生成可以说服人们改变信仰,从事潜在危险或非法行为的内容的能力。

研究团队向高层管理人员报告了该问题并致力于修复。但一些员工对这一过程感到沮丧,他们表示,如果公司花更多时间进行安全测试,他们本可以在呈现给用户之前解决问题。

虽然 GPT-4o 是在今年春天发布的,但 OpenAI 直到最近才全面开放了 GPT-4o 的高级语音功能,或许也和安全问题有关。

急于部署 GPT-4o 是影响 Murati 等技术领导者抉择的其中一件事。CTO 一再推迟计划推出的产品,包括搜索和语音交互,因为她认为这些产品还没有准备好。

而 GPT-4o 的高级语音功能一开放,Mira Murati 随后就宣布了离职。

其他高级职员也越来越不满。

另一位联合创始人兼顶尖科学家 John Schulman 告诉同事,他对 OpenAI 的内部冲突感到沮丧,对 Ilya Sutskever 未能回归感到失望,并担心 OpenAI 最初使命的重要性逐渐减弱。

8 月,他跳槽去了 Anthropic。

至于休假的 Greg Brockman,据 OpenAI 现任和前任员工称,Greg Brockman 倾向于参与任何他想要参与的项目,常常让共事的人感到沮丧。他们还表示,Brockman 经常要求在最后一刻改变计划已久的举措,这促使包括 Mira Murati 在内的其他高管介入以平息事态。

多年来,员工们一直敦促奥特曼约束 Brockman,称他的行为使员工士气低落。今年,奥特曼终于同意让他休假。


虽然 OpenAI 的研究实力毋庸置疑,已在 AI 军备竞赛中确立了竞争优势,但行业发展的未来可能并不完全是由 AI 模型能力决定的。如何建立最好的运营模式,是摆在大模型公司面前的问题。

参考内容:

https://www.wsj.com/tech/ai/open-ai-division-for-profit-da26c24b?st=C8P17G&reflink=desktopwebshare_permalink

https://twitter.com/ylecun/status/1839726968444518772

https://www.nytimes.com/2024/09/27/technology/openai-chatgpt-investors-funding.html

https://www.businessinsider.com/openai-implosion-investors-vcs-2024-9

https://www.theverge.com/2024/9/27/24255177/openai-safety-mira-murati-quit-sam-altman-cofounders-exodus

https://www.reuters.com/technology/artificial-intelligence/openai-sees-116-billion-revenue-next-year-offers-thrive-chance-invest-again-2025-2024-09-28/




#从头构建类GPT文本分类器

近日,机器学习研究员、畅销书《Python 机器学习》作者 Sebastian Raschka 又分享了一篇长文,主题为《从头开始构建一个 GPT 风格的 LLM 分类器》。

文章展示了如何将预训练的大型语言模型(LLM)转化为强大的文本分类器。对文章内容进行了不改变原意的编译、整理:

为什么要关注分类呢?首先,针对分类任务,对预训练模型进行微调是一个简单有效的 LLM 知识入门方式。其次,文本分类有许多商业应用场景,比如:垃圾邮件检测、情感分析、客户反馈分类、主题分类等等。

51c大模型~合集1_编码器_16

阅读完本文,你将找到以下 7 个问题的答案:

1. 需要训练所有层吗?

2. 为什么微调最后一个 token,而不是第一个 token?

3. BERT 与 GPT 在性能上有何比较?

4. 应该禁用因果掩码吗?

5. 扩大模型规模会有什么影响?

6. LoRA 可以带来什么改进?

7. Padding 还是不 Padding?

完整代码可以从 GitHub 找到:https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb

Different categories of finetuning

微调的不同种类

指令微调和分类微调是最常见的语言模型微调方法。指令微调是用特定任务训练模型,提高它理解和执行自然语言提示中所描述任务的能力,如下图 1 所示。

51c大模型~合集1_编码器_17

图 1:指令微调的两种场景。上方:模型的任务是判断文本是否为垃圾邮件;下方:模型的任务是将英文句子翻译成德语。

在分类微调中,模型被训练用于识别特定的类别标签,比如「垃圾邮件」和「非垃圾邮件」。分类任务还包括从图像中识别不同的植物、给新闻按体育、政治或科技等主题分类,从医学影像中区分良性和恶性肿瘤等等。

不过经过分类微调的模型只能判断类别,不能对输入的文本作出其他判断。

51c大模型~合集1_模态_18

图 2:一个使用 LLM 进行垃圾邮件分类的示例。针对垃圾邮件分类微调的模型在输入时不需要额外的指令,然而,与指令微调模型相比,它的回答只能是「垃圾邮件」和「非垃圾邮件」。

指令微调的模型通常能够执行更广泛的任务。我们可以将分类微调的模型视为是高度专业化的模型,一般来说,开发一个专用模型比开发一个在各种任务上表现良好的通用模型更容易。

使用预训练权重初始化模型

下图中展示了将通用预训练 LLM 转变为专门用于分类任务的 LLM 需要做的修改:

51c大模型~合集1_数据_19

图 3:在此跳过步骤 1-5,直接进入步骤 6(将在下一节开始)。

在做修改之前,让我们先简单了解一下正在使用的预训练 LLM。为简便起见,假设我们设置了如下代码来加载该模型:

model = GPTModel (BASE_CONFIG)


load_weights_into_gpt (model, params)


model.eval()

在将模型权重加载到 GPT 后,使用下列文本生成的函数库,确保模型生成连贯的文本:

from chapter04 import generate_text_simple


from chapter05 import text_to_token_ids, token_ids_to_text


text_1 = "Every effort moves you"


token_ids = generate_text_simple (


    model=model,


    idx=text_to_token_ids (text_1, tokenizer),


    max_new_tokens=15,


    context_size=BASE_CONFIG ["context_length"]


)


print (token_ids_to_text (token_ids, tokenizer))

根据以下输出,我们可以看到模型生成了连贯的文本,这表明模型权重已正确加载:

Every effort moves you forward.


The first step is to understand the importance of your work

让我们先看看模型是否可以通过指令微调完成垃圾邮件的分类:

text_2 = (


    "Is the following text'spam'? Answer with 'yes' or 'no':"


    "'You are a winner you have been specially"


    "selected to receive $1000 cash or a $2000 award.'"


)


token_ids = generate_text_simple (


    model=model,


    idx=text_to_token_ids (text_2, tokenizer),


    max_new_tokens=23,


    context_size=BASE_CONFIG ["context_length"]


)


print (token_ids_to_text (token_ids, tokenizer))

模型的输出如下所示:

Is the following text'spam'? Answer with 'yes' or 'no': 'You are a winner you have been specially selected to receive $1000 cash or a $2000 award.'


The following text'spam'? Answer with 'yes' or 'no': 'You are a winner

可以明显看出模型在准确遵循指令方面遇到了一些挑战。这是可以预见的,因为它仅经过了预训练,缺乏指令微调。

加入分类头

我们将原始输出层(这层的功能是将模型内部生成的隐藏表示转换为一个包含 50,257 个 tokens 的词表)替换为一个较小的输出层,该层映射到两个类别:0(非垃圾邮件)和 1(垃圾邮件),如下图 4 所示。

51c大模型~合集1_编码器_20

图 4:此图展示了如何通过改变架构将 GPT 模型适配为垃圾邮件分类。最初,模型的线性输出层将 768 个隐藏单元映射到一个包含 50,257 个 tokens 的词汇表。为了进行垃圾邮件检测,这一层被替换为一个新的输出层,该层将相同的 768 个隐藏单元映射到两个类别,分别表示「垃圾邮件」和「非垃圾邮件」。

输出层节点

从技术上讲,因为这是一个二元分类任务,可以只用一个输出节点。然而,这将需要修改损失函数。因此,我们选择一种更通用的方法,匹配输出节点与分类的数量。例如,对于一个分三类的问题,如将新闻文章分类为「科技」、「体育」或「政治」,使用三个输出节点,依此类推。

在尝试进行图 4 中所示的修改之前,先通过 print (model) 输出模型架构:

GPTModel (


  (tok_emb): Embedding (50257, 768)


  (pos_emb): Embedding (1024, 768)


  (drop_emb): Dropout (p=0.0, inplace=False)


  (trf_blocks): Sequential (


...


    (11): TransformerBlock (


      (att): MultiHeadAttention (


        (W_query): Linear (in_features=768, out_features=768, bias=True)


        (W_key): Linear (in_features=768, out_features=768, bias=True)


        (W_value): Linear (in_features=768, out_features=768, bias=True)


        (out_proj): Linear (in_features=768, out_features=768, bias=True)


        (dropout): Dropout (p=0.0, inplace=False)


      )


      (ff): FeedForward (


        (layers): Sequential (


          (0): Linear (in_features=768, out_features=3072, bias=True)


          (1): GELU ()


          (2): Linear (in_features=3072, out_features=768, bias=True)


        )


      )


      (norm1): LayerNorm ()


      (norm2): LayerNorm ()


      (drop_resid): Dropout (p=0.0, inplace=False)


    )


  )


  (final_norm): LayerNorm ()


  (out_head): Linear (in_features=768, out_features=50257, bias=False)


)

如上所示,GPTModel 由嵌入层和 12 个相同的 transformer 块组成,为简洁起见,仅显示最后一个块,然后是最终的 LayerNorm 和输出层 out_head。

接下来,我们将 out_head 替换为一个新的输出层,如图 4 所示,我们将对这一层进行微调。

选择微调特定层与微调所有层

我们不必对模型每一层进行微调,因为神经网络的较低层捕捉到的基本的语言结构和语义是通用的,可以在许多不同的任务和数据集中发挥作用。

因此,我们仅微调最后几层(靠近输出的层)就够了,这些层更具体于细微的语言模式和任务特征。这种方法在计算上也将更加高效。

为了准备进行分类微调,首先我们冻结模型,即将所有层设置为不可训练:

for param in model.parameters ():


    param.requires_grad = False

然后,如图 4 所示,我们修改输出层 model.out_head :

torch.manual_seed (123)


num_classes = 2


model.out_head = torch.nn.Linear (


    in_features=BASE_CONFIG ["emb_dim"],


    out_features=num_classes


)

注意,在上述代码中,我们使用了 BASE_CONFIG ["emb_dim"],它的值在 “gpt2-small(124M)” 模型中为 768。这样做的目的是为了让后续的代码更加通用,相同的代码也能处理其他型号的 GPT-2 模型。

新的 model.out_head 输出层的 requires_grad 属性默认设置为 True,这意味着这是模型中唯一会在训练期间更新的层。

从技术上讲,只训练刚刚添加的输出层就足够了。然而,我在实验中发现,微调额外的层,可以显著提高微调模型的预测性能。

此外,我们将最后一个 transformer 块以及连接该块与输出层的 LayerNorm 模块设置为可训练,如图 5 所示。

51c大模型~合集1_编码器_21

图 5:用我的步骤开发的 GPT 模型包含 12 个重复的 transformer 块。除了输出层,我们将最后的 LayerNorm 和最后一个 transformer 块设置为可训练,而其余 11 个 transformer 块和嵌入层保持为不可训练。

为了做到这点,我们将它们各自的 requires_grad 设置为 True:

for param in model.trf_blocks [-1].parameters ():


    param.requires_grad = True


for param in model.final_norm.parameters ():


    param.requires_grad = True

尽管我们添加了一个新的输出层,并将某些层设置为不可训练,我们仍然可以使用这个模型。例如,我们可以像之前那样输入一段示例文本:

inputs = tokenizer.encode ("Do you have time")


inputs = torch.tensor (inputs).unsqueeze (0)


print ("Inputs:", inputs)


print ("Inputs dimensions:", inputs.shape)

如输出所示,上述代码将输入编码为一个包含 4 个输入 tokens 的张量:

Inputs: tensor ([[5211,  345,  423,  640]])


Inputs dimensions: torch.Size ([1, 4])

然后,我们将编码后的 token IDs 输入模型:

with torch.no_grad ():


    outputs = model (inputs)


print ("Outputs:\n", outputs)


print ("Outputs dimensions:", outputs.shape)

输出张量如下所示:

Outputs:


 tensor ([[[-1.5854,  0.9904],


          [-3.7235,  7.4548],


          [-2.2661,  6.6049],


          [-3.5983,  3.9902]]])


Outputs dimensions: torch.Size ([1, 4, 2])

模型将输出一个 [1, 4, 50257] 的输出张量,其中 50,257 代表词汇表的大小。输出行数对应于输入标记的数量(在本例中是 4)。每个输出的嵌入维度(列数)现在减少到 2,而不是 50,257,因为我们替换了模型的输出层。

由于我们的主要目标是微调出更擅长对垃圾邮件进行分类的模型。为了实现这一点,我们不需要对所有行进行微调,可以专注于一个单一的输出 token。具体来说,我们将专注于最后一行,对应的最后一个输出 token,如图 6 所示。

51c大模型~合集1_数据_22

图 6: 本图展示了 GPT 模型处理一个包含 4 个 token 的输入示例,并生成相应输出的详细过程。模型的输出层经过调整,输出张量仅包含 2 列,为了完成分类微调,我们专注于输出的最后一行,对应的最后一个 token。

可以使用以下代码从输出张量中提取最后一个输出 token:

print ("Last output token:", outputs [:, -1, :])

Print 出来结果如下:

Last output token: tensor([[-3.5983,  3.9902]])

那么,我们为什么要选择最后一个 token,而不是其他位置上的 token 呢?

注意力机制建立了每个输入 token 与其他 token 之间的关系,为了让「注意力」集中,需要用到因果注意力掩码。它的原理是限制每个 token 只关注自己和前面的 token,如下图 7 所示:

51c大模型~合集1_数据_23

图 7:因果注意力机制,矩阵显示了每个输入 token 之间的注意力得分。空白单元格表示被掩码屏蔽的位置,防止 token 关注后来的 token。最后一个 token「time」是唯一需要为所有之前的 token 计算注意力得分的 token。

如图所示,序列中的最后一个 token 积累了最多的信息,因此,在微调过程中,我们重点关注这个最后的 token。

如何将最后一个 token 转换为分类标签预测,并计算模型的初始预测准确率。接下来,我们将在后续部分微调模型以完成垃圾邮件分类任务。

评估模型性能

由于这部分内容已经很长,我就不详细讨论模型评估的细节了。不过,我想至少分享一张图,展示训练过程中,模型训练集和验证集的分类准确率,以展示模型确实学得很好。

51c大模型~合集1_编码器_24

图 8:训练准确率(实线)和验证准确率(虚线)在早期的训练周期中大幅上升,然后趋于平稳,达到了几乎完美的准确率 1.0,对应 100%。两条线在整个训练过程中相距较近,表明模型对训练数据并没有过度拟合。

模型的验证准确率约为 97%。测试准确率约为 96%。此外,我们可以看到模型略微有一点点过拟合,因为训练集的准确率稍高。

从补充实验得出的洞见

到这里,你可能对某些设计选择有很多疑问,所以我进行了一些补充实验并把结果分享了出来。重新运行这些实验的代码已经放在了以下 GitHub 项目中。

GitHub 地址:https://github.com/rasbt/LLMs-from-scratch/tree/main/ch06/02_bonus_additional-experiments

需要训练所有层吗?

出于效率原因,我们仅训练输出层和最后一个 transformer 块。如前所述,对于分类微调,无需更新 LLM 中的所有层。我们更新的权重越少,训练速度就越快,因为我们不需要在反向传播期间计算权重的梯度。

但是,你可能想知道如果不更新所有层,我们会留下多少预测性能。因此,在下表中,我对所有层、仅最后一个 transformer 块(包括最后一层)、仅最后一层进行了微调。

51c大模型~合集1_模态_25

表 1:训练所有层 vs 仅训练最后一个 Transformer 块(包括最后一层)vs 仅训练最后一层

如上表 1 所示,训练所有层的性能稍好一些:96.67% vs 95.00%。不过,这使运行时间增加了约 2.5 倍。

为什么要微调最后一个 token,而不是第一个 token?

如果你熟悉 BERT(Devlin et al. 2018)等编码器式语言模型,你可能知道这些模型有一个指定的分类 token 作为其第一个 token,如下图所示:

51c大模型~合集1_模态_26

图来自 BERT 原始论文:https://arxiv.org/abs/1810.04805

与 BERT 相比,GPT 是一种具有因果注意力掩码的解码器式模型(如图 7 所示)。这意味着第一个 token 没有输入中任何其他 token 的上下文信息。只有最后一个 token 具有有关所有其他 token 的信息。

因此,如果我们想使用像 GPT 这样的模型进行分类微调,我们应该关注最后一个 token 标记以捕获所有其他输入 token 的上下文信息。

如下表所示,我们可以看到使用第一个 token 来微调 GPT 模型进行分类会导致性能更差。

51c大模型~合集1_模态_27

表 2:微调 GPT 模型中的最后一个 token 与第一个 token。

BERT 与 GPT 的性能比较如何?

说到 BERT,你可能想知道它在分类任务上与类 GPT 模型的性能比较如何?简单来说,在垃圾邮件分类任务上,更小的 GPT-2(124M)与更大 BERT(340M)的性能类似,具体如下表 3 所示。

51c大模型~合集1_编码器_28

表 3:GPT-2 与 BERT 的结果比较。

可以看到,BERT 模型的表现比 GPT-2 稍微好一点(测试准确率高 1%),但 BERT 的参数规模几乎是 GPT-2 的 3 倍。此外,数据集可能太小且太简单了,因此我又在 IMDB Movie Review 数据集上尝试比较了情感分类表现(即预测观看者是否喜欢一部电影)。

51c大模型~合集1_数据_29

表 4:GPT-2 与 BERT 在影评分类任务上的比较。

可以看到,在这个更大的数据集上(包含 25k 训练和 25k 测试集记录),GPT-2 与 BERT 两个模型的预测性能同样类似。

总的来说,在分类任务上,BERT 和其他编码器风格的模型被认为优于解码器风格的模型。但是,实验结果也表明,编码器风格的 BERT 和解码器风格的 GPT 模型之间没有太大的差异。

此外,如果你对更多基准比较以及如何进一步提升解码器风格模型的分类性能感兴趣,可以参阅以下两篇最近的论文:

  • Label Supervised LLaMA Finetuning:https://arxiv.org/abs/2310.01208
  • LLM2Vec: Large Language Models Are Secretly Powerful Text Encoders:https://arxiv.org/abs/2404.05961

其中第一篇论文讨论了:在分类微调期间移除因果掩码可以提升解码器风格模型的分类性能。

我们应该禁用因果掩码吗?

当我们在下一个词(next-word)预测任务上训练类 GPT 模型时,GPT 架构的核心特征是因果注意力掩码,这与 BERT 模型或原始 transformer 架构不同。

但实际上,我们可以在分类微调阶段移除因果掩码, 从而允许我们微调第一个而不是最后一个 token。这是因为未来的 tokens 将不再被掩码,并且第一个 token 可以看到所有其他的 tokens.

51c大模型~合集1_编码器_30

有 / 无因果掩码的注意力权重矩阵。

幸运的是,在类 GPT 大语言模型中禁用因果注意力掩码只需要改变 2 行代码。

class MultiheadAttention (nn.Module):


    def __init__(self, d_in, d_out, context_length, dropout, num_heads):


        super ().__init__()


        # ...


    def forward (self, x):


        b, num_tokens, d_in = x.shape


        keys = self.W_key (x)  # Shape: (b, num_tokens, d_out)


        queries = self.W_query (x)


        values = self.W_value (x)


        # ...


        attn_scores = queries @ keys.transpose (2, 3)


        # Comment out the causal attention mask part


        # mask_bool = self.mask.bool ()[:num_tokens, :num_tokens]


        # attn_scores.masked_fill_(mask_bool, -torch.inf)


        attn_weights = torch.softmax (


             attn_scores /keys.shape [-1]**0.5, dim=-1


        )


        context_vec = (attn_weights @ values).transpose (1, 2)


        context_vec = context_vec.contiguous ().view (


            b, num_tokens, self.d_out


        )


        context_vec = self.out_proj (context_vec)


        return context_vec

下表 5 展示了改变代码后对垃圾邮件分类任务带来的影响。

51c大模型~合集1_数据_31

表 5:有无使用因果注意力掩码来微调 GPT-2 分类器的结果。

可以看到,在微调阶段禁用因果掩码可以带来略微的提升。

增加模型大小会带来哪些影响?

目前为止,我们只看到了最小的 GPT-2(124M)模型的性能,那么与规模更大的 GPT-2 变体相比如何呢?比如 GPT-2 medium(355M)、GPT-2 large(774M)和 GPT-2 XL(1558M)。结果如下表 6 所示。

51c大模型~合集1_编码器_32

表 6:不同参数规模的 GPT-2 变体的分类微调结果。

可以看到,随着模型参数增加,预测准确率显著提升。不过 GPT-2 medium 是个例外,它在其他数据集上的性能同样很差。我怀疑该模型可能没有经过很好的预训练。

此外,最大的 GPT-2 XL 获得了比最小的 GPT-2 small(124M)好得多的分类准确率,但微调时间也长了 7 倍。

LoRA 预计能带来哪些改进?

回到本文第一个问题:我们需要训练所有层吗?结果发现,当仅仅微调最后一个 transformer 块而不是整个模型时, 我们可以(或几乎可以)匹配分配性能。所以仅仅微调最后一个块的优势在于训练速度更快,毕竟不是所有的权重参数都要更新。

接下来的问题是与低秩适应(LoRA)的比较结果如何,LoRA 是一种参数高效的微调技术。

51c大模型~合集1_编码器_33

表 7:覆盖所有层的完整微调 vs 利用 LoRA 的参数高效微调。

可以看到,完整微调(所有层)和 LoRA 在数据集上获得了相似的测试集性能。

在小模型上,LoRA 会稍微慢一点,添加 LoRA 层带来的额外开销可能会超过获得的收益。但当训练更大的 15 亿参数模型时,LoRA 的训练速度会快 1.53 倍。

填充(Padding)还是不填充?

如果我们想要在训练或推理阶段分批次地处理数据(包括一次处理多个输入序列),则需要插入 padding token,以确保训练样本的长度相等。

51c大模型~合集1_编码器_34

图中描述了给定批次中的输入文本如何在 padding 过程中保持长度相等。

在常规文本生成任务中,由于 padding tokens 通常要添加到右侧,因而 padding 不影响模型的响应结果。并且由于前面讨论过的因果掩码,这些 padding tokens 也不影响其他 token。

但是,我们对最后一个 token 进行了微调。同时由于 padding tokens 在最后一个 token 的左侧,因此可能影响结果。

如果我们使用的批大小为 1,实际上不需要 pad 输入。当然,这样做从计算的角度来看更加高效(一次只处理一个输入样本)。并且批大小为 1 可以用作一个变通方法,来测试使用 padding 是否影响结果。

51c大模型~合集1_模态_35

表 8:有无 padding 时,GPT-2(124M)的训练准确率、验证准确率和测试准确率变化。

可以看到,避免 padding tokens 的确可以为模型带来效果的显著提升。这里使用了梯度累计来模拟批大小 8,以匹配默认实验的批大小,并进行公平比较。

作者介绍

个人主页:https://sebastianraschka.com/

Sebastian Raschka 是一名机器学习和人工智能研究员,曾在威斯康星大学麦迪逊分校担任统计学助理教授,专门研究深度学习和机器学习。他致力于关于 AI 和深度学习相关的内容更简单易懂。

Sebastian 还热衷于开源软件,十多年来,他一直是一个充满热情的开源贡献者。他提出的方法现已成功在 Kaggle 等机器学习竞赛中得到应用。

除了编写代码,Sebastian 还喜欢写作,他撰写了畅销书《Python Machine Learning》(《Python 机器学习》)和《Machine Learning with PyTorch and ScikitLearn》。

这篇博客的内容是他的新书《Build a Large Language Model (From Scratch)》的第六章。

更多研究细节,可参考原博客。

原博链接:https://magazine.sebastianraschka.com/p/building-a-gpt-style-llm-classifier




#揭示视觉强化学习可塑性损失的独特机制

从数据增强的隐藏作用出发

Sutton 等研究人员近期在《Nature》上发表的研究《Loss of Plasticity in Deep Continual Learning》揭示了一个重要发现:在持续学习环境中,标准深度学习方法的表现竟不及浅层网络。研究指出,这一现象的主要原因是 "可塑性损失"(Plasticity Loss):深度神经网络在面对非平稳的训练目标持续更新时,会逐渐丧失从新数据中学习的能力。

深度强化学习任务中的神经网络实际上面临着更为严峻的可塑性损失问题。这源于强化学习智能体必须通过与环境的持续互动来不断调整其策略,使得非平稳的数据流和优化目标成为深度强化学习范式中的固有特征。值得注意的是,即使在单任务强化学习中,在线数据收集和策略更新也会导致数据分布和优化目标持续动态变化。因此,严重的可塑性损失已然成为制约深度强化学习算法样本利用效率的关键瓶颈。

要突破视觉强化学习样本利用效率低下这一瓶颈,关键在于深入解构深度强化学习中神经网络可塑性损失的细节,从而明确问题的根源。针对这一挑战,来自清华大学、悉尼大学、华盛顿大学、京东探索研究院和南洋理工大学的研究人员展开了一项全面而深入的研究。他们选取视觉强化学习任务作为深度强化学习的典型代表,创新性地从数据、模块和训练阶段三个关键角度对神经网络的可塑性损失特征进行分析。

  • 论文链接:https://arxiv.org/abs/2310.07418
  • 代码链接:https://github.com/Guozheng-Ma/Adaptive-Replay-Ratio

这项研究不仅解释了视觉强化学习中一些此前难以理解的反常现象,还揭示了一系列与直觉相悖的有趣结论。该研究成果已在 ICLR 2024 上发表,本文将对其中一系列引人深思的发现进行进一步梳理和总结。其中最核心的要点可概括如下:

1. 揭示了数据增强的作用机制:简单的数据增强能够显著提升视觉强化学习的样本利用效率,其效果令人瞩目。在自动驾驶任务 CARLA 中,引入数据增强将性能提高至基准的 235%。更令人惊讶的是,在 DeepMind Control suite 的 9 种机器人控制任务中,数据增强平均将性能提升至基准的 431%。然而,尽管这些惊人的效果早已被观察到,但数据增强为何能带来如此显著的性能提升一直是一个未解之谜。该研究的突破性发现揭示了视觉强化学习中数据增强背后的作用机制:它能直接有效地缓解训练过程中的可塑性损失。

2. 明确了样本利用效率的关键瓶颈:过去多年,学界普遍认为导致视觉强化学习样本利用效率低下的主要瓶颈在于训练视觉表征器的难度。然而,这项研究通过一系列巧妙的实验,颠覆了这一长期以来的观点。研究结果表明,目前限制视觉强化学习样本利用效率的关键因素并非编码器(Encoder)的视觉表征能力,而是评价者网络(Critic)的可塑性损失。

3. 突出了训练早期干预的重要性:可塑性损失指的是模型的学习能力随着训练不断减弱的现象。然而,不同训练阶段对于避免灾难性可塑性损失的作用是否有所不同,这一问题此前一直未被深入探索。该研究填补了这一空白,揭示了一个关键发现:训练早期对 Critic 网络可塑性的干预极为重要:若未能在训练早期及时将网络可塑性恢复到高水平,将会导致训练后期难以逆转的灾难性可塑性损失。

从视觉强化学习中的数据增强开始

51c大模型~合集1_编码器_36

数据增强已成为实现高样本利用效率的视觉强化学习算法中不可或缺的组件。与监督学习中数据增强仅带来渐进式改进不同,在多种视觉强化学习任务中,数据增强对算法效果起到了决定性作用。如上图所示,在不使用数据增强的情况下,算法几乎无法训练出有效的策略。相反,仅仅引入对输入观察图像的简单数据增强,就能在不修改算法其他部分的前提下,实现一个具有高渐进效果和样本效率的视觉强化学习算法。

这种显著的提升显然无法用传统视觉任务中数据增强的作用机理来解释。更可能的是,数据增强有效缓解或解决了强化学习中的一个关键瓶颈。在没有数据增强的情况下,智能体的性能在短暂上升后几乎停滞,这一现象与智能体遭受可塑性损失,无法从新收集的数据中学习的后果非常吻合。基于这一观察,该研究设计了巧妙的实验,旨在验证数据增强的背后作用机制是否确实在于有效缓解了灾难性的可塑性损失。

51c大模型~合集1_数据_37

Reset 是一种简单而直接的方法,通过周期性地重新初始化智能体网络最后几层全连接层来恢复神经网络的可塑性。在这项研究中,研究人员巧妙地将 Reset 作为一种诊断工具,用来判断使用与不使用数据增强时网络的可塑性损失情况。实验结果揭示了以下关键发现:

  • 在不使用数据增强的情况下,实施 Reset 均能够带来显著的性能提升。这明确地表明,在缺乏数据增强的训练过程中,网络确实经历了严重的可塑性损失。
  • 但当引入数据增强后,Reset 的实施只带来轻微的改善,有时甚至会导致性能下降。这一结果表明,只通过数据增强就能有效提升智能体的可塑性。

这一巧妙的实验证明数据增强能够非常显著地缓解视觉强化学习训练过程中的可塑性损失,从而解释了为什么数据增强对于提高样本利用效率如此关键。通过有效维持神经网络的可塑性,数据增强实际上延长了神经网络的有效学习期,使其能够更充分地利用每一个训练样本。

51c大模型~合集1_模态_38

研究还对比了数据增强和其他先前提出的用来缓解可塑性损失的方法。实验结果再次证明,作为一种从数据角度出发(data-centric)的方法,数据增强在缓解可塑性损失方面展现出卓越的效果,相对于目前已有的其他方案具有明显优势。

解构视觉强化学习不同模块中可塑性损失的不同影响

51c大模型~合集1_数据_39

相较于基于状态向量的强化学习任务,视觉强化学习一直面临着样本利用效率严重低下的困扰。近年来,缩小基于图像和基于状态向量的强化学习在样本利用效率上的差距已成为整个视觉强化学习社区关注的重点。这两种学习范式的关键区别在于:视觉强化学习需要在进行策略优化的同时进行表征学习。基于这一认识,大量研究致力于通过改进视觉表征学习来提升视觉强化学习的样本利用效率。常见的方法包括添加额外的辅助表征任务,或使用预训练的视觉编码器(Encoder)。但是,高维视觉表征真的是影响视觉强化学习样本利用效率的关键瓶颈吗?

51c大模型~合集1_模态_40

该研究通过一个巧妙的实验回答了这个问题。研究者采用了 PIE-G 提出的预训练编码器方案,并测试了数据增强对训练过程的影响。这个实验设计有两个关键点:

  • 使用在 ImageNet 上预训练的编码器,确保了足够的视觉表征能力。
  • 在整个训练过程中保持编码器不变,排除了数据增强对编码器的直接影响。

研究假设:如果表征学习是当前限制样本利用效率的关键,或者可塑性损失主要发生在编码器,那么数据增强的使用与否不应显著影响算法的训练过程。

51c大模型~合集1_数据_41

然而,实验结果令人惊讶:

  • 数据增强对基于预训练编码器的视觉强化学习的样本利用效率产生了显著影响。
  • 在不使用数据增强的情况下,即使是简单的 Walker Walk 任务,智能体的性能在训练后期也明显停滞,表现出严重的可塑性损失。

这一发现具有重要意义:即使有了良好的视觉表征,视觉强化学习仍然存在严重的可塑性损失。这表明对于当前的视觉强化学习算法,高维视觉的表征已经不构成影响样本利用效率的关键瓶颈。更为关键的是,该实验证明了严重的可塑性损失并非发生在编码器模块,而应该是存在于 Actor 或 Critic 中。

研究者进一步使用可塑性注入(Plasticity Injection)作为可靠的诊断工具来最终判定灾难性的可塑性损失究竟发生在 Actor 还是 Critic 中。不同于 Reset,可塑性注入在恢复网络可塑性的同时不会破坏网络现有知识,因此不会出现明显的性能波动。这使得可塑性注入更适合用来作为判断特定网络模块是否发生灾难性可塑性损失的诊断工具。

51c大模型~合集1_编码器_42

实验结果揭示了两个关键发现:

  • 在使用数据增强的情况下,对 Actor 或者 Critic 实施可塑性注入都不会明显影响智能体的训练过程。这表明在 Walker Run 任务中,仅仅通过使用数据增强就足以维持训练所需的网络可塑性。
  • 在初始 100 万步训练中不使用数据增强的情况下,对 Critic 实施可塑性注入会导致性能显著提升。相反,对 Actor 进行可塑性注入也并不能使智能体恢复正常训练。这一结果充分证明,Critic 严重的可塑性损失是造成视觉强化学习样本利用效率严重低下的关键原因。

51c大模型~合集1_数据_43

分析视觉强化学习不同训练阶段中可塑性损失的不同性质

51c大模型~合集1_模态_44

51c大模型~合集1_数据_45

最后,该研究设计了一个巧妙的实验,通过在训练过程中的不同时间点开启或关闭数据增强,来探究数据增强在不同训练阶段对解决可塑性损失的影响。具体来说,他们在训练进行到三分之一时改变数据增强的使用状态,观察其对训练效果的影响。这个实验揭示了两个重要发现:

  • 在 Critic 的可塑性已经恢复后停止使用数据增强,并不会明显影响训练效率。这表明在训练的后期,不需要采取特定干预来维持可塑性。
  • 当可塑性已经显著丧失,且未能在早期阶段及时干预的情况下,后期引入数据增强也无法使智能体恢复正常的训练。这一观察强调了在训练早期维持可塑性的至关重要性,否则,这种损失将变得无法挽回。

这一实验不仅证实了数据增强在训练早期阶段的关键作用,更重要的是,它揭示了可塑性损失的不可逆特性。实验结果表明,如果在训练早期没有通过有效干预(如数据增强)使 Critic 网络的可塑性恢复到较高水平,就会导致不可逆的灾难性可塑性损失。

51c大模型~合集1_模态_46

在训练的初始阶段,由于收集到的经验数据质量低且数量有限,通过自举学习所得出的训练目标(Target Q Value)表现出高度的非平稳性,并显著偏离真实的 Q 值。这种严重的非平稳性导致 Critic 的可塑性迅速下降,使其失去从新收集数据中继续优化策略的能力。随之,智能体持续收集低质量的数据,形成了一个恶性循环。这一连锁反应最终阻碍了智能体获得有效策略,导致训练早期阶段出现灾难性的可塑性损失。

然而,训练过程的后期呈现出不同的特征:尽管 Critic 的可塑性在训练早期恢复到高水平后仍然会缓慢下降,但这种下降可以被理解为逐步逼近当前任务最优值函数的过程。对于不需要智能体保持持续学习能力的单任务视觉强化学习而言,这种后期的可塑性损失被视为良性的。

这种在训练不同阶段所观察到的可塑性变化差异,为解决视觉强化学习中的可塑性损失挑战提供了新的视角,暗示了针对训练不同阶段采取差异化策略的可能性。

基于对视觉强化学习中可塑性损失的深入分析,该研究最终提出了一种创新的训练方法 —— 自适应回放比例。这种方法巧妙地根据 Critic 网络的可塑性水平动态调整回放比例(Replay Ratio),成功破解了视觉强化学习算法难以使用高回放比例的长期困境。对该方法的技术细节感兴趣的读者,可以前往论文原文深入了解。




#Oryx

长短大小样样精通!原始分辨率、超长视频输入:更灵活的全开源多模态架构

本文的主要作者来自清华大学智能视觉实验室(i-Vision Group)、腾讯公司和南洋理工大学 S-Lab。本文的共同第一作者为清华大学自动化系博士生刘祖炎和南洋理工大学博士生董宇昊,主要研究方向为多模态模型。本文的通讯作者为腾讯高级研究员饶永铭和清华大学自动化系鲁继文教授。

视觉数据的种类极其多样,囊括像素级别的图标到数小时的视频。现有的多模态大语言模型(MLLM)通常将视觉输入进行分辨率的标准化或进行动态切分等操作,以便视觉编码器处理。然而,这些方法对多模态理解并不理想,在处理不同长度的视觉输入时效率较低。

为了解决上述问题,来自清华大学、腾讯、南洋理工大学的研究者们提出一种更灵活的多模态模型 Oryx。Oryx 是一种统一的多模态架构,能够处理图像、视频和多视角 3D 场景,提供了一种能够按照需求处理任意空间大小和时间长度视觉输入的解决方案。

Oryx 的核心创新点包括:一个预训练的 OryxViT 模型,能够将任意原始分辨率的图像编码为视觉 token;一个动态压缩模块,支持按需对视觉 token 进行 1 倍到 16 倍的压缩。上述设计使 Oryx 能够在处理不同需求下的任务时保持更高的效率和精度。此外,Oryx 通过增强的混合数据和针对上下文检索、空间感知数据的训练,在多模态融合上取得了更强的能力。

  • 项目地址:https://oryx-mllm.github.io/
  • 论文:https://arxiv.org/abs/2409.12961
  • 代码:https://github.com/Oryx-mllm/Oryx
  • Demo:https://huggingface.co/spaces/THUdyh/Oryx

1. 介绍

现有方法简单地将各种视觉输入统一处理,忽略了视觉内容的差异和不同应用的具体需求。例如,早期的 MLLM 将视觉输入转化为固定分辨率;近期的 MLLM 通过动态切分方式生成高分辨率的视觉表示。然而,由于缺乏支持原始分辨率输入的高质量视觉编码器,这些解决方案仍然是一种妥协。我们认为,提供原始分辨率的视觉输入具有以下优势:利用整个图像输入以防止信息丢失;解决边缘情况;提高效率和自然性;具有更高的性能等。

51c大模型~合集1_编码器_47

图 1:按需求理解的概念。

如图 1 所示,在分辨率和压缩比上的优化可以提高效率,满足实际需求。例如,高分辨率对于与文本相关的任务更重要,而对象层次的任务只需要简单的图像,部分应用场景需要总结极长的视频,其他应用场景需要对每一帧保持高精度。因此,支持时空上的任意分辨率是一种更通用和高效的方案。

为了解决以上挑战,本文提出了一个统一的时空理解 MLLM 框架 Oryx,能够在按需方式下处理任意视觉分辨率、不同时间长度和多样化的任务。Oryx 的主要贡献包括:

  • 预训练视觉编码器 OryxViT。通过自适应位置嵌入层和变长自注意力机制,能够并行处理原始分辨率的视觉表示,更加适合语言模型。
  • 动态压缩模块。能够任意调整下采样比例,支持 1 倍到 16 倍压缩的无缝切换,保持精度和长度上的取舍。
  • 更好的数据和训练策略,能够在图像、视频和 3D 数据理解上取得优异的性能。

我们提供了 7B/34B 两种尺度的 Oryx 模型,在视频、图像和 3D 理解任务上表现出色,在 7B 规模下取得了综合最好的结果,34B 模型超越了部分 72B 模型的性能,在部分数据集超过 GPT-4o、GPT-4V 等模型,成为开源模型的新标杆。

2. 方法概览

51c大模型~合集1_模态_48

图 2:Oryx 方法总览图。

原始分辨率表示

此前在图像理解上的工作证明,保持视觉内容的原始形式具有更高的有效性。然而,原始分辨率在 MLLM 上的应用还未得到探索。我们认为,MLLM 实际上是一个应用原始分辨率的最好环境:视觉输入的来源更加多样,具有不同的需求和格式;语言 token 长度本质是动态的,因此视觉的动态表示可以无缝与后续阶段对接。

现有的解决方案证明,传统的视觉编码器无法处理原始分辨率输入。因此,我们基于 SigLIP 模型提出 OryxViT 视觉编码器。OryxViT 通过将位置嵌入矩阵进行缩放插值适应输入内容。我们通过轻量级的语言模型作为接口,训练视觉编码器的参数,从多个多模态任务下获取数据进行训练,得到 OryxViT 模型。

为了解决批处理过程中动态的序列长度问题,我们在通道维度上对不同长度的序列进行拼接,通过可变长自注意力操作,独立计算每个视觉输入的注意力矩阵,因此 OryxViT 可以高效处理不同纵横比的视觉信号,并保持与固定分辨率编码器相同的推理速度。

动态压缩模块

在处理不同长度的视觉输入时,对所有输入一视同仁会降低总体计算效率。我们通过动态压缩模块实现更高比例的压缩,并将不同压缩比的视觉内容统一成一致的模式,从而能够按需控制视觉序列的长度。我们对图像、视频和长视频应用不同压缩比的下采样层,并设置下采样倍率为 1 倍、4 倍、16 倍,从而实现可变和极高的压缩比。

为了减轻下采样的影响,我们采用区域注意力操作对高分辨率、低分辨率特征图进行交互。低分辨率的图像块作为查询向量,通过交叉注意力操作与高分辨率邻近小块进行交互

51c大模型~合集1_模态_49

其中,我们通过投影层将 Q、K 向量投影到更低的维度,并省略了 V 向量和输出层的投影以保持原始视觉特征。我们通过共享的 MLP 处理不同压缩比的视觉输入,以保持不同视觉输入的一致性。最终的视觉表示被展平后输入到语言模型进行上下文预测。

全能模型:图像、视频、三维理解

我们进一步扩展了此前多任务 MLLM 的能力,处理更多样化的情境、不同长度的内容和更广泛的任务。

视频大海捞针训练。我们认为,处理长视频的关键在于从广泛的上下文中找到特定信息。因此,我们从 MovieNet 数据集中获取视频样本,并通过单帧标题生成和两帧差异识别两个任务对模型进行强化训练。

通过粗略空间关系学习 3D 知识。3D 环境相关的多视图图像缺乏时间或轨迹线索,因此以往的方法在 3D 任务中难以实现正确的空间理解。我们通过粗略空间关系对应的方法,使得模型在多视角中能够跟随和捕捉空间关联。

训练策略、数据组成

Oryx 的训练策略轻量且直接。模型初始化包括视觉编码器 OryxViT 和大语言模型。第一阶段训练仅涉及图像数据,首先在 LLaVA-1.5-558k 图文对中进行简单的对齐预训练,训练动态压缩模块。此后在 4M 高质量图文对中进行有监督微调,这些数据从各种开源学术数据集中获取。需要注意的是,我们没有进行大规模的预训练,也没有使用私有的有监督微调数据以获取更好的性能,我们的主要目标是验证架构的有效性。

在第二阶段,我们通过图像、视频和 3D 理解的多种视觉输入联合训练 Oryx 模型,微调策略与第一阶段类似。我们从第一阶段中抽样 600k 图像数据,并从开源视频数据集中选取多个视频数据集进行混合。此外,我们包含了所提出的视频大海捞针样本、具有粗略空间关系的 3D 样本。这部分引入的视频和多视角数据共 650k。

我们的训练数据均来源于开源数据集,因此确保了 Oryx 的可复现性,并提供了较大的进一步改进空间。

3. 实验结果

通用视频理解

我们选取 4 个选择题评测标准和 3 个回答生成评测标准进行通用视频理解能力的测试。Oryx 在不同尺度的模型下均取得了有竞争力的表现。在带字幕的 VideoMME 数据集中,Oryx 取得 62.6% 和 67.4% 的平均准确率。在 NextQA 和 Perception Test 数据集分别超越此前的 SOTA 结果 3.3% 和 5.4%。在 GPT 评测的标准下,Oryx 表现出色,取得了 1.49、3.53 和 3.76 的平均得分。

51c大模型~合集1_模态_50

长视频理解

为了专门测试在长视频输入下的能力,我们选取了 3 个主流且具代表性的长视频理解基准,包括 MLVU、LongVideoBench 和 VideoMME 长视频子集。Oryx 在理解长视频内容表现出显著的能力,超越了所有现有的 7B 模型系列,34B 模型在 MLVU 和 LongVideoBench 上相比之前最先进的 72B 模型提升了 4.4% 和 0.9% 平均准确率。在 MLVU 测试集下,Oryx-34B 相比 GPT-4o 高出 6.2%。

51c大模型~合集1_数据_51

视频大海捞针

为了测试模型的长视频检索能力,我们进行了视频大海捞针实验。基线模型显示出严重的信息丢失,相比之下,我们的方法在 1.6k 帧输入的情况下仍然能够准确回答问题。

51c大模型~合集1_模态_52

图像理解

Oryx 模型在多种有代表性的图像评测基准下保持了开源模型中第一梯队的水平。

51c大模型~合集1_数据_53

三维空间理解

Oryx 在性能上超越此前为 3D 理解设计的专有模型,也超过最近更新的基于大语言模型的 3D 模型。

51c大模型~合集1_编码器_54

分析实验

分辨率和缩放策略的影响。原始分辨率输入明显好于固定尺寸(保持长宽比不变)图像输入,尤其在特定任务下的数据集。在不同视觉输入分辨率下,MMBench 和 OCRBench 性能均有提升,但原始分辨率是相较而言更简单且有效的策略。

51c大模型~合集1_模态_55

Oryx 结构的消融实验。在视觉编码器维度,OryxViT 相比 SigLIP 具有更优异的图像 - 语言对齐性能。通过对原始分辨率和动态切分方法的公平比较,此前的视觉编码器无法处理原始分辨率输入,而基于 OryxViT,原始分辨率方法明显优于动态切分方法。在我们的训练和测试过程中,我们始终保持原始分辨率输入。

对于连接模块,动态压缩模块在视频测试集中表现出更优越的性能,且平均池化具有更好的结果,这可能是由于无参数降采样能够更好地保留视觉特征分布,并减轻训练的优化压力。

51c大模型~合集1_编码器_56

4. 案例分析

视频描述和总结任务

51c大模型~合集1_模态_57

基于视频内容的推理和学习

51c大模型~合集1_编码器_58

5. 总结

我们提出了 Oryx 系列,一种能够按需处理不同任务、时间长度、视觉分辨率输入的新架构。Oryx 在时空理解上有突出表现,利用 OryxViT 创新地处理原始分辨率,采用动态压缩模块进行高效的数据压缩,并应用了更好的训练策略。Oryx 在各种主流图像、视频和 3D 测试基准中均表现出色。我们希望本工作能够为多模态学习提供一个新视角。