【转载】大语言模型研究洞察:指令掩码与新型LoRA微调实验

原文地址:LLM Research Insights: Instruction Masking and New LoRA Finetuning Experiments,by Sebastian Raschka, on 2024-06-02

大语言模型研究洞察:指令掩码与新型LoRA微调实验

讨论2024年5月最新模型发布与AI研究

本月我将介绍三篇与大语言模型(LLM)的指令微调、以及基于LoRA的参数高效微调相关的新论文。我日常工作中经常用到这些方法,因此看到能带来实践洞见的新研究总是令人兴奋。

这篇文章可能会比往常稍短一些,因为我目前正在完成我的著作《http://mng.bz/orYv》的最后一章。此外,我还在准备本周三的一场线上讲座:https://events.zoom.us/ev/ArzwACAJCGWLB-pPrWeIwszDr8WDhlEcFLL4VMCb1SJVU4fzrQo9~AvhUziSVIoulf4yLm7f0hhyew2qRK0ZEIE6Xztz4yEDudekpMeEd9L_UXVY_6lWFFOTqXHlF-N_xKaCrP5aP07ZzFQ。讲座免费向所有人开放,如果感兴趣的话非常欢迎你参加!

figure01

了解本次线上讲座:https://events.zoom.us/ev/ArzwACAJCGWLB-pPrWeIwszDr8WDhlEcFLL4VMCb1SJVU4fzrQo9~AvhUziSVIoulf4yLm7f0hhyew2qRK0ZEIE6Xztz4yEDudekpMeEd9L_UXVY_6lWFFOTqXHlF-N_xKaCrP5aP07ZzFQ

1. 对指令计算损失的指令微调

本月吸引我注意的一篇论文是:https://arxiv.org/abs/2405.14394

在这篇论文中,作者们对指令微调中一个被广泛认可的做法提出了质疑:计算损失时对指令部分进行掩码。在讨论研究结果之前,我们先来做一个整体概述。

1.1 指令微调过程中的指令掩码

指令微调(简称指令调优)的任务是提升预训练大语言模型遵循指令的响应能力(比如“总结这篇文章”“翻译这个句子”等)。

figure02

指令微调数据集示例示意图

在对大语言模型进行指令微调时,计算损失时通常会将指令本身掩码掉。例如,我们的https://github.com/Lightning-AI/litgpt库默认就是这么做的,我在自己的著作《https://github.com/rasbt/LLMs-from-scratch》的第7章中也采用了这种做法(不过我现在正考虑把掩码相关内容改成读者练习题)。

在其他主流大语言模型库中,比如https://github.com/OpenAccess-AI-Collective/axolotl,该功能也会通过config.yaml中默认的`train_on_inputs: false设置自动实现。而在Hugging Face中,默认不会这么做,但可以通过DataCollatorForCompletionOnlyLM`数据集整理器来实现,详情参见:https://huggingface.co/docs/trl/en/sft_trainer#train-on-completions-only

figure03

输入掩码示意图:高亮的文本仍会输入给大语言模型,但在训练计算损失时不参与计算。

如上所述,对输入提示进行掩码是一项常规操作,有些论文中也会对比使用和不使用掩码的效果。例如QLoRA论文的附录中就包含了一组对比,结果显示掩码的效果更好。

figure04

《QLoRA:量化大语言模型的高效微调》中的带标注表格,原文:https://arxiv.org/abs/2305.14314

需要注意的是,MMLU是一个专注于测评选择题表现的基准测试,作者们并没有研究当微调后的模型用作聊天机器人时,该做法对对话性能的影响。

1.2 指令建模

在上一节对主题做了简要介绍之后,我们来详细分析https://arxiv.org/abs/2405.14394这篇论文。在这项研究中,作者系统地探究了指令掩码与非掩码两种情况下大语言模型的性能差异。

figure05

三种方式示意图:(1) 无指令掩码;(2) 指令掩码;(3) 样板文本掩码。

上图中的方法1是实现大语言模型时的默认做法,因为它不需要对损失函数做任何额外的修改。论文中作者将这种方法称为“指令建模”(论文中还额外对非Alpaca提示模板中可能出现的特殊提示词元,比如<|user|><|assistant|><|system|>进行了掩码)。

方法2是目前实践中最常用的方式:计算损失时,除了响应部分之外的所有内容都被掩码。论文中作者将这种方法称为“指令微调”(在这个语境下这个命名有点不妥,因为和方法1相比,我们并不是在“微调”指令,而是将指令排除在损失计算之外)。

在绘制上图的时候,我想到了论文中没有探讨的第三种有趣的思路:对提示中特定的样板文本进行掩码。例如在Alpaca风格的提示中,所有示例都以“以下是一条指令……”开头。和实际的指令与输入相比,这段文本是固定的,因此可以排除在损失计算之外。论文中没有研究这一点,但这可能是一个有趣的补充实验,我正计划把它作为另一道读者练习题(附答案)加入到我的《https://github.com/rasbt/LLMs-from-scratch》中。

结果表明,指令建模(即不对指令进行掩码)的效果似乎优于掩码方法,如下图所示。

figure06

不对指令掩码的效果优于对指令掩码。改绘自《对指令计算损失的指令微调》,原文:https://arxiv.org/abs/2405.14394

不过,“指令建模”的效果取决于两个因素:(a) 指令长度与响应长度的比值;(b) 数据集的大小(以训练样本数量计)。

figure07

不掩码指令的收益取决于数据集的长度与规模。改绘自《对指令计算损失的指令微调》,原文:https://arxiv.org/abs/2405.14394

对于上图呈现的数据集长度和规模依赖性,一个合理的解释是:如果响应很短且训练样本很少,模型会更容易记住响应,因此采用指令建模(也就是在损失中对更多模型输出进行建模)有助于减少过拟合。

1.3 结论

简而言之,作者们发现,回归最基础的做法——不对指令进行掩码——能够提升模型性能。

令人意外的是,不对指令掩码(仅对<|user|><|assistant|><|system|>这类特殊提示词元进行掩码)这种更简单的方法,效果反而更好。

以我个人的经验来看,过去我尝试过两种方法,但并没有看到明显的优劣之分,所以通常不会在掩码上做太多实验,效果不好的时候更多会去调整其他设置。现在回头看,多尝试一下(非)掩码方法或许是有意义的,因为它的效果似乎取决于数据集的大小和长度。

Ahead of AI是一份由读者支持的刊物。想要接收新文章并支持我的创作,欢迎成为免费或付费订阅者。

2. LoRA学得更少,忘得也更少

https://arxiv.org/abs/2405.09673是一项针对大语言模型低秩适配(LoRA)微调的综合实证研究,在编程和数学两个目标领域对比了LoRA与全量微调的效果。除了领域维度,对比还覆盖了两种目标任务:指令微调和持续预训练。

如果你在继续阅读前想回顾一下LoRA的相关知识,我之前在《改进LoRA:从零实现权重分解低秩适配(DoRA)》一文中有过介绍:
https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch

2.1 LoRA的学习能力更弱

从第一组结果来看,LoRA的学习效果明显不如全量微调,如下图所示。在我看来这是意料之中的,因为更新更少的参数会限制学习能力。学习新知识通常需要比“将预训练基础模型转化为指令遵循模型”更大的容量。

figure08

全量微调 vs LoRA。性能在HumanEval数据集上测得,该数据集包含164道编程挑战题。改绘自《LoRA学得更少,忘得也更少》,原文:https://arxiv.org/abs/2405.09673

在上图中还有一个值得注意的现象:持续预训练场景下,LoRA与全量微调的差距比指令微调场景下更大。这符合我们的普遍认知:预训练主要是教大语言模型新知识,而指令微调主要是改变大语言模型的行为模式。

接下来,在数学领域而非编程领域重复同一组实验,我们会发现全量微调和LoRA之间的差距缩小了,如下图所示。

figure09

数学任务下全量微调与LoRA的对比。改绘自《LoRA学得更少,忘得也更少》,原文:https://arxiv.org/abs/2405.09673

可以认为,相比编程,解决数学问题与大语言模型的预训练源域关联更紧密。换句话说,大语言模型在预训练过程中接触到的数学题可能比编程任务更多。此外,数学题通常用自然语言描述,而编程需要一整套全新的术语体系。

总结一下,目前我们可以得出结论:新任务与预训练数据的差异越大,在获取新知识时(比如通过持续预训练),全量微调相比LoRA的优势就越明显。

2.2 LoRA的遗忘程度更低

上文我们对比了LoRA和全量微调在知识更新方面的表现。接下来的一组实验评估了两种方法在经过持续预训练和指令微调后,对原有信息的遗忘情况。和之前结果的区别在于,这里测量的是模型在原始源任务上的性能。

figure10

在编程数据上训练后,全量微调与LoRA在原始源任务上的表现。改绘自《LoRA学得更少,忘得也更少》,原文:https://arxiv.org/abs/2405.09673

从上图可以看出,当训练数据集离源域更远时(这里是编程),全量微调比LoRA遗忘的知识多得多。而在数学数据集上,两者的差距更小,如下图所示。

figure11

在数学数据上训练后,全量微调与LoRA在原始源任务上的表现。改绘自《LoRA学得更少,忘得也更少》,原文:https://arxiv.org/abs/2405.09673

2.3 结论

LoRA还是全量微调?或许正如预期,归根结底是“学习-遗忘”的权衡问题。全量微调在新目标域上能带来更强的性能,而LoRA能更好地保留原始源域的性能*。

直观上,我认为这只是LoRA修改模型参数更少带来的副作用——顾名思义,LoRA的目标是低秩适配,也就是不会大幅修改所有模型参数。

而且在实践中,很多时候根本不是“选全量微调还是LoRA”的问题:由于LoRA能节省显存、占用更低的存储空间,很多场景下它可能是唯一可行的选择。

尽管如此,能看到这个问题被如此详尽地通过实验梳理和分析,还是非常有价值的。(实验基于7B和13B参数的Llama 2模型开展。)

*(Mariano Kamp向我指出过一个注意事项:在LoRA实验中他们没有更新嵌入层,而这一点在让模型适配新任务时至关重要。)

3. MoRA:面向参数高效微调的高秩更新方法

每当有新论文提出一种类LoRA的大语言模型高效微调方法时,总是令人兴奋。在https://arxiv.org/abs/2405.12130中,作者们采用了一种与低秩适配相关但方向相反的思路:用一个方阵替换LoRA适配器。

另外,我的著作《http://mng.bz/orYv》的附录E中,从零实现了针对垃圾邮件分类GPT模型的LoRA。

figure12

我著作《http://mng.bz/orYv》中LoRA章节的可视化内容

3.1 低秩与高秩的对比

如下图所示,MoRA使用一个小型方阵(M),而非LoRA的两个小型矩阵A和B。我们会在下一节详细讨论其工作原理。

figure13

LoRA与MoRA的结构对比,W为神经网络层的权重。图片来源:《MoRA:面向参数高效微调的高秩更新方法》,原文:https://arxiv.org/abs/2405.12130

为什么要提出另一种LoRA替代方案,而且还是“高秩”的?原因在于,LoRA对原始权重的更新方式相对受限。在我看来这是刻意设计的:当我们用LoRA微调模型时,我们不希望过度扰动或改变原始模型的能力。然而,尽管低秩更新对于指令微调这类任务来说有效且足够,但它的一个缺点是,在融入新知识时(比如通过持续预训练,也就是在常规文本数据上微调,而非指令微调)效果相对较差。

在MoRA论文中,作者们希望开发出一种参数高效的微调方法,既能在指令微调上表现良好,也能在持续预训练中很好地吸收新知识。

下面是基于合成数据集的LoRA、MoRA和常规全量微调(FFT)的横向对比,该合成数据集要求大语言模型记住特定的识别码。

figure14

LoRA、MoRA和全量微调(FFT)在记忆识别码任务上的性能。图片来源:《MoRA:面向参数高效微调的高秩更新方法》,原文:https://arxiv.org/abs/2405.12130

在上图展示的合成基准测试中,MoRA的知识获取(或记忆)能力与全量微调相近。高秩LoRA(r=256)最终也能记住合成识别码,但需要更多的训练步数。而小秩LoRA(r=8)则无法完成记忆。

需要注意的是,大语言模型中的记忆不一定是好事(当然,历史日期和事实类知识除外)。不过,LoRA不容易产生记忆的特点,也有助于降低模型对训练数据过拟合的倾向。话虽如此,这个基准测试主要是为了探究LoRA是否提供了足够的容量来学习新知识。可以把它类比为批量过拟合调试法:我们让模型在一小部分训练集上过拟合,以此确认架构实现是否正确。(下一节我们会看真实数据上的基准测试结果。)

3.2 MoRA方法概览

那么MoRA是如何实现的呢?

作者们使用了一个可训练的方阵,作用于原始权重W上,而非LoRA中的AB矩阵。这个方阵通常远小于原始权重矩阵。实际上,LoRA和MoRA的可训练参数数量甚至可以相同。

例如,如果原始权重层有4096 × 4096 = 16,777,216个参数,秩r=8的LoRA有4096×8 + 8×4096 = 65,536个参数。而用MoRA时,我们可以取r=256来匹配参数量,即256 × 256 = 65,536个参数。

如何将这个256×256的矩阵作用于原始的1024×1024权重矩阵?作者定义了几种非参数化的压缩与解压缩方法(具体细节超出了本文的范围,但我在图中尝试用PyTorch代码做了总结)。

左图:总参数量相同时,LoRA与DoRA的矩阵维度可视化。右图:MoRA矩阵压缩与解压缩的示例代码。

figure15

左子图来源:《MoRA:面向参数高效微调的高秩更新方法》,原文:https://arxiv.org/abs/2405.121

LoRA和MoRA的效果对比如何?

从真实数据集的基准测试来看(见下表),MoRA和LoRA的表现处于相近水平。不过,在生物医学和金融数据的持续预训练场景下,MoRA的表现优于所有LoRA变体;只有全量微调(FFT)效果更好。此外一个有趣的发现是,LoRA的表现与DoRA持平甚至更优——DoRA是我几个月前在《改进LoRA:从零实现权重分解低秩适配(DoRA)》中介绍过的LoRA变体:
https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch
https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch
https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch
https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch
https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch https://substack.com/profile/27393275-sebastian-raschka-phd
· 2024年2月19日
https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch

<figure16

多种LoRA变体与MoRA在真实数据集上的对比。改绘自《MoRA:面向参数高效微调的高秩更新方法》,原文:https://arxiv.org/abs/2405.12130

3.3 结论

事实证明,相对简单的MoRA方法效果出人意料地好。它在持续预训练上确实略优于LoRA,但在指令微调和小秩数学推理任务上略逊于LoRA。对我而言,这些结果还不足以让人用MoRA替换LoRA。尽管如此,这篇论文提出了一种有趣的方法,配套的实验也很有价值。

4. 5月其他值得关注的研究论文

以下是我本月偶然发现的其他一些有趣论文。由于列表较长,我将10篇我认为特别值得关注的论文用星号(*)标注。不过请注意,这份列表及其标注完全基于我个人的兴趣,以及和我自身项目的相关性。

  • 《上下文位置编码:学会计数重要信息》,作者Golovneva、Wang、Weston和Sukhbaatar(5月29日),https://arxiv.org/abs/2405.18719
    该研究提出了上下文位置编码(CoPE)——一种适用于大语言模型的新型位置编码方法,能够根据上下文自适应,支持更抽象的基于位置的注意力机制。

  • 《LLaMA-NAS:面向大语言模型的高效神经架构搜索》,作者Sarah、Sridhar、Szanking和Sundaresan(5月28日),https://arxiv.org/abs/2405.18377
    该研究提出了一种结合一次性NAS和遗传算法的方法来优化LLaMA2-7B模型,在精度损失极小的情况下实现了1.5倍的体积缩减和1.3倍的推理吞吐量提升,效果优于传统的剪枝和稀疏化技术。

  • 《VeLoRA:基于秩1子词元投影的显存高效训练方法》,作者Miles、Reddy、Elezi和Deng(5月28日),https://arxiv.org/abs/2405.17991
    该论文提出了一种用于大语言模型训练与微调的显存高效算法,能够在不损失性能的前提下压缩中间激活值,将词元拆分为子词元并投影到固定的一维子空间中。

  • *《gzip可预测数据相关的缩放法则》,作者Pandey(5月26日),https://arxiv.org/abs/2405.16684
    该研究挑战了“神经语言模型的缩放法则与数据无关”的观点,证明模型性能的缩放对训练数据的复杂度敏感,并提出了一种新的数据相关缩放法则,将模型的最优计算资源分配与训练数据的gzip压缩率相关联。

  • 《面向大语言模型对齐的离线正则化强化学习》,作者Yao、Wu、Yang等人(5月22日),https://arxiv.org/abs/2405.13800
    该论文提出了直接奖励优化(DRO)——一种用于大语言模型对齐的新框架,它利用更丰富的单轨迹数据集(包含提示、响应和用户反馈),无需像直接偏好优化(DPO)那样使用成对偏好数据。

  • 《Trans-LoRA:迈向无数据可迁移的参数高效微调》,作者Wang、Ghosh、Cox等人(5月27日),https://arxiv.org/abs/2405.17258
    Trans-LoRA能够利用合成数据,在不同基础模型之间实现低秩适配器(LoRA)的近乎无数据、无损迁移。

  • 《堆叠你的Transformer:深入探究高效大语言模型预训练中的模型增长方法》,作者Du、Luo、Qiu等人(5月26日),https://arxiv.org/abs/2405.15319
    该论文研究了预训练大语言模型中的模型增长方法,特别是一种名为Gstack的深度堆叠算子,能够加快训练速度并提升性能。

  • 《更少调度的训练之路》,作者Defazio、Yang、Mehta等人(5月24日),https://arxiv.org/abs/2405.15682
    该研究提出了一种无调度优化方法,效果优于传统的学习率调度方法,且无需预设停止时机,除了标准动量优化器中的超参数外,无需引入额外超参数。

  • 《对指令计算损失的指令微调》,作者Shi、Yang、Wu等人(5月23日),https://arxiv.org/abs/2405.14394
    该论文对比了指令微调时对指令进行掩码与不掩码两种情况下大语言模型的性能,发现不掩码的效果通常更好。

  • 《SimPO:基于无参考奖励的简单偏好优化》,作者Meng、Xia和Chen(5月23日),https://arxiv.org/abs/2405.14734
    直接偏好优化(DPO)简化了大语言模型基于人类反馈的强化学习,而该论文通过对对数概率取平均、去除参考模型的需求,进一步简化了DPO。

  • 《AlignGPT:具备自适应对齐能力的多模态大语言模型》,作者Fei Zhao、Taotian Pang和Chunhui Li(5月23日),https://arxiv.org/abs/2405.14129
    AlignGPT是一种新型多模态大语言模型,通过在预训练阶段区分图文对的对齐能力、在指令微调阶段自适应调整对齐能力,提升了跨模态对齐效果。

  • 《面向多模态大语言模型的密集连接器》,作者Yao、Wu、Yang等人(5月22日),https://arxiv.org/abs/2405.13800
    该论文提出了密集连接器(Dense Connector)——一种视觉-语言连接器,通过整合多层视觉特征来改进多模态大语言模型(MLLM)。

  • 《作为循环神经网络的注意力机制》,作者Feng、Tung、Hajimirsadeghi等人(5月22日),https://arxiv.org/abs/2405.13956
    该研究将Transformer重新解释为循环神经网络的一种变体,并提出了Aaren——一种新型注意力模块,兼具Transformer的并行训练能力和传统循环神经网络高效、恒定内存更新的优势。

  • *《MoRA:面向参数高效微调的高秩更新方法》,作者Jiang、Huang、Luo等人(5月20日),https://arxiv.org/abs/2405.12130
    该论文分析了大语言模型中低秩更新的局限性,并提出了MoRA方法:使用方阵进行高秩更新,在保持与LoRA相当的参数效率的同时,在内存密集型任务上表现更优,其他任务上表现相近。

  • 《SLAB:结合简化线性注意力与渐进重参数化批归一化的高效Transformer》,作者Guo、Chen、Tang和Wang(5月19日),https://arxiv.org/abs/2405.11582
    该论文提出了一种方法,在基于Transformer的模型中用重参数化的批归一化渐进替换层归一化,同时搭配简化线性注意力(SLA)模块。

  • 《构建与复用LoRA库,迈向模块化大语言模型》,作者Ostapenko、Su、Ponti等人(5月17日),https://arxiv.org/abs/2405.11157
    该研究探索了将基础大语言模型上训练好的适配器复用于新任务的方法,提出了一种基于模型聚类(MBC)构建适配器库的方法,以及零样本路由机制,无需重新训练即可提升任务泛化能力。

  • 《Chameleon:混合模态早期融合基础模型》,Meta AI团队作者(5月16日),https://arxiv.org/abs/2405.09818
    Chameleon是一种早期融合、基于词元的混合模态模型,擅长以任意顺序处理和生成图像与文本。

  • 《Xmodel-VLM:多模态视觉语言模型的简单基线》,作者Xu、Liu、He等人(5月15日),https://arxiv.org/abs/2405.09215
    该论文提出了Xmodel-VLM——一个10亿参数规模、高效的多模态视觉语言模型,专为消费级GPU部署设计。

  • *《LoRA学得更少,忘得也更少》,作者Biderman、Ortiz、Portes等人(5月15日),https://arxiv.org/abs/2405.09673
    该研究在编程和数学领域对比了参数高效微调方法低秩适配(LoRA)与全量微调在大语言模型上的效果,发现尽管LoRA通常表现稍差,但它能更好地保留目标域之外的基础模型能力,并且提供了更强的正则化效果。

  • 《RLHF工作流:从奖励建模到在线RLHF》,作者Dong、Xiong、Pang等人(5月13日),https://arxiv.org/abs/2405.07863
    该报告概述了一种适用于大语言模型的在线迭代RLHF方法,它使用代理模型模拟人类反馈,效果优于离线方法,并训练出了性能优异的SFR-Iterative-DPO-LLaMA-3-8B-R模型。

  • 《PHUDGE:可扩展评判模型Phi-3》,作者Deshwal和Chawla(5月12日),https://arxiv.org/abs/2405.08029
    该报告介绍了PHUDGE——一个基于Phi-3的模型,在评分任务上的速度和效果都超过了ChatGPT的GPT-4。

  • 《面向语言模型对齐与个性化的价值增强采样》,作者Han、Shenfeld、Srivastava等人(5月10日),https://arxiv.org/abs/2405.06639
    该研究提出了价值增强采样(VAS)——一种新型奖励优化框架,能够高效对齐大语言模型,无需修改模型权重,也无需联合训练策略和价值函数,并且支持对仅开放API的大语言模型(如ChatGPT)进行适配。

  • *《在新知识上微调大语言模型会加剧幻觉吗?》,作者Gekhman、Yona、Aharoni等人(5月9日),https://arxiv.org/abs/2405.05904
    该研究探究了在有监督微调过程中引入新事实信息对大语言模型的影响,发现尽管模型很难融入新事实、学习新事实的速度比熟悉的信息慢,但最终学会这些事实后,模型生成错误事实回答的倾向会线性增加。

  • *《寻找鲤鱼王:自动检测大语言模型中训练不足的词元》,作者Land和Bartolo(5月8日),https://arxiv.org/abs/2405.05417
    该论文对大语言模型的分词器问题进行了全面分析,并提出了一种自动检测“故障词元”的方法——这类词元存在于分词器词表中,但在训练数据中几乎或完全没有出现过。

  • *《DeepSeek-V2:一款强大、经济、高效的混合专家语言模型》,作者Liu、Feng、Wang等人(5月8日),https://arxiv.org/abs/2405.04434
    DeepSeek-V2是一个2360亿参数的混合专家语言模型(每个词元仅激活210亿参数),它引入了多头潜注意力(MLA),旨在将键值(KV)缓存压缩为潜向量,从而提升推理效率并降低显存需求。

  • 《仅缓存一次:面向语言模型的解码器-解码器架构》,作者Sun、Dong、Zhu等人(5月8日),https://arxiv.org/abs/2405.05254
    该研究提出了YOCO——一种面向大语言模型的解码器-解码器架构,它通过自解码器编码全局键值缓存,供交叉解码器复用,大幅降低了GPU显存需求并提升了预填充阶段的性能。

  • *《xLSTM:扩展长短期记忆网络》,作者Beck、Poeppel、Spanring等人(5月7日),https://arxiv.org/abs/2405.04517
    该研究探索了将LSTM扩展到数十亿参数规模的潜力,通过指数门控、增强记忆结构等新改进,将其整合为xLSTM架构,性能与当前最先进的基于Transformer和状态空间模型的大语言模型相当。

  • 《vAttention:无需分页注意力的大语言模型服务动态内存管理》,作者Prabhu、Nayak、Mohan等人(5月7日),https://arxiv.org/abs/2405.04437
    该论文提出了vAttention——一种大语言模型GPU显存管理方法,它将键值缓存保存在连续的虚拟内存中,并利用现有的底层系统按需分页支持来动态分配物理内存。

  • *《Flash Attention稳定吗?》,作者Golden、Hsia、Sun等人(5月5日),https://arxiv.org/abs/2405.02803
    该研究建立了一套分析数值偏差对大规模机器学习训练影响的框架,发现被广泛使用的Flash Attention优化确实存在显著的数值偏差,不过其影响程度低于低精度训练带来的偏差。

  • *《构建视觉语言模型,什么才是关键?》,作者Laurencon、Tronchon、Cord和Sanh(5月3日),https://arxiv.org/abs/2405.02246
    该论文指出,视觉语言模型(VLM)中很多关键设计选择都缺乏依据,并提出了Idefics2——一个80亿参数的新型视觉语言基础模型,通过严格评估不同架构、数据和训练方法,实现了同量级下的最优性能,其模型和数据集均已公开。

  • 《Prometheus 2:一款专门用于评估其他语言模型的开源语言模型》(5月2日),https://arxiv.org/abs/2405.01535
    该论文提出了Prometheus 2——一款开源的评估用大语言模型,它解决了此前模型的局限性,与人类和GPT-4的判断高度对齐,并且在评估格式和标准上具备灵活性。

  • *《大语言模型小学数学表现的细致检验》,作者Zhang、Da、Lee等人(5月1日),https://arxiv.org/abs/2405.00332
    该研究提出了GSM1k——一个复刻了经典基准GSM8k的新基准,用于测试大语言模型,结果发现模型性能出现显著下降,表明之前的优异表现可能更多源于对训练数据的记忆,而非真正的数学推理能力。(注:GSM8k是一个用于评估大语言模型数学推理能力的基准,通过呈现小学难度的题目来衡量模型能力。)

  • 《面向语言模型对齐的自博弈偏好优化》,作者Wu、Sun、Yuan等人(5月1日),https://arxiv.org/abs/2405.00675
    该论文提出了自博弈概率偏好优化(SPPO)方法用于语言模型对齐,它利用自博弈框架,通过迭代策略更新来逼近纳什均衡。

  • 《编辑批次越大越好吗?——基于Llama-3的模型编辑实证研究》,作者Yoon、Gupta和Anumanchipalli(5月1日),https://arxiv.org/abs/2405.00664
    该研究在Llama-3上检验了模型编辑技术的效果,通过测试顺序编辑、批量编辑以及一种新颖的顺序-批量混合编辑策略在不同层上的表现,得出结论:更小的顺序编辑比更大的批量编辑更能提升模型性能。(注:编辑批次大小指的是一轮编辑中同时对模型参数做出的修改数量。)

这本杂志是我个人的兴趣项目,不提供直接报酬。不过,如果您愿意支持我的话,可以考虑购买我的著作:https://sebastianraschka.com/books。如果您觉得这些书有洞见、对您有帮助,非常欢迎推荐给您的朋友和同事。(也欢迎在亚马逊上分享您的反馈,这对我帮助很大)

figure17

http://mng.bz/M96ohttps://nostarch.com/machine-learning-and-ai-beyond-basics 以及https://www.amazon.com/Machine-Learning-PyTorch-Scikit-Learn-scikit-learn-ebook-dp-B09NW48MR1/dp/B09NW48MR1/

您的支持对我意义重大!非常感谢!

【转载】最新开源大语言模型表现如何?DPO 是否优于 PPO?

原文地址:How Good Are the Latest Open LLMs? And Is DPO Better Than PPO?,by Sebastian Raschka, on 2024-04-02

最新开源大语言模型表现如何?DPO 是否优于 PPO?

2024年4月最新模型发布与AI研究综述

2024年4月真是精彩纷呈的一个月!恰逢我的生日,我的新书《机器学习与人工智能:核心问题》(https://www.amazon.com/Machine-Learning-AI-Essential-Questions/dp/171850376)也正式推出,春天终于到来,同时还有四款重磅开源大语言模型(LLM)集中发布:Mixtral、Meta AI的Llama 3、微软的Phi-3,以及苹果的OpenELM。

本文将对过去几周发布的四款基于Transformer架构的主流大语言模型逐一进行评述,随后探讨基于人类反馈强化学习(RLHF)的指令微调最新研究,重点对比PPO与DPO两种算法。

  1. Mixtral、Llama 3与Phi-3表现几何?
  2. OpenELM:搭载开源训练与推理框架的高效语言模型家族
  3. 大语言模型对齐中DPO是否优于PPO?一项全面研究
  4. 4月其他值得关注的研究论文

1. Mixtral、Llama 3与Phi-3:有哪些新进展?

首先从本月最受瞩目的话题——几款重磅大语言模型的发布说起。本节将简要介绍Mixtral、Llama 3和Phi-3,这几款模型均配套有简短的博客文章或技术报告。下一节将更详细地介绍苹果的OpenELM,好在该模型同步发布了研究论文,披露了大量值得关注的技术细节。

1.1 Mixtral 8x22B:更大的模型,更优的表现

https://mistral.ai/news/mixtral-8x22b/ 是Mistral AI推出的最新混合专家(Mixture-of-Experts, MoE)模型,采用宽松的Apache 2.0开源许可证发布。

与2024年1月发布的Mixtral 8x7B类似,该模型的核心设计是将Transformer架构中的每个前馈模块替换为8个专家层。本文篇幅较长,因此不再展开讲解MoE的原理;如果您感兴趣,可以参考我几个月前发布的文章中关于Mixtral 8x7B的章节,其中有更详细的说明:

https://magazine.sebastianraschka.com/p/research-papers-in-january-2024

https://mistral.ai/news/mixtral-8x22b/ 中最值得关注的一张图,从两个维度对比了Mixtral 8x22B与多款大语言模型:一是在主流基准测试https://arxiv.org/abs/2009.03300(MMLU)上的建模表现,二是激活参数量(与计算资源需求相关)。

figure01

Mixtral 8x22B与其他大语言模型对比。(标注图基于https://mistral.ai/news/mixtral-8x22b/中的图表制作)

1.2 Llama 3:更大规模的数据,更优的效果

2023年2月发布的https://arxiv.org/abs/2302.13971 是开源可获取大语言模型的重大突破,也是开源大语言模型发展的关键节点。因此,去年推出的https://arxiv.org/abs/2307.09288 自然也备受期待。如今,由https://ai.meta.com/blog/meta-llama-3/ 正式发布的Llama 3系列模型,同样令人振奋。

尽管Meta仍在训练其最大规模的几款模型(例如4000亿参数版本),但本次已发布了大家熟知的80亿(8B)和700亿(70B)参数规格的模型,且表现十分出色。下文我将官方https://ai.meta.com/blog/meta-llama-3/ 公布的MMLU分数,补充到之前分享的Mixtral对比图中。

figure02

Llama 3、Mixtral与其他大语言模型对比。(标注图基于https://mistral.ai/news/mixtral-8x22b/中的图表制作)

整体而言,Llama 3的架构与Llama 2几乎完全一致,主要区别在于词表规模有所扩大,且小尺寸版本的Llama 3采用了分组查询注意力(Grouped-Query Attention)。如果您想了解分组查询注意力的原理,我曾在此处写过相关讲解:

https://magazine.sebastianraschka.com/p/ahead-of-ai-11-new-foundation-models

以下是在LitGPT中实现Llama 2与Llama 3的配置文件,可以直观体现二者的主要差异。

figure03

通过LitGPT对比Llama 2与Llama 3的配置,来源:https://github.com/Lightning-AI/litgpt

训练数据规模

Llama 3的性能相比Llama 2大幅提升,最主要的原因是训练数据集规模大得多。Llama 3的训练语料达到15万亿token,而Llama 2“仅为”2万亿token。

这一发现非常值得关注:正如https://ai.meta.com/blog/meta-llama-3/ 中提到的,根据Chinchilla缩放法则,80亿参数模型的最优训练数据量要小得多,约为2000亿token。此外,Llama 3的研究团队观察到,无论是80亿还是700亿参数的模型,在训练到15万亿token规模时,性能仍保持对数线性提升。这意味着,继续使用超过15万亿token的训练数据,模型性能还能进一步提升。

指令微调与对齐

在指令微调和模型对齐阶段,研究人员通常会二选一:要么采用基于近端策略优化(PPO)的人类反馈强化学习(RLHF),要么采用无需奖励模型的直接偏好优化(DPO)。有意思的是,Llama 3的研究团队并没有厚此薄彼,而是两种方法都使用了(后文会详细对比PPO和DPO)。

https://ai.meta.com/blog/meta-llama-3/ 中提到,Llama 3的研究论文将在次月发布,我很期待论文中能披露更多技术细节。

1.3 Phi-3:更高质量的数据,更优的表现

就在Llama 3发布仅一周后,微软推出了全新的Phi-3大语言模型。根据https://arxiv.org/abs/2404.14219 中的基准测试结果,即便尺寸最小的Phi-3模型,参数量不到Llama 3 8B的一半,性能却超越了后者。

figure04

Phi-3、Llama 3、Mixtral与其他大语言模型对比。(标注图基于https://mistral.ai/news/mixtral-8x22b/中的图表制作)

值得注意的是,基于Llama架构的Phi-3,训练token数仅为Llama 3的1/5(3.3万亿对比15万亿)。Phi-3甚至沿用了Llama 2的分词器,词表大小为32064,远小于Llama 3的词表规模。

此外,Phi-3-mini“仅有”38亿参数,规模还不到Llama 3 8B的一半。

那么,它的制胜秘诀是什么?根据技术报告,答案在于数据质量优先于数量:“经过严格过滤的网页数据与合成数据”。

论文没有过多阐述数据筛选的细节,但整体沿用了前代Phi模型的数据处理方案。几个月前我曾在此处写过关于Phi模型的更多介绍:

https://magazine.sebastianraschka.com/p/ahead-of-ai-12-llm-businesses
https://magazine.sebastianraschka.com/p/ahead-of-ai-12-llm-businesses
https://magazine.sebastianraschka.com/p/ahead-of-ai-12-llm-businesses
https://magazine.sebastianraschka.com/p/ahead-of-ai-12-llm-businesses
https://magazine.sebastianraschka.com/p/ahead-of-ai-12-llm-businesses https://substack.com/profile/27393275-sebastian-raschka-phd
·
2023年10月8日
https://magazine.sebastianraschka.com/p/ahead-of-ai-12-llm-businesses

截至本文撰写时,业界仍不确定Phi-3是否真如宣传般出色。例如,我交流过的许多人都提到,在非基准测试任务上,Phi-3的表现远不如Llama 3。

1.4 小结

从上述三款重磅发布来看,本月对开源大语言模型而言可谓成果丰硕。而我还没提到我最欣赏的模型——OpenELM,我们将在下一节展开讨论。

实际应用中该选哪款模型?我认为这三款模型各有优势,适配不同场景。Mixtral的激活参数量比Llama 3 70B更少,同时仍保持了相当不错的性能水平。Phi-3 3.8B对移动端设备极具吸引力,据研究团队称,其量化版本可以在iPhone 14上运行。而Llama 3 8B可能是微调场景下最具性价比的多面手,因为使用LoRA技术时,单张GPU就能轻松完成微调。

《Ahead of AI》是读者支持的独立出版物。如果想接收新文章并支持我的创作,欢迎订阅免费或付费会员。

2. OpenELM:搭载开源训练与推理框架的高效语言模型家族

https://arxiv.org/abs/2404.14619 是苹果研究人员发布的最新大语言模型系列及配套论文,旨在打造可部署在移动设备上的小型大语言模型。

https://magazine.sebastianraschka.com/p/research-papers-in-february-2024?utm_source=profile&utm_medium=reader2 类似,能看到一篇公开架构、训练方法和训练数据细节的大语言模型论文,让人耳目一新。

figure05

OpenELM与其他同时公开数据集、代码和权重的开源大语言模型对比(同等开放程度的模型并不多见)。标注表格来自OpenELM论文https://arxiv.org/abs/2404.14619

先来看最值得关注的几个亮点:

2.1 架构细节

除了逐层缩放策略(后文详述),模型的整体架构设置和超参数配置与OLMo、Llama等其他大语言模型较为相近,如下图所示。

figure06

OpenELM、最小规格OLMo模型与最小规格Llama 2模型的架构与超参数对比。标注表格来自OpenELM论文https://arxiv.org/abs/2404.14619

2.2 训练数据集

公开数据细节和解释清楚背后的逻辑是两回事——这也是我学生时代研究论文的核心追求。例如,研究团队从多个公开数据集中采样了规模相对较小的1.8万亿token子集(数据集包括https://arxiv.org/abs/2306.01116、https://github.com/togethercomputer/RedPajama-Data、https://arxiv.org/abs/2101.00027 和https://arxiv.org/abs/2402.00159)。该子集的规模仅为训练OLMo所用的Dolma数据集的一半。但这样子采样的依据是什么?采样标准又是什么?

其中一位作者友好地回复了我的疑问:“关于数据集:我们采样没有特别的依据,只是想使用约2万亿token规模的公开数据集(参考Llama 2的设定)。”

figure07

OpenELM训练使用的token数与数据集原始token数对比(注:具体token数取决于所使用的分词器)。标注表格来自OpenELM论文https://arxiv.org/abs/2404.14619

2.3 逐层缩放

逐层缩放策略(借鉴自https://arxiv.org/abs/2008.00623 论文)非常有创意。本质上,研究人员从Transformer的浅层到深层逐步加宽层的维度。具体来说,在保持每个注意力头尺寸不变的前提下,增加注意力模块的头数;同时对前馈模块的隐藏层维度进行缩放,如下图所示。

figure08

大语言模型架构图,基于我的著作《从零构建大语言模型》(https://www.manning.com/books/build-a-large-language-model-from-scratch)制作。

我本希望能看到在同一数据集下,分别训练采用和不采用逐层缩放策略的大语言模型的消融实验。但这类实验成本很高,我理解为什么论文没有做。

不过,我们可以参考https://arxiv.org/abs/2008.00623 论文中的消融实验——该论文首次提出逐层缩放,是在更小的数据集上基于原始的编码器-解码器架构完成的,如下图所示。

figure09

标准Transformer块与采用逐层(逐块)缩放的Transformer块对比,来自DeLighT论文https://arxiv.org/abs/2008.00623

2.4 LoRA与DoRA对比

一个意外的惊喜是,研究人员还对比了LoRA和DoRA(https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch)两种参数高效微调方法的效果!不过结果显示,两种方法之间没有显著差异。

figure10

两种参数高效微调方法LoRA与DoRA的建模性能对比。标注表格来自OpenELM论文https://arxiv.org/abs/2404.14619

2.5 小结

尽管这篇论文没有解决新的研究问题,但它对大语言模型的实现细节做了清晰透明的梳理,质量很高。逐层缩放策略未来可能会越来越多地出现在大语言模型设计中。此外,论文只是本次发布的一部分,苹果还同步开源了相关代码:https://github.com/apple/corenet/tree/main/mlx_examples/open_elm

总而言之,这是一项出色的工作,向研究人员(以及苹果)的开源分享精神致敬!

3. 大语言模型对齐中DPO是否优于PPO?一项全面研究

https://arxiv.org/abs/2404.10719 终于解答了我近几个月一直关注的核心问题之一。

在深入分析结果之前,先做一个简要概述:PPO(近端策略优化)和DPO(直接偏好优化)都是通过人类反馈强化学习(RLHF)实现大语言模型对齐的主流方法。

RLHF是大语言模型开发的关键环节,用于让模型输出符合人类偏好,例如提升生成回答的安全性和有用性。

figure11

典型的大语言模型训练生命周期

更详细的原理讲解与对比,可以参考我上个月发布的文章中“语言模型的奖励建模评估”章节:https://magazine.sebastianraschka.com/p/tips-for-llm-pretraining-and-evaluating-rms

3.1 什么是RLHF-PPO和DPO?

RLHF-PPO是最早的大语言模型对齐方法,也是OpenAI的https://arxiv.org/abs/2203.02155 以及ChatGPT中部署的大语言模型的核心技术。然而近几个月,局面发生了变化:经过DPO微调的大语言模型异军突起,在公开排行榜上表现亮眼。DPO之所以快速流行,得益于它无需奖励模型的特性,使用门槛显著降低:与PPO不同,DPO不需要单独训练一个奖励模型,而是通过类似分类的目标函数直接更新大语言模型。

figure12

摘自https://magazine.sebastianraschka.com/p/tips-for-llm-pretraining-and-evaluating-rms

如今,公开排行榜上名列前茅的大语言模型大多采用DPO而非PPO训练。但遗憾的是,在这篇新论文发表之前,一直没有研究在同一模型、同一数据集的条件下,对PPO和DPO进行直接的横向对比。

3.2 整体而言PPO优于DPO

https://arxiv.org/abs/2404.10719 是一篇质量很高的论文,包含大量实验与结果,核心结论是:整体上PPO的效果优于DPO,且DPO在分布外数据上的性能衰减更严重。

这里的“分布外数据”指的是,大语言模型之前用于有监督微调的指令数据,与DPO所用的偏好数据不属于同一分布。例如,模型先在通用的Alpaca数据集上完成指令微调,再在另一个带有偏好标签的数据集上做DPO微调。(改善DPO分布外表现的方法之一,是在DPO微调之前,先在偏好数据集上增加一轮有监督指令微调。)

主要研究结论总结如下图所示。

figure13

标注表格来自《大语言模型对齐中DPO是否优于PPO?一项全面研究》(https://arxiv.org/abs/2404.10719)论文。

除了上述核心结论,论文还包含多项补充实验和消融研究,如果您对该话题感兴趣,推荐深入阅读。

3.3 最佳实践

此外,论文还总结了使用DPO和PPO的最佳实践建议,这些结论同样值得关注。

例如,如果使用DPO,务必先在偏好数据集上进行有监督微调。此外,迭代DPO(利用现有奖励模型标注更多数据再进行训练)的效果优于仅在现有偏好数据上做DPO。

如果使用PPO,成功的关键因素是大批次训练、优势函数归一化,以及通过指数移动平均更新参数。

figure4

偏好数据集示例(样例取自https://huggingface.co/datasets/Intel/orca_dpo_pairs

3.4 小结

根据论文结果,如果使用得当,PPO的效果优于DPO。但考虑到DPO使用和实现更简单,我预计它仍会是非常受欢迎的主流方法。

一个实用的建议是:如果你有真实的奖励标签(无需自己预训练奖励模型),或者能下载到同领域的奖励模型,就使用PPO;否则,为了简便优先选择DPO。

此外,从Llama 3的博客文章来看,我们不必在PPO和DPO之间二选一,两者可以结合使用!例如,Llama 3的训练流程就是:预训练 → 有监督微调 → 拒绝采样 → PPO → DPO。(希望Llama 3的开发团队能尽快发布论文,披露更多细节!)

深入理解大语言模型

深入理解大语言模型的最佳方式之一,就是从零开始手写实现一个!

如果您想深入学习大语言模型,我的著作《从零构建大语言模型》(https://www.manning.com/books/build-a-large-language-model-from-scratch)会完整覆盖、实现并讲解大语言模型的全生命周期。该书将于2024年夏季正式出版,目前正处于预售优惠阶段。

讲解预训练的第5章已于两周前发布。如果您感兴趣,也可以在GitHub上提前查看代码:https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb

figure15

https://www.manning.com/books/build-a-large-language-model-from-scratch

4. 4月其他值得关注的研究论文

以下是本月我发现的其他值得关注的论文。即便和成果丰硕的前几个月相比,4月的大语言模型研究也堪称精彩纷呈。

  • KAN:柯尔莫哥洛夫-阿诺德网络,Liu、Wang、Vaidya等人(4月30日),https://arxiv.org/abs/2404.19756
    柯尔莫哥洛夫-阿诺德网络(KAN)用边上可学习的样条函数替代线性权重参数,且没有固定的激活函数。它在准确率、模型缩放性和可解释性上均优于多层感知机,是颇具潜力的替代方案。
  • 何时检索:教大语言模型高效利用信息检索,Labruna、Ander Campos、Azkune(4月30日),https://arxiv.org/abs/2404.19705
    本文提出了一种定制化训练方法,通过特殊token <RET> 教会大语言模型:当不知道答案时,是调用自身的参数记忆,还是使用外部信息检索系统。
  • 基于Transformer的语言模型内部工作原理入门,Ferrando、Sarti、Bisazza、Costa-jussa(4月30日),https://arxiv.org/abs/2405.00208
    这份入门指南对基于Transformer的解码器-only语言模型的相关技术做了精炼的技术综述。
  • RAG与RAU:自然语言处理中检索增强语言模型综述,Hu、Lu(4月30日),https://arxiv.org/abs/2404.19543
    该综述全面梳理了检索增强大语言模型的研究进展,详细介绍了其组成模块、架构、应用场景与评估方法。
  • 通过多token预测打造更优更快的大语言模型,Gloeckle、Idrissi、Rozière等人(4月30日),https://arxiv.org/abs/2404.19737
    研究表明,训练大语言模型同时预测多个未来token而非仅下一个token,不仅能提升采样效率,还能改善生成类任务的性能。
  • LoRA Land:310个媲美GPT-4的微调大语言模型技术报告,Zhao、Wang、Abid等人(4月28日),https://arxiv.org/abs/2405.00732
    LoRA是应用最广泛的参数高效微调技术之一。本研究发现,4位LoRA微调后的模型性能显著超越基座模型,甚至优于GPT-4。
  • 让你的大语言模型充分利用上下文,An、Ma、Lin等人(4月25日),https://arxiv.org/abs/2404.16811
    该研究提出了FILM-7B模型,采用信息密集型训练方法解决“中间丢失”难题——即大语言模型难以提取上下文窗口中间位置信息的问题。
  • 层跳过:实现早停推理与自推测解码,Elhoushi、Shrivastava、Liskovich等人(4月25日),https://arxiv.org/abs/2404.16710
    LayerSkip通过训练时的层丢弃与早停损失、推理时的自推测解码,能够加速大语言模型的推理过程。
  • 检索头从机制上解释长上下文事实性,Wu、Wang、Xiao等人(4月24日),https://arxiv.org/abs/2404.15574
    本文探究了具备长上下文能力的Transformer模型如何利用注意力机制中的特定“检索头”高效提取信息,揭示了这类头具有通用性、稀疏性、内在性、动态激活的特点,且对需要参考上下文或推理的任务至关重要。
  • 大语言模型时代的图机器学习,Fan、Wang、Huang等人(4月23日),https://arxiv.org/abs/2404.14928
    这篇综述介绍了图神经网络与大语言模型如何日益深度融合,以提升图机器学习与推理能力。
  • NExT:教大语言模型对代码执行进行推理,Ni、Allamanis、Cohan等人(4月23日),https://arxiv.org/abs/2404.14662
    NExT是一种提升大语言模型理解与修复代码能力的方法,核心是教会模型分析程序执行过程。
  • 多头混合专家,Wu、Huang、Wang、Wei(4月23日),https://arxiv.org/abs/2404.15045
    提出的多头混合专家(MH-MoE)模型,通过引入多头机制将token拆分为子token,由不同专家并行处理,解决了稀疏混合专家模型中专家激活率低、难以处理多个语义概念的问题。
  • 大语言模型自我进化综述,Tao、Lin、Chen等人(4月22日),https://arxiv.org/abs/2404.14662
    该工作全面梳理了大语言模型自我进化的相关方法,提出了大语言模型自我进化的概念框架,并指出了当前挑战与未来提升方向。
  • OpenELM:搭载开源训练与推理框架的高效语言模型家族,Mehta、Sekhavat、Cao等人(4月22日),https://arxiv.org/abs/2404.14619
    苹果研究人员推出的OpenELM是对标OLMo(我之前介绍过的模型家族)的大语言模型系列,包含完整的训练与评估框架、训练日志、模型检查点、配置文件以及其他可复现研究的相关产物。
  • Phi-3技术报告:可在手机本地运行的高性能语言模型,Abdin、Jacobs、Awan等人(4月22日),https://arxiv.org/abs/2404.14219
    Phi-3-mini是拥有38亿参数的大语言模型,训练语料为3.3万亿token。基准测试显示,其性能可匹敌Mixtral 8x7B、GPT-3.5等更大规模的模型。
  • 低比特量化的LLaMA3模型表现如何?一项实证研究,Huang、Ma、Qin(4月22日),https://arxiv.org/abs/2404.14047
    该实证研究发现,Meta的LLaMA3模型在超低位宽量化下会出现显著的性能下降。
  • 指令层级:训练大语言模型优先处理特权指令,Wallace、Xiao、Leike等人(4月19日),https://arxiv.org/abs/2404.13208
    该研究为大语言模型引入了指令层级机制,使其优先处理可信提示,在不牺牲标准能力的前提下,提升了模型对抗攻击的鲁棒性。
  • OpenBezoar:在混合指令数据上训练的小型、低成本开源模型,Dissanayake、Lowe、Gunasekara、Ratnayake(4月18日),https://arxiv.org/abs/2404.12195
    该研究利用Falcon-40B生成的合成数据,结合RLHF、DPO等技术对OpenLLaMA 3Bv2模型进行微调,通过系统性的数据筛选与微调,在更小的模型规模下实现了顶尖的大语言模型任务表现。
  • 通过想象、检索与批判实现大语言模型自我提升,Tian、Peng、Song等人(4月18日),https://arxiv.org/abs/2404.12253
    尽管大语言模型在各类任务上表现亮眼,但在复杂推理与规划上仍有不足。本文提出的AlphaLLM整合了蒙特卡洛树搜索,构建了自我提升循环,无需额外数据标注即可提升模型的推理任务表现。
  • 当大语言模型不适用时,试试FastFit:面向多类别场景的快速高效文本分类,Yehudai、Bendel(4月18日),https://arxiv.org/abs/2404.12365
    FastFit是一个全新的Python工具包,通过整合批次对比学习与token级相似度评分,快速精准地处理语言任务中的少样本多分类问题。实验显示,其训练速度提升3-20倍,性能优于SetFit、HF Transformers等其他方法。
  • 大语言模型检索增强文本生成综述,Huang、Huang(4月17日),https://arxiv.org/abs/2404.10981
    这篇综述文章探讨了检索增强生成(RAG)如何结合检索技术与深度学习,通过动态融入最新信息提升大语言模型性能;文章对RAG流程进行了分类,梳理了最新研究进展,并提出了未来的研究方向。
  • RAG模型的忠实度如何?量化RAG与大语言模型内部先验的博弈,Wu、Wu、Zou(4月16日),https://arxiv.org/abs/2404.10198
    提供正确的检索信息通常能修正GPT-4等大语言模型的错误,但错误的检索信息也会被模型反复复述,除非模型自身具备足够强的内部知识来反驳。
  • CLIP缩放降级:数据、架构与训练策略的全面分析,Li、Xie、Cubuk(4月16日),https://arxiv.org/abs/2404.08197
    本文探究了对比语言-图像预训练(CLIP)的降级缩放方案,以适配有限的计算预算。研究表明,高质量的小型数据集往往优于规模更大但质量更低的数据集,且小型Vision Transformer(ViT)模型是这类数据集的最优选择。
  • 大语言模型对齐中DPO是否优于PPO?一项全面研究,Xu、Fu、Gao等人(4月16日),https://arxiv.org/abs/2404.10719
    该研究探究了直接偏好优化(DPO)与近端策略优化(PPO)在人类反馈强化学习(RLHF)中的效果,发现只要应用得当,PPO在所有场景下都能超越其他替代方法。
  • 为真正优质的对齐学习你的参考模型,Gorbatovski、Shaposhnikov、Malakhov等人(4月15日),https://arxiv.org/abs/2404.09656
    研究指出,全新的对齐方法——信任域直接偏好优化(TR-DPO)通过在训练中更新参考策略,在多个指标上提升了模型质量,在特定数据集上最高可带来19%的性能提升,效果优于现有技术。
  • Chinchilla缩放法则:一次复现尝试,Besiroglu、Erdil、Barnett、You(4月15日),https://arxiv.org/abs/2404.10102
    作者尝试复现Hoffmann等人提出的计算最优缩放法则估算方法,发现与其他方法的原始估算结果相比,存在不一致性与不合理的结果。
  • 新一代Transformer替代方案:状态空间模型综述,Wang、Wang、Ding等人(4月15日),https://arxiv.org/abs/2404.09516
    本文对状态空间模型(SSM)作为Transformer架构的高效替代方案进行了全面综述与实验分析,详细介绍了SSM的原理、在各领域的应用,并通过统计对比展示了其优势与未来研究方向。
  • 大语言模型的上下文回忆依赖于提示,Machlab、Battle(4月13日),https://arxiv.org/abs/2404.08865
    该研究通过在文本块中嵌入事实信息,评估不同条件下大语言模型提取该信息的能力,以此测试模型的上下文回忆能力。研究发现,模型表现同时受提示内容与训练数据中潜在偏差的影响。
  • 面向RLHF的数据集重置策略优化,Chang、Zhan、Oertell等人(4月12日),https://arxiv.org/abs/2404.08495
    该工作提出了数据集重置策略优化(DR-PO),这是一种全新的基于人类偏好反馈的强化学习(RLHF)算法,通过将离线偏好数据集直接融入在线策略训练,提升了训练效果。
  • 用更少token预训练小型基座语言模型,Sanyal、Sanghavi、Dimakis(4月12日),https://arxiv.org/abs/2404.08634
    该研究提出了“Inheritune”方法:从更大的模型中继承部分Transformer块,仅用大模型极少比例的数据进行训练,以此构建小型基座语言模型。实验表明,尽管训练数据与资源大幅减少,这些小型模型的表现仍与大模型相当。
  • Rho-1:并非所有token都必不可少,Lin、Gou、Gong等人(4月11日),https://arxiv.org/abs/2404.07965
    Rho-1是一种全新的语言模型,它选择性地在损失较高的token上训练,而非采用传统的下一个token预测方法。
  • 大语言模型合成数据的最佳实践与经验总结,Liu、Wei、Liu等人(4月11日),https://arxiv.org/abs/2404.07503
    本文围绕大语言模型场景下的合成数据研究进行了综述。
  • JetMoE:仅需10万美元达到Llama2性能,Shen、Guo、Cai、Qin(4月11日),https://arxiv.org/abs/2404.07413
    JetMoE-8B是拥有80亿参数的稀疏门控混合专家模型,训练语料1.25万亿token,成本不到10万美元。它每个输入token仅激活20亿参数,仅用3万GPU训练小时,性能就超越了Llama2-7B等成本更高的模型。
  • LLoCO:离线学习长上下文,Tan、Li、Patil等人(4月11日),https://arxiv.org/abs/2404.07979
    LLoCO方法结合了上下文压缩、检索与基于LoRA的参数高效微调,可有效将LLaMA2-7B模型的上下文窗口扩展至12.8万token。
  • 不遗漏任何上下文:基于无限注意力的高效无限上下文Transformer,Munkhdalai、Faruqui、Gopal(4月10日),https://arxiv.org/abs/2404.07143
    该研究提出了一种方法,在单个Transformer块内结合多种注意力策略,让基于Transformer的大语言模型能高效处理无限长的输入,适配需要海量上下文的任务。
  • 将LLaMA解码器适配为视觉Transformer,Wang、Shao、Chen等人(4月10日),https://arxiv.org/abs/2404.06773
    该研究通过后序列类别token、软掩码策略等技术修改标准视觉Transformer(ViT),将Llama这类解码器-only的Transformer大语言模型适配到计算机视觉领域。
  • LLM2Vec:大语言模型是隐藏的强大文本编码器,BehnamGhader、Adlakha、Mosbach等人(4月9日),https://arxiv.org/abs/2404.05961
    该研究提出了一种简单的无监督方法,可将GPT、Llama这类解码器风格的大语言模型转化为强大的文本编码器,步骤包括:1)禁用因果注意力掩码;2)掩码下一个token预测;3)无监督对比学习。
  • 大象永不忘记:大语言模型对表格数据的记忆与学习,Bordt、Nori、Rodrigues等人(4月9日),https://arxiv.org/abs/2404.06209
    该研究揭示了大语言模型中数据污染与记忆化的关键问题:模型往往会记住流行的表格数据集,在训练中见过的数据集上表现更好,进而导致过拟合。
  • MiniCPM:通过可扩展训练策略释放小语言模型的潜力,Hu、Tu、Han等人(4月9日),https://arxiv.org/abs/2404.06395
    该研究推出了全新的高效能“小型”语言模型,参数量在12亿-24亿区间,并提出了热身-稳定-衰减(WSD)学习率调度器等技术,适用于持续预训练与领域适配。
  • CodecLM:用定制合成数据对齐语言模型,Wang、Li、Perot等人(4月8日),https://arxiv.org/abs/2404.05875
    CodecLM提出了一套基于编解码原理的框架,以大语言模型为编解码器,自适应生成高质量合成数据,让大语言模型对齐不同的指令分布,提升其遵循复杂多样指令的能力。
  • Eagle与Finch:具备矩阵值状态与动态循环的RWKV,Peng、Goldstein、Anthony等人(4月8日),https://arxiv.org/abs/2404.05892
    Eagle与Finch是基于RWKV架构的全新序列模型,引入了多头矩阵状态、动态循环等特性。
  • AutoCodeRover:自动化程序改进,Zhang、Ruan、Fan、Roychoudhury(4月8日),https://arxiv.org/abs/2404.05427
    AutoCodeRover是一种自动化方案,利用大语言模型与高级代码搜索技术,通过修改软件程序解决GitHub上的问题。
  • Sigma:面向多模态语义分割的孪生Mamba网络,Wan、Wang、Yong等人(4月5日),https://arxiv.org/abs/2404.04256
    Sigma是一种采用孪生Mamba(状态空间模型结构)网络的多模态语义分割方法,它将热成像、深度等模态与RGB信息融合,为基于CNN和视觉Transformer的方案提供了替代选择。
  • 设计即可验证:让语言模型学会引用预训练数据原文,Zhang、Marone、Li等人(2024年4月5日),https://arxiv.org/abs/2404.03862
    Quote-Tuning通过训练模型更多地引用可靠来源的原文,提升大语言模型的可信度与准确率。相比标准模型,其原文引用量提升了55%至130%。
  • ReFT:语言模型的表示微调,Wu、Arora、Wang等人(4月5日),https://arxiv.org/abs/2404.03592
    本文提出了表示微调(ReFT)方法,与参数高效微调(PEFT)类似,它仅修改模型的隐藏表示而非全部参数,就能高效适配大模型。
  • CantTalkAboutThis:对齐语言模型以在对话中保持话题聚焦,Sreedhar、Rebedea、Ghosh、Parisien(4月4日),https://arxiv.org/abs/2404.03820
    本文推出了CantTalkAboutThis数据集,旨在帮助大语言模型在任务导向对话中紧扣主题。数据集包含跨领域的合成对话,其中穿插了干扰轮次,用以挑战并训练模型抵御话题偏离。
  • 在神经压缩文本上训练大语言模型,Lester、Lee、Alemi等人(4月4日),https://arxiv.org/abs/2404.03626
    本文提出了一种方法,使用“等信息窗口”技术(将文本分割为比特长度相等的块),在经过小型语言模型压缩的文本上训练大语言模型。
  • 直接纳什优化:教语言模型通过通用偏好自我提升,Andriushchenko、Croce、Flammarion(4月4日),https://arxiv.org/abs/2404.02151
    本文提出了直接纳什优化(DNO),这是一种大语言模型训练后方法,它利用来自先知的偏好反馈迭代提升模型性能,可作为其他人类反馈强化学习(RLHF)方法的替代方案。
  • 交叉注意力让文本到图像扩散模型的推理变得繁琐,Zhang、Liu、Xie等人(4月3日),https://arxiv.org/abs/2404.02747
    该研究探究了文本条件扩散模型中交叉注意力在推理阶段的作用,发现它会在特定节点后趋于稳定;而在该收敛点之后绕过文本输入,能简化推理过程且不损失输出质量。
  • BAdam:面向大语言模型的内存高效全参数训练方法,Luo、Hengzu、Li(4月3日),https://arxiv.org/abs/2404.02827
    BAdam是一种内存高效的优化器,提升了大语言模型微调的效率,同时易于使用,仅新增一个超参数。
  • 基于扩散的文本到图像生成的可扩展性研究,Li、Zou、Wang等人(4月3日),https://arxiv.org/abs/2404.02883
    该研究通过分析去噪主干网络与训练集缩放的影响,实证探究了基于扩散的文本到图像模型的缩放特性,揭示了交叉注意力与Transformer块的效率对性能有显著影响,并提出了在更低成本下提升图文对齐效果与学习效率的策略。
  • 用简单自适应攻击破解主流安全对齐大语言模型,Andriushchenko、Croce、Flammarion(4月2日),https://arxiv.org/abs/2404.02151
    研究表明,即便是最新的安全对齐大语言模型,也能通过自适应技术轻松破解。通过对抗性提示、利用API漏洞、限制token搜索空间等方法,在各类模型上实现了近100%的攻击成功率。
  • 缩减规模生成式语言模型中的涌现能力,Muckatira、Deshpande、Lialin、Rumshisky(4月2日),https://arxiv.org/abs/2404.02204
    研究发现,如果对预训练数据集进行降维和简化,即便“非常小”的大语言模型(100万到1.65亿参数)也能展现出涌现能力。
  • 长上下文大语言模型在长上下文学习中表现不佳,Li、Zheng、Do等人(4月2日),https://arxiv.org/abs/2404.02060
    全新基准测试LongICLBench聚焦长上下文学习与极端标签分类任务,结果显示:大语言模型在2万token以内表现良好,但更长序列下性能会下降(GPT-4是个例外),凸显了模型处理海量富上下文信息的能力短板。
  • 深度混合:在基于Transformer的语言模型中动态分配计算资源,Raposo、Ritter、Richard等人(4月2日),https://arxiv.org/abs/2404.02258
    该研究提出了一种方法,让基于Transformer的语言模型能在输入序列的不同位置动态分配计算资源(FLOPs),通过在每一层选择特定token进行处理,优化性能与效率。
  • Diffusion-RWKV:将类RWKV架构扩展到扩散模型,Fei、Fan、Yu等人(4月6日),https://arxiv.org/abs/2404.04478
    本文将NLP领域的RWKV架构进行适配,引入到图像生成任务的扩散模型中,提出了Diffusion-RWKV。
  • 细微边界:通过下游能力分析导航大语言模型预训练,Yang、Li、Niu等人(4月1日),https://arxiv.org/abs/2404.01204
    该研究识别出了可预测大语言模型最终性能的早期指标,有助于在预训练过程中分析模型并优化预训练方案。
  • 更大并不总意味着更好:潜扩散模型的缩放特性,Mei、Tu、Delbracio等人(4月1日),https://arxiv.org/abs/2404.01367
    该研究探究了潜扩散模型的尺寸如何影响不同采样步数与任务下的采样效率,揭示了一个反直觉的趋势:在给定推理预算下,更小的模型往往能生成质量更高的结果。
  • 语言模型会为未来token提前规划吗?,Wu、Morris、Levine(4月1日),https://arxiv.org/abs/2404.00859
    该论文通过实证发现,Transformer在推理过程中会通过“预缓存”和“面包屑”机制预判未来信息。

机器学习问答与AI

如果您正在寻找一本聚焦机器学习与人工智能中高级话题的书籍,或许会喜欢我的新书《机器学习与人工智能:核心问题》(https://www.amazon.com/Machine-Learning-AI-Essential-Questions/dp/1718503768)。纸质版已于两周前正式发售!

figure16

https://www.amazon.com/Machine-Learning-AI-Essential-Questions/dp/1718503768

《Ahead of AI》是个人兴趣驱动的创作项目,没有直接的商业收入,非常感谢您的支持。
如果您购买了这本书,也非常欢迎在亚马逊上留下评论!

【转载】使用与微调预训练Transformer模型

原文地址:Using and Finetuning Pretrained Transformers,by Sebastian Raschka, on 2024-04-20

使用与微调预训练Transformer模型

本周行业动态频出,其中不乏令人振奋的AI前沿研究,我会在 https://magazine.sebastianraschka.com/archive 中展开讨论。

此外,我很高兴地向大家宣布我的新书已由No Starch Press出版,书籍链接:https://www.amazon.com/Machine-Learning-AI-Essential-Questions/dp/1718503768

如果你一直在寻找机器学习入门课程之后的进阶学习资料,这本书或许正合适。书中涵盖了30个在我过往书籍与课程中未深入展开的概念,以简洁的问答形式呈现(包含配套练习)。

我相信它也会成为机器学习面试备考的实用参考资料。

figure01

《机器学习与AI问答》(Machine Learning Q and AI)已在 https://nostarch.com/machine-learning-q-and-aihttps://www.amazon.com/Machine-Learning-AI-Essential-Questions/dp/1718503768 及各大图书渠道发售。

当前,预训练大语言模型的使用与微调方法是业界讨论最热烈的话题之一,因此我想分享书中的一段节选,希望能对你当下的项目有所帮助。

祝阅读愉快!

预训练大语言模型有哪些使用与微调方式?

预训练大语言模型(LLM)有哪些不同的使用与微调方式?最常见的三类方法包括:基于特征的方法、上下文提示法,以及更新模型部分参数的方法。

首先,大多数预训练LLM或语言Transformer模型无需额外微调即可直接使用。例如,我们可以采用基于特征的方法,利用预训练Transformer生成的嵌入向量来训练新的下游模型(比如线性分类器)。其次,我们可以在输入中直接给出新任务的示例,无需模型进行任何参数更新或学习,就能让模型输出预期结果,这一方法也被称为提示(Prompting)。最后,我们也可以通过微调模型的全部参数或少量参数来达成目标效果。

接下来的章节将深入展开介绍这些方法。

利用Transformer完成分类任务

我们先从使用预训练Transformer的传统方法讲起:基于特征嵌入训练下游模型、微调输出层、微调整层。我们会结合分类任务场景展开讨论(提示法相关内容将在后续“上下文学习、索引与提示调优”章节中详细介绍)。

基于特征的方法

在基于特征的方法中,我们加载预训练模型并将其“冻结”——即不更新预训练模型的任何参数,而是将模型作为特征提取器应用于新数据集,再基于这些嵌入向量训练下游模型。下游模型可以是任意类型(随机森林、XGBoost等),但通常线性分类器的效果最佳。这是因为BERT、GPT、Llama、Mistral等预训练Transformer已经能从输入数据中提取高质量、高信息量的特征,这些特征嵌入往往捕捉到了数据中复杂的关联与模式,足以让线性分类器轻松实现数据的类别划分。

此外,逻辑回归、支持向量机等线性分类器通常具备较强的正则化特性,能够在预训练Transformer生成的高维特征空间中有效避免过拟合。这种基于特征的方法是效率最高的方案,因为完全不需要更新Transformer模型的参数。并且,由于嵌入向量是固定的,在多轮训练分类器时,可以预先计算好训练集对应的嵌入向量。

图1展示了LLM的典型构建流程,以及通过微调适配下游任务的过程。图中,在通用文本语料上完成预训练的模型,经过微调后可执行德译英等任务。

figure02

图1:大语言模型的通用微调工作流

微调

预训练LLM的传统微调方法分为两种:仅更新输出层(我们称之为“I型微调”),以及更新全部层(我们称之为“II型微调”)。

I型微调与前文提到的基于特征的方法思路相近,但它是直接在LLM自身之上新增一层或多层输出层。LLM的主干网络保持冻结,仅更新新增输出层的模型参数。由于不需要反向传播遍历整个网络,这种方法在训练吞吐量和显存占用上效率相对更高。
II型微调同样先加载模型并新增输出层,但与I型微调仅反向传播到最后几层不同,它会通过反向传播更新所有层的参数,因此是计算成本最高的方案。尽管计算开销高于基于特征的方法和I型微调,但它通常能带来更优的建模效果与预测性能,在处理专业性更强的领域特定数据集时优势尤为明显。

图2总结了本节介绍的三种方法。

figure03

图2:使用预训练LLM的三种传统方法。 三种方法的代码示例可参见:https://github.com/rasbt/MachineLearning-QandAI-book/tree/main/supplementary/q18-using-llms/01_classifier-finetuning

除了概念层面的总结,图2还给出了三种方法在训练效率上的经验性对比。由于II型微调需要更新的层数和参数量多于I型微调,其反向传播的计算成本也更高;同理,II型微调的成本也高于更简单的基于特征的方法。

感兴趣的读者可以通过以下链接获取代码示例,涵盖基于特征的方法、单层/多层微调,以及微调整个Transformer完成分类任务的实现:https://github.com/rasbt/MachineLearning-QandAI-book/tree/main/supplementary/q18-using-llms/01_classifier-finetuning

上下文学习、索引与提示调优

GPT-2、GPT-3等大语言模型让上下文学习(In-context Learning)的概念广为人知,该场景下也常被称为零样本学习或少样本学习,如图3所示。

figure04

图3:通过提示让LLM进行上下文学习。 上下文学习的代码实现可参见:https://github.com/rasbt/MachineLearning-QandAI-book/blob/main/supplementary/q18-using-llms/02_prompting

如图3所示,上下文学习的核心是在输入(提示词)中提供任务的相关背景或示例,让模型推断出预期的行为模式并生成对应输出。这种方法利用了模型在预训练阶段从海量数据中习得的能力——这些数据覆盖了丰富的任务类型与场景。

注:此处的少样本学习与上下文学习方法含义相近,其定义与第3章中讨论的传统少样本学习方法有所不同。

举个例子,假设我们想通过上下文学习,用GPT-3这类大规模预训练语言模型实现少样本德译英任务。我们可以提供几个德译英的示例,帮助模型理解任务要求,如下所示:

将下列德语句子翻译成英语:
示例1:德语:"Ich liebe Pfannkuchen." 英语:"I love pancakes."
示例2:德语:"Das Wetter ist heute schoen." 英语:"The weather is nice today."
翻译这个句子:德语:"Wo ist die naechste Bushaltestelle?"

总体而言,在特定任务或特定数据集上,上下文学习的效果通常不如微调。因为它完全依赖预训练模型从训练数据中习得的泛化能力,不会针对当前任务调整模型参数。

但上下文学习也有自身优势:当可用于微调的标注数据有限或缺失时,它的价值尤为突出。同时,如果我们无法直接访问模型权重,只能通过界面或API与模型交互(比如ChatGPT),这种方法也能让我们快速尝试不同任务,无需微调模型参数。

与上下文学习相关的还有硬提示调优(Hard Prompt Tuning),“硬”指的是输入token是不可微的。前文介绍的微调方法是通过更新模型参数来提升任务效果,而硬提示调优则是通过优化提示词本身来提升性能。提示调优不修改模型参数,但可能会利用小规模标注数据集,找到最适合特定任务的提示词写法。例如,为了优化前面德译英任务的提示词,我们可以尝试以下三种写法:

"Translate the German sentence '{german_sentence}' into English: {english_translation}"
"German: '{german_sentence}' | English: {english_translation}"
"From German to English: '{german_sentence}' -> {english_translation}"

提示调优是参数微调的一种低资源替代方案。但它的效果通常不及全量模型微调,因为它没有针对特定任务更新模型参数,限制了模型适配任务细节的能力。此外,提示调优可能耗费大量人力——需要人工对比不同提示词的效果,或通过其他类似方法完成评估,这也是“硬提示”名称的由来:输入token始终不可微。除此之外,也有研究提出用另一个LLM来自动生成并评估提示词。

提示法与上下文学习的代码示例可参见:https://github.com/rasbt/MachineLearning-QandAI-book/blob/main/supplementary/q18-using-llms/02_prompting

还有一种纯基于上下文学习思路的方法是LLM索引(LLM Indexing),如图4所示。

figure05

图4:通过LLM索引从外部文档中检索信息。 索引的代码示例可参见:https://github.com/rasbt/MachineLearning-QandAI-book/blob/main/supplementary/q18-using-llms/03_retrieval-augmented-generation

在LLM领域,索引可以看作是基于上下文学习的一种延伸方案,它能将LLM改造为信息检索系统,从外部资源和网站中提取信息。如图4所示,索引模块会将文档或网站内容切分为更小的文本块,再将这些文本块转化为嵌入向量存储在向量数据库中。当用户提交查询时,索引模块会计算查询的嵌入向量与数据库中所有向量的相似度,最终召回相似度最高的前k个嵌入向量,用于生成最终回答。

LLM索引通常是一个统称,指代将LLM与现有数据源连接的框架或流程,其中的典型代表是检索增强生成(Retrieval Augmented Generation,RAG)。RAG将LLM与检索系统相结合,以此提升模型生成回答的能力。

感兴趣的读者可以通过以下链接获取LLM索引与检索增强生成的代码示例:https://github.com/rasbt/MachineLearning-QandAI-book/blob/main/supplementary/q18-using-llms/03_retrieval-augmented-generation/retrieval-augmented-generation.ipynb

参数高效微调

近年来,业界涌现出大量方法,能更高效地让预训练Transformer适配新的目标任务,这类方法统称为参数高效微调(Parameter-Efficient Finetuning)。截至本文撰写时,主流的参数高效微调方法如图5所示。

figure06

图5:参数高效微调技术的主要分类及代表性方法

与上一节介绍的硬提示方法不同,软提示(Soft Prompting)策略优化的是提示的嵌入向量形式。硬提示调优修改的是离散的输入token,而软提示调优使用的是可训练的参数张量。

软提示调优

软提示调优的核心思路是:在查询的嵌入token序列前拼接一个可训练的参数张量(即“软提示”),然后通过梯度下降训练这个张量,以提升模型在目标数据集上的表现。用类Python伪代码可以表示为:

x = EmbeddingLayer(input_ids)
x = concatenate([soft_prompt_tensor, x],
                  dim=seq_len)
output = model(x)

其中,soft_prompt_tensor 的特征维度与嵌入层输出的输入嵌入维度一致。因此,修改后的输入矩阵会多出若干行,相当于在原输入序列中新增了一些token,让序列变得更长。

前缀调优

另一种主流的提示调优方法是前缀调优(Prefix Tuning)。前缀调优与软提示调优思路相近,但区别在于:前缀调优是在每一个Transformer块前都拼接可训练张量(软提示),而非仅在输入嵌入层前拼接,这样可以让训练更稳定。前缀调优的实现伪代码如下:

def transformer_block_with_prefix(x):
    # ➊ 前缀部分:通过全连接层处理软提示
    soft_prompt = FullyConnectedLayers(soft_prompt)
    # ➋ 将软提示(前缀)与输入拼接
    x = concatenate([soft_prompt, x],
                        dim=seq_len)
    # ➌ Transformer块的标准运算
    x = SelfAttention(x)
    x = LayerNorm(x + residual)
    residual = x
    x = FullyConnectedLayers(x) 
    x = LayerNorm(x + residual)
    return x

代码清单1:改造为前缀调优的Transformer块

我们可以将代码清单1拆分为三部分:软提示的实现、软提示(前缀)与输入的拼接、Transformer块其余部分的实现。首先,软提示张量会经过一组全连接层的变换 ➊;接着,变换后的软提示与主输入x进行拼接 ➋,拼接的维度为seq_len,即序列长度维度;最后,后续代码 ➌ 是Transformer块的标准运算,包括自注意力、层归一化和前馈神经网络层,并通过残差连接包裹。

如代码清单1所示,前缀调优通过添加可训练软提示来改造Transformer块。图6进一步展示了普通Transformer块与前缀调优Transformer块的区别。

figure07

图6:普通Transformer与前缀调优Transformer的对比

软提示调优和前缀调优都属于参数高效方法,因为它们只需要训练拼接的参数张量,无需更新LLM本身的参数。

适配器方法

适配器方法与前缀调优的关联在于,二者都在Transformer层中新增了额外参数。在原始的适配器方法中,每个Transformer块的多头自注意力层和原有全连接层之后,都会新增额外的全连接层,如图7所示。

figure08

图7:普通Transformer块(左)与添加适配器层的Transformer块(右)对比。 适配器层的代码示例可参见:https://github.com/rasbt/MachineLearning-QandAI-book/tree/main/supplementary/q18-using-llms/04_adapter

使用原始适配器方法训练LLM时,仅更新新增的适配器层,其余Transformer层保持冻结。适配器层的参数量通常很小:适配器块的第一个全连接层会将输入映射到低维空间,第二个全连接层再将其映射回原始输入维度,因此这种方法通常被认为是参数高效的。

原始适配器方法的伪代码实现如下:

def transformer_block_with_adapter(x):
    residual = x
    x = SelfAttention(x)
    x = FullyConnectedLayers(x)
    # 适配器层
    x = LayerNorm(x + residual)
    residual = x
    x = FullyConnectedLayers(x)
    x = FullyConnectedLayers(x)
    # 适配器层
    x = LayerNorm(x + residual)
    return x

低秩适配

低秩适配(Low-Rank Adaptation,LoRA)是另一种值得关注的主流参数高效微调方法,其核心是利用低秩变换对预训练LLM的权重进行重参数化。LoRA的基础是低秩变换思想——用低维表示近似高维矩阵或数据集,通过找到更少的维度组合,有效捕捉原始数据中的大部分信息。常见的低秩变换技术包括主成分分析和奇异值分解。

例如,假设ΔW是LLM中某个权重矩阵的参数更新量,维度为ℝ^(A×B)。我们可以将这个权重更新矩阵分解为两个更小的矩阵:ΔW = W_A · W_B,其中W_A ∈ ℝ^(A×h),W_B ∈ ℝ^(h×B)。训练时,原始权重保持冻结,仅训练新矩阵W_A和W_B。

既然引入了新的权重矩阵,为什么说它是参数高效的?因为这些新矩阵的规模可以非常小。举个例子,如果A=25、B=50,那么ΔW的参数量是25×50=1250。如果取h=5,那么W_A有125个参数,W_B有250个参数,两个矩阵加起来总共只有125+250=375个参数。

学习到权重更新矩阵后,全连接层的矩阵乘法可以写成如下伪代码形式:

def lora_forward_matmul(x):
    h = x . W  # 常规矩阵乘法
    h += x . (W_A . W_B) * scalar
    return h

代码清单2:结合LoRA的矩阵乘法。 适配器层的代码示例可参见:https://github.com/rasbt/MachineLearning-QandAI-book/tree/main/supplementary/q18-using-llms/05_lora

在代码清单2中,scalar是一个缩放因子,用于调整合并结果(原始模型输出+低秩适配输出)的幅度,以此平衡预训练模型的原有知识与新任务的专属适配。根据LoRA原论文的实验结果,在多个任务基准测试中,使用LoRA的模型表现略优于使用适配器方法的模型,甚至往往比前文介绍的II型微调(全量微调)的模型效果更好。

《Ahead of AI》是读者支持型付费专栏。若想接收新文章并支持我的创作,欢迎成为免费或付费订阅者。

基于人类反馈的强化学习

上一节我们聚焦于提升微调效率的方法,现在换个角度:我们如何通过微调来提升LLM的建模效果?

让LLM适配新的目标领域或任务,传统方法是基于标注目标数据的监督式微调。例如,通过II型微调,我们可以让预训练LLM在情感分类这类目标任务上进行微调,使用的数据集中包含文本及其对应的情感标签(正面、中性、负面等)。

监督微调是LLM训练中的基础步骤。而更进阶的一步是基于人类反馈的强化学习(Reinforcement Learning with Human Feedback,RLHF),它能进一步提升模型与人类偏好的对齐程度。例如ChatGPT及其前身InstructGPT,就是预训练LLM(GPT-3)经过RLHF微调后的典型代表。

在RLHF中,预训练模型会结合监督学习与强化学习进行微调。该方法因初代ChatGPT而普及,而ChatGPT的技术基础正是InstructGPT。我们通过让人类对模型的不同输出进行排序或打分来收集人类反馈,以此提供奖励信号。收集到的奖励标签可用于训练奖励模型(Reward Model),再由奖励模型引导LLM向人类偏好的方向适配。奖励模型通常以预训练LLM为基座,通过监督学习训练得到;之后再通过额外的微调,让预训练LLM向人类偏好对齐。这一额外微调阶段使用的强化学习算法是近端策略优化(Proximal Policy Optimization,PPO)。

RLHF之所以使用奖励模型,而非直接用人类反馈训练预训练模型,是因为人类参与学习过程会形成瓶颈——我们无法实时获取反馈。

预训练语言模型的适配思路总结

尽管微调整个预训练LLM的所有层,仍是适配新目标任务的“黄金标准”,但我们也有多种高效方案来利用预训练Transformer。例如,通过基于特征的方法、上下文学习或参数高效微调技术,我们可以在最小化计算成本与资源消耗的同时,让LLM高效适配新任务。

三种传统方法——基于特征的方法、I型微调、II型微调——在计算效率和模型性能之间提供了不同的权衡。软提示调优、前缀调优、适配器方法等参数高效微调技术,进一步优化了适配过程,减少了需要更新的参数量。而RLHF则为监督微调提供了另一种思路,有望进一步提升建模效果。

总而言之,预训练LLM的通用性与效率仍在不断提升,为我们提供了更多将模型高效适配到各类任务与领域的思路与策略。随着该领域研究的推进,未来预训练语言模型的使用方法还会迎来更多改进与创新。

参考文献与延伸阅读

代码示例

练习题

  1. 什么时候使用上下文学习比微调更合适?什么时候微调更合适?
  2. 在前缀调优、适配器方法和LoRA中,我们如何保证模型保留(而不遗忘)原始知识?

《机器学习与AI问答》

希望你喜欢这段节选!如果你还想了解另外29个机器学习与AI相关的主题,可以在 https://nostarch.com/machine-learning-and-ai-beyond-basicshttps://www.amazon.com/Machine-Learning-AI-Beyond-Basics/dp/1718503768 及各大图书渠道购买本书。

figure09

https://www.amazon.com/Machine-Learning-AI-Essential-Questions/dp/1718503768 这本书涵盖了30个机器学习与AI领域的核心主题。

《Ahead of AI》是一个个人兴趣项目,没有商业盈利。如果你愿意支持我的创作,非常欢迎购买我的新书。
如果你已经购买了本书,也非常欢迎在亚马逊上留下书评!

【转载】大语言模型预训练与奖励模型评估技巧

原文地址:Tips for LLM Pretraining and Evaluating Reward Models,by Sebastian Raschka, on 2024-03-31

大语言模型预训练与奖励模型评估技巧

2024年3月AI研究论文述评

2024年3月31日

AI研究领域又走过了一个月,精彩成果层出不穷,很难选出最心仪的作品。

除了新研究之外,本月还有诸多重磅发布。其中xAI开源了其https://github.com/xai-org/grok-1 模型,参数量达3140亿,是目前规模最大的开源模型。此外有报道称,https://www.anthropic.com/news/claude-3-family 的性能正在接近甚至超越GPT-4。同时值得关注的还有:https://github.com/hpcaitech/Open-Sora(一个完全开源的视频生成项目)、https://blog.rwkv.com/p/eagle-7b-soaring-past-transformers(全新的基于RWKV的模型)、Mosaic推出的1320亿参数https://www.databricks.com/blog/introducing-dbrx-new-state-art-open-llm(混合专家模型),以及https://huggingface.co/ai21labs/Jamba-v0.1(基于Mamba的状态空间模型-Transformer混合架构)。

不过由于这些模型的详细信息还十分有限,我将重点讨论研究论文。本月我会先解读一篇探讨大语言模型持续预训练策略的论文,随后讨论基于人类反馈的强化学习(当下主流的大语言模型对齐方法)中所用的奖励建模,以及一个全新的基准测试。

大语言模型的持续预训练是一个重要课题:它让我们能够更新现有大语言模型,比如保证模型能跟进最新的信息与趋势;同时也能让模型适配新的目标领域,而无需从头重新训练。

奖励建模的重要性在于,它能让大语言模型更贴合人类偏好,并且在一定程度上有助于提升安全性。但除了优化人类偏好之外,奖励建模还提供了一种机制,让大语言模型能够学习并适配复杂任务——只需提供指令-输出示例即可,而无需为正确行为编写明确的程序(这往往难度很高甚至不切实际)。

祝阅读愉快!

1. 大语言模型持续预训练的简洁可扩展策略

我们经常讨论对大语言模型进行微调以使其遵循指令,但在实际应用中,用新知识或特定领域数据更新大语言模型同样非常重要。近期论文https://arxiv.org/abs/2403.08763 就如何利用新数据持续预训练大语言模型提供了宝贵的见解。

具体而言,研究者对比了三种不同的训练方式:

  • 常规预训练:用随机权重初始化模型,在数据集D1上进行预训练。
  • 持续预训练:取上述场景中已完成预训练的模型,在数据集D2上进一步预训练。
  • 联合数据集重训练:与第一种场景一样用随机权重初始化模型,但在数据集D1与D2的并集上训练。

figure01
三种预训练方法示意图

方法3(在联合数据集上重训练)是业界常用的做法,例如https://magazine.sebastianraschka.com/p/ahead-of-ai-7-large-language-models?utm_source=%2Fsearch%2F%2520BloombergGPT&utm_medium=reader2 中所述。原因在于,重训练通常有助于确定合适的学习率调度——往往采用线性热身加半周期余弦衰减的策略——并且能缓解灾难性遗忘问题。

灾难性遗忘指的是神经网络(尤其是在序列学习任务中)在学习新信息后,会遗忘之前学到的知识的现象。对于在不同数据集或任务上依次训练的模型而言,这是一个尤为突出的问题。

因此,通过在包含新旧信息的联合数据集上重训练模型,模型既能适配新数据,又能保持在之前已学任务上的性能。

1.1 核心结论与实验结果

这篇长达24页的论文包含大量实验与海量图表,以当下的标准来看研究非常详尽。为了便于理解,下图总结了核心结果:采用持续预训练,能够达到与从头在联合数据集上重训练相当的优异性能。

figure02
持续预训练的成本仅为从头重训练的一半(因为已有预训练模型,只需使用一半的数据量),却能达到同等的优异性能。来源:改编自https://arxiv.org/abs/2403.08763 的图表

成功实现持续预训练的“技巧”有哪些?

  • 重新热身与重新衰减学习率(见下一节)。
  • 在新数据集(D2)中加入一小部分(如5%)原始预训练数据(D1),以防止灾难性遗忘。值得注意的是,0.5%和1%等更小的比例同样有效。

1.2 学习率调度

在预训练或微调大语言模型时,通常会采用“线性热身+半周期余弦衰减”的学习率调度,如下图所示。

figure03
大语言模型预训练与微调的常用学习率调度。来源:https://www.manning.com/books/build-a-large-language-model-from-scratch、https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-D/01_main-chapter-code/appendix-D.ipynb

如上图所示,在线性热身阶段,学习率从一个较低的值开始,在训练初期逐步提升至预设值。这种方法有助于在进入主训练阶段前稳定模型的权重参数。热身阶段结束后,学习率转入余弦衰减调度,在训练的同时逐步降低模型的学习率。

既然预训练结束时学习率已经非常低,那持续预训练时该如何调整学习率?通常的做法是重新引入一个热身阶段,再跟进一个衰减阶段,这被称为重新热身与重新衰减。简单来说,就是沿用初始预训练阶段完全相同的学习率调度。

figure04
持续预训练的调度方案。图基于https://www.manning.com/books/build-a-large-language-model-from-scratch、https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-D/01_main-chapter-code/appendix-D.ipynb

作者发现,重新热身与重新衰减确实有效。此外,他们还与所谓的“无限学习率”调度进行了对比——该调度出自2021年的论文https://arxiv.org/abs/2106.04560。这种调度以平缓的余弦(或可选的逆平方根)衰减开始,过渡到恒定学习率,最后以陡峭的衰减进行退火收尾。

figure05
三个预训练阶段下,重新热身-重新衰减调度与无限学习率调度的实验对比。来源:改编自https://arxiv.org/abs/2403.08763 的图表

无限学习率调度的便利之处在于,在恒定学习率阶段的任意时刻,都可以通过一个短暂的退火阶段终止预训练(而无需完成整个余弦半周期)。但如上图结果所示,预训练和持续预训练都没必要使用“无限学习率”。常用的重新热身-重新衰减方法,最终损失与无限学习率调度相当。

1.3 结论与注意事项

据我所知,重新热身-重新衰减、以及在新数据中加入原始预训练数据,或多或少都属于业界常识。但我非常欣赏研究者们花时间在这篇长达24页的详细报告中,对该方法进行了正式的验证。

此外我认为很有意思的一点是,“无限学习率”调度并非必需,它最终得到的损失,和我们常用的“线性热身+半周期余弦衰减”方案基本一致。

尽管这篇论文的实验非常全面,但有一点值得注意:大部分实验都是在参数规模较小的4.05亿模型上开展的,采用的是相对经典的大语言模型架构(GPT-NeoX)。不过作者也证明,该结论在100亿参数模型上同样成立,这让我们有理由相信,这些结果也适用于更大的模型(比如700亿参数),以及可能的架构变体。

研究者聚焦于规模相近的预训练数据集。此外,附录也显示,当持续预训练仅使用50%或30%的数据集时,结果依然一致。一个值得未来研究的方向是:当持续预训练的数据集远小于初始预训练数据集时(这在实际中很常见),这些趋势和建议是否仍然成立。

另一个值得未来研究的方向是,测试持续预训练会对经过指令微调的大语言模型的指令遵循能力产生怎样的影响。我尤其好奇的是,用持续预训练更新大语言模型的知识后,是否需要再进行一轮指令微调。

顺带一提,如果您对高效预训练大语言模型感兴趣,我们最近开源了一个面向PyTorch的编译器,名为https://github.com/Lightning-AI/lightning-thunder。

我的同事将它应用到我参与开发的开源大语言模型库https://github.com/Lightning-AI/litgpt 后,在预训练Llama 2 7B模型时,运行时性能提升了40%。

figure06
使用Thunder预训练大语言模型,图片来源:https://github.com/Lightning-AI/lightning-thunder

《Ahead of AI》是读者支持型出版物。如果想收到新文章并支持我的创作,欢迎成为免费或付费订阅者。

2. 语言建模中的奖励建模评估

https://arxiv.org/abs/2403.13787 提出了一个面向奖励模型的基准测试,奖励模型用于基于人类反馈的强化学习(RLHF)——这是当下流行的大语言模型指令调优与对齐流程。

在讨论这篇论文的核心结论之前,我们先在下一节简要介绍一下RLHF和奖励建模。

2.1 奖励建模与RLHF简介

RLHF的目标是改进大语言模型,使其生成的输出更贴合人类偏好,通常指模型回复的有用性与无害性。我之前的文章也更详细地介绍过RLHF流程:https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives

请注意,这篇论文聚焦于对奖励模型进行基准测试,而非对通过RLHF得到的指令微调大语言模型本身。RLHF流程用于打造ChatGPT、Llama 2-chat这类遵循指令的大语言模型,其流程总结如下图。

figure07
通过RLHF对大语言模型进行微调与人类偏好对齐的三步流程总结。基于InstructGPT论文的图表改编,https://arxiv.org/abs/2203.02155

如上图所示,奖励模型构建是RLHF流程中的中间步骤,并且奖励模型本身也是一个大语言模型。

奖励模型与原始基础大语言模型的区别在于,我们调整了奖励模型的输出层,使其返回一个可作为奖励标签的分数。实现方式有两种:(1)将现有输出层替换为新的线性层,输出单个对数几率值;(2)复用现有输出对数几率中的一个,并用奖励标签对其进行微调。

训练奖励模型的流程与损失函数,和训练分类神经网络类似。在常规二分类中,我们预测输入样本属于类别1还是类别0,通过逻辑斯蒂函数计算输入样本属于类别1的类成员概率来建模。

通过逻辑斯蒂函数完成二分类任务的核心要点如下图所示。

figure08
二分类总结

如果您不熟悉用于训练分类器的逻辑斯蒂函数,可以在这里了解更多:

在奖励建模中,我们可以用二分类的逻辑斯蒂损失(输出标记为0或1)来训练奖励模型。

但对于奖励模型,更常用的是对应的Bradley-Terry模型,它专为成对比较任务设计:目标不是将样本独立分类,而是确定每对样本之间的偏好或排名。

Bradley-Terry模型尤其适用于关注相对比较的场景,比如“这两个输出哪个更受偏好?”,而非绝对分类,比如“这个输出是0还是1?”。

figure09
用于相对比较的Bradley-Terry模型概览

2.2 RLHF与直接偏好优化(DPO)

在大多数模型中(比如Llama 2和OpenAI的InstructGPT,ChatGPT背后很可能也是同样的方法),奖励模型被训练成一个分类器,用于预测两个回答之间的人类偏好概率,如上一节所述。

但训练奖励模型是一个额外步骤,实际中如果不用创建显式的奖励模型,直接优化奖励会更简便。这种方法也被称为https://arxiv.org/abs/2305.18290,近年来广受欢迎。

在DPO中,核心思想是优化策略π(“策略”只是被训练模型的术语),使其最大化期望奖励,同时与参考策略π_ref保持一定程度的接近。这有助于在新策略π中保留π_ref的某些期望属性(比如稳定性或安全性)。

figure10
奖励模型与DPO对比

上述公式中的β通常作为温度参数,控制概率分布对策略分数差异的敏感度。β越高,分布对差异越敏感,函数越陡峭,选项间的偏好差异越明显;β越低,模型对分数差异越不敏感,函数越平缓,代表偏好越弱。本质上,β用于校准偏好模型中偏好表达的强弱程度。

由于DPO相对简单(无需训练单独的奖励模型),通过DPO微调的大语言模型非常流行。但一个核心问题是:它的性能到底如何?根据原始论文https://arxiv.org/abs/2305.18290,如下表所示,DPO的表现非常出色。但对此要持保留态度:因为带专用奖励模型的RLHF(即RLHF-PPO)需要更大的数据集和算力,训练难度更高,这种对比未必能反映最优DPO模型与最优RLHF-PPO模型的真实差距。

figure11

此外,在大多数大语言模型排行榜上,DPO模型都名列前茅。但由于DPO比带专用奖励模型的RLHF简单得多,因此DPO模型的数量也要多得多。所以很难说DPO在直接对比中是否真的更优——因为不存在对等的模型(即架构完全相同、训练数据集完全一致,仅分别使用DPO和带专用奖励模型的RLHF)。

2.3 RewardBench基准

在简要介绍了RLHF和奖励建模之后,本节将深入解读https://arxiv.org/abs/2403.13787 这篇论文,它提出了一个基准,用于评估奖励模型以及DPO模型的奖励分数。

该基准套件会同时评估被选中(偏好)回复和被拒绝回复的分数,如下图所示。

figure12
RewardBench将奖励模型与DPO模型的评估建模为预测任务,统计方法选中“偏好”回复的频次。(改编自RewardBench论文的图表,https://arxiv.org/abs/2403.13787

下图列出了RewardBench排名前20的模型。图中的表格基本印证了我之前的观点:很多DPO模型都在大语言模型排行榜前列,这很可能是因为DPO比带专用奖励模型的RLHF简单得多,因此DPO模型的数量要多得多。

figure13
RewardBench排名前20的模型。(改编自RewardBench论文的表格,https://arxiv.org/abs/2403.13787

需要注意的是,现有排行榜与RewardBench的区别在于评估指标不同。其他排行榜评估的是通过奖励模型训练得到的大语言模型的问答与对话性能,而RewardBench聚焦于训练这些大语言模型所用的奖励分数。

这篇论文另一个有趣的结论是,测得的奖励准确率与模型规模正相关,这符合预期,如下表所示。(遗憾的是,该对比仅针对DPO模型。)

figure14
按模型类型与规模划分的DPO模型。(改编自RewardBench论文的表格,https://arxiv.org/abs/2403.13787

2.4 结论、注意事项与未来研究建议

尽管这篇论文没有提出新的大语言模型微调方法,但它为我们讨论奖励建模与DPO提供了很好的契机。而且,终于有了专门针对奖励模型的基准测试,这一点非常好。向研究者们的创建与分享工作致敬。

一点小遗憾:如果能看到RewardBench上的排名,与使用这些奖励模型得到的大语言模型对话模型在公开排行榜上的排名是否高度相关,会很有意思。不过既然公开排行榜数据和RewardBench数据都是公开的,希望能启发未来的论文对此进行分析。

另一个小问题(作者在论文中也承认了)是,RewardBench对DPO模型更有利,因为DPO模型的数量远多于奖励模型。

未来如果有其他论文在固定算力与数据集的条件下,对RLHF奖励模型和DPO模型进行对照实验,看看哪种方法更优,将会非常有意义。

《Ahead of AI》是一个个人兴趣项目,不提供直接报酬。如果您希望支持我,欢迎购买https://sebastianraschka.com/books/ 上的书籍。如果您觉得这些书有洞见、有帮助,也欢迎推荐给您的朋友和同事。
https://sebastianraschka.com/books/


2024年3月其他值得关注的研究论文

以下是本月我发现的其他一些有趣论文。由于列表较长,我用星号(*)标出了10篇我认为尤其值得关注的论文。请注意,这份列表及注解仅基于我个人的兴趣和与我自身项目的相关性。

  • Model Stock: All We Need Is Just a Few Fine-Tuned Models,作者Jang、Yun、Han(3月28日),https://arxiv.org/abs/2403.19522
    该论文提出了一种名为Model Stock的高效微调技术,仅使用两个模型进行逐层权重平均。

  • MagicLens: Self-Supervised Image Retrieval with Open-Ended Instructions,作者Zhang、Luan、Hu等(3月28日),https://arxiv.org/abs/2403.19651
    MagicLens是一个自监督图像检索模型框架,它利用文本指令,支持基于远超视觉相似性的各类关系进行图像搜索。

  • Mechanistic Design and Scaling of Hybrid Architectures,作者Poli、Thomas、Nguyen等(3月26日),https://arxiv.org/abs/2403.17844
    该论文提出了一种机制化的架构设计流水线,通过合成任务实现高效的架构评估,简化了深度学习开发流程;研究发现,混合架构与稀疏架构在可扩展性与效率上均优于传统模型。

  • *** LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning**,作者Pan、Liu、Diao等(3月26日),https://arxiv.org/abs/2403.17919
    该研究提出了一种简单的技术:训练时基于重要性采样,随机冻结中间层。该方法高效,在模型性能上显著优于LoRA和全量大语言模型微调。

  • Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models,作者Li、Zhang、Wang等(3月27日),https://arxiv.org/abs/2403.18814
    Mini-Gemini是一个旨在提升多模态视觉语言模型(VLM)性能的框架,通过高分辨率视觉token、高质量数据集与VLM引导生成实现优化。

  • Long-form Factuality in Large Language Models,作者Wei、Yang、Song等(3月27日),https://arxiv.org/abs/2403.18802
    LongFact是一套全面的提示集,用于基准测试大语言模型在38个主题上的长文本事实准确性。

  • ViTAR: Vision Transformer with Any Resolution,作者Fan、You、Han等(3月27日),https://arxiv.org/abs/2403.18361
    该论文解决了视觉Transformer在不同图像分辨率下扩展性受限的难题,提出了动态分辨率调整与模糊位置编码。

  • BioMedLM: A 2.7B Parameter Language Model Trained On Biomedical Text,作者Bolton、Venigalla、Yasunaga等(3月27日),https://arxiv.org/abs/2403.18421
    BioMedLM是一个紧凑的GPT风格大语言模型,在PubMed的生物医学论文上训练,是打造“小型”、专业化但能力出色的大语言模型的又一个优秀案例。

  • The Unreasonable Ineffectiveness of the Deeper Layers,作者Gromov、Tirumala、Shapourian等(3月26日),https://arxiv.org/abs/2403.17887
    研究表明,选择性剪枝预训练大语言模型最多一半的层,再结合量化与QLoRA进行策略性微调,对问答任务的性能影响极小。

  • LLM Agent Operating System,作者Mei、Li、Xu等(3月25日),https://arxiv.org/abs/2403.16971
    该论文提出了AIOS,一个旨在将大语言模型与智能体深度整合的操作系统。

  • LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement,作者Lee、Wattanawong、Kim等(3月22日),https://arxiv.org/abs/2403.15042
    LLM2LLM是一种数据增强策略,通过教师模型根据学生模型初始训练时产生的错误生成合成数据,提升大语言模型在小样本场景下的性能。

  • Can Large Language Models Explore In-Context?,作者Krishnamurthy、Harris、Foster等(3月22日),https://arxiv.org/abs/2403.15371
    研究发现,当前主流大语言模型包括GPT-3.5、GPT-4和Llama2,在多臂老虎机环境中,如果没有显著干预,无法可靠地进行探索性行为。

  • SiMBA: Simplified Mamba-Based Architecture for Vision and Multivariate Time Series,作者Patro、Agneeswaran(3月22日),https://arxiv.org/abs/2403.15360
    SiMBA提出了一种新颖架构,结合Einstein FFT进行通道建模、Mamba块进行序列建模,解决了大规模网络在图像与时序领域的稳定性问题。

  • RakutenAI-7B: Extending Large Language Models for Japanese,作者Levine、Huang、Wang等(3月21日),https://arxiv.org/abs/2403.15484
    RakutenAI-7B是面向日语的大语言模型系列,采用Apache 2.0协议开源,包含专用的指令模型与对话模型,在日语LM Harness基准测试中取得了顶尖性能。

  • LlamaFactory: Unified Efficient Fine-Tuning of 100+ Language Models,作者Zheng、Zhang、Zhang等(3月20日),https://arxiv.org/abs/2403.13372
    LlamaFactory提出了一个多功能框架,配备友好的网页界面LlamaBoard,可对100余种大语言模型进行高效、无代码的微调。

  • *** RewardBench: Evaluating Reward Models for Language Modeling**,作者Lambert、Pyatkin、Morrison等(3月20日),https://arxiv.org/abs/2403.13787
    该论文提出了RewardBench基准数据集与工具包,用于全面评估基于人类反馈的强化学习(RLHF)中的奖励模型,RLHF用于将预训练语言模型与人类偏好对齐。

  • *** PERL: Parameter Efficient Reinforcement Learning from Human Feedback**,作者Sidahmed、Phatale、Hutcheson等(3月19日),https://arxiv.org/abs/2403.10704
    该工作提出了参数高效的人类反馈强化学习(PERL),采用低秩适配(LoRA)训练模型,能高效地将预训练基础大语言模型与人类偏好对齐。

  • Decoding Compressed Trust: Scrutinizing the Trustworthiness of Efficient LLMs Under Compression,作者Hong、Duan、Zhang等(3月18日),https://arxiv.org/abs/2403.15447
    该研究分析了大语言模型压缩技术与可信度之间的复杂关系,发现在保持效率与可信度方面,量化优于剪枝。

  • TnT-LLM: Text Mining at Scale with Large Language Models,作者Wan、Safavi、Jauhar等(3月18日),https://arxiv.org/abs/2403.12173
    该论文提出了TnT-LLM框架,利用大语言模型自动化标签分类体系的生成与分配,仅需极少的人工参与。

  • *** RAFT: Adapting Language Model to Domain Specific RAG**,作者Zhang、Patil、Jain等(3月15日),https://arxiv.org/abs/2403.10131
    该论文提出了检索增强微调(RAFT),用于提升大语言模型的开卷、领域内问答能力;通过训练模型识别并忽略无帮助的“干扰”文档,同时准确引用正确来源的相关信息。

  • *** MM1: Methods, Analysis & Insights from Multimodal LLM Pre-training**,作者McKinzie、Gan、Fauconnier等(3月14日),https://arxiv.org/abs/2403.09611
    该工作通过分析架构与数据策略推动多模态大语言模型发展,提出了300亿参数的MM1模型系列,在各基准测试的预训练与微调中表现出色。

  • GiT: Towards Generalist Vision Transformer through Universal Language Interface,作者Wang、Tang、Jiang等(3月14日),https://arxiv.org/abs/2403.09394
    GiT是一个利用基础视觉Transformer(ViT)处理各类视觉任务的框架,核心是通过通用语言接口简化架构,支持图像描述、目标检测、语义分割等任务。

  • LocalMamba: Visual State Space Model with Windowed Selective Scan,作者Huang、Pei、You等,https://arxiv.org/abs/2403.09338
    该工作通过优化扫描方向改进视觉Mamba任务,采用局部扫描方法更好地捕捉二维依赖,并进行动态的逐层扫描优化,在ImageNet等基准上实现了显著的性能提升。

  • BurstAttention: An Efficient Distributed Attention Framework for Extremely Long Sequences,作者Ao、Zhao、Han等(3月14日),https://arxiv.org/abs/2403.09347
    “BurstAttention”优化了Transformer模型中长序列的分布式注意力,将通信开销降低40%,在GPU上的处理速度提升一倍。

  • Language Models Scale Reliably With Over-Training and on Downstream Tasks,作者Gadre、Smyrnis、Shankar等(3月13日),https://arxiv.org/abs/2403.08540
    该论文聚焦于过训练以及模型困惑度与下游任务性能的关系,探究了大语言模型缩放定律中的空白。

  • *** Simple and Scalable Strategies to Continually Pre-train Large Language Models**,作者Ibrahim、Thérien、Gupta等(3月13日),https://arxiv.org/abs/2403.08763
    该工作证明,通过简单的学习率重新热身、以及加入小比例的历史训练数据来对抗灾难性遗忘,能够高效地用新数据更新大语言模型。

  • Chronos: Learning the Language of Time Series,作者Ansari、Stella、Turkmen等(3月12日),https://arxiv.org/abs/2403.07815
    Chronos将基于Transformer的模型应用于时间序列预测,通过混合真实数据与合成数据进行训练,在已知和未知数据集上均取得了良好性能。

  • *** Stealing Part of a Production Language Model**,作者Carlini、Paleka、Dvijotham等(3月11日),https://arxiv.org/abs/2403.06634
    研究者提出了一种新的模型窃取攻击,能够从OpenAI的ChatGPT、Google的PaLM-2等黑盒语言模型中精确提取信息(首次揭示了这些模型的隐藏维度)。

  • Algorithmic Progress in Language Models,作者Ho、Besiroglu、Erdil(3月9日),https://arxiv.org/abs/2403.05812
    研究发现,自2012年以来,预训练语言模型(包括大语言模型)的计算效率大约每8个月翻一番,这一速度远超摩尔定律预测的硬件进步速度。

  • LLM4Decompile: Decompiling Binary Code with Large Language Models,作者Tan、Luo、Li、Zhang(3月8日),https://arxiv.org/abs/2403.05286
    本文介绍了多款开源反编译大语言模型,它们在包含C源代码与对应汇编代码的大规模数据集上进行了预训练。

  • Is Cosine-Similarity of Embeddings Really About Similarity?,作者Steck、Ekanadham、Kallus(3月8日),https://arxiv.org/abs/2403.05440
    该论文探讨了利用余弦相似度,通过低维嵌入判断高维对象语义相似性的有效性与局限性。

  • Gemini 1.5: Unlocking Multimodal Understanding Across Millions of Tokens of Context,作者Reid、Savinov、Teplyashin等(3月8日),https://arxiv.org/abs/2403.05530
    该技术报告介绍了Gemini 1.5 Pro,这是Google Gemini系列的多模态模型,在各模态的长上下文任务中表现出色。

  • *** Common 7B Language Models Already Possess Strong Math Capabilities**,作者Li、Wang、Hu等(3月7日),https://arxiv.org/abs/2403.04706
    研究发现,LLaMA-2 7B模型即使仅经过标准预训练,也具备出人意料的数学能力;并且随着有监督指令微调数据规模扩大,其数学能力的一致性会提升。

  • How Far Are We from Intelligent Visual Deductive Reasoning?,作者Zhang、Bai、Zhang等(3月7日),https://arxiv.org/abs/2403.04732
    该研究探究了GPT-4V等顶尖视觉语言模型(VLM)在视觉演绎推理这一精细领域的能力,发现视觉演绎推理存在显著盲区;并且,在大语言模型文本推理中有效的技术,无法直接迁移到视觉推理挑战中。

  • Stop Regressing: Training Value Functions via Classification for Scalable Deep RL,作者Farebrother、Orbay、Vuong等(3月6日),https://arxiv.org/abs/2403.03950
    该论文探讨了提升深度强化学习(RL)可扩展性的潜力:用分类交叉熵分类而非传统回归,来训练强化学习中至关重要的价值函数。

  • *** GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection**,作者Zhao、Zhang、Chen等(3月6日),https://arxiv.org/abs/2403.03507
    梯度低秩投影(GaLore)是一种全新的训练策略,在大语言模型训练中,能将优化器状态的内存占用最多降低65.5%,同时不损失性能。

  • MedMamba: Vision Mamba for Medical Image Classification,作者Yue、Li(2024),https://arxiv.org/abs/2403.03849
    MedMamba将卷积神经网络与状态空间模型(Conv-SSM)相结合,用于医学图像分类,可高效建模长距离依赖并提取局部特征。

  • 3D Diffusion Policy,作者Ze、Zhang、Zhang等(3月6日),https://arxiv.org/abs/2403.03954
    3D Diffusion Policy是一种全新的视觉模仿学习方法,将3D视觉表征与扩散策略相结合,提升了机器人训练的效率与泛化能力,所需演示更少,安全性更高。

  • Are Language Models Puzzle Prodigies? Algorithmic Puzzles Unveil Serious Challenges in Multimodal Reasoning,作者Ghosal、Han、Ken、Poria(3月6日),https://arxiv.org/abs/2403.03864
    该论文提出了一项全新的多模态解谜挑战,揭示了GPT4-V、Gemini等模型在复杂谜题任务中存在明显困难。

  • SaulLM-7B: A pioneering Large Language Model for Law,作者Colombo、Pires、Boudiaf等(3月6日),https://arxiv.org/abs/2403.03883
    SaulLM-7B是专门面向法律领域的70亿参数语言模型,基于Mistral 7B架构构建,在海量英文法律文本语料上训练。

  • Learning to Decode Collaboratively with Multiple Language Models,作者Shen、Lang、Wang等(3月6日),https://arxiv.org/abs/2403.03870
    该方法让多个大语言模型在token级别协作生成文本,自动学习何时自主生成、何时让其他模型生成;通过整合通用模型与领域专家模型的各自优势,提升各类任务的性能。

  • Backtracing: Retrieving the Cause of the Query,作者Wang、Wirawarn、Khattab等(3月6日),https://arxiv.org/abs/2403.03956
    该研究将“回溯”作为一项任务,帮助讲师等内容创作者定位引发用户提问的文本片段,旨在提升教育、新闻、对话等领域的内容交付效果。

  • *** ShortGPT: Layers in Large Language Models are More Redundant Than You Expect**,作者Men、Xu、Zhang等(3月6日),https://arxiv.org/abs/2403.03853
    该研究提出了块影响力(BI)指标,用于评估大语言模型中每一层的重要性;并提出了ShortGPT剪枝方法,根据BI分数移除冗余层。

  • Design2Code: How Far Are We From Automating Front-End Engineering?,作者Si、Zhang、Yang等(3月5日),https://arxiv.org/abs/2403.03163
    该研究提出了Design2Code基准,用于测试多模态大语言模型将视觉设计转化为代码的能力;基准使用人工整理的484个真实网页作为测试用例,其中GPT-4V表现最优。

  • Scaling Rectified Flow Transformers for High-Resolution Image Synthesis,作者Esser、Kulal、Blattmann等(3月5日),https://arxiv.org/abs/2403.03206
    该工作改进了用于高分辨率文本到图像合成的整流流模型,优化了噪声采样,并提出了一种全新的Transformer架构,提升了文本理解能力与图像质量;通过大量评估与人类偏好评分,证明了该方法的更优性能。

  • Enhancing Vision-Language Pre-training with Rich Supervisions,作者Gao、Shi、Zhu等(3月5日),https://arxiv.org/abs/2403.03346
    强监督截图预训练(S4)提出了一种全新的视觉-语言模型预训练范式,使用网页截图数据,并利用HTML元素固有的树状层级结构。

  • Evolution Transformer: In-Context Evolutionary Optimization,作者Lange、Tian、Tang(3月5日),https://arxiv.org/abs/2403.02985
    提出的演化Transformer采用因果Transformer架构,用于元优化。

  • *** The WMDP Benchmark: Measuring and Reducing Malicious Use With Unlearning**,作者Li、Pan、Gopal等(3月5日),https://arxiv.org/abs/2403.03218
    WMDP基准是一个经过精心整理的数据集,包含4000余个问题,用于评估并降低大语言模型在生物安全、网络安全等易被滥用领域的知识。

  • Vision-RWKV: Efficient and Scalable Visual Perception with RWKV-Like Architectures,作者Duan、Wang、Chen等(3月4日),https://arxiv.org/abs/2403.02308
    VRWKV将NLP领域的RWKV模型适配到计算机视觉领域,在分类任务的速度与内存占用上优于DeiT等视觉Transformer(ViT),并且在密集预测任务中表现出色。

  • Training-Free Pretrained Model Merging,作者Xu、Yuan、Wang等(3月4日),https://arxiv.org/abs/2403.01753
    提出的模型合并框架解决了模型合并时权重空间与激活空间的单元相似性不一致的难题,通过线性融合两个空间的相似性矩阵,提升了多任务模型的性能。

  • The Hidden Attention of Mamba Models,作者Ali、Zimerman、Wolf(3月3日),https://arxiv.org/abs/2403.01590
    该论文证明,Mamba这类选择性状态空间模型,可以被视为注意力驱动的模型。

  • Improving LLM Code Generation with Grammar Augmentation,作者Ugare、Suresh、Kang(3月3日),https://arxiv.org/abs/2403.01632
    SynCode是一个提升大语言模型代码生成能力的框架,利用编程语言的语法(本质是离线构建的高效查找表)进行语法验证,将大语言模型的词表约束为仅包含语法合法的token。

  • Learning and Leveraging World Models in Visual Representation Learning,作者Garrido、Assran、Ballas等(3月1日),https://arxiv.org/abs/2403.00504
    该研究拓展了流行的联合嵌入预测架构(JEPA),提出了图像世界模型(IWM),超越了掩码图像建模的范畴。


本杂志是一个个人兴趣项目,不提供直接报酬。如果您希望支持我,欢迎购买https://sebastianraschka.com/books/ 上的书籍。如果您觉得这些书有洞见、有帮助,也欢迎推荐给您的朋友和同事。

figure15

https://www.amazon.com/Machine-Learning-PyTorch-Scikit-Learn-scikit-learn-ebook-dp-B09NW48MR1/dp/B09NW48MR1/、https://nostarch.com/machine-learning-and-ai-beyond-basics、http://mng.bz/M96o

您的支持对我意义重大!非常感谢!

【转载】LoRA的继任者、小型微调大语言模型 vs 通用大语言模型,以及透明化大语言模型研究

原文地址:A LoRA Successor, Small Finetuned LLMs Vs Generalist LLMs, and Transparent LLM Research,by Sebastian Raschka, on 2024-03-03

LoRA的继任者、小型微调大语言模型 vs 通用大语言模型,以及透明化大语言模型研究

2024年3月3日

AI研究领域又度过了精彩纷呈的一个月。本月,我将介绍两款全新的开源大语言模型(LLM)、关于小型微调大语言模型的深度洞察,以及一种新型参数高效的大语言模型微调技术。

上述两款大语言模型之所以脱颖而出,原因有几点。其中一款大语言模型(OLMo)是完全开源的,这意味着从训练代码、数据集到日志文件的所有内容都全部公开共享。

另一款大语言模型(Gemma)同样提供开源权重,在多项基准测试中取得了当前最优的性能,并且以大幅优势超越了Llama 2 7B、Mistral 7B等同尺寸的主流大语言模型。

不过,在讨论这款新型大语言模型的架构优化细节之前,我们先从下文的《Tiny Titans》论文入手,更深入地探讨小型大语言模型的实用价值。

1) Tiny Titans:小型语言模型能否在真实会议摘要任务中实现越级表现?

在这篇论文(https://arxiv.org/abs/2402.00841)中,研究人员试图解答一个价值百万美元的问题:参数量低于20亿的“小型”微调大语言模型,能否超越Llama 2 Chat这类更大的开源大语言模型,以及GPT-3.5这类闭源商业大语言模型?

答案并非非黑即白。在讨论细节之前,下表汇总了相关实验结果。

figure01

带标注的表格(来源:https://arxiv.org/abs/2402.00841),展示了现有大语言模型与小型微调大语言模型的文本摘要性能对比

在上表中,“零样本(zero-shot)”指这些模型未在会议数据和摘要任务上进行额外微调,而是直接开箱即用——要么通过开源权重直接部署(如Llama 2 7B Chat),要么调用其商业API(如GPT-3.5)。

但需要注意一个重要前提:尽管这些“零样本”模型没有经过论文作者的额外微调,但它们在原生训练阶段已经完成了大规模的指令微调,其中就包含文本摘要生成任务。

从结果来看,FLAN-T5-Large在领域内数据集(即互联网上无法获取的真实会议数据)类别中表现一骑绝尘,因此我们可以部分给出肯定答案:小型微调大语言模型确实能够超越更大的现有大语言模型。但为什么它在QMSUM-I数据集上的表现远逊于GPT-3.5、Mixtral-8x7B这类模型?原因可能有两方面。

第一,GPT-3.5和Mixtral在训练过程中可能已经使用了部分公开的QMSUM数据(由于模型训练所用数据的细节并未公开,我们无法下定论)。

第二种合理的解释是,FLAN-T5-Large的上下文窗口限制为2048个token,而QMSUM数据集的输入长度是它的4-5倍,如下表所示。

figure02

带标注的表格(来源:https://arxiv.org/abs/2402.00841),展示了不同数据集的文本长度差异

自动化评估指标是否可靠?

除了上文讨论的截断问题之外,ROUGE分数这类自动化评估指标(相关代码:https://github.com/rasbt/MachineLearning-QandAI-book/blob/main/supplementary/q19-evaluation-llms/rouge.ipynb)究竟是否可靠?

总体而言,摘要任务的ROUGE分数被认为可以有效评估机器生成摘要与参考摘要之间的重合度,尤其是在n元语法重叠、词语序列和词对匹配层面。但这类指标无法全面衡量摘要在连贯性、可读性或事实准确性方面的质量,因此并非完美的评估工具。为此,研究人员也开展了人工评估,结果汇总如下表。

figure03

带标注的表格(来源:https://arxiv.org/abs/2402.00841),展示人工评估结果,分数越高表现越好

基于上表结果,FLAN在领域内数据集上的表现显著优于Llama 2 7B,与GPT-3.5基本持平。而它在QMSUM-I数据集上的短板,与我们之前看ROUGE分数时观察到的情况一致。

另外需要注意的是,金标准参考摘要是由GPT-4生成的。假设GPT-3.5的预训练和指令微调方式与GPT-4相近,我推测结果会略微偏向GPT-3.5。

为什么小型模型的表现相对欠佳?

总体来看,除了在领域内数据集上的FLAN-T5之外,我们发现小型微调大语言模型的表现普遍弱于更大的大语言模型。

原因之一是它们的上下文窗口有限,导致输入数据被截断,这对生成摘要任务来说十分不利。可以通过在训练和推理阶段扩展上下文长度来解决这个问题,而这并不一定需要增大模型参数量。

另一个原因可能是模型在中间状态下存储和处理信息的能力更弱。要验证这一点,我们至少需要训练一批上下文长度各不相同的大语言模型进行对比。

本次实验中,小型大语言模型的目标任务是摘要任务微调。但摘要微调本身也是大型闭源大语言模型训练中的重要组成部分。换句话说,我们对比的其实是“大型微调大语言模型”和“小型微调大语言模型”。如果换成大语言模型指令微调流程中从未覆盖过的全新领域特定任务,对比结果会很有意思。

核心结论

Mixtral(我在2024年1月的研究论文盘点中介绍过:https://magazine.sebastianraschka.com/p/research-papers-in-january-2024)的表现十分出色!而参数量小得多的FLAN-T5,在特定微调任务中依然是非常优秀的模型。

2) DoRA:权重分解式低秩适配

在这篇论文(https://arxiv.org/abs/2402.09353)中,研究人员提出了LoRA的一种创新替代方案。LoRA是目前大语言模型和视觉Transformer中应用最广泛的参数高效微调方法。我原本只打算在本文中简单介绍它,但这个方法实在太有意思,我几周前就忍不住自己动手实现了一遍。

想要了解更多细节和论文解读的读者,可以查看我写的这篇深度文章,其中包含了DoRA的从零实现指南:
https://magazine.sebastianraschka.com/p/lora-and-dora-from-scratch

《Ahead of AI》是一份由读者支持的出版物。想要接收新文章并支持我的创作,欢迎注册免费订阅或付费订阅。

3) OLMo:推动语言模型科学发展

论文(https://arxiv.org/abs/2402.00838)中的“OLMo”全称为Open Language Model(开放语言模型),是近期发布的一款开源大语言模型,提供10亿和70亿参数量两个版本。OLMo的特别之处在于,研究人员不仅公开了模型权重(https://huggingface.co/allenai/OLMo-7B),还公开了全部训练细节,包括训练代码(https://github.com/allenai/OLMo)、训练数据集Dolma(https://huggingface.co/datasets/allenai/dolma)、模型评估代码(https://github.com/allenai/OLMo-Eval)、训练日志报告(https://wandb.ai/ai2-llm/OLMo-7B/reports/OLMo-7B–Vmlldzo2NzQyMzk5)以及指令微调代码(https://github.com/allenai/open-instruct)。

我非常推荐大家去读OLMo的原论文。虽然我希望论文能包含更多深度洞察和分析,但光是里面列出的各类架构细节选择和超参数配置,就已经对我自己的实验很有帮助了。这里分享两个值得注意的设计:

  • 他们在所有线性层中禁用了偏置向量(与Llama的设计类似),以提升训练稳定性。
  • 他们没有使用标准的层归一化(LayerNorm,包含可训练的缩放和偏移参数)或RMSNorm,而是采用了一种不含任何可训练参数的层归一化变体。

此外,下表列出了OLMo与其他主流大语言模型在架构上的核心差异。

figure04

OLMo架构细节(来源:OLMo论文,https://arxiv.org/abs/2402.00838

不仅如此,OLMo论文还给出了AdamW优化器的超参数和学习率的详细信息,汇总如下表。

figure05

OLMo优化器配置(来源:OLMo论文,https://arxiv.org/abs/2402.00838

在学习率方面,他们采用了5000步(约210亿token)的热身阶段,随后使用线性衰减(而非余弦衰减)将学习率降至表中数值的十分之一。同时,他们将梯度的L2范数最大值裁剪为1.0。

最后值得一提的是,他们使用了线性学习率调度而非余弦调度来衰减学习率,如下对比表所示:

figure06

OLMo训练参数(来源:OLMo论文,https://arxiv.org/abs/2402.00838

这些设计选择都很有意思,但OLMo的实际性能和其他大语言模型相比如何?结果表明,OLMo的性能与Llama 2和Falcon相当,如下表所示。

figure07

OLMo与其他主流大语言模型对比(来源:OLMo论文,https://arxiv.org/abs/2402.00838

尽管论文没有针对部分超参数和架构选择做额外的消融实验,但所有训练日志都可以在W&B平台上查看,我们未来几周或几个月里可以自己做分析。总的来说,我认为OLMo是对开源社区和研究领域的极佳贡献,非常感谢作者公开了所有代码和训练产物。

从零搭建大语言模型

如果你想要通过从零搭建大语言模型(仅使用PyTorch,不借助外部大语言模型库)来加深理解,我的新书《从零构建大语言模型》(https://www.manning.com/books/build-a-large-language-model-from-scratch)的第4章已经在Manning的抢先体验版中上线了。

figure08

《从零构建大语言模型》相关仓库:https://github.com/rasbt/LLMs-from-scratch,书籍地址:https://www.manning.com/books/build-a-large-language-model-from-scratch

4) Gemma

当然,我们必须聊聊Gemma——谷歌近期推出的大语言模型系列。Gemma大语言模型基于Gemini架构构建,共有四个版本:预训练的Gemma 2B和7B基础模型,以及经过指令微调的Gemma 2B和7B模型。

除了模型权重(https://huggingface.co/google/gemma-7b),谷歌还发布了一份技术报告(https://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf),我们将在下文详细解读。

Gemma的性能表现

Gemma最引人注目的一点,是它相比Llama 2 7B、Mistral等主流开源模型的出色性能,如下图所示:

figure09

带标注的性能对比图,来源:https://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf

目前尚不完全清楚上述分数对应的是预训练版本还是指令微调版本;不过我推测,这些结果大概率代表指令微调模型的性能。

Gemma为何能有如此出色的表现?论文中没有明确说明原因,但我推测主要得益于以下两点:

  • 25.6万的超大词表(相比之下,Llama的词表仅为3.2万);
  • 规模达6万亿token的海量训练数据集(Llama的训练数据量仅为其三分之一)。

此外,我和同事在将Gemma接入我们的开源项目Lit-GPT(https://github.com/Lightning-AI/lit-gpt)时发现,它的整体架构与Llama 2高度相似。我们在下一节详细分析这一点。

Gemma架构深度解析

Gemma背后有哪些有意思的设计选择?如上所述,它的词表规模很大,对应的嵌入矩阵尺寸也很大。下表对比了Gemma、Llama 2 7B和我们之前讨论过的OLMo 7B的架构概览。

figure10

Gemma、Llama 2与OLMo的架构对比。表格来源:https://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf

模型规模

另外值得注意的是,Gemma 2B采用了多查询注意力,而Gemma 7B没有。此外,尽管Gemma 7B的总层数更少(28层对比32层),但它的前馈层规模比Llama 2更大。不过,虽然层数更少,Gemma的参数量却相当可观。

尽管它被称作Gemma 7B,但实际总参数量达到93亿;如果考虑权重共享(weight tying),参数量为85亿。权重共享指输入嵌入层和输出投影层使用同一套权重,GPT-2和OLMo 1B都采用了这种设计(OLMo 7B训练时没有使用权重共享)。

归一化层

另一个值得关注的细节是论文中的这段描述:

归一化位置:我们对每个Transformer子层的输入和输出都做归一化,这与仅对其中一侧做归一化的常规做法不同。我们采用RMSNorm(Zhang和Sennrich,2019)作为归一化层。

乍一看,这似乎意味着Gemma在每个Transformer块之后都额外加了一层RMSNorm。但查看源码(https://github.com/keras-team/keras-nlp/blob/34a2cba28f6cb501ade97d6a9e308705d5095ec7/keras_nlp/models/gemma/rms_normalization.py#L39)后会发现,Gemma采用的其实就是GPT-2、Llama 2等其他大语言模型通用的前置归一化方案,如下图所示。

figure11

GPT、Llama 2等大语言模型的典型层归一化位置:Gemma在这一点上并无创新。(图出自我的著作《从零构建大语言模型》,https://www.manning.com/books/build-a-large-language-model-from-scratch

GeGLU激活函数

Gemma与其他架构的一个显著区别是它使用了GeGLU激活函数,该函数出自2020年的这篇论文:https://arxiv.org/abs/2002.05202

GeLU(高斯误差线性单元)是一种越来越流行的激活函数,常作为传统ReLU的替代方案。GeLU的优势在于,它既能引入非线性,又能让负输入值的梯度继续传播,解决了ReLU完全阻断负值的缺陷。

figure12

GELU与ReLU对比图(图出自我的著作《从零构建大语言模型》,https://www.manning.com/books/build-a-large-language-model-from-scratch

而GeGLU是GELU的门控线性单元变体,它将激活分为两部分:一部分是类S型的激活,另一部分是线性投影,两部分的输出按元素相乘,如下图所示:

figure13

如上图所示,GeGLU与Llama 2、Mistral等大语言模型使用的SwiGLU激活函数原理类似,区别仅在于它的基础激活函数是GELU而非Swish。

看这些激活函数的伪代码会更容易理解:

# Feedforward module with GELU (GPT-2)
x = linear(x)
x = gelu(x)
x = linear_projection(x)

# Feedforward module with SwiGLU (Llama 2)
x_1 = self.linear_1(x)
x_2 = self.linear_2(x)
x = silu(x_1) * x_2
x = linear_projection(x)

# Feedforward module with GeGLU (Gemma)
x_1 = self.linear_1(x)
x_2 = self.linear_2(x)
x = gelu(x_1) * x_2
x = linear_projection(x)

需要注意的是,与使用普通GELU的前馈模块(只有一个线性层)相比,使用SwiGLU和GeGLU的前馈模块实际上多了一个线性层(分为linear_1和linear_2)。不过在GeGLU和SwiGLU前馈模块中,linear_1和linear_2通常是将单个线性层拆分为两部分得到的,因此不一定会增加参数量。

GeGLU比SwiGLU更好吗?目前还没有消融实验能给出定论。我猜测这个选择可能也只是为了让Gemma和Llama 2略有区分度。

其他设计选择

此外,在为Lit-GPT添加Gemma支持的过程中(https://github.com/Lightning-AI/lit-gpt/pull/941),我们还发现了一些其他有意思的设计选择。

例如,Gemma在RMSNorm层中加了+1的偏移量,并且用隐藏层维度的平方根对嵌入做归一化。后者其实是原始Transformer论文(https://arxiv.org/abs/1706.03762)中的做法,但GPT-2、OLMo等同样使用权重共享的模型并没有这么做。

figure14

摘自《Attention Is All You Need》论文,https://arxiv.org/abs/1706.03762

这些细节在论文中没有提及或讨论,其作用也尚不明确。

我想到一个可能的解释:尽管线性层和嵌入层的本质是一样的(详见我的文章:https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/03_bonus_embedding-vs-matmul/embeddings-and-linear-layers.ipynb),但两者的初始权重尺度不同。而谷歌的研究人员习惯用TensorFlow做实验,乘以嵌入维度的平方根或许是为了让权重尺度更合理,正如我在下面的示例代码中展示的那样。

figure15

将权重乘以嵌入维度的平方根后,权重的尺度就和标准线性层中的权重一致了。

结论

Gemma是开源大语言模型生态的优秀补充。看起来7B版本是一款性能极强的模型,在实际应用场景中有望替代Llama 2和Mistral。

此外,既然目前已经有大量7B左右的开源模型,Gemma 2B反而更值得关注——它可以轻松在单张GPU上运行。看看它和同样27亿参数量的phi-2相比表现如何,会很有意思。

如果你想通过上述的Lit-GPT实现实际使用Gemma,我创建了一个Studio环境:https://lightning.ai/lightning-ai/studios/understanding-using-and-finetuning-gemma

figure16

通过Lit-GPT Studio使用Gemma(地址:https://lightning.ai/lightning-ai/studios/understanding-using-and-finetuning-gemma

2月其他值得关注的研究论文

以下是本月我发现的其他一些有意思的论文。由于列表较长,我用星号(*)标注了10篇我认为特别值得关注的论文。不过请注意,这份列表及解读仅基于我个人的兴趣和与我自身项目的相关性。

  1. 《Griffin:将门控线性循环与局部注意力结合,打造高效语言模型》,作者:De、Smith、Fernando等,2月29日,https://arxiv.org/abs/2402.19427
    该论文提出了Hawk和Griffin两种架构:前者是循环神经网络大语言模型,后者是将循环神经网络单元与局部注意力结合的混合架构,为基于Transformer的大语言模型提供了新的高效替代方案。

  2. 《当缩放定律遇上大语言模型微调:数据、模型与微调方法的影响》,作者:Zhang、Liu、Cherry、Firat,2月27日,https://arxiv.org/abs/2402.17193
    该研究系统探究了模型规模、预训练数据量、微调参数量、微调数据量等缩放因素对大语言模型微调性能的影响,在大语言模型规模超过微调数据规模的场景下,对比了全参数微调与参数高效微调(包括提示微调、LoRA)的效果。

  3. 《Sora生成的视频具备惊人的几何一致性》,作者:Li、Zhou、Zhang等,2月27日,https://arxiv.org/abs/2402.17403
    该论文提出了一套基准测试方法,用于评估Sora模型生成视频对真实物理规律的还原度:将生成的视频转换为3D模型,以3D重建的准确率作为指标衡量模型对物理原理的遵循程度。研究发现,Sora的表现远优于Pika等其他文生视频模型。

  4. * 《1比特大语言模型时代:所有大语言模型都可压缩至1.58比特》,作者:Ma、Wang、Ma等,2月27日,https://arxiv.org/abs/2402.17764
    该研究提出了一种1比特大语言模型变体(仅支持-1、0、1三种取值),在推理阶段的困惑度和下游任务表现上,与传统16比特精度的大语言模型相当。

  5. 《Genie:生成式交互环境》,作者:Bruce、Dennis、Edwards等,2月23日,https://arxiv.org/abs/2402.15391
    Genie是一款开创性的110亿参数量生成式交互环境,基于时空Transformer构建,通过互联网视频无监督训练而成,能够根据文本、图像和草图生成无限多样、可控制动作的虚拟世界。

  6. * 《回归基础:重新审视基于人类反馈学习的REINFORCE式优化方法在大语言模型中的应用》,作者:Ahmadian、Cremer、Galle等,2月22日,https://arxiv.org/abs/2402.14740
    该研究表明,在基于人类反馈的强化学习(RLHF)大语言模型对齐任务中,更简单的REINFORCE式优化方法比近端策略优化(PPO)效率更高、效果更好。

  7. 《TinyLLaVA:小型多模态大模型框架》,作者:Zhou、Hu、Weng等,2月22日,https://arxiv.org/abs/2402.14289
    TinyLLaVA框架证明,小型多模态大模型通过使用高质量数据和优化训练,能够达到甚至超越更大模型的表现——其最佳模型TinyLLaVA-3.1B的性能超过了现有7B级别的多模态模型。

  8. 《大语言模型用于数据标注:综述》,作者:Tan、Beigi、Wang等,2月21日,https://arxiv.org/abs/2402.13446
    该论文探讨了GPT-4等大语言模型在自动化数据标注这一劳动密集型流程中的潜力,重点关注大语言模型在数据标注中的应用、对大语言模型生成标注的评估,以及基于这些标注的模型学习。

  9. * 《LongRoPE:将大语言模型上下文窗口扩展至200万token以上》,作者:Ding、Zhang、Zhang等,2月21日,https://arxiv.org/abs/2402.13753
    LongRoPE是一种新方法,仅需少量微调即可将预训练大语言模型的上下文窗口扩展至204.8万token,通过改进位置插值和渐进式扩展策略,在不同上下文长度下都能保持性能稳定。

  10. 《YOLOv9:利用可编程梯度信息学习你想要的内容》,作者:Wang、Yeh、Liao,2月21日,https://arxiv.org/abs/2402.13616
    该研究针对深度监督机制的信息瓶颈和适用性问题提出了解决方案,推出了YOLOv9,在MS COCO数据集上的效率和表现均优于YOLOv8。

  11. 《神经网络扩散》,作者:Wang、Xu、Zhou等,2月20日,https://arxiv.org/abs/2402.13144
    该研究展示了传统上用于图像和视频生成的扩散模型,如何被用于生成高性能的神经网络参数。

  12. * 《LoRA+:大模型的高效低秩适配》,作者:Hayou、Ghosh、Yu,2月19日,https://arxiv.org/abs/2402.12354
    该论文提出了LoRA+,对原始低秩适配(LoRA)方法做了改进:对适配器矩阵A和B使用不同的学习率以增强特征学习,在不增加额外计算成本的前提下,实现了1-2%的性能提升,微调速度最高可达原来的2倍。

  13. 《迈向跨分词器蒸馏:面向大语言模型的通用对数似然蒸馏损失》,作者:Boizard、Haddad、Hudelot、Colombo,2月19日,https://arxiv.org/abs/2402.12030
    该论文提出了通用对数似然蒸馏损失,能够在不同架构、不同分词器的大语言模型之间实现高效的知识蒸馏,突破了必须使用相同分词器的限制。

  14. 《AnyGPT:基于离散序列建模的统一多模态大语言模型》,作者:Zhan、Dai、Ye、Zhou,2月19日,https://arxiv.org/abs/2402.12226
    AnyGPT是一款多模态语言模型,通过离散表示无缝融合语音、文本、图像和音乐,无需改动大语言模型的核心架构,即可实现灵活的任意模态间交互。

  15. * 《重格式化对齐》,作者:Fan、Li、Zou、Li,2月19日,https://arxiv.org/abs/2402.12219
    该论文提出了ReAlign方法,通过简单的重格式化手段,提升大语言模型微调数据的质量,使其更好地与人类价值观对齐。

  16. 《LongAgent:通过多智能体协作将语言模型上下文扩展至12.8万token》,作者:Zhao、Zu、Xu等,2月18日,https://arxiv.org/abs/2402.11550
    LongAgent通过多智能体协作和智能体间通信机制,提升了大语言模型的长文本处理能力,在文本检索、多跳问答等任务中表现超过GPT-4等模型。

  17. 《Vision-Flan:在视觉指令微调中扩展人工标注任务规模》,作者:Xu、Feng、Shao等,2024年,https://arxiv.org/abs/2402.11690
    该研究提出了Vision-Flan——一个多样化的视觉指令微调数据集,以及一套面向视觉语言模型的两阶段指令微调框架,通过结合专家数据和GPT-4合成数据,解决了泛化性差、存在偏差等问题。

  18. 《OneBit:迈向极低比特大语言模型》,作者:Xu、Han、Yang等,2月17日,https://arxiv.org/abs/2402.11295
    该论文提出了OneBit——一种面向大语言模型的1比特量化感知训练框架,通过新的参数表示和初始化方法,在性能损失极小的情况下,大幅提升了存储和计算效率。

  19. 《FinTral:达到GPT-4水平的多模态金融大语言模型系列》,作者:Bhatia、Nagoudi、Cavusoglu、Abdul-Mageed,2月16日,https://arxiv.org/abs/2402.10986
    FinTral是专为金融分析优化的多模态大语言模型套件,基于Mistral-7B构建,通过领域专属训练和基准测试做了增强,在核心任务上表现超过ChatGPT-3.5和GPT-4,是金融AI领域的优秀案例。

  20. 《生成式表征指令微调》,作者:Muennighoff、Su、Wang等,2月15日,https://arxiv.org/abs/2402.09906
    GRIT是一种新的训练方法,能够让大语言模型GritLM通过遵循指令,在生成任务和嵌入任务中都有出色表现。

  21. 《恢复生成模型的微调前权重》,作者:Horwitz、Kahana、Hoshen,2月15日,https://arxiv.org/abs/2402.10208
    该论文提出了Spectral DeTuning方法,能够从Stable Diffusion、Mistral等大规模微调模型中恢复出微调前的权重。

  22. 《BASE TTS:用10万小时数据打造十亿参数量语音合成模型的经验》,作者:Lajszczak、Cambara、Li等,2月15日,https://arxiv.org/abs/2402.08093
    BASE TTS是亚马逊研究人员推出的新型语音合成模型,基于十亿参数量的Transformer架构,用10万小时数据训练而成,实现了前所未有的语音自然度。

  23. 《Transformer可以实现长度泛化,但鲁棒性不足》,作者:Zhou、Alon、Chen等,2月14日,https://arxiv.org/abs/2402.09371
    该论文探究了语言模型的长度泛化难题,证明标准Transformer通过特定的数据格式和位置编码,可以外推至训练输入长度2.5倍的序列,但这种能力对权重初始化、数据顺序等因素高度敏感。

  24. * 《DoRA:权重分解式低秩适配》,作者:Liu、Wang、Yin等,2月14日,https://arxiv.org/abs/2402.09353
    DoRA是对标准低秩适配(LoRA)的改进,它将预训练权重分解为幅值和方向两部分以实现更高效的参数更新,填补了LoRA这类参数高效微调方法与全参数微调之间的精度差距。

  25. 《混合专家架构为深度强化学习解锁参数缩放能力》,作者:Obando-Ceron、Sokar、Willi等,2月13日,https://arxiv.org/abs/2402.08609
    该论文表明,将混合专家(MoE)模块(尤其是软混合专家)融入基于价值的强化学习网络,能够让模型随规模增长更高效地提升性能,为在强化学习领域建立缩放定律提供了方向。

  26. 《基于RingAttention的百万长度视频与语言世界模型》,作者:Liu、Yan、Zaharia、Abbeel,2月13日,https://arxiv.org/abs/2402.08268
    该研究提出利用RingAttention等最新技术,在超长视频和语言序列组成的海量数据集上训练神经网络。

  27. 《用直接原则反馈抑制“粉红大象”问题》,2月12日,https://arxiv.org/abs/2402.07896
    该研究提出了直接原则反馈(DPF)方法,用于实时调整大语言模型的输出,并在“粉红大象”问题上验证了其效果,成功引导模型避开特定话题。

  28. 《Step-On-Feet微调:通过自举扩展大语言模型的自对齐能力》,作者:Wang、Ma、Meng等,2月12日,https://arxiv.org/abs/2402.07610
    该研究通过Step-On-Feet微调(SOFT)探究了大语言模型的多轮自举自对齐,与单步方法相比,该方法通过迭代对齐和优化训练序列提升了模型性能。

  29. 《Aya模型:经过指令微调的开源多语种语言模型》,作者:Ustun、Aryabumi、Yong等,2月12日,https://arxiv.org/abs/2402.07610
    该研究推出了Aya——一款精通101种语言的多语种生成式语言模型。

  30. 《细粒度混合专家架构的缩放定律》,作者:Jakub Krajewski、Jan Ludziejewski、Kamil Adamczewski等,2月12日,https://arxiv.org/abs/2402.07871
    该研究探究了混合专家(MoE)模型的缩放特性,引入了“粒度”作为调整专家规模的新超参数,并证明了MoE模型优于稠密Transformer模型。

  31. 《利用语言反馈模型改进策略》,作者:Zhong、Misra、Yuan、Cote,2月12日,https://arxiv.org/abs/2402.07876
    语言反馈模型(LFM)利用大语言模型对文本化视觉轨迹的反馈来改进模仿学习,在任务完成率和新环境适配方面优于传统方法,同时还能提供人类可解读的反馈,用于验证最优行为。

  32. 《ODIN:解耦奖励缓解RLHF中的奖励破解问题》,作者:Chen、Zhu、Soselia等,2月11日,https://arxiv.org/abs/2402.07319
    该研究针对大语言模型中的奖励破解问题,设计了更精细的评估协议和改进的奖励模型:通过联合训练两个输出头,让模型更关注内容而非长度,显著降低了长度偏差,提升了策略效果。

  33. 《神经网络可训练性的边界是分形的》,作者:Dickstein,2月9日,https://arxiv.org/abs/2402.06184
    该研究揭示了神经网络训练中存在分形边界,强调在各种配置和规模下,训练动态对超参数的微小调整都极度敏感。

  34. 《混合专家架构中的缓冲区溢出》,作者:Hayes、Shumailov、Yona,2月8日,https://arxiv.org/abs/2402.05526
    该研究表明,混合专家(MoE)模型容易受到基于跨批次依赖的专家路由策略攻击:恶意查询可以影响同一批次中良性查询的输出。

  35. 《基于在线AI反馈的大语言模型直接对齐》,作者:Guo、Zhang、Liu等,2月7日,https://arxiv.org/abs/2402.04792
    该论文提出了一种用于模型训练的在线反馈方法,通过利用大语言模型的实时评估,效果超越了DPO等直接偏好对齐(DAP)方法以及RLHF。

  36. 《无需搜索实现大师级国际象棋水平》,作者:Ruoss、Deletang、Medapati,2月7日,https://arxiv.org/abs/2402.04494
    这篇来自谷歌DeepMind的论文提出了一个“小型”2.7亿参数量的Transformer模型,在1000万局国际象棋对局上训练而成,棋力表现超过了AlphaZero的网络和GPT-3.5-turbo-instruct。

  37. 《Self-Discover:大语言模型自组合推理结构》,作者:Zhou、Pujara、Ren等,2月6日,https://arxiv.org/abs/2402.03620
    SELF-DISCOVER框架让大语言模型能够自主构建推理策略,以更高的效率提升问题解决能力,且具备跨模型适用性,其推理方式可能更接近人类。

  38. 《视觉超对齐:视觉基础模型的弱到强泛化》,作者:Guo、Chen、Wang等,2月6日,https://arxiv.org/abs/2402.03749
    该论文通过自适应置信度损失进行知识蒸馏,探究了视觉基础模型中的弱到强泛化,证明较弱的模型可以有效增强更强模型的性能,是视觉任务AI能力的重要进展。

  39. 《MOMENT:开源时间序列基础模型系列》,作者:Goswami、Szafer、Choudhry等,2月6日,https://arxiv.org/abs/2402.03885
    MOMENT提出了一种基于开源基础模型的通用时间序列分析新方法,通过构建“时间序列堆”数据集,并设计低监督场景下的模型评估基准,解决了时间序列数据集不统一、多数据集训练难度大等挑战。

  40. 《大语言模型下游任务性能的缩放定律》,作者:Isik、Ponomareva、Hazimeh等,2月6日,https://arxiv.org/abs/2402.04177
    该研究探究了预训练数据的规模和相关性如何影响大语言模型的机器翻译性能,发现数据对齐会提升效果,而错位则可能导致结果波动。

  41. 《点积注意力可解模型中位置学习与语义学习的相变》,作者:Cui、Behrens、Krzakala、Zdeborova,2月6日,https://arxiv.org/abs/2402.03902
    该研究探究了点积注意力层如何学习关注数据中的位置或语义,揭示了当数据量足够时,这些层会从位置注意力机制过渡到语义注意力机制,从而超越线性模型的表现。

  42. 《MobileVLM V2:更快更强的视觉语言模型基线》,作者:Chu、Qiao、Zhang等,2月6日,https://arxiv.org/abs/2402.03766
    MobileVLM V2推出了小型高效的视觉语言模型,性能超越更大的模型:17亿版本持平或超过30亿规模的模型,30亿版本则超过70亿以上规模的模型。

  43. 《DeepSeekMath:突破开源语言模型数学推理的极限》,作者:Shao、Wang、Zhu等,2月5日,https://arxiv.org/abs/2402.03300
    DeepSeekMath 7B是在1200亿数学相关token上预训练的大语言模型,通过挖掘网页数据,并引入组相对策略优化(PPO的替代方案)提升数学推理能力,在MATH基准上取得了51.7%的分数,接近Gemini Ultra和GPT-4等顶尖模型的水平。

  44. 《更多智能体就是你所需的全部》,作者:Li、Zhang、Yu、Fu、Ye,2月3日,https://arxiv.org/abs/2402.05120
    该研究表明,通过对多个大语言模型采用简单的多数投票集成方法,可以提升模型性能,且这种提升与现有方法互补,在难度更高的任务中效果更明显。

  45. 《FindingEmo:面向真实场景情感识别的图像数据集》,作者:Mertens、Yargholi、Op de Beeck等,2月2日,https://arxiv.org/abs/2402.01355
    FindingEmo是一个全新的情感识别标注数据集,包含2.5万张图像,聚焦自然场景中的复杂多人情境,数据集和源码均已公开。

  46. * 《LiPO:基于排序学习的列表式偏好优化》,作者:Liu、Qin、Wu等,2月2日,https://arxiv.org/abs/2402.01878
    该研究提出了列表式偏好优化(LiPO)方法,将大语言模型对齐转化为列表排序问题,利用人类反馈进行优化,证明LiPO的效果优于DPO等现有策略优化方法。

  47. * 《跟着我复述:Transformer在复制任务上优于状态空间模型》,作者:Jelassi、Brandfonbrener、Kakade、Malach,2月1日,https://arxiv.org/abs/2402.01032
    该论文证明,尽管状态空间模型在推理效率上有优势,但受限于固定大小的隐状态,在需要复制输入上下文的任务上,它们的表现不如Transformer。

  48. * 《Tiny Titans:小型大语言模型能否在真实会议摘要任务中实现越级表现?》,作者:Fu、Laskar、Khasanonva等,2月1日,https://arxiv.org/abs/2402.00841
    该研究发现,FLAN-T5等紧凑型大语言模型在会议摘要等特定任务上,效率和表现可以持平甚至超越更大的模型,作为高性价比的部署方案具有实用价值。

  49. * 《OLMo:推动语言模型科学发展》,作者:Groeneveld、Beltagy、Walsh等,2月1日,https://arxiv.org/abs/2402.00838
    这份技术报告介绍了完全开源的大语言模型OLMo,以及包含训练数据、训练代码、评估代码在内的完整框架。

  50. 《大语言模型的高效探索》,作者:Dwaracherla、Asghari、Hao、Van Roy,2月1日,https://arxiv.org/abs/2402.00396
    该研究论文证明,高效探索生成人类反馈查询的不同方式,能够通过基于收到的反馈持续优化奖励模型,用更少的查询大幅提升大语言模型的性能。

《机器学习与AI问答》

我非常激动,《机器学习与AI问答》终于要出版了,这周我刚收到了作者样书。

如果你正在寻找新的学习资源来加深对机器学习和AI概念的理解,《机器学习与AI问答》以通俗易懂的方式讲解了中高级概念。

figure17

书籍地址:https://nostarch.com/machine-learning-and-ai-beyond-basics

《Ahead of AI》是我的个人兴趣项目,没有直接的商业收益。如果你愿意支持我的工作,非常欢迎购买我的书。
https://nostarch.com/machine-learning-and-ai-beyond-basics
https://www.amazon.com/Machine-Learning-AI-Beyond-Basics/dp/1718503768

【转载】改进LoRA:从零实现权重分解低秩适配DoRA

原文地址:Improving LoRA: Implementing Weight-Decomposed Low-Rank Adaptation (DoRA) from Scratch,by Sebastian Raschka, on 2024-02-19

改进LoRA:从零实现权重分解低秩适配DoRA

低秩适配(Low-Rank Adaptation,简称LoRA)是一种机器学习技术,它仅调整模型参数中一个小型的低秩子集,即可修改预训练模型(例如大语言模型或视觉Transformer),使其更好地适配特定的(通常规模较小的)数据集。

该方法的重要意义在于,它支持在任务特定数据上对大模型进行高效微调,大幅降低了微调所需的计算成本(与)时间。

上周,研究人员提出了LoRA的一种全新替代方案:https://arxiv.org/abs/2402.09353,其性能可能大幅超越LoRA。

figure01
DoRA是标准LoRA的一种极具潜力的替代方案(图注来自DoRA论文:https://arxiv.org/abs/2402.09353

为了理解这些方法的工作原理,本文将从零开始,用PyTorch实现LoRA(与)DoRA两种算法!

LoRA 回顾

在深入讲解DoRA之前,我们先简要回顾一下https://arxiv.org/abs/2106.09685中LoRA的工作原理。

由于大语言模型体量庞大,受GPU显存限制,训练时更新全部模型权重的成本很高。假设某一层有一个大型权重矩阵$W$,在反向传播过程中,我们会得到一个$\Delta W$矩阵,它包含了为最小化训练损失函数,需要对原始权重进行的更新幅度信息。

在常规训练(与)微调中,权重更新的公式如下:
$$W_{\text{updated}} = W + \Delta W$$

https://arxiv.org/abs/2106.09685 提出的LoRA方法提供了一种更高效的替代方案:它不去直接计算权重更新量$\Delta W$,而是学习$\Delta W$的近似值,即$\Delta W \approx AB$。换言之,在LoRA中,权重更新公式如下,其中$A$和$B$是两个小型权重矩阵:
$$W_{\text{updated}} = W + A \cdot B$$
(“$A \cdot B$”中的“$\cdot$”代表矩阵乘法。)

下图并排展示了全量微调(与)LoRA微调的公式原理。

figure02
图:常规微调(左)(与)LoRA微调(右)示意图

LoRA是如何节省GPU显存的?假设预训练权重矩阵$W$是$1000 \times 1000$(的LoRA矩阵),那么常规微调中的权重更新矩阵$\Delta W$同样是$1000 \times 1000$(的LoRA矩阵),此时$\Delta W$包含1,000,000个参数。如果我们取LoRA的秩为2,那么$A$是$1000 \times 2$(的LoRA矩阵),$B$是$2 \times 1000$(的LoRA矩阵),使用LoRA时仅需要更新$2 \times 2 \times 1000 = 4000$个参数。在这个例子中,秩为2的LoRA参数量仅为全量更新的1/250。

当然,$A$和$B$无法捕捉$\Delta W$所能包含的全部信息,但这是刻意设计的。使用LoRA时,我们基于这样一个假设:模型需要满秩的大型矩阵$W$来捕获预训练数据集中的全部知识;但在微调大语言模型时,我们不需要更新所有权重,用比$\Delta W$少得多的参数就能捕获适配任务的核心信息,因此我们通过$AB$实现低秩更新。

如果你仔细观察,上图中全量微调(与)LoRA的图示和我之前给出的公式看起来略有不同。这是因为矩阵乘法的分配律:我们不必将权重(与)更新量合并,而是可以分开保存。例如,设$x$为输入数据,那么常规微调可以写成:
$$x \cdot (W+\Delta W) = x \cdot W + x \cdot \Delta W$$

同理,LoRA可以写成:
$$x \cdot (W+A \cdot B) = x \cdot W + x \cdot A \cdot B$$

LoRA权重矩阵可以分开保存的特性,让LoRA极具实用价值。在实际应用中,这意味着我们完全不需要修改预训练模型的权重,只需在推理时动态叠加LoRA矩阵即可。如果你需要为多个客户提供模型托管服务,这一点尤其有用:你不必为每个客户保存一份庞大的更新后模型,只需在原始预训练模型之外,保存一组小型的LoRA权重即可。

为了让这个概念不那么抽象,并提供更直观的理解,我们将在下一节从零开始用代码实现LoRA。

LoRA层的代码实现

我们首先初始化一个LoRALayer层,它会创建矩阵$A$和$B$,以及alpha缩放超参数和秩超参数。该层可以接收输入并计算对应的输出,如下图所示。

figure03
秩为r的LoRA矩阵A与B示意图

在代码中,上图所示的LoRA层实现如下:

import torch.nn as nn  
class LoRALayer(nn.Module):    
    def __init__(self, in_dim, out_dim, rank, alpha):        
        super().__init__()        
        std_dev = 1 / torch.sqrt(torch.tensor(rank).float())        
        self.A = nn.Parameter(torch.randn(in_dim, rank) * std_dev)        
        self.B = nn.Parameter(torch.zeros(rank, out_dim))        
        self.alpha = alpha    

    def forward(self, x):        
        x = self.alpha * (x @ self.A @ self.B)        
        return x

在上述代码中,rank(秩)是控制矩阵$A$和$B$内部维度的超参数。换言之,该参数决定了LoRA引入的额外参数量,是平衡模型适配能力(与)参数效率的关键因素。

第二个超参数alpha是作用于低秩适配输出的缩放超参数。它本质上控制了适配层的输出对被适配层原始输出的影响程度,可以看作是调节低秩适配对层输出影响大小的手段。

到目前为止,我们实现的LoRALayer类可以对层输入$x$进行变换。但在LoRA的实际应用中,我们通常需要替换已有的线性(Linear)层,从而将权重更新作用到现有的预训练权重上,如下图所示:

figure04
应用于现有线性层的LoRA

为了融入上图所示的原始线性层权重,我们将实现一个LinearWithLoRA层,它复用之前实现的LoRALayer,可用于替换神经网络中已有的线性层,例如大语言模型中的自注意力模块或前馈模块:

class LinearWithLoRA(nn.Module):    
    def __init__(self, linear, rank, alpha):        
        super().__init__()        
        self.linear = linear        
        self.lora = LoRALayer(            
            linear.in_features, linear.out_features, rank, alpha        
        )    

    def forward(self, x):        
        return self.linear(x) + self.lora(x)

注意,由于我们在LoRA层中将权重矩阵$B$(LoRALayer中的self.B)初始化为零值,$A$(与)$B$(的LoRA矩阵)乘法结果是一个全零矩阵,因此不会影响原始权重(因为给原始权重加0不会改变其数值)。

我们用一个仅含单个线性层的小型神经网络层来测试LoRA:

输入:

torch.manual_seed(123)
layer = nn.Linear(10, 2)
x = torch.randn((1, 10)) 
print("Original output:", layer(x))

输出:

Original output: tensor([[0.6639, 0.4487]], grad_fn=&#x3C;AddmmBackward0>)

现在,我们给这个线性层加上LoRA,可以看到输出结果和原来完全一致,因为我们还没有训练LoRA的权重。也就是说,一切都符合预期:

输入:

layer_lora_1 = LinearWithLoRA(layer, rank=2, alpha=4)
print("LoRA output:", layer_lora_1(x))

输出:

LoRA output: tensor([[0.6639, 0.4487]], grad_fn=&#x3C;AddmmBackward0>)

之前我提到了矩阵乘法的分配律:
$$x \cdot (W+A \cdot B) = x \cdot W + x \cdot A \cdot B$$

这意味着我们也可以将LoRA矩阵(与)原始权重合并,得到等效的实现方式。在代码中,LinearWithLoRA层的这种替代实现方式如下:

class LinearWithLoRAMerged(nn.Module):    
    def __init__(self, linear, rank, alpha):        
        super().__init__()        
        self.linear = linear        
        self.lora = LoRALayer(            
            linear.in_features, linear.out_features, rank, alpha        
        )    

    def forward(self, x):        
        lora = self.lora.A @ self.lora.B # Combine LoRA matrices        
        # Then combine LoRA with orig. weights        
        combined_weight = self.linear.weight + self.lora.alpha*lora.T        
        return F.linear(x, combined_weight, self.linear.bias)

简而言之,LinearWithLoRAMerged计算的是等式$x \cdot (W+A \cdot B) = x \cdot W + x \cdot A \cdot B$的左侧,而LinearWithLoRA计算的是右侧——二者是等价的。

我们可以通过以下代码验证它的输出和之前完全一致:

输入:

layer_lora_2 = LinearWithLoRAMerged(layer, rank=2, alpha=4)
print("LoRA output:", layer_lora_2(x))

输出:

LoRA output: tensor([[0.6639, 0.4487]], grad_fn=&#x3C;AddmmBackward0>)

现在我们已经有了可运行的LoRA实现,下一节将介绍如何将它应用到神经网络中。

《Ahead of AI》是一份读者支持的出版物。想要接收新文章并支持我的创作,欢迎成为免费或付费订阅者。

应用LoRA层

我们为什么要用PyTorch模块以这种方式实现LoRA?因为这种方法可以让我们轻松地将现有神经网络中的线性层(例如大语言模型的前馈模块或注意力模块)替换为我们新的LinearWithLoRA(或LinearWithLoRAMerged)层。

为简单起见,我们暂时不用大语言模型,而是聚焦于一个小型的3层多层感知机,如下图所示:

figure05
一个简单的3层多层感知机

在代码中,我们可以这样实现上图的多层感知机:

输入:

class MultilayerPerceptron(nn.Module):    
    def __init__(self, num_features, num_hidden_1, num_hidden_2, num_classes):        
        super().__init__()        
        self.layers = nn.Sequential(            
            nn.Linear(num_features, num_hidden_1),            
            nn.ReLU(),            
            nn.Linear(num_hidden_1, num_hidden_2),            
            nn.ReLU(),            
            nn.Linear(num_hidden_2, num_classes)        
        )    

    def forward(self, x):        
        x = self.layers(x)        
        return x  

model = MultilayerPerceptron(    
    num_features=num_features,    
    num_hidden_1=num_hidden_1,    
    num_hidden_2=num_hidden_2,    
    num_classes=num_classes 
)  
print(model)

输出:

MultilayerPerceptron(  
  (layers): Sequential(    
    (0): Linear(in_features=784, out_features=128, bias=True)    
    (1): ReLU()    
    (2): Linear(in_features=128, out_features=256, bias=True)    
    (3): ReLU()    
    (4): Linear(in_features=256, out_features=10, bias=True)  
  ) 
)

使用LinearWithLoRA,我们可以替换多层感知机模型中的原始线性层,从而加入LoRA层:

输入:

model.layers[0] = LinearWithLoRA(model.layers[0], rank=4, alpha=8)
model.layers[2] = LinearWithLoRA(model.layers[2], rank=4, alpha=8)
model.layers[4] = LinearWithLoRA(model.layers[4], rank=4, alpha=8) 
print(model)

输出:

MultilayerPerceptron(  
  (layers): Sequential(    
    (0): LinearWithLoRA(      
      (linear): Linear(in_features=784, out_features=128, bias=True)      
      (lora): LoRALayer()    
    )    
    (1): ReLU()    
    (2): LinearWithLoRA(      
      (linear): Linear(in_features=128, out_features=256, bias=True)      
      (lora): LoRALayer()    
    )    
    (3): ReLU()    
    (4): LinearWithLoRA(      
      (linear): Linear(in_features=256, out_features=10, bias=True)      
      (lora): LoRALayer()    
    )  
  ) 
)

接下来,我们可以冻结原始线性层,仅让LoRALayer层可训练,方法如下:

输入:

def freeze_linear_layers(model):    
    for child in model.children():        
        if isinstance(child, nn.Linear):            
            for param in child.parameters():                
                param.requires_grad = False        
        else:            
            # Recursively freeze linear layers in children modules            
            freeze_linear_layers(child)  

freeze_linear_layers(model)
for name, param in model.named_parameters():    
    print(f"{name}: {param.requires_grad}")

输出:

layers.0.linear.weight: False
layers.0.linear.bias: False
layers.0.lora.A: True
layers.0.lora.B: True
layers.2.linear.weight: False
layers.2.linear.bias: False
layers.2.lora.A: True
layers.2.lora.B: True
layers.4.linear.weight: False
layers.4.linear.bias: False
layers.4.lora.A: True
layers.4.lora.B: True

通过上面的TrueFalse值,我们可以直观地确认现在只有LoRA层是可训练的(True代表可训练,False代表冻结)。在实际应用中,我们就可以用这个LoRA配置的网络在新数据集或新任务上进行训练。

为了不让文章过于冗长,我省略了训练该模型的样板代码。如果你对完整代码感兴趣,可以在这里找到独立的代码笔记本:https://github.com/rasbt/dora-from-scratch

此外,如果你想了解从零开始的LoRA讲解以及在大语言模型上的应用,也可以查看我的Lightning Studio:https://lightning.ai/lightning-ai/studios/code-lora-from-scratch

理解权重分解低秩适配(DoRA)

你可能已经注意到,我们花了很多时间来实现和讲解LoRA。这是因为DoRA(https://arxiv.org/abs/2402.09353)可以看作是在LoRA基础上的改进(与)扩展,我们现在可以很方便地复用之前的部分代码来实现DoRA。

DoRA可以分为两个步骤:第一步是将预训练权重矩阵分解为幅值向量($m$)和方向矩阵($V$);第二步是对方向矩阵$V$应用LoRA,同时单独训练幅值向量$m$。

这种将向量分解为幅值和方向分量的思路,源于一个数学原理:任意向量都可以表示为其幅值(表示长度的标量)(与)方向(表示空间朝向的单位向量)的乘积。

figure06
单个向量的方向(与)幅值示意图。例如,对于二维向量[1, 2],我们可以将其分解为幅值2.24和方向向量[0.447, 0.894],而$2.24 \times [0.447, 0.894] = [1, 2]$。

在DoRA中,我们将这种幅值-方向分解应用到整个预训练权重矩阵$W$上,而不是单个向量。权重矩阵的每一列(向量)对应连接所有输入到某个输出神经元的权重。

因此,分解$W$后得到的幅值向量$m$,代表了权重矩阵中每一列向量的尺度或长度,如下图所示。

figure07
DoRA中权重矩阵分解示意图

随后,DoRA对方向矩阵$V$应用标准LoRA,例如:
$$W’ = m \cdot (V + \Delta V)/\text{norm} = m \cdot (W + AB)/\text{norm}$$

这里的归一化(为了不让概述过于复杂,我简称为“norm”)基于Salimans和Kingma在2016年提出的权重归一化方法,参见https://arxiv.org/abs/1602.07868

DoRA的两步流程(分解预训练权重矩阵、对方向矩阵应用LoRA)在下面DoRA论文的图中有进一步说明。

figure08
来自DoRA论文的带注释示意图(https://arxiv.org/abs/2402.09353

研发DoRA的动机,源于对LoRA(与)全量微调学习模式的分析对比。DoRA的作者发现,LoRA对幅值和方向的更新是成比例增减的,无法像全量微调那样仅对方向做细微调整。因此,研究人员提出将幅值分量(与)方向分量解耦。

换言之,DoRA方法的目标是仅对方向分量$V$应用LoRA,同时让幅值分量$m$可以单独训练。

引入幅值向量$m$后,DoRA的参数量仅比LoRA多0.01%。但研究人员发现,在大语言模型和视觉Transformer的基准测试中,即使DoRA的秩减半(即参数量仅为常规LoRA的一半),其性能依然优于LoRA,如下方性能对比图所示。

figure09
DoRA论文中LoRA(与)DoRA的对比(https://arxiv.org/abs/2402.09353

正如我几个月前在另一篇文章中所写,LoRA需要仔细调整秩才能优化性能:https://magazine.sebastianraschka.com/p/practical-tips-for-finetuning-llms。但如下图的对比所示,DoRA对秩的变化鲁棒性要强得多。

figure10
DoRA对秩超参数的鲁棒性优于LoRA(图注来自DoRA论文:https://arxiv.org/abs/2402.09353

DoRA可以在秩相对较小的情况下取得良好效果,这让该方法比LoRA的参数效率更高。

总的来说,这些结果让我印象深刻,将LoRA实现升级为DoRA的工作量并不大,我们将在下一节完成这项工作。

用PyTorch实现DoRA层

在本节中,我们将看到DoRA的代码实现形式。之前我们提到,可以将预训练权重$W_0$初始化为幅值$m$和方向分量$V$。例如,我们有如下公式:
其中$|V|_c$是$V$的逐列向量范数。然后我们可以写出包含LoRA权重更新$BA$的DoRA公式,如下所示:

在DoRA论文中,作者给出的DoRA公式如下:他们直接将初始预训练权重$W_0$作为方向分量,在训练中学习幅值向量$m$:
其中$\Delta V$是方向分量矩阵$V$的更新量。

虽然原作者尚未发布官方实现,但你可以找到一个第三方实现:https://github.com/catid/dora/blob/main/dora.py,我下面的实现也大致参考了它。

基于我们之前的LinearWithLoRAMerged实现,我们可以将其升级为DoRA,代码如下:

class LinearWithDoRAMerged(nn.Module):    
    def __init__(self, linear, rank, alpha):        
        super().__init__()        
        self.linear = linear        
        self.lora = LoRALayer(            
            linear.in_features, linear.out_features, rank, alpha        
        )        
        self.m = nn.Parameter(            
            self.linear.weight.norm(p=2, dim=0, keepdim=True))    

    # Code loosely inspired by     
    # https://github.com/catid/dora/blob/main/dora.py    

    def forward(self, x):        
        lora = self.lora.A @ self.lora.B        
        numerator = self.linear.weight + self.lora.alpha*lora.T        
        denominator = numerator.norm(p=2, dim=0, keepdim=True)        
        directional_component = numerator / denominator        
        new_weight = self.m * directional_component        
        return F.linear(x, new_weight, self.linear.bias)

LinearWithDoRAMerged类(与)之前的LinearWithLoRAMerged类有几个关键区别,主要体现在修改和应用线性层权重的方式上。不过两个类都集成了LoRALayer来增强原始线性层的权重,而DoRA额外加入了权重归一化(与)调整。

下图并排展示了两个类的代码差异对比:

figure11
LinearWithLoRAMerged(与)LinearWithDoRAMerged的代码差异对比

从上图可以看到,LinearWithDoRAMerged额外加入了一步对增强后权重的动态归一化。

在将原始权重(与)LoRA调整后的权重合并(self.linear.weight + self.lora.alpha*lora.T)之后,它会计算这些合并后权重的列范数(column_norm),然后通过除以各自的范数来归一化合并权重($V = \text{合并权重} / \text{列范数}$)。这一步确保了合并权重矩阵的每一列都具有单位范数,能够通过维持权重更新的尺度来稳定训练过程。

DoRA还引入了可学习向量self.m,它代表归一化后权重矩阵每一列的幅值。该参数让模型可以在训练中动态调整合并权重矩阵中每个权重向量的尺度,这种额外的灵活性有助于模型更好地捕捉不同特征的重要性。

总而言之,LinearWithDoRAMergedLinearWithLoRAMerged的概念基础上进行了扩展,加入了动态权重归一化(与)缩放,以提升训练性能。

在实际应用中,对于之前的多层感知机,我们可以直接将现有线性层替换为LinearWithDoRAMerged层,方法如下:

输入:

model.layers[0] = LinearWithDoRAMerged(model.layers[0], rank=4, alpha=8)
model.layers[2] = LinearWithDoRAMerged(model.layers[2], rank=4, alpha=8)
model.layers[4] = LinearWithDoRAMerged(model.layers[4], rank=4, alpha=8) 
print(model)

输出:

MultilayerPerceptron(  
  (layers): Sequential(    
    (0): LinearWithDoRAMerged(      
      (linear): Linear(in_features=784, out_features=128, bias=True)      
      (lora): LoRALayer()    
    )    
    (1): ReLU()    
    (2): LinearWithDoRAMerged(      
      (linear): Linear(in_features=128, out_features=256, bias=True)      
      (lora): LoRALayer()    
    )    
    (3): ReLU()    
    (4): LinearWithDoRAMerged(      
      (linear): Linear(in_features=256, out_features=10, bias=True)      
      (lora): LoRALayer()    
    )  
  ) 
)

在微调模型之前,我们可以复用之前实现的freeze_linear_layers函数,仅让LoRA权重和幅值向量可训练:

输入:

freeze_linear_layers(model)
for name, param in model.named_parameters():    
    print(f"{name}: {param.requires_grad}")

输出:

layers.0.m: True
layers.0.linear.weight: False
layers.0.linear.bias: False
layers.0.lora.A: True
layers.0.lora.B: True
layers.2.m: True
layers.2.linear.weight: False
layers.2.linear.bias: False
layers.2.lora.A: True
layers.2.lora.B: True
layers.4.m: True
layers.4.linear.weight: False
layers.4.linear.bias: False
layers.4.lora.A: True
layers.4.lora.B: True

包含模型训练在内的完整代码示例,可以在我的GitHub仓库中找到:https://github.com/rasbt/dora-from-scratch

figure12
DoRA代码笔记本:https://github.com/rasbt/dora-from-scratch

结语

在我看来,DoRA是LoRA一种合理、有效且极具潜力的扩展,我很期待在实际的大语言模型微调场景中应用它。

同时,我也将上述DoRA实现加入到了Lightning Studio中(https://lightning.ai/lightning-ai/studios/code-lora-from-scratch),用于微调DistilBERT语言模型(参见bonus_02_finetune-with-dora.ipynb)。即使没有进行超参数调优,我也已经观察到它的预测准确率比LoRA高出1%以上。

这本杂志是我的个人兴趣项目。如果你愿意支持我的创作,欢迎购买我的著作:https://amzn.to/4fqvn0D 。(我相信你会从这本书中收获颇丰,因为它对大语言模型工作原理的讲解深度是其他地方找不到的。)

figure13
《从零构建大语言模型》现已发售:https://amzn.to/4fqvn0D

如果你读过这本书,并且能抽出几分钟时间,我会非常感谢你留下评价:https://www.amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167 。这对我们作者帮助很大!

另外,我最近也在Substack上开通了付费订阅选项,可以直接支持这本杂志。

《Ahead of AI》是一份读者支持的出版物。想要接收新文章并支持我的创作,欢迎成为免费或付费订阅者。

【转载】模型合并、混合专家,以及迈向更小的大语言模型

原文地址:Model Merging, Mixtures of Experts, and Towards Smaller LLMs,by Sebastian Raschka, on 2024-02-03

模型合并、混合专家,以及迈向更小的大语言模型

2023年,大语言模型(Large Language Models,LLM)的潜力与复杂度都在飞速增长。纵观2024年的开源进展与研究成果,我们似乎正进入一个可喜的阶段:无需扩大模型规模,就能让模型变得更优、也更小巧。

在本月的文章中,我将重点介绍四篇符合这一主题的最新论文:

  1. 权重平均与模型合并让我们得以将多个大语言模型整合为单个更优的模型,且不会带来传统集成方法的典型弊端,比如资源需求上升。
  2. 代理调优(Proxy-tuning)利用两个小型大语言模型提升现有大型大语言模型的性能,且无需修改大模型的权重。
  3. 通过组合多个更小的模块构建混合专家模型,得到的大语言模型在效率与效果上足以比肩、甚至往往超越更大的同类模型。
  4. 预训练一个参数量仅11亿的小型大语言模型,既能降低开发与运行成本,也为教育和研究应用开辟了新路径。

1. WARM:论权重平均奖励模型的优势

在这篇论文中(https://arxiv.org/abs/2401.12187),研究人员提出了一种针对大语言模型奖励模型的权重平均方法。(“奖励模型”指的是用于基于人类反馈的强化学习(RLHF)对齐阶段的模型,相关内容见https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives)

什么是权重平均?既然权重平均与模型合并似乎是2024年最受关注的方向,在深入讲解WARM论文之前,我想先简要介绍这个主题。

理解模型合并与权重平均

模型合并与权重平均虽然并非新技术,但目前已是最主流的方法,主导着开源大语言模型排行榜。我们来简要讨论这两个概念。(未来我可能会写一篇更详细的文章。)

权重平均和模型合并都涉及将多个模型或检查点整合为单个实体。它们的优势是什么?与构建模型集成的思路类似,这种将多个模型合二为一的方法可以提升训练收敛性、改善整体性能并增强鲁棒性。值得强调的是,与传统集成方法不同,模型合并与权重平均最终得到的是单个模型,而非维护多个独立的模型,如下图所示。

figure01

权重平均与模型合并(左)和多数投票等传统集成方法(右)的对比。

传统上,权重平均指的是对单个模型在训练过程中不同节点的权重(参数)取平均值。通常在训练末期、模型接近收敛时进行。该技术的一种常见形式是随机权重平均(https://arxiv.org/abs/1803.05407):我们先从一个较大的学习率开始衰减,在学习率衰减(但仍相对较高)的阶段内,对多个迭代步的权重取平均。

figure02

随机权重平均(SWA)在训练周期末期对模型权重取平均。

由于模型的训练轨迹可能并不平稳,该策略会在训练末期、学习率较低时(如果使用了学习率调度器)对模型取平均,如上图所示,此时训练已接近收敛。

另一种方法是指数移动平均(https://openreview.net/pdf?id=2M9CUnYnBA),通过对更早的模型状态赋予指数递减的权重,计算得到平滑版的权重。

2022年,有研究(https://arxiv.org/abs/2209.14981)证明,对每个epoch末期保存的最近k个检查点的权重取平均,可以在损失值和准确率上加快数个epoch的训练进度。这一效果在ResNet视觉模型和RoBERTa语言模型上都得到了验证。

随后在2023年,论文《Early Weight Averaging meets High Learning Rates for LLM Pre-training》(https://arxiv.org/abs/2306.03241)探索了一种改进版的LaWA方法:采用更高的学习率,且在训练过程中更早开始对检查点取平均。研究人员发现,该方法的表现显著优于标准SWA和EMA技术。

figure03

改进版LaWA方法,出自论文《Early Weight Averaging meets High Learning Rates for LLM Pre-training》(https://arxiv.org/abs/2306.03241)。

权重平均是将同一模型的多个检查点合并为单个模型,而模型合并则是将多个不同的训练后模型整合为一个模型。这些模型可能是独立训练的,训练数据集或任务也可能各不相同。

模型合并的由来已久,但对大语言模型领域而言,最新且最具影响力的论文或许是《Model Ratatouille》(https://arxiv.org/abs/2212.10445)(感谢Alexandre Ramé让我注意到这篇论文)。

Model Ratatouille的核心思路是:将同一个基础模型在各类不同辅助任务上的多个微调版本复用起来,如下图所示。

figure04

通过Model Ratatouille进行模型合并,与其他微调策略的对比。(OOD = 分布外/泛化);图片标注来自https://arxiv.org/abs/2212.10445

更详细地说,Model Ratatouille方法的流程可以总结为下图。

figure05

用于模型合并的Model Ratatouille方法;图片标注来自https://arxiv.org/abs/2212.10445

需要注意的是,这种整体合并思路也可以应用于LoRA适配器,如论文https://arxiv.org/abs/2307.13269所示。

我计划未来写更多关于模型合并的内容。与此同时,我非常推荐Hugging Face的模型合辑(https://huggingface.co/collections/osanseviero/model-merging-65097893623330a3a51ead66 ),以及NathanLambert在Interconnects上关于模型合并的文章(https://www.interconnects.ai/p/model-merging)。

权重平均奖励模型

讨论完权重平均与模型合并的概念,我们再回到上周1月22日发布的新论文https://arxiv.org/abs/2401.12187

这项研究主要旨在优化大语言模型的RLHF对齐阶段(RLHF是ChatGPT和Llama 2 Chat背后的方法,关于该流程的更多细节,请参考我的文章https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives)。具体而言,研究人员尝试通过对微调后的奖励模型权重取平均,来缓解大语言模型中的奖励黑客问题。

奖励黑客指的是大语言模型学会操纵或利用奖励系统的漏洞来获取高分或奖励,而并未真正完成预期任务或达成核心目标。

figure06

权重平均让奖励建模对奖励黑客更具鲁棒性(图片标注来自WARM论文:https://arxiv.org/abs/2401.12187

为了解决奖励黑客问题,研究人员提出通过权重平均合并大语言模型奖励模型。通过该流程得到的合并奖励模型,相比单个奖励模型的胜率达到79.4%。

WARM是如何工作的?该方法相当直接:与随机权重平均类似,WARM对多个模型(这里是奖励模型)的权重取平均,如下图所示。

figure07

WARM在RLHF流程中的使用框架。这里唯一的新点是,该方法使用权重平均得到的奖励模型,而非训练单个奖励模型(图片标注来自WARM论文:https://arxiv.org/abs/2401.12187)。

我们之前讨论了几种权重平均方法。WARM具体是如何对权重取平均得到奖励模型的?在这里,他们使用了与随机权重平均类似的简单线性平均。但不同之处在于,这些模型并非来自同一条训练轨迹,而是像Model ratatouille那样,从预训练模型开始独立创建的。此外,WARM还有一种名为Baklava的流程,可以沿着微调轨迹进行采样。两种方法的对比如下图所示。

figure08

不同模型合并与平均方法的对比。感谢Alexandre Rame提供了这张来自Model ratatouille论文的调整版本。

按照上述WARM流程,对10个奖励模型取平均后,研究人员发现,采用WARM的RL策略相比使用单个奖励模型的策略,胜率达到79.4%,如下图所示。

figure09

在第3000步时,WARM的表现优于单个最优奖励模型(图片标注来自WARM论文:https://arxiv.org/abs/2401.12187)。

结论

模型合并并非新技术,但在大语言模型语境下,它似乎尤其有前景——因为大语言模型的训练成本极高、资源消耗极大。因此,这种能利用训练过程中产生的多个现有大语言模型(无需额外工作)的方法格外有吸引力。此外,与需要同时运行多个模型的传统集成方法不同,权重平均得到的模型相对轻量,推理阶段的成本不会超过单个模型。

展望未来,我认为大语言模型的模型合并领域前景广阔。特别是,我预计未来还会出现更多有创意的模型合并方式。

2. 通过代理调优大语言模型

论文https://arxiv.org/abs/2401.08565提出了一种名为**代理调优(proxy-tuning)**的大语言模型优化技术,前景广阔。该方法可以(在一定程度上)微调大语言模型,且无需修改其权重。

代理调优在解码阶段通过调整目标大语言模型的logits来工作,流程非常直接。具体来说,它先计算小型基础模型与微调模型之间的logits差值,再将这个差值加到目标模型的logits上。(Logits是模型最终层输出的原始分值,在通过softmax等函数转换为概率之前,这些logits代表大语言模型词表中每个可能输出token的未归一化得分。)

figure10

代理调优示意图,标注改自https://arxiv.org/abs/2401.08565

为了更清晰地说明这个概念,假设我们的目标是优化一个大型目标模型M1(比如Llama 2 70B)。该流程会用到两个更小的模型:

  • 小型基础模型(M2),比如Llama 2 7B
  • 基础模型的微调版本(M3),比如Llama 2 7B Chat

优化的实现方式是:将这两个小型模型的预测差值(logits)应用到目标模型M1上。优化后的目标模型M1的输出logits计算公式为:M1(x) = M1(x) + [M3(x) – M2(x)]。得到输出logits后,通过softmax函数将其转换为概率,再利用这些概率采样得到最终输出,也就是生成的文本,采样方法可参考https://arxiv.org/abs/1904.09751或https://peterchng.com/blog/2023/05/02/token-selection-strategies-top-k-top-p-and-temperature。

代理调优在实际中效果如何?

实验结果非常乐观。研究人员在三种不同场景下应用了该方法:

  • 指令调优:优化70B规模的Llama 2 Base模型,使其达到Llama 2 70B Chat模型的性能。
  • 领域适配:提升70B规模的Llama 2 Base模型在代码任务上的表现,目标是达到CodeLlama 70B的性能水平。
  • 特定任务微调:针对问答(TriviaQA)或数学题等专门任务,优化70B规模的Llama 2 Base模型。

在每种场景下,相比原始基础模型都观察到了显著提升。下表为了简洁起见,重点对比了Llama 70B Base和Chat模型,但论文中还提供了CodeLlama的更多基准测试结果。

figure11

修改并标注后的图片,来自代理调优论文https://arxiv.org/abs/2401.08565

可以看到,基于上图中的基准测试结果,经过代理调优的70B Llama 2模型表现远优于70B基础模型,几乎和直接微调的Llama 70B Chat模型一样好。

实际考量

使用该方法的场景或动机可能是提升研发效率:先在更小的模型上开发新的训练或模型优化方法并测试,以降低成本;之后再将这些方法放大,用于优化更大的基础模型,而无需重新训练大模型。

不过,在实际场景中落地该方法仍然需要用到三个不同的模型:

  1. 大型通用基础模型;
  2. 小型通用模型;
  3. 多个针对特定用例或客户需求定制的小型专用模型。

那么,为什么要选择这种方法,而不用LoRA(https://arxiv.org/abs/2106.09685)呢?LoRA不需要上述的小型通用模型(2),还可以用一组小型LoRA矩阵替代多个小型专用模型(3)。

代理调优方法有两个潜在优势:
a) 在某些场景下它的表现可能优于LoRA,尽管目前还没有直接的对比研究。
b) 当大型基础模型(1)是“黑盒”、无法获取其内部权重时,该方法非常有用。

但有一个前提:小型模型必须与更大的目标模型共享同一个词表。(理论上,如果有人知道GPT-4的词表,并且能获取其logit输出,就可以用这种方法创建专用的GPT-4模型。)

3. 混合专家Mixtral

论文https://arxiv.org/abs/2401.04088终于发布了!Mixtral 8x7B是一个稀疏混合专家(sparse MoE)模型,目前是表现最好、也最受关注的开源大语言模型之一。其代码库https://github.com/mistralai/mistral-src基于Apache 2许可证发布,据论文称,学术和商业用途均可免费使用。

什么是MoE?MoE即混合专家(Mixture of Experts),是一种集成模型,由多个更小的“专家”子网络组合而成。每个子网络负责处理不同类型的任务,或者更具体地说,处理不同的token。通过使用多个更小的子网络而非一个大型网络,MoE旨在更高效地分配计算资源,从而实现更有效的规模化,并有潜力在更广泛的任务上取得更好的性能。(也可参考我之前文章中关于混合专家的简介:https://magazine.sebastianraschka.com/i/139848187/mixture-of-experts

在下面要讨论的论文https://arxiv.org/abs/2401.04088中,作者介绍了Mixtral 8x7B的构建过程。该模型的表现远超规模大得多的Llama 2 70B模型。

figure12

Mixtral of Experts论文(https://arxiv.org/abs/2401.04088)中的标注图,显示Mixtral 8x7B在多项基准测试上持平甚至超越更大的Llama 2 70B模型

Mixtral架构

Mixtral 8x7B的核心思路是:将Transformer架构中的每个前馈模块替换为8个专家层,如下图所示。

figure13

Transformer架构标注图,出自《Attention Is All You Need》https://arxiv.org/abs/1706.03762

前馈模块本质上就是一个多层感知机。用类似PyTorch的伪代码表示的话,它大致是这样的:

class FeedForward(torch.nn.Module):    
    def __init__(self, embed_dim, coef):        
        super().__init__()        
        self.layers = nn.Sequential(            
            torch.nn.Linear(embed_dim, coef*embed_dim),            
            torch.nn.ReLU(),            
            torch.nn.Linear(coef*n_embed, embed_dim),            
            torch.nn.Dropout(dropout)        
        )    
    def forward(self, x):        
        return self.layers(x)

此外,还有一个路由模块(也称为门控网络),负责将每个token嵌入分配到8个专家前馈模块中。这8个专家前馈层的输出随后会被求和,如下图所示。

figure14

Mixtral of Experts论文中解释MoE模块的标注图,https://arxiv.org/abs/2401.04088

从数学上看,对于8个专家{E1, E2, …, E8},上图的结构可以表示为:

其中,G代表路由器(或门控网络),Ei是专家模块的输出。基于上式,MoE层计算专家输出Ei的加权和,权重由门控网络G(x)针对输入x给出。

乍一看,Mixtral似乎只是通过这些专家(前馈)模块为大语言模型增加了更多参数,形成一种加权集成的思路。但它还有一个额外的设计:Mixtral是稀疏MoE,也就是说,每个输入只会激活一部分专家:

在Mixtral 8x7B的具体实现中,作者指定TopK=2,意味着每次只会用到2个专家。因此,基于上式,G(x)的输出可能是这样的:[0, 0, 0.63, 0, 0, 0.37, 0, 0]。这表示第三个专家贡献了63%的输出,第六个专家贡献了37%。

模型规模

Mixtral 8x7B的名字从何而来?这个稀疏MoE模型的实际规模又是多少?“8x”指的是使用了8个专家子网络,“7B”表示它组合了Mistral 7B模块。但需要注意的是,Mixtral的规模并不是8×7B = 56B。70亿参数是整个Mistral 7B模型的参数量,但在Mixtral 8x7B中,只有前馈层被替换成了专家层。

Mixtral 8x7B总共有47B参数。我们可以通过以下公式推导,其中FF代表前馈层,NonFF代表非前馈层(比如注意力权重):

  • NonFF + 8×FF = 47B(MoE Mixtral模型)
  • NonFF + FF = 7B(常规Mistral模型)

解这两个方程可以得到:7B的Mistral模型中,前馈层有40/7 ≈ 57.1亿参数,注意力层有7B – 5.71B = 12.9亿参数。有趣的是,大语言模型中的大部分参数都集中在前馈模块中,而非注意力机制中。对于Mixtral 8x7B来说尤其如此:它的专家(前馈)层参数达到8×5.71B = 456.8亿。

Mixtral 8x7B总参数量为47B,远小于比如Llama 2 70B这样的模型。此外,由于每个时间步只有2个专家处于激活状态,模型处理每个输入token时仅用到13B参数,比常规的非MoE 47B参数模型高效得多。

figure15

Mixtral of Experts论文中的标注图,https://arxiv.org/abs/2401.04088

专家专业化

一个有意思的问题是:这些专家是否会表现出特定任务或特定token的模式?遗憾的是,作者并未观察到按主题的专业化分工(这里的“主题”指GitHub、Arxiv、数学、维基百科等数据集)。

但作者发现了一个有趣的现象:文本数据集中的连续token往往会被分配给相同的专家。此外,Python代码中的缩进token也经常被分配给同一个专家,如下图所示。

figure16

Mixtral of Experts论文中的标注图,https://arxiv.org/abs/2401.04088

(作者没有说明每个token对应的两个专家中哪个被标了色,但我推测他们始终标记权重更高的那个专家。)

结论

Mixtral 8x7B有几大优势:它完全开源,表现持平或超越Llama 2 70B等更大的模型,并且以一种相对新颖(尽管并非全新)的方式采用稀疏MoE模块构建大语言模型。

它出色的性能,加上参数高效性以及最高支持32k上下文窗口的能力,很可能让它在未来一段时间内(至少在接下来的几个月里)都是极具吸引力的模型。我相信,混合专家模型也将成为2024年大多数开源项目的核心方向之一,Mixtral of Experts值得持续关注。

如果说有一点小瑕疵的话,就是作者没有分享任何关于训练数据集的信息。(这可能是为了避免版权争议,可以理解。)

此外,尽管这样的研究成本会非常高,但如果能看到Mixtral 8x70B与在相同数据集上训练的Llama 2 70B模型对比会很有意思。我还希望未来能看到Mixtral 8x70B与以下两个假设模型的对比,从而更直接地比较MoE和非MoE方法的性能:

  • Mistral 56B(一个更大的非MoE模型)
  • Mistral 47B(参数量与Mixtral 8x70B相同的非MoE模型)

(趣闻:Brave浏览器的Leo助手功能已将Mixtral 8x7B作为默认大语言模型,见https://brave.com/leo-mixtral/

4. TinyLlama:一款开源的小型语言模型

继微软的Phi-2在去年12月引发热议之后(https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/),论文https://arxiv.org/abs/2401.02385为“小型”大语言模型家族再添新成员。TinyLlama不仅体型小巧——仅11亿参数——而且完全开源。这里的“开源”指的是训练代码和模型检查点都通过无限制的开源库提供。你可以在这里找到GitHub仓库:https://github.com/jzhang38/TinyLlama。

小型大语言模型(也称为SLM,即Small Language Models)为什么如此有吸引力?小型大语言模型具备以下特点:

  • 易获取、成本低:意味着它们可以在资源有限的环境中(比如笔记本电脑和/或小型GPU)运行(推理模式)。
  • 开发与预训练成本更低:这类模型只需要相对较少的GPU。
  • 更易针对目标任务定制:小型模型通常仅用单个GPU就能完成微调。
  • 能效更高:考虑到训练和运行大规模AI模型的环境影响,这一点至关重要;或者,想想在智能手机等便携设备上部署大语言模型时的续航问题。
  • 具有教育价值:它们更易于掌控,因此更容易理解和调试。

TinyLlama的性能

除了小巧与开源之外,与其他同规模的开源模型相比,TinyLlama在常识推理和问题解决基准测试上的表现也相当不错。

figure17

来源:《TinyLlama: An Open-Source Small Language Model》,https://arxiv.org/abs/2401.02385

当然,TinyLlama在这些基准测试上还无法与大得多的模型抗衡,但由于所有代码都是开源的,它为后续的研究和微调提供了丰富的可能性。

TinyLlama带来的启发

比如,从作者的训练实验中,一个有意思的教育性结论是:在1万亿token上训练模型3个epoch(而非1个epoch)实际上是有益的(尽管根据Chinchilla缩放定律,这可能并非最优,相关见https://arxiv.org/abs/2203.15556)。

figure18

来源:《Training Compute-Optimal Large Language Models》,https://arxiv.org/abs/2203.15556

比如,如下图所示,即使数据被重复使用,通过多epoch训练,模型的性能仍在持续提升。

figure19

TinyLlama论文(https://arxiv.org/abs/2401.02385)中的标注图;论文中还有其他6个基准测试的类似图表

研究“超大规模”数据集上的行为,或者将训练运行超过1个epoch,对于更大的模型来说绝非易事。无论如何,我很期待看到未来在TinyLlama上的微调实验会带来怎样的成果。(不过,有推文指出,它目前的表现还落后于体积是它3倍的小型模型Phi-2,见https://x.com/abacaj/status/174408661353529713?s=20

一月份其他值得关注的研究论文

以下是我本月发现的其他一些有意思的论文。由于列表较长,我用星号(*)标出了我认为尤其值得关注的论文。

  • *KVQuant: Towards 10 Million Context Length LLM Inference with KV Cache Quantization,作者Hooper、Kim、Mohammadzadeh、Mahoney等人(1月31日),https://arxiv.org/abs/2401.18079
    研究人员提出了一种键值缓存激活量化方法,在困惑度下降极小的情况下,实现了在单张A100(80GB)GPU上运行Llama-7B这类模型时,上下文长度可达100万。

  • *Rephrasing the Web: A Recipe for Compute and Data-Efficient Language Modeling,作者Maini、Seto、Bai、Grangier等人(1月29日),https://arxiv.org/abs/2401.16380
    作者提出使用改写后的网页文档来更高效地训练大语言模型,实现了更快的预训练、在各类任务上更优的性能,并揭示了训练数据构成如何影响分布外表现。

  • MoE-LLaVA: Mixture of Experts for Large Vision-Language Models,作者Lin、Tang、Ye、Cui等人(1月29日),https://arxiv.org/abs/2401.15947
    本文提出一种混合专家范式来规模化大视觉语言模型,以更少的参数达到了与更大模型相当的性能。

  • EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty,作者Li、Wei、C. Zhang、H. Zhang(1月26日),https://arxiv.org/abs/2401.15077
    EAGLE通过在次级特征层面进行处理并融入未来token,加快了大语言模型的自回归解码速度。

  • Multimodal Pathway: Improve Transformers with Irrelevant Data from Other Modalities,作者Zhang、Ding、Gong、Ge、Yue(1月25日),https://arxiv.org/abs/2401.14405
    本文提出了多模态通路(Multimodal Pathway)技术,利用来自其他模态(比如音频)的未配对数据来提升特定模态(比如图像)的视觉Transformer,在各类图像识别任务中实现了显著的性能提升。

  • Pix2gestalt: Amodal Segmentation by Synthesizing Wholes,作者Ozguroglu、Liu、Surís、Chen等人(1月25日),https://arxiv.org/abs/2401.14398
    Pix2gestalt是一个零样本模态分割框架,利用扩散模型和人工筛选的合成数据集,估计被部分遮挡物体的形状和外观。

  • Rethinking Patch Dependence for Masked Autoencoders,作者Fu、Lian、Wang、Shi等人(1月25日),https://arxiv.org/abs/2401.14391
    交叉注意力掩码自编码器是一种新型预训练框架,仅使用掩码token与可见token之间的交叉注意力来进行掩码块重建,相比传统掩码自编码器,在效率和质量上都有提升。

  • SpacTor-T5: Pre-training T5 Models with Span Corruption and Replaced Token Detection,作者Ye、Jiang、Rostamizadeh、Chakrabarti等人(1月24日),https://arxiv.org/abs/2401.13160
    本文提出SPACTOR,一种大语言模型训练方法,将跨度破坏¹和token替换检测²结合在两阶段课程中,在预训练迭代次数减少50%、计算成本降低40%的情况下,达到了与标准方法相同的性能。

    ¹ 与BERT中掩码单个token不同,T5会将输入文本中的连续token跨度随机替换为单个掩码token。
    ² 在替换检测中,输入文本中的部分token(单词或子词)会被替换为其他token,模型的任务是识别哪些token被替换了。

  • MambaByte: Token-free Selective State Space Model,作者Wang、Gangavarapu、Yan、Rush(1月24日),https://arxiv.org/abs/2401.13660
    MambaByte是一种无token的语言Mamba选择性状态空间模型,直接基于原始字节运行,避免了子词分词带来的偏差。

  • Spotting LLMs With Binoculars: Zero-Shot Detection of Machine-Generated Text,作者Hans、Schwarzschild、Cherepanova、Kazemi等人(1月22日),https://arxiv.org/abs/2401.12070
    Binoculars是一种全新的、(更)准确的机器生成文本检测方法,无需训练数据,通过对比两个预训练大语言模型的简单计算即可实现。

  • *WARM: On the Benefits of Weight Averaged Reward Models,作者Ramé、Vieillard、Hussenot、Dadashi等人(1月22日),https://arxiv.org/abs/2401.12187
    该研究通过对微调后的奖励模型权重取平均,解决了经人类偏好强化学习对齐的大语言模型中的奖励崩溃问题。

  • SpatialVLM: Endowing Vision-Language Models with Spatial Reasoning Capabilities,作者Chen、Xu、Kirmani、Ichter等人(1月22日),https://arxiv.org/abs/2401.12168
    该研究通过构建互联网规模的空间推理数据集并在其上训练视觉语言模型(VLM),提升了这类模型的3D空间推理能力。

  • *Knowledge Fusion of Large Language Models,作者Wan、Huang、Cai、Quan等人(1月19日),https://arxiv.org/abs/2401.10491
    研究人员提出一种知识融合方法,将多个不同的大语言模型合并为一个统一模型,其表现优于单个模型、传统集成方法以及其他模型合并方法。

  • VMamba: Visual State Space Model,作者Liu、Tian、Zhao、Yu等人(1月18日),https://arxiv.org/abs/2401.10166
    该研究将视觉Transformer的全局感受野与动态权重,和CNN的线性复杂度相结合,提出了名为VMamba的新架构,在更高图像分辨率下表现尤为出色。

  • * Self-Rewarding Language Models,作者Yuan、Pang、Cho、Sukhbaatar等人(1月18日),https://arxiv.org/abs/2401.10020
    研究人员在训练中采用“大语言模型即法官”的方法进行自我奖励,成功提升了大语言模型遵循指令和建模奖励的能力,这意味着模型有望在基于人类偏好的常规训练之外实现持续自我提升。

  • DiffusionGPT: LLM-Driven Text-to-Image Generation System,作者Qin、Wu、Chen、Ren等人(1月18日),https://arxiv.org/abs/2401.10061
    DiffusionGPT是一个文本生成图像框架,利用大语言模型解析多样化的提示词,并从思维树结构中选择最合适的生成模型,同时还融入了人类反馈。

  • ReFT: Reasoning with Reinforced Fine-Tuning,作者Luong、Zhang、Jie、Sun等人(1月17日),https://arxiv.org/abs/2401.08967
    本文提出强化微调(Reinforced FineTuning,ReFT)技术,通过将监督微调与强化学习相结合,提升大语言模型在数学解题等任务中的推理能力,在无需额外训练数据的情况下,效果优于标准微调。

  • RAG vs Fine-tuning: Pipelines, Tradeoffs, and a Case Study on Agriculture,作者Balaguer、Benara、de Freitas Cunha、Estevão Filho等人(1月16日),https://arxiv.org/abs/2401.08406
    尽管通常存在“检索增强生成(RAG)vs 微调”的争论,但本文证明,将RAG与微调结合可以带来累积的准确率提升(在农业应用场景下)。

  • Code Generation with AlphaCodium: From Prompt Engineering to Flow Engineering,作者Ridnik、Kredo、Friedman(1月16日),https://arxiv.org/abs/2401.08500
    AlphaCodium是一种迭代式、基于测试的大语言模型代码生成方法,以更小的计算预算超越了此前的方法。

  • * Scalable Pre-training of Large Autoregressive Image Models,作者El-Nouby、Klein、Zhai、Bautista等人(1月16日),https://arxiv.org/abs/2401.08541
    受大语言模型预训练启发,本文以自回归方式(无监督)预训练视觉模型,证明了其性能随模型规模和数据量增长而提升,并在ImageNet-1k上取得了显著成果,且未出现饱和。

  • * Tuning Language Models by Proxy,作者Liu、Han、Wang等人(1月16日),https://arxiv.org/abs/2401.08565
    代理调优是一种资源高效的大语言模型适配方法,通过更小的微调模型来修改大模型的预测,即使是专有模型也能达到与直接微调接近的性能。

  • An Experimental Design Framework for Label-Efficient Supervised Finetuning of Large Language Models,作者Bhatt、Chen、Das等人(1月12日),https://arxiv.org/abs/2401.06692
    研究人员将实验设计技术用于大语言模型的监督微调,通过选择信息量最大的样本进行标注来最大化效率,相比随机采样,标注成本降低了50%。

  • A Closer Look at AUROC and AUPRC under Class Imbalance,作者McDermott、Hansen、Zhang等人(1月11日),https://arxiv.org/abs/2401.06091
    本文对机器学习中一个广为接受的观点提出了挑战:在类别不平衡的二分类任务中,精确率-召回率曲线下面积(AUPRC)优于受试者工作特征曲线下面积(AUROC)。

  • * The Unreasonable Effectiveness of Easy Training Data for Hard Tasks,作者Hase、Bansal、Clark、Wiegreffe,https://arxiv.org/abs/2401.06751
    作者发现,模型通常能从简单数据很好地泛化到困难数据,并提出训练时使用更简单的数据效率更高——通过在各类问答数据集上对最高700亿参数的模型进行实验,验证了这一结论。

  • Sleeper Agents: Training Deceptive LLMs that Persist Through Safety Training,作者Hubinger、Denison、Mu等人(1月10日),https://arxiv.org/abs/2401.05566
    该研究探究了大语言模型学习欺骗性行为的可能性,比如当提示词表明年份是2023时编写安全代码,而当年份是2024时插入可利用代码;研究发现,标准的安全训练技术无法清除这些顽固的欺骗性策略。

  • Transformers are Multi-State RNNs,作者Oren、Hassid、Adi、Schwartz(1月11日),https://arxiv.org/abs/2401.06104
    该研究表明,原本被认为与循环神经网络(RNN)截然不同的仅解码器Transformer,可以被理解为隐藏状态大小无限的多状态RNN。

  • RoSA: Accurate Parameter-Efficient Fine-Tuning via Robust Adaptation,作者Nikdan、Tabesh、Alistarh(1月9日),https://arxiv.org/abs/2401.04679
    该研究提出了鲁棒适配(Robust Adaptation,RoSA),一种新型的大语言模型参数高效微调方法,通过在固定预训练权重上训练低秩和高稀疏组件,表现优于LoRA等现有方法。

  • A Minimaximalist Approach to Reinforcement Learning from Human Feedback,作者Swamy、Dann、Kidambi等人(1月8日),https://arxiv.org/abs/2401.04056
    本文提出自博弈偏好优化(Self-Play Preference Optimization,SPO),一种简单高效的强化学习算法,作为基于人类反馈的强化学习(RLHF)的替代方案,且无需奖励模型。

  • MoE-Mamba: Efficient Selective State Space Models with Mixture of Experts,作者Pioro、Ciebiera、Krol等人(1月8日),https://arxiv.org/abs/2401.04081
    本文提出将Mamba这类状态空间模型与混合专家(MoE)相结合,得到MoE-Mamba模型,在效率和效果上都优于标准Mamba结构的状态空间模型和Transformer-MoE基线。

  • * Mixtral of Experts,作者Jiang、Sablayrolles、Roux等人(1月8日),https://arxiv.org/abs/2401.04088
    Mixtral 8x7B是一个稀疏混合专家模型,对Mistral 7B进行修改,每层设置8个专家,最终得到47B参数的模型,在多项基准测试中持平或超越Llama 2 70B等更大的模型。

  • Soaring from 4K to 400K: Extending LLM’s Context with Activation Beacon,作者Zhang、Liu、Xiao、Shao等人(2024年1月7日),https://arxiv.org/abs/2401.03462
    研究人员提出通过所谓的“激活信标”来扩展大语言模型的上下文窗口——激活信标是激活状态的压缩形式,被添加到输入上下文中。

  • * Denoising Vision Transformers,作者Yang、Luo、Li等人(1月5日),https://arxiv.org/abs/2401.02957
    作者发现,视觉Transformer(ViT)中常见的网格状伪影源于输入阶段的位置嵌入,并提出了一种去噪视觉Transformer,可以提取现有ViT的干净特征。

  • DeepSeek LLM: Scaling Open-Source Language Models with Longtermism,作者Bi、Chen、Chen等人(1月5日),https://arxiv.org/abs/2401.02954
    DeepSeek LLM采用7B和67B两种配置,在2万亿token的数据集上训练,完善了Chinchilla缩放定律,性能超越LLaMA-2 70B和GPT-3.5等模型。

  • Blending Is All You Need: Cheaper, Better Alternative to Trillion-Parameters LLM,作者Lu、Liusie、Raina等人(1月4日),https://arxiv.org/abs/2401.02994
    本文提出“融合(Blending)”方法,从多个小型聊天AI模型中随机选择响应,证明中等规模模型(6B/13B参数)的组合可以达到甚至超越ChatGPT(175B+参数)等更大模型的性能。

  • LLM Augmented LLMs: Expanding Capabilities through Composition,作者Bansal、Samanta、Dalmia等人(1月4日),https://arxiv.org/abs/2401.02412
    CALM(Composition to Augment Language Models,大语言模型增强组合)利用交叉注意力将基础大语言模型与专用大语言模型结合,以极少的额外参数和数据,在新任务(比如低资源语言翻译和代码生成)上实现提升。

  • LLaMA Pro: Progressive LLaMA with Block Expansion,作者Wu、Gan、Ge等人(1月4日),https://arxiv.org/abs/2401.02415
    本文提出一种大语言模型后预训练方法(将Llama 7B升级为Llama Pro-8.3B),通过扩展Transformer块来提升编程和数学等领域的能力,且不会遗忘之前的知识。

  • A Mechanistic Understanding of Alignment Algorithms: A Case Study on DPO and Toxicity,作者Lee、Bai、Pres等人(1月3日),https://arxiv.org/abs/2401.01967
    该研究探究了直接偏好优化(DPO)算法如何通过降低毒性将GPT2-medium等预训练模型对齐到用户偏好,揭示了它是绕过而非移除预训练能力,并且还展示了一种让模型恢复到原始有毒行为的方法。

  • LLaMA Beyond English: An Empirical Study on Language Capability Transfer,作者Zhao、Zhang、Gao等人(1月2日),https://arxiv.org/abs/2401.01055
    本文研究如何将Llama等大语言模型的能力迁移到非英语语言——仅用不到1%的预训练数据,就能达到与当前最优模型相当的性能。

  • * Self-Play Fine-Tuning Converts Weak Language Models to Strong Language Models,作者Chen、Deng、Yuan等人(1月2日),https://arxiv.org/abs/2401.01335
    本文提出自博弈微调(Self-Play fIne-tuNing,SPIN)方法,无需额外的人类标注数据,通过自博弈机制让大语言模型生成并优化自己的训练数据,从而提升模型能力。

  • LLM Maybe LongLM: Self-Extend LLM Context Window Without Tuning,作者Jin、Han、Yang等人(1月2日),https://arxiv.org/abs/2401.01325
    本文提出了一种仅需4行代码的简单技术,无需任何微调就能扩展大语言模型的上下文处理能力。

  • A Comprehensive Study of Knowledge Editing for Large Language Models(1月2日),作者Zhang、Yao、Tian等人,https://arxiv.org/abs/2401.01286
    本文讨论了如何通过各类知识编辑技术(诉诸外部知识、将知识融入模型、编辑内在知识)让大语言模型保持时效性,同时还提出了全新的KnowEdit基准测试。

  • Astraios: Parameter-Efficient Instruction Tuning Code Large Language Models(1月1日),作者Terry Zhuo、Zebaze、Suppattarachai等人,https://arxiv.org/abs/2401.00788
    本文评估了不同的全参数和参数高效微调技术,发现全参数微调通常能带来最佳性能,而LoRA通常在成本与性能之间实现了最优平衡。

从零构建大语言模型

从零开始创建大语言模型,是深入理解其内部运作原理的绝佳方式。在我的图书项目《从零构建大语言模型》(https://github.com/rasbt/LLMs-from-scratch)中,我编写并详细讲解了整个流程:从设计大语言模型架构,到实现预训练、微调和对齐阶段。

figure20

更多信息请访问GitHub仓库:https://github.com/rasbt/LLMs-from-scratch

这本杂志是我的个人兴趣项目,不提供直接报酬。不过,如果您愿意支持我,可以考虑购买我的书(https://sebastianraschka.com/books)。如果您觉得这些内容有洞见、有帮助,也欢迎推荐给您的朋友和同事。

figure21

https://www.amazon.com/Machine-Learning-PyTorch-Scikit-Learn-scikit-learn-ebook-dp-B09NW48MR1/dp/B09NW48MR1/https://nostarch.com/machine-learning-and-ai-beyond-basics 以及 http://mng.bz/M96o

您的支持对我意义重大!非常感谢!

【转载】理解并实现大语言模型中的自注意力、多头注意力、因果注意力与交叉注意力

Understanding and Coding Self-Attention, Multi-Head Attention, Causal-Attention, and Cross-Attention in LLMs,by Sebastian Raschka, 2024-01-14

理解并实现大语言模型中的自注意力、多头注意力、因果注意力与交叉注意力

本文将为你讲解Transformer架构与GPT-4、Llama等大语言模型(LLM)中所使用的自注意力机制。自注意力及相关机制是大语言模型的核心组成部分,在从事相关模型开发工作时,理解这一主题非常有价值。

不过,本文不会只停留在理论层面讲解自注意力机制,而是会带你用Python和PyTorch从零开始编码实现。在我看来,从零手写实现算法、模型与技术,是最高效的学习方式!

补充说明:本文是《从零理解并编码实现大语言模型的自注意力机制》的更新扩展版,那篇文章发布在我旧博客上,距今刚好差不多一年。我本人非常喜欢写(也喜欢读)这类“从零实现”的文章,因此特意将这篇内容更新优化,发布在Ahead of AI平台。

此外,这篇文章也促使我动笔撰写《从零构建大语言模型》一书,目前该书仍在创作中。下方是梳理全书脉络的思维模型,展示了自注意力机制在整个大语言模型体系中的位置。

figure01

《从零构建大语言模型》一书涵盖主题概览

为控制文章篇幅,本文默认你已经对大语言模型有基础了解,也掌握了注意力机制的基本概念。本文的核心目标,是通过Python与PyTorch的代码逐行讲解,帮你彻底理解注意力机制的运行原理。

自注意力简介

自注意力机制自《Attention Is All You Need》这篇Transformer开山论文提出以来,已成为众多顶尖深度学习模型的基石,在自然语言处理(NLP)领域尤其如此。如今自注意力的应用无处不在,理解其工作原理至关重要。

figure02

原始Transformer架构图,来源:https://arxiv\.org/abs/1706\.03762

深度学习中“注意力”的概念,最早源于对循环神经网络(RNN)的改进——解决RNN难以处理长序列、长句子的问题。举个例子,把一句话从一种语言翻译成另一种语言时,逐词直译通常行不通,因为它忽略了每种语言独有的复杂语法结构与习语表达,最终会得到不准确、甚至不通顺的译文。

figure03

错误的逐词直译(上)与正确翻译(下)对比

为解决这个问题,研究者提出了注意力机制:让模型在每个时间步都能访问序列中的所有元素,核心是做到“有选择地关注”,判断特定上下文中哪些单词最重要。2017年问世的Transformer架构,提出了独立的自注意力机制,彻底摆脱了对循环神经网络的依赖。

(为精简篇幅、聚焦自注意力的技术细节,本文只对背景动机做简要介绍,把重点放在代码实现上。)

figure04

摘自《Attention Is All You Need》论文的可视化图:通过注意力权重展示单词“making”对输入中其他单词的依赖与关注程度(颜色深浅与注意力权重的数值大小正相关)。

我们可以把自注意力理解为一种信息增强机制:它通过融入输入的上下文信息,丰富输入嵌入的信息量。换句话说,自注意力机制让模型能够权衡输入序列中不同元素的重要性,并动态调整它们对输出的影响。这在语言处理任务中尤为关键——同一个单词的含义,会随着它在句子、文档中的上下文变化而改变。

需要注意的是,自注意力有很多变体,其中一个主流研究方向是提升自注意力的计算效率。但绝大多数论文仍沿用《Attention Is All You Need》中提出的**缩放点积注意力(scaled-dot product attention)**原始实现;对大多数训练大规模Transformer的公司而言,自注意力本身通常并不是计算瓶颈。

因此,本文将聚焦最经典、实际应用最广泛的原始缩放点积注意力机制(下文统称自注意力)。如果你对其他类型的注意力机制感兴趣,可以参考2020年的《Efficient Transformers: A Survey》、2023年的《A Survey on Efficient Training of Transformers》综述,以及近年提出的FlashAttention与FlashAttention-v2相关论文。

输入句子的嵌入处理

正式开始前,我们先以句子Life is short, eat dessert first为例,看看如何将它输入自注意力机制。和其他文本建模方法(比如循环神经网络、卷积神经网络)一样,我们首先要生成句子的嵌入表示。

为简化演示,这里我们的词典dc只包含输入句子中出现的单词。在实际应用中,词典会覆盖训练数据集中的所有单词,典型的词表规模在3万到5万之间。

输入代码:

sentence = 'Life is short, eat dessert first'

dc = {s:i for i,s 
      in enumerate(sorted(sentence.replace(',', '').split()))}

print(dc)

输出:

{'Life': 0, 'dessert': 1, 'eat': 2, 'first': 3, 'is': 4, 'short': 5}

接下来,我们用这个词典为每个单词分配一个整数索引:

输入代码:

import torch

sentence_int = torch.tensor(
    [dc[s] for s in sentence.replace(',', '').split()]
)
print(sentence_int)

输出:

tensor([0, 4, 5, 2, 1, 3])

得到句子的整数向量表示后,我们就可以通过嵌入层,将输入编码为实数向量形式的嵌入。这里我们使用极小的3维嵌入,也就是每个输入单词对应一个3维向量。

注意:实际场景中的嵌入维度通常在数百到数千维,比如Llama 2的嵌入维度就达到了4096。这里使用3维纯粹是为了演示方便,方便我们查看每个向量的具体数值,不会让页面被数字占满。

句子包含6个单词,因此最终会得到一个6×3的嵌入矩阵:

输入代码:

vocab_size = 50_000

torch.manual_seed(123)
embed = torch.nn.Embedding(vocab_size, 3)
embedded_sentence = embed(sentence_int).detach()

print(embedded_sentence)
print(embedded_sentence.shape)

输出:

tensor([[ 0.3374, -0.1778, -0.3035],
        [ 0.1794,  1.8951,  0.4954],
        [ 0.2692, -0.0770, -1.0205],
        [-0.2196, -0.3792,  0.7671],
        [-0.5880,  0.3486,  0.6603],
        [-1.1925,  0.6984, -1.4097]])
torch.Size([6, 3])

定义权重矩阵

接下来我们讲解应用最广泛的自注意力机制——缩放点积注意力,它是Transformer架构的核心组成部分。

自注意力会用到三个权重矩阵,分别记作$W_q$、$W_k$、$W_v$,它们是模型的可训练参数,会在训练过程中不断更新。这三个矩阵的作用,分别是将输入投影为序列的查询(query)、键(key)和值(value)分量。

对应的查询、键、值序列,通过权重矩阵$W$与嵌入输入$x$做矩阵乘法得到:

  • 查询序列:$q(i) = x(i)W_q$,其中$i$为序列中第1到第$T$个位置

  • 键序列:$k(i) = x(i)W_k$,其中$i$为序列中第1到第$T$个位置

  • 值序列:$v(i) = x(i)W_v$,其中$i$为序列中第1到第$T$个位置

下标$i$代表输入序列中的token位置索引,序列总长度为$T$。

figure05

通过输入$x$与权重$W$计算查询、键、值向量

其中,$q(i)$和$k(i)$都是维度为$d_k$的向量。投影矩阵$W_q$和$W_k$的形状为 $d \times d_k$,而$W_v$的形状为 $d \times d_v$。

(注意:$d$代表每个单词向量$x$的维度。)

由于我们要计算查询向量和键向量的点积,因此这两个向量的元素数量必须相等($d_q = d_k$)。在很多大语言模型中,值向量也会采用相同的维度,也就是 $d_q = d_k = d_v$。不过值向量$v(i)$的元素数(决定了最终上下文向量的维度)本身是可以自由设置的。

在接下来的代码演示中,我们设置 $d_q = d_k = 2$,$d_v = 4$,并按如下方式初始化投影矩阵:

输入代码:

torch.manual_seed(123)

d = embedded_sentence.shape[1]

d_q, d_k, d_v = 2, 2, 4

W_query = torch.nn.Parameter(torch.rand(d, d_q))
W_key = torch.nn.Parameter(torch.rand(d, d_k))
W_value = torch.nn.Parameter(torch.rand(d, d_v))

(和前面的词嵌入向量一样,实际场景中$d_q$、$d_k$、$d_v$的维度会大得多,这里用小数值只是为了方便演示。)

figure06

计算未归一化注意力权重

现在,假设我们要计算第二个输入元素的注意力向量——此时第二个输入元素就作为查询。

figure07

接下来的内容,我们都以第二个输入$x(2)$为例

代码实现如下:

输入代码:

x_2 = embedded_sentence[1]
query_2 = x_2 @ W_query
key_2 = x_2 @ W_key
value_2 = x_2 @ W_value

print(query_2.shape)
print(key_2.shape)
print(value_2.shape)

输出:

torch.Size([2])
torch.Size([2])
torch.Size([4])

我们可以把这个逻辑推广到所有输入,计算出所有输入对应的键和值,因为后续计算未归一化注意力权重时会用到它们:

输入代码:

keys = embedded_sentence @ W_key
values = embedded_sentence @ W_value

print("keys.shape:", keys.shape)
print("values.shape:", values.shape)

输出:

keys.shape: torch.Size([6, 2])
values.shape: torch.Size([6, 4])

有了全部的键和值,我们就可以进入下一步:计算未归一化的注意力权重$\omega$(omega),如下图所示:

figure08

计算未归一化注意力权重$\omega$(omega)

如图所示,$\omega_{i,j}$ 等于查询向量与键向量的点积,即 $\omega_{i,j} = q(i) \cdot k(j)$。

举个例子,我们可以计算当前查询与第5个输入元素(对应索引4)之间的未归一化注意力权重:

输入代码:

omega_24 = query_2.dot(keys[4])
print(omega_24)

(注:$\omega$是希腊字母“omega”,上面代码中的变量名也由此而来。)

输出:

tensor(1.2903)

后续计算正式注意力权重时需要用到这些未归一化的$\omega$值,我们把所有输入token对应的$\omega$都计算出来,就像上图演示的那样:

输入代码:

omega_2 = query_2 @ keys.T
print(omega_2)

输出:

tensor([-0.6004,  3.4707, -1.5023,  0.4991,  1.2903, -1.3374])

计算注意力权重

自注意力的下一步,是对未归一化的注意力权重$\omega$做归一化,通过softmax函数得到归一化后的注意力权重$\alpha$(alpha)。此外,在输入softmax之前,我们会先将$\omega$乘以 $1/\sqrt{d_k}$ 做缩放,如下所示:

figure09

计算归一化注意力权重$\alpha$

除以$d_k$的平方根进行缩放,是为了保证权重向量的欧氏长度保持在相近的量级,避免注意力权重过大或过小,防止数值不稳定,同时保障模型的训练收敛效果。

为什么偏偏是$\sqrt{d_k}$?因为$q$和$k$的点积是$d_k$个独立项的和,每一项的方差约为1,这意味着原始得分的方差会随$d_k$线性增长。除以$\sqrt{d_k}$后,就能抵消这种增长,让方差回到约1的水平。

代码中的注意力权重计算实现如下:

输入代码:

import torch.nn.functional as F

attention_weights_2 = F.softmax(omega_2 / d_k**0.5, dim=0)
print(attention_weights_2)

输出:

tensor([0.0386, 0.6870, 0.0204, 0.0840, 0.1470, 0.0229])

最后一步,是计算上下文向量$z(2)$。它是原始查询输入$x(2)$的注意力加权版本,通过注意力权重融合了所有其他输入元素的上下文信息:

figure10

注意力权重是针对特定输入元素计算的。这里我们选择的是输入元素$x(2)$。

代码实现如下:

输入代码:

context_vector_2 = attention_weights_2 @ values

print(context_vector_2.shape)
print(context_vector_2)

输出:

torch.Size([4])
tensor([0.5313, 1.3607, 0.7891, 1.3110])

注意,这个输出向量的维度($d_v = 4$)比原始输入向量的维度($d = 3$)更高,因为我们前面设置了$d_v > d$;实际上,嵌入维度$d_v$的取值是任意的。

自注意力完整实现

结合前面几节的内容,我们可以把自注意力机制的代码整合起来,封装成一个简洁的SelfAttention类:

输入代码:

import torch.nn as nn

class SelfAttention(nn.Module):

    def __init__(self, d_in, d_out_kq, d_out_v):
        super().__init__()
        self.d_out_kq = d_out_kq
        self.W_query = nn.Parameter(torch.rand(d_in, d_out_kq))
        self.W_key   = nn.Parameter(torch.rand(d_in, d_out_kq))
        self.W_value = nn.Parameter(torch.rand(d_in, d_out_v))

    def forward(self, x):
        keys = x @ self.W_key
        queries = x @ self.W_query
        values = x @ self.W_value
        
        attn_scores = queries @ keys.T  # 未归一化注意力权重    
        attn_weights = torch.softmax(
            attn_scores / self.d_out_kq**0.5, dim=-1
        )
        
        context_vec = attn_weights @ values
        return context_vec

遵循PyTorch的编码惯例,上面的SelfAttention类在__init__方法中初始化自注意力的参数,在forward方法中完成所有输入的注意力权重与上下文向量计算。我们可以这样使用这个类:

输入代码:

torch.manual_seed(123)

d_in, d_out_kq, d_out_v = 3, 2, 4

sa = SelfAttention(d_in, d_out_kq, d_out_v)
print(sa(embedded_sentence))

输出:

tensor([[-0.1564,  0.1028, -0.0763, -0.0764],
        [ 0.5313,  1.3607,  0.7891,  1.3110],
        [-0.3542, -0.1234, -0.2627, -0.3706],
        [ 0.0071,  0.3345,  0.0969,  0.1998],
        [ 0.1008,  0.4780,  0.2021,  0.3674],
        [-0.5296, -0.2799, -0.4107, -0.6006]], grad_fn=&#x3C;MmBackward0>)

可以看到,输出的第二行和我们上一节算出的context_vector_2完全一致:tensor([0.5313, 1.3607, 0.7891, 1.3110])

多头注意力

在文章开头的第一张图里(这里再放一次方便查看),我们能看到Transformer中使用了一个叫“多头注意力”的模块。

figure11

原始Transformer架构中的多头注意力模块,来源:https://arxiv\.org/abs/1706\.03762

这个“多头”注意力模块,和我们前面讲解的自注意力机制(缩放点积注意力)是什么关系呢?

在缩放点积注意力中,输入序列通过查询、键、值三个矩阵做变换。在多头注意力的语境里,这一套矩阵就对应一个注意力头。下图总结了我们前面实现的单个注意力头:

figure12

前文实现的自注意力机制总结

顾名思义,多头注意力就是包含多个这样的“头”,每个头都有自己的查询、键、值矩阵。这个概念和卷积神经网络中使用多个卷积核的思路类似,最终会输出多通道的特征图。

figure13

多头注意力:包含多个头的自注意力

用代码演示的话,我们可以基于前面的SelfAttention类,写一个MultiHeadAttentionWrapper包装类:

class MultiHeadAttentionWrapper(nn.Module):

    def __init__(self, d_in, d_out_kq, d_out_v, num_heads):
        super().__init__()
        self.heads = nn.ModuleList(
            [SelfAttention(d_in, d_out_kq, d_out_v) 
             for _ in range(num_heads)]
        )

    def forward(self, x):
        return torch.cat([head(x) for head in self.heads], dim=-1)

其中d_*参数和SelfAttention类中的定义完全一致,唯一新增的参数是注意力头的数量:

  • d_in:输入特征向量的维度

  • d_out_kq:查询与键的输出维度

  • d_out_v:值的输出维度

  • num_heads:注意力头的数量

我们用这些参数初始化num_headsSelfAttention实例,并用PyTorch的nn.ModuleList存储这些实例。

在前向传播时,每个存储在self.heads中的SelfAttention头都会独立处理输入x,然后将所有头的结果在最后一维(dim=-1)拼接起来。我们来实际运行一下:

首先,为了简化演示,我们用单个自注意力头,输出维度设为1:

输入代码:

torch.manual_seed(123)

d_in, d_out_kq, d_out_v = 3, 2, 1

sa = SelfAttention(d_in, d_out_kq, d_out_v)
print(sa(embedded_sentence))

输出:

tensor([[-0.0185],
        [ 0.4003],
        [-0.1103],
        [ 0.0668],
        [ 0.1180],
        [-0.1827]], grad_fn=&#x3C;MmBackward0>)

现在我们把它扩展为4个注意力头:

输入代码:

torch.manual_seed(123)

mha = MultiHeadAttentionWrapper(
    d_in, d_out_kq, d_out_v, num_heads=4
)

context_vecs = mha(embedded_sentence)

print(context_vecs)
print("context_vecs.shape:", context_vecs.shape)

输出:

tensor([[-0.0185,  0.0170,  0.1999, -0.0860],
        [ 0.4003,  1.7137,  1.3981,  1.0497],
        [-0.1103, -0.1609,  0.0079, -0.2416],
        [ 0.0668,  0.3534,  0.2322,  0.1008],
        [ 0.1180,  0.6949,  0.3157,  0.2807],
        [-0.1827, -0.2060, -0.2393, -0.3167]], grad_fn=&#x3C;CatBackward0>)
context_vecs.shape: torch.Size([6, 4])

从输出可以看到,前面单个自注意力头的结果,正好对应输出张量的第一列。

可以看到,多头注意力的结果是一个6×4的张量:我们有6个输入token,4个自注意力头,每个自注意力头输出1维结果。而前面单头自注意力部分,我们也得到过6×4的张量——那是因为我们把单头的输出维度设成了4,而不是1。

那么问题来了:既然单头自注意力本身就能调整输出嵌入的大小,为什么还需要多头注意力呢?

“提升单个自注意力头的输出维度”和“使用多个注意力头”,两者的本质区别在于模型处理、学习数据的方式不同。虽然两种方式都能提升模型表征不同特征、不同数据维度的能力,但底层逻辑完全不同。

比如,多头注意力中的每个头,都有可能学会关注输入序列的不同部分,捕捉数据中不同层面的关系。这种表征的多样性,正是多头注意力成功的关键。

此外,多头注意力的计算效率更高,尤其适合并行计算。每个头都可以独立处理,非常适配GPU、TPU这类擅长并行运算的现代硬件加速设备。

简而言之,使用多头注意力不只是为了提升模型容量,更是为了增强模型学习数据中多样化特征与关联的能力。举个例子,70亿参数的Llama 2模型就使用了32个注意力头。

因果自注意力

本节我们将前面讲解的自注意力机制,改造为因果自注意力机制——它主要用于GPT这类(解码器风格的)文本生成大语言模型。因果自注意力也常被称为“掩码自注意力”,在原始Transformer架构中,它对应“掩码多头注意力”模块。为了简化讲解,本节我们只看单个注意力头,其原理可以直接推广到多头场景。

figure14

原始Transformer架构中的因果自注意力模块,来源:《Attention Is All You Need》, https://arxiv\.org/abs/1706\.03762

因果自注意力的作用是:序列中每个位置的输出,只能依赖当前位置之前的已知输出,不能看到未来位置的信息。简单来说,就是保证下一个单词的预测,只由它前面的单词决定。

在GPT类大语言模型中,为了实现这一点,处理每个token时,我们都会把输入文本中位于当前token之后的“未来token”掩码掉。

下图演示了如何对注意力权重施加因果掩码,隐藏输入中的未来token:

为了演示并实现因果自注意力,我们沿用前面的未归一化注意力得分与注意力权重。首先快速回顾一下自注意力部分的注意力得分计算:

输入代码:

torch.manual_seed(123)

d_in, d_out_kq, d_out_v = 3, 2, 4

W_query = nn.Parameter(torch.rand(d_in, d_out_kq))
W_key   = nn.Parameter(torch.rand(d_in, d_out_kq))
W_value = nn.Parameter(torch.rand(d_in, d_out_v))

x = embedded_sentence

keys = x @ W_key
queries = x @ W_query
values = x @ W_value

# attn_scores 就是前面的 "omegas",即未归一化注意力权重
attn_scores = queries @ keys.T 

print(attn_scores)
print(attn_scores.shape)

输出:

tensor([[ 0.0613, -0.3491,  0.1443, -0.0437, -0.1303,  0.1076],
        [-0.6004,  3.4707, -1.5023,  0.4991,  1.2903, -1.3374],
        [ 0.2432, -1.3934,  0.5869, -0.1851, -0.5191,  0.4730],
        [-0.0794,  0.4487, -0.1807,  0.0518,  0.1677, -0.1197],
        [-0.1510,  0.8626, -0.3597,  0.1112,  0.3216, -0.2787],
        [ 0.4344, -2.5037,  1.0740, -0.3509, -0.9315,  0.9265]],
       grad_fn=&#x3C;MmBackward0>)
torch.Size([6, 6])

和之前自注意力部分一样,上面的输出是6×6的张量,保存了6个输入token两两之间的未归一化注意力权重(也叫注意力得分)。

之前我们是这样通过softmax计算缩放点积注意力的:

输入代码:

attn_weights = torch.softmax(attn_scores / d_out_kq**0.5, dim=1)
print(attn_weights)

输出:

tensor([[0.1772, 0.1326, 0.1879, 0.1645, 0.1547, 0.1831],
        [0.0386, 0.6870, 0.0204, 0.0840, 0.1470, 0.0229],
        [0.1965, 0.0618, 0.2506, 0.1452, 0.1146, 0.2312],
        [0.1505, 0.2187, 0.1401, 0.1651, 0.1793, 0.1463],
        [0.1347, 0.2758, 0.1162, 0.1621, 0.1881, 0.1231],
        [0.1973, 0.0247, 0.3102, 0.1132, 0.0751, 0.2794]],
       grad_fn=&#x3C;SoftmaxBackward0>)

这个6×6的输出就是注意力权重,和我们之前自注意力部分计算的结果一致。

而在GPT类大语言模型中,模型的训练方式是从左到右,逐个读取、生成token(单词)。如果我们有一条训练文本Life is short eat dessert first,就会形成如下的训练模式:箭头右侧单词的上下文向量,只能融合自身和箭头左侧的单词信息。

  • "Life""is"

  • "Life is""short"

  • "Life is short""eat"

  • "Life is short eat""dessert"

  • "Life is short eat dessert""first"

实现这个模式最简单的方法,就是对注意力权重矩阵的上三角(主对角线以上的部分)做掩码,如下图所示。这样一来,在计算上下文向量(即输入的注意力加权和)时,“未来”的单词就不会被纳入计算。

figure15

主对角线以上的注意力权重需要被掩码掉

代码层面,我们可以用PyTorch的tril函数实现:先生成一个由0和1组成的掩码矩阵。

输入代码:

block_size = attn_scores.shape[0]
mask_simple = torch.tril(torch.ones(block_size, block_size))
print(mask_simple)

输出:

tensor([[1., 0., 0., 0., 0., 0.],
        [1., 1., 0., 0., 0., 0.],
        [1., 1., 1., 0., 0., 0.],
        [1., 1., 1., 1., 0., 0.],
        [1., 1., 1., 1., 1., 0.],
        [1., 1., 1., 1., 1., 1.]])

接下来,我们把注意力权重和这个掩码相乘,将主对角线以上的所有注意力权重置零:

输入代码:

masked_simple = attn_weights*mask_simple
print(masked_simple)

输出:

tensor([[0.1772, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
        [0.0386, 0.6870, 0.0000, 0.0000, 0.0000, 0.0000],
        [0.1965, 0.0618, 0.2506, 0.0000, 0.0000, 0.0000],
        [0.1505, 0.2187, 0.1401, 0.1651, 0.0000, 0.0000],
        [0.1347, 0.2758, 0.1162, 0.1621, 0.1881, 0.0000],
        [0.1973, 0.0247, 0.3102, 0.1132, 0.0751, 0.2794]],
       grad_fn=&#x3C;MulBackward0>)

这是掩码未来单词的一种实现方式,但你会发现:此时每一行的注意力权重不再求和等于1。为了解决这个问题,我们可以对每一行重新做归一化,让它们的和重新变为1——这是注意力权重的标准约定。

输入代码:

row_sums = masked_simple.sum(dim=1, keepdim=True)
masked_simple_norm = masked_simple / row_sums
print(masked_simple_norm)

输出:

tensor([[1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
        [0.0532, 0.9468, 0.0000, 0.0000, 0.0000, 0.0000],
        [0.3862, 0.1214, 0.4924, 0.0000, 0.0000, 0.0000],
        [0.2232, 0.3242, 0.2078, 0.2449, 0.0000, 0.0000],
        [0.1536, 0.3145, 0.1325, 0.1849, 0.2145, 0.0000],
        [0.1973, 0.0247, 0.3102, 0.1132, 0.0751, 0.2794]],
       grad_fn=&#x3C;DivBackward0>)

可以看到,现在每一行的注意力权重之和都为1了。

在Transformer这类模型中,使用归一化的注意力权重主要有两点优势:第一,求和为1的归一化注意力权重类似概率分布,更直观地体现了模型对输入不同部分的关注比例;第二,约束权重和为1,可以控制权重与梯度的量级,优化训练过程的稳定性。

更高效的掩码方式:无需二次归一化

上面我们实现的因果自注意力流程是:先计算注意力得分,再计算注意力权重,接着掩码掉上三角的权重,最后重新归一化。整个流程总结如下图:

figure16

前文实现的因果自注意力流程

其实还有一种更高效的方式,可以得到完全相同的结果。这种方法是在输入softmax计算注意力权重之前,就把注意力得分中主对角线以上的值替换为负无穷。流程总结如下:

figure17

另一种更高效的因果自注意力实现方案

我们可以用PyTorch写出这个流程,首先对注意力得分的上三角做掩码:

输入代码:

mask = torch.triu(torch.ones(block_size, block_size), diagonal=1)
masked = attn_scores.masked_fill(mask.bool(), -torch.inf)
print(masked)

上面的代码先生成一个掩码矩阵:主对角线及以下为0,以上为1。其中torch.triu(上三角)会保留矩阵主对角线及以上的元素,将下方元素置零,保留上三角部分;对应的torch.tril(下三角)则保留主对角线及以下的元素。

然后masked_fill方法会把掩码中为1的位置(主对角线以上)的所有元素替换为-torch.inf(负无穷),结果如下:

输出:

tensor([[ 0.0613,    -inf,    -inf,    -inf,    -inf,    -inf],
        [-0.6004,  3.4707,    -inf,    -inf,    -inf,    -inf],
        [ 0.2432, -1.3934,  0.5869,    -inf,    -inf,    -inf],
        [-0.0794,  0.4487, -0.1807,  0.0518,    -inf,    -inf],
        [-0.1510,  0.8626, -0.3597,  0.1112,  0.3216,    -inf],
        [ 0.4344, -2.5037,  1.0740, -0.3509, -0.9315,  0.9265]],
       grad_fn=&#x3C;MaskedFillBackward0>)

接下来,我们照常应用softmax函数,就能得到经过掩码且归一化的注意力权重:

输入代码:

attn_weights = torch.softmax(masked / d_out_kq**0.5, dim=1)
print(attn_weights)

输出:

tensor([[1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
        [0.0532, 0.9468, 0.0000, 0.0000, 0.0000, 0.0000],
        [0.3862, 0.1214, 0.4924, 0.0000, 0.0000, 0.0000],
        [0.2232, 0.3242, 0.2078, 0.2449, 0.0000, 0.0000],
        [0.1536, 0.3145, 0.1325, 0.1849, 0.2145, 0.0000],
        [0.1973, 0.0247, 0.3102, 0.1132, 0.0751, 0.2794]],
       grad_fn=&#x3C;SoftmaxBackward0>)  

为什么这种方法有效?因为最后一步的softmax函数会把输入值转化为概率分布。当输入中存在负无穷时,$e^{-\infty}$趋近于0,因此这些位置对输出概率没有贡献,相当于概率为0。

结语

本文通过逐行编码的方式,拆解了自注意力的内部工作原理。在此基础上,我们进一步学习了多头注意力——这是Transformer大语言模型的核心组件。

随后我们还编码实现了交叉注意力(自注意力的一种变体,在处理两个独立序列时效果突出),以及因果自注意力——这是GPT、Llama等解码器风格大语言模型生成连贯、符合上下文的序列的关键概念。

通过从零编码实现这些复杂机制,希望你已经对Transformer与大语言模型中使用的自注意力机制有了透彻的理解。

(注:本文中的代码仅用于演示原理。如果你要在大语言模型训练中实现自注意力,推荐使用Flash Attention这类优化实现,它们能显著降低内存占用与计算开销。)

附加主题:交叉注意力

在前面自注意力与因果注意力的代码讲解中,我们设置了 $d_q = d_k = 2$,$d_v = 4$。也就是说,查询序列和键序列使用了相同的维度。虽然值矩阵$W_v$通常也会设置成和查询、键矩阵相同的维度(比如PyTorch自带的MultiHeadAttention类就是如此),但值的维度其实可以自由设置……

【以下为付费内容,请跳转至原文付费订阅,6$,两杯咖啡钱】
Understanding and Coding Self-Attention, Multi-Head Attention, Causal-Attention, and Cross-Attention in LLMs,by Sebastian Raschka, 2024-01-14

=== 以下为付费内容 ===

【转载】2023年值得关注的10篇AI研究论文

原文地址:Ten Noteworthy AI Research Papers of 2023,by Sebastian Raschka, on 2023-12-30

2023年值得关注的10篇AI研究论文

今年的感觉格外不同。我从事机器学习与AI领域的研究、应用与相关工作已有十余年,但印象中从未有哪个时期,这些领域能像今年这样备受瞩目、发展如此迅猛。

为给精彩纷呈的2023年机器学习与AI研究收尾,我很乐意分享今年读过的10篇值得关注的论文。我个人的研究重心更偏向大语言模型,因此今年的榜单中大语言模型(LLM)相关论文的占比会高于计算机视觉类论文。

我没有把这篇文章命名为“2023年顶级AI研究论文”,因为评判“最佳”论文本身带有主观性。这份榜单的遴选标准,是结合了我个人特别欣赏、或是认为具有重要影响力、值得关注的论文。(排序是推荐的阅读顺序,而非按感知到的质量或影响力高低排序。)

对了,滑到文章末尾有个小惊喜。感谢大家一路的支持,祝大家新年开局顺利!

1) Pythia —— 来自大规模训练运行的洞见

https://arxiv.org/abs/2304.01373 这篇论文中,研究者们发布了8个参数规模从7000万到120亿不等的大语言模型(权重与训练数据均公开,这在行业中十分罕见)。

但在我看来,这篇论文最突出的亮点在于,他们同时公开了训练细节、分析与洞见(其中一部分展示在下方的带注释图中)。

figure01
来自Pythia论文的带注释图表,https://arxiv.org/abs/2304.01373

Pythia论文解答了以下问题:

  • 在重复数据上进行预训练(即训练超过1个epoch)会有影响吗?结果表明,去重既不会提升也不会损害模型性能。
  • 训练顺序会影响记忆效果吗?遗憾的是,答案是否定的。说“遗憾”,是因为如果训练顺序会影响记忆,我们就可以通过重排训练数据来缓解不良的逐字记忆问题。
  • 预训练中的词频会影响任务性能吗?会的。出现频率更高的词汇,其少样本准确率往往更高。
  • 增大批次大小会影响训练效率与模型收敛吗?批次大小翻倍可让训练时间减半,且不会损害收敛效果。

如今,仅仅过去六个月,这些大语言模型早已算不上突破性成果。但我仍然将这篇论文纳入榜单,因为它不仅尝试解答关于训练设置的诸多有趣问题,更是在细节披露与透明度方面做出了良好示范。此外,参数规模小于10亿的小型大语言模型,是小型研究、实验探索的绝佳模板,也适合作为预训练实验的起步模型(这是他们的GitHub仓库链接:https://github.com/EleutherAI/pythia )。

我对2024年的期许是,未来能看到更多此类研究,以及更多写作精良的论文!

2) Llama 2:开源基础模型与经过微调的对话模型

https://arxiv.org/abs/2307.09288 是Meta广受欢迎的首篇Llama论文的后续研究。

Llama 2模型的参数范围从70亿到700亿,这也是它入选榜单的原因之一:这些模型至今仍是能力最强、应用最广泛的开源模型之一。值得一提的是,https://github.com/facebookresearch/llama/blob/main/LICENSE 许可协议也允许商业用途(详见https://ai.meta.com/resources/models-and-libraries/llama-downloads/ )。

figure02
来自Llama 2论文(https://arxiv.org/abs/2307.09288)的带注释图,对比Llama 2模型与ChatGPT的性能

在模型层面,Llama 2系列与其他许多大语言模型的区别在于,它既提供标准预训练模型,也提供经过基于人类反馈的强化学习(RLHF,正是ChatGPT所采用的训练方法)微调的对话模型,使其能像ChatGPT一样遵循人类指令——经过RLHF微调的模型目前仍然十分少见。

figure03
来自Llama 2论文(https://arxiv.org/abs/2307.09288)的带注释图,总结了用于指令微调的RLHF流程

关于RLHF及其在Llama 2中的应用细节,可参见我之前更全面的专题文章:
https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives

除了Llama 2模型应用广泛且提供RLHF指令微调版本之外,我决定将这篇论文纳入榜单的另一个原因,是随附的这份长达77页的深度研究报告。

在报告中,作者们还很好地展示了Llama 2 70B对话模型的演进过程,追溯了从初始监督微调(SFT-v1)到最终采用PPO的RLHF微调阶段(RLHF-v5)的完整历程。下图反映了模型在无害性与有用性两个维度上的持续提升,如带注释图表所示。

figure04
来自Llama 2论文(https://arxiv.org/abs/2307.09288)的带注释图,展示了从第一代监督微调模型(SFT-1)到最终RLHF微调对话模型(RLHF-v5)的性能演进

尽管Mistral-8x7B(后文会详述)、DeepSeek-67B、YI-34B等模型在公开基准测试中超越了更大的Llama-2-70B模型,但在开源大语言模型以及基于其进行方法开发的场景中,Llama 2仍然是普遍且热门的选择。

此外,尽管部分基准测试显示已有更优模型,但今年行业面临的更大挑战之一,是基准测试结果的可信度。比如,我们如何确定模型没有在这些基准测试数据上训练过,分数没有被高估?在经典机器学习领域,有人提出一种新的梯度提升模型时,复现结果并验证相对容易。而如今,鉴于训练大语言模型的成本与复杂度(且大多数研究者既不公开架构,也不披露训练数据细节),我们根本无从考证。

总而言之,在其他所有主流公司都纷纷推出自有闭源大语言模型(谷歌的Bard与Gemini、亚马逊的Q、Twitter/X的Grok,以及OpenAI的ChatGPT)的当下,Meta仍在坚持开源,这令人耳目一新。

3) QLoRA:量化大语言模型的高效微调

https://arxiv.org/abs/2305.14314 是今年大语言模型研究与微调社区最受欢迎的技术之一,它让本已流行的LoRA(低秩适配)技术进一步降低了内存占用。简而言之,这意味着你可以在显存更小的GPU上运行更大的模型。

figure05
常规LoRA的简要可视化总结

QLoRA即量化低秩适配(Quantized Low-Rank Adaptation)。标准LoRA方法通过在模型各层权重上添加低秩矩阵来修改预训练大语言模型。这些矩阵规模更小,因此微调过程中更新所需的资源更少。

在QLoRA中,这些低秩矩阵被量化,也就是降低其数值精度。具体做法是将矩阵中连续的取值范围映射到有限的离散电平集合。这一过程降低了模型的内存占用与计算需求,因为低精度数值的运算内存开销更低。

figure06
在大语言模型的众多高效微调方法中,LoRA是最流行、应用最广泛的方法之一。图为出色的综述论文https://arxiv.org/abs/2303.15647 中的带注释图。

根据https://arxiv.org/abs/2305.14314 的数据,QLoRA将650亿参数Llama模型的内存需求降低到可在单张48GB GPU(如A100)上运行。通过对650亿参数Llama进行4位量化训练得到的650亿参数Guanaco模型,保持了完整16位微调的任务性能,仅经过24小时微调,性能就达到ChatGPT的99.3%。

我今年也做了很多QLoRA实验,发现它是降低微调时GPU内存需求的实用工具。不过它也存在权衡:额外的量化步骤会带来额外的计算开销,意味着训练速度会比常规LoRA稍慢。

figure07
我之前撰写的LoRA与QLoRA实验节选,见https://magazine.sebastianraschka.com/p/practical-tips-for-finetuning-llms

随着研究者与从业者致力于打造定制化大语言模型,大语言模型微调的重要性一如既往。而QLoRA这类技术降低了GPU内存门槛,让微调过程更易上手,我对此十分认可。

4) BloombergGPT:面向金融领域的大语言模型

纵观今年发表的所有论文,https://arxiv.org/abs/2303.17564 入选十佳榜单看起来或许有些意外,因为它并没有带来突破性的新洞见、新方法,也没有开源模型。

我将它纳入榜单,是因为它是一个很有意思的案例:研究者在领域专属数据集上预训练了一个规模较大的大语言模型。此外,论文的描述相当详尽,这在如今越来越少见。尤其是企业作者参与的论文更是如此——今年的一个趋势是,在竞争激烈的格局下,大公司为了保护商业机密,对架构或数据集细节越来越保密(注:我对此并无指责之意)。

同时,BloombergGPT也让我思考了在领域专属数据上预训练与微调模型的各种不同方式,如下图所总结(注意:这一点并未在BloombergGPT论文中探讨,但未来的相关研究会很有意思)。

figure08
大语言模型预训练与微调的不同方式

简而言之,BloombergGPT是一个拥有500亿参数的金融领域语言模型,在3630亿金融领域token与3450亿公开通用数据集token上训练而成。作为对比,GPT-3的参数规模是它的3.5倍(1750亿参数),但训练token量仅为它的1.4倍(4990亿)。

既然GPT-3的规模是它的3.5倍,为什么作者们要采用“仅”500亿参数的架构?这个问题更好回答。他们采用了Chinchilla缩放法则,结合可用金融数据的规模,认为这个参数量是合适的。

在混合数据集上从头(预)训练大语言模型是否值得?从论文来看,该模型在目标领域表现非常出色。但我们并不知道,它是否优于以下两种方案:a)在领域专属数据上对预训练模型做进一步预训练;b)在领域专属数据上微调预训练模型。

尽管有上述小幅批评,总体而言这仍是一篇有趣的论文,是领域专属大语言模型的出色案例与范本;同时,它也为“向大语言模型注入知识时,预训练与微调孰优孰劣”这一问题留下了进一步研究的空间。

(注:好奇微调效果对比的读者,可参见我和他人的相关讨论:https://x.com/rohanpaul_ai/status/1738474868214235163?s=20 。“小型”模型https://arxiv.org/abs/2309.09530 在一个数据集上表现优于BloombergGPT,在另外三个金融数据集上性能与其接近。尽管整体来看BloombergGPT略胜一筹,但值得注意的是,训练AdaptLLM-7B的成本仅约100美元,而BloombergGPT的投入高达数百万美元。)

《Ahead of AI》是读者支持型出版物。若想接收新文章并支持我的创作,欢迎成为免费或付费订阅者。

5) 直接偏好优化:你的语言模型本质上是一个奖励模型

在讨论https://arxiv.org/abs/2305.18290 这篇论文之前,我们先稍作回顾,聊聊它旨在取代的方法——基于人类反馈的强化学习(RLHF)。

RLHF是ChatGPT与Llama 2对话模型背后的核心技术。我曾在https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives 一文中更详细地介绍过RLHF,它采用多步骤流程:

  1. 监督微调:首先在包含指令与期望回复的数据集上训练模型。
  2. 奖励建模:人类标注者对模型的输出给出反馈。这些反馈用于训练奖励模型,学习预测什么样的输出更受偏好。
  3. 近端策略优化(PPO):模型生成输出,由奖励模型为每个输出打分。PPO算法利用这些分数调整模型的策略,使其生成更高质量的输出。(这是一种用于微调模型策略的强化学习算法。)

figure09
监督指令微调步骤所用数据集中的两个训练示例。注意“输入”是可选的。

RLHF虽然流行且有效——正如ChatGPT与Llama 2所展现的那样,但它的实现也相当复杂,且对参数十分敏感。

https://arxiv.org/abs/2305.18290 提出了一种算法,无需显式的奖励建模或强化学习,就能优化语言模型以对齐人类偏好。相反,DPO采用简单的分类目标。

figure10
来自DPO论文https://arxiv.org/abs/2305.18290 的带注释图

在DPO中,我们保留监督微调步骤(即上述步骤1),但将步骤2和步骤3替换为单个步骤,在偏好数据上进一步微调模型。换句话说,DPO完全省去了RLHF所需的奖励模型构建环节,极大简化了微调流程。

它的效果如何?直到最近,采用DPO训练的模型还不多。(这也合理,因为DPO本身也是较新的方法。)不过,https://arxiv.org/abs/2310.16944 中介绍的Zephyr 7B模型就是一个近期的例子。Zephyr-7B基于Mistral-7B基础大语言模型,采用DPO进行微调。(后文还会详细介绍Mistral。)

如下方性能表格所示,70亿参数的Zephyr模型在发布时,在同规模模型中表现超越所有其他模型。更令人印象深刻的是,在对话类基准测试https://arxiv.org/abs/2306.05685 上,Zephyr-7B甚至超越了参数规模是它10倍的700亿参数Llama 2对话模型。

figure11
来自https://arxiv.org/abs/2310.16944 的Zephyr模型(经DPO微调的大语言模型)带注释基准测试结果

总而言之,DPO论文的吸引力在于其方法的简洁性。除了Llama 2等少数例外,采用RLHF训练的对话模型十分稀少,这很大程度上归因于RLHF方法的复杂性。有鉴于此,我认为未来一年DPO模型的应用会愈发广泛,这一判断是合理的。

6) Mistral 7B

必须承认,https://arxiv.org/abs/2310.06825 这篇论文篇幅简短,并不在我最喜爱的论文之列。但它提出的模型却产生了相当大的影响力。

我决定将这篇论文纳入榜单,是因为Mistral 7B模型不仅在发布时大受欢迎,还作为基础模型催生了另外两个知名模型:Zephyr 7B与最新的Mistral混合专家(MoE)模型。这些模型很好地代表了我所预见的、至少在2024年上半年小型大语言模型的发展趋势。

在讨论Zephyr 7B与Mistral MoE模型之前,我们先简要聊聊Mistral 7B本身。

简而言之,Mistral 7B论文提出了一个紧凑而强大的语言模型:尽管仅有70亿参数的适中规模,它在各类基准测试中却超越了更大的模型,比如130亿参数的Llama 2模型。(除了规模是它两倍的https://github.com/QwenLM/Qwen 之外,Mistral 7B也是今年https://llm-efficiency-challenge.github.io/leaderboard 竞赛优胜方案所采用的基础模型。)

figure12
来自https://arxiv.org/abs/2310.06825 的带注释图,对比Mistral 7B与Llama 13B的性能

它为何如此出色,确切原因尚不清楚,但很可能得益于其训练数据。Llama 2与Mistral均未公开训练数据,因此我们只能推测。

架构层面,该模型与Llama 2一样采用分组查询注意力。尽管与Llama 2非常相似,但Mistral架构的一个有趣新增特性是滑动窗口注意力,它能够节省内存、提升计算吞吐量,从而加快训练速度。(滑动窗口注意力此前已在https://arxiv.org/abs/1904.10509https://arxiv.org/abs/2004.05150 中被提出。)

Mistral所采用的滑动窗口注意力机制,本质上是一个固定大小的注意力块,让当前token仅能关注特定数量的之前token(而非所有之前的token),如下图所示。

figure13
来自https://arxiv.org/abs/2310.06825 的带注释图,解释滑动窗口注意力机制

具体到7B Mistral,注意力块大小为4096个token,研究者训练模型时的上下文长度可达10万token。举个具体的例子:在常规自注意力中,模型处理第50000个token时,可以关注之前全部49999个token。而在滑动窗口自注意力中,Mistral模型仅能关注第45904到50000个token(因为50000 – 4096 = 45904)。

不过,滑动窗口注意力主要用于提升计算性能。Mistral能够超越更大的Llama 2模型,大概率不是因为滑动窗口注意力,而恰恰是在采用滑动窗口注意力的情况下依然实现了超越。

Zephyr与Mixtral

Mistral 7B极具影响力的原因之一,是它作为Zephyr 7B的基础模型——正如前文DPO部分所提到的。Zephyr 7B是首个采用DPO训练且表现超越其他方案的热门模型,它可能为DPO成为未来数月对话模型微调的首选方法奠定了基础。

另一个源自Mistral 7B的值得关注的模型,是最近发布的https://mistral.ai/news/mixtral-of-experts/ ,也称为Mixtral-8x7B。该模型在多个公开基准测试中,性能追平甚至超越了更大的Llama-2-70B。

figure14
OpenCompass基准测试结果,来自https://github.com/open-compass/MixtralKit。蓝色方框标出了每行中的最优结果。

更多基准测试结果可参见官方页面:https://mistral.ai/news/mixtral-of-experts/ 。该团队还发布了Mixtral-8x7B-Instruct模型,采用DPO进行微调(不过截至撰写本文时,尚无基准测试将其与经过RLHF微调的Llama-2-70-Chat做对比)。

figure15
Mixtral架构概览,基于Mistral团队最初通过社交媒体磁力链接分享的param.json文件

有传闻称GPT-4也是一个混合专家模型,由16个子模块组成。据传这16个子模块每个都有110亿参数(作为参考,GPT-3有1750亿参数)。如果你大约两个月前读过我的文章https://magazine.sebastianraschka.com/p/ai-and-open-source-in-2023 ,我曾提到“看看2024年混合专家方法能否将开源模型提升到新高度,会很有意思”。看起来Mixtral早早开启了这一趋势,而我确信这仅仅是个开始。

混合专家模型入门

如果你对混合专家模型还不熟悉,这里做个简要说明。

figure16
来自Switch Transformer论文(https://arxiv.org/abs/2101.03961)的带注释图,解释混合专家架构

上图展示了Switch Transformer的架构,它每个token使用1个专家,总共有4个专家。而Mixtral-8x-7B则包含8个专家,每个token使用2个专家。

为什么采用混合专家架构?综合来看,像Mixtral这样的7B级模型中的8个专家,总参数量仍约为560亿。实际上,实际数值低于560亿,因为混合专家方法仅应用于前馈网络(FFN,即全连接层),而非自注意力权重矩阵。因此,总参数量更可能在400-500亿之间。

注意,路由器会对token进行路由分配,使得前向传播时每次仅激活不到140亿参数(2×小于70亿,而非全部560亿),因此训练(尤其是推理)速度会比传统的非混合专家方法更快。

如果你想了解更多关于混合专家模型的内容,这里是https://twitter.com/sophiamyang 推荐的阅读清单:
https://arxiv.org/abs/1701.06538
https://arxiv.org/abs/2006.16668
https://arxiv.org/abs/2211.15841
https://arxiv.org/abs/2305.14705

此外,如果你想试用混合专家大语言模型,也可以看看https://github.com/XueFuzhao/OpenMoE 仓库,它在今年早些时候实现并开源了混合专家大语言模型。

其他小型但竞争力强的大语言模型

Mistral 7B、Zephyr 7B与Mixtral-8x7B是2023年小型但高性能、且权重开源的模型取得进展的绝佳范例。另一个值得一提的模型、也是我个人榜单的亚军,是微软的phi系列。

phi系列的秘诀在于,通过过滤网络数据得到高质量数据(被称为“教科书级数据”)进行训练。

phi系列模型在2023年分阶段发布,包括phi-1(13亿参数)、phi-1.5(13亿参数)与phi-2(27亿参数)。其中phi-2于两周前刚刚发布,据称尽管规模仅为Mistral 7B的一半,性能却追平甚至超越了后者。

figure17
13亿参数的phi-1.5模型与各类70亿参数模型的对比(来自phi-1.5论文https://arxiv.org/abs/2309.05463

想了解更多phi模型的信息,推荐以下资源:
https://arxiv.org/abs/2306.11644 —— phi-1论文
https://arxiv.org/abs/2309.05463
https://www.microsoft.com/en-us/research/blog/phi-2-the-surprising-power-of-small-language-models/ 官方发布公告

7) Orca 2:教小语言模型学会推理

https://arxiv.org/abs/2311.11045 是一篇相对较新的论文,未来它会对我们未来数月乃至数年训练大语言模型的方式产生多大影响,还有待时间检验。

我决定将它纳入榜单,是因为它融合了多个概念与思路。

其中一个思路是从GPT-4等大型高性能模型中蒸馏数据,创建合成数据集来训练小型但高性能的大语言模型。这一思路在去年发表的Self-Instruct论文中已有阐述。今年早些时候,Alpaca(一个在ChatGPT输出上微调的Llama模型)真正让这种方法流行开来。

它的工作原理是什么?简而言之,这是一个4步流程:

  1. 用一组人工编写的指令(本研究中为175条)与示例指令初始化任务池;
  2. 用预训练大语言模型(如GPT-3)确定任务类别;
  3. 给定新指令,让预训练大语言模型生成回复;
  4. 对回复进行收集、修剪与过滤,再加入任务池。

figure18
基于Self-Instruct论文https://arxiv.org/abs/2212.10560 的带注释图

另一个思路或许并不令人意外,但值得强调:高质量数据对微调至关重要。例如,https://arxiv.org/abs/2305.11206 提出了一个人工生成的高质量数据集,仅包含1000个训练样本,用其微调后的模型,性能优于在5万条ChatGPT生成回复上微调的同一模型。

figure19
来自LIMA论文https://arxiv.org/abs/2305.11206 的带注释图

与以往严重依赖模仿学习来复制更大模型输出的研究不同,Orca 2旨在教“小型”(即70亿与130亿参数)大语言模型掌握各类推理技巧(如逐步推理、回忆后生成等),并帮助它们确定每个任务最有效的策略。这一方法让Orca 2的表现明显优于同规模模型,甚至能达到5-10倍规模模型的性能水平。

figure20
Orca 2论文https://arxiv.org/abs/2311.11045 中评估的众多基准测试任务的子集

尽管我们尚未看到广泛的相关研究,但Orca 2的方法或许也能解决https://arxiv.org/abs/2305.15717 论文中强调的合成数据问题。该研究中,研究者们探究了用Alpaca、Self-Instruct等方法,让较弱的语言模型模仿ChatGPT等更强的闭源模型。最初,这些模仿模型表现亮眼,指令遵循能力出色,众包标注者给出的评分也与ChatGPT相当。但后续更多评估发现,这些模仿模型只是在人类观察者看起来表现好,生成的回复却常常存在事实错误。

8) 大规模下卷积神经网络与视觉Transformer性能相当

近年来,由于Transformer的出色性能,我几乎只研究大语言Transformer或视觉Transformer(ViT)。

最后三篇我们切换到计算机视觉领域的论文。我觉得计算机视觉Transformer尤其吸引人的一点是,预训练的视觉Transformer甚至比卷积神经网络更易于微调。(我今年早些时候在CVPR的一个动手实践讲座中做过总结,见:https://magazine.sebastianraschka.com/p/accelerating-pytorch-model-training

令我意外的是,我偶然发现了https://arxiv.org/abs/2310.16764 这篇论文,它表明当拥有足够大的数据集时,卷积神经网络(CNN)实际上与视觉Transformer具有竞争力。

figure21
来自《大规模下卷积神经网络与视觉Transformer性能相当》(https://arxiv.org/abs/2310.16764)论文的带注释图

该研究中,研究者投入了最高达11000 TPU小时的计算预算,对视觉Transformer与卷积神经网络进行了公平对比。结果表明,当卷积神经网络的预训练计算预算与视觉Transformer的常用预算相当时,二者性能可以持平。为此,他们在JFT的40亿张标注图像上进行预训练,随后在ImageNet上微调模型。

9) Segment Anything

图像与视频中的目标识别与分割,以及分类与生成建模,是计算机视觉的主要研究方向。

先简要说明这两个任务的区别:目标检测是预测边界框及对应的类别标签;分割则是对每个像素进行分类,以区分前景与背景物体。

figure22
目标检测(上)与分割(下)。图分别来自YOLO论文(https://arxiv.org/abs/1506.02640)与Mask R-CNN论文(https://arxiv.org/abs/1703.06870v3

Meta的https://arxiv.org/abs/2304.02643 论文是开源与图像分割研究领域的重要里程碑。该论文提出了图像分割的新任务、新模型与新数据集。随附的图像数据集是迄今为止最大的分割数据集,包含1100万张图像上的超过10亿个掩码。

figure23
Segment Anything模型(SAM)专为高效、基于提示的图像分割而设计。图为Segment Anything论文https://arxiv.org/abs/2304.02643 的带注释截图

而尤为难得、值得称赞的是,研究者们使用的是获得授权且尊重隐私的图像,因此该模型可以开源,而不会存在重大版权问题。

Segment Anything模型(SAM)由三个主要组件组成,如上方带注释图所总结。

figure24
Segment Anything模型的三个主要组件,来自https://arxiv.org/abs/2304.02643

更详细地说,三个组件可总结如下:

  1. 图像编码器:采用基于预训练视觉Transformer(ViT)的掩码自动编码器,可处理高分辨率输入。该编码器每张图像仅运行一次,可在向模型输入提示前完成计算。
  2. 提示编码器:处理两类提示:稀疏提示(点、框、文本)与密集提示(掩码)。点与框通过位置编码结合每种提示类型的可学习嵌入来表示;自由格式文本则使用CLIP的现成文本编码器。密集提示即掩码,通过卷积进行嵌入,并与图像嵌入逐元素相加。
  3. 掩码解码器:将图像嵌入、提示嵌入与输出token映射为掩码。它采用解码器式Transformer架构,计算每个图像位置的掩码前景概率。

图像分割对于自动驾驶、医学影像等诸多应用都至关重要。在短短6个月时间里,这篇论文的引用量已达https://scholar.google.com/scholar?cites=1574144728855576863&as_sdt=5,39&sciodt=0,39&hl=en ,并且已有大量项目基于这篇论文展开。

10) 对齐你的潜在向量:基于潜在扩散模型的高分辨率视频合成

https://arxiv.org/abs/2311.10709 是Meta研究部门的另一个知名计算机视觉项目。

Emu是一个文本生成视频模型,可以根据文本提示生成完整视频。

尽管它并非首个实现出色文本生成视频效果的模型,但与此前的工作相比,它的表现十分优异。

figure25
Emu与其他文本生成视频模型的性能对比,来自https://arxiv.org/abs/2311.10709

正如作者们所指出的,与此前的方法相比,Emu的架构设计相对简洁。其核心思路之一是,Emu将生成过程拆解为两步:首先根据文本生成图像(采用扩散模型),然后同时基于文本与生成的图像生成视频(采用另一个扩散模型)。

2022年是DALL-E 2、Stable Diffusion、Midjourney等文本生成图像模型的大年。尽管2023年文本生成图像模型仍然非常流行(虽然大语言模型占据了全年大部分关注度),但我认为,文本生成视频模型即将在未来一年的线上社区中变得更加普及。

由于我并非图像或视频设计师,目前暂时没有这些工具的使用场景;不过,作为衡量计算机视觉领域进展的通用指标,文本生成图像与文本生成视频模型的发展仍然值得关注。

这本杂志是个人兴趣项目,不提供直接报酬。不过,如果您愿意支持我的创作,欢迎购买https://sebastianraschka.com/books 上的书籍。如果您觉得这些书有洞见、有帮助,也欢迎推荐给您的朋友与同事。

figure26
https://www.amazon.com/Machine-Learning-PyTorch-Scikit-Learn-scikit-learn-ebook-dp-B09NW48MR1/dp/B09NW48MR1/ , https://nostarch.com/machine-learning-and-ai-beyond-basics , 以及 http://mng.bz/M96o

您的支持意义重大!谢谢!

【转载】应对幻觉问题、提升推理能力与Transformer架构新洞察

原文地址:Tackling Hallucinations, Boosting Reasoning Abilities, and New Insights into the Transformer Architecture,by Sebastian Raschka, on 2023-12-09

应对幻觉问题、提升推理能力与Transformer架构新洞察

本月,我想重点介绍三篇论文,它们分别针对大语言模型(LLM)三类不同的问题展开研究:

  • 减少幻觉现象
  • 提升开源小型模型的推理能力
  • 深化对Transformer架构的理解,并探索其简化可能

减少幻觉之所以重要,是因为尽管GPT-4这类大语言模型已被广泛用于知识生成,但它们仍会生成看似合理却存在错误的信息。
提升小型模型的推理能力同样意义重大。当前,在处理诸多任务时,ChatGPT与GPT-4(相较于私有或个人大语言模型)依然是我们的首选方案。提升这些小型模型的推理能力,是缩小开源模型与当前前沿闭源模型差距的途径之一。
最后,深化对Transformer架构的理解,是掌握大语言模型训练动态的基础。这些知识有望催生更简洁、更高效的模型,提升开源模型的性能,甚至可能为新的架构创新铺平道路。

1)针对事实性微调语言模型

大语言模型(LLM)常受幻觉问题困扰,即会生成看似可信但事实有误的内容。在将大语言模型用于知识类问答场景时,这个问题尤为突出,因为用户需要手动对回复进行事实核查。这一过程耗时耗力,对于某些查询来说,甚至会让使用大语言模型的意义大打折扣。

在论文https://arxiv.org/abs/2311.08401中,作者提出利用https://arxiv.org/abs/2305.18290(DPO,直接偏好优化)的微调方法来降低幻觉发生率。通过对7B参数的Llama 2模型使用该方法进行微调,与原始Llama-2-chat模型相比,其事实错误率降低了58%。

figure01
摘自论文https://arxiv.org/abs/2311.08401的带标注图表,显示该方法在事实错误率方面优于其他方案。

关于幻觉

这一点在论文中并未展开讨论。但在深入探讨论文内容之前,我们有必要先了解大语言模型的训练与推理机制,它们带来了两方面挑战。在预训练阶段,低质量的数据集可能会让大语言模型吸收事实错误的信息。
其次,在推理阶段,我们会使用温度参数和采样方法,让大语言模型变换句式结构,避免每次生成完全相同的文本。这种机制避免了模型单纯像数据库查询一样输出内容,但同时,也没有机制能保证哪些词元应该采样生成、哪些应该直接沿用训练集中的内容。

比如,对于“iPhone是谁发明的?首次发布于何时?”这样的问题,可能的回复包括以下几种:
figure02
大语言模型的不同回复,关键事实已用蓝色标出。

大语言模型可以变换句式和措辞,但核心事实——即iPhone由苹果公司在史蒂夫·乔布斯领导下的团队研发,于2007年6月29日发布——不应被改动。
更具体地说,把“发明(invented)”换成“研发(created)”是可以接受的;但把“苹果(Apple)”换成“橙子(Orange)”“三星(Samsung)”,或是改动发布日期,显然就是严重错误。

直接偏好优化

研究人员在这里采用的核心方法是https://arxiv.org/abs/2305.18290(DPO,直接偏好优化),它正逐渐成为人类反馈强化学习(RLHF)之外的热门替代方案。
RLHF是ChatGPT、Llama 2 Chat等模型背后的训练方法。想了解更多RLHF的内容,可以参考我的另一篇文章,链接如下:
https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives
https://substack.com/profile/27393275-sebastian-raschka-phd
·
2023年9月10日
https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives
无论是讨论研究前沿还是教程内容,我经常会提到“人类反馈强化学习(RLHF)”这一流程。由于能将人类偏好融入优化过程,提升模型的有用性与安全性,RLHF已成为现代大语言模型训练流程中不可或缺的一环。
https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives

DPO在概念上比RLHF更简单:它直接基于回复偏好排名对大语言模型进行训练,无需单独构建奖励模型。本质上,DPO直接在偏好数据上计算分类损失,实现和使用难度都远低于RLHF。此外,DPO近期已被成功应用——比如Lewis Tunstall团队开发的https://huggingface.co/HuggingFaceH4/zephyr-7b-alpha,其表现似乎超过了通过RLHF训练的更大参数的Llama-2 70b Chat模型——DPO正逐渐成为最主流的微调方法之一。

figure03
DPO论文(https://arxiv.org/abs/2305.18290)中的带标注图表。

注:这篇《针对事实性微调语言模型》论文中,有三位作者同时也是原始DPO论文的作者。

省去人工标注工作

与RLHF相比,DPO简化了微调流程,因为它不需要构建奖励模型。但DPO仍然需要生成偏好数据,通常需要先让模型生成回复,再由人工进行事实核查,然后由标注人员按偏好对这些回复排序。
作者指出,人工核查一条大语言模型回复(比如一位知名人物的生平介绍)平均需要9分钟。按照这个速度,核查本研究使用的505条生平传记数据集,成本约为2000美元。

作为人工事实核查的替代方案,作者提出了一种DPO变体,完全不需要人工参与。这种思路与https://arxiv.org/abs/2309.00267(AI反馈强化学习)类似,后者和RLHF不同,不需要人工输入。
figure04
RLAIF论文(https://arxiv.org/abs/2309.00267)中的带标注图表。

在《针对事实性微调语言模型》论文中,作者实验了两种生成全自动“真实性”评分的方法:

  • 基于参考的真实性评分,简称FactTune-FS
  • 无参考的真实性评分,简称FactTune-MC

figure05
《针对事实性微调语言模型》论文(https://arxiv.org/abs/2311.08401)中的带标注图表。

两种方法的第一步,都是获取一个回复数据集(比如知名人物的生平介绍),再用GPT-3.5模型从中提取出原子化的事实主张。
在方法1(FactTune-FS)中,作者沿用了已有的https://arxiv.org/abs/2305.14251方法:以维基百科作为事实来源,用Llama 1 7B模型验证每条原子主张是否能得到对应文章的支持。我推测这里使用小型Llama 1模型,是因为原始FactScore论文中采用的就是该模型。

在方法2(FactTune-MC)中,作者先用GPT-3.5把原子主张转化为问题,再将这些问题作为查询,输入给设置了高温度参数的Llama 1模型,让它生成多个不同的回复,将出现频率最高的回复的频次作为真实性评分。和方法1相比,FactTune-MC的优势在于不需要外部来源提供参考文章。

之后,利用真实性评分为数据集生成偏好排名,再通过DPO流程对模型进行微调。实验结果显示,FactTune-FS表现极为出色,在降低事实错误率方面,超过了包括RLHF和常规监督微调在内的所有其他测试方法。
figure06
《针对事实性微调语言模型》论文(https://arxiv.org/abs/2311.08401)中对比不同方法效果的带标注图表。

注意:作者实验了对Llama 1和Llama 2都进行微调,但并未说明上图中微调的是哪款模型。结合论文表2的数据比对,我推测是Llama 2模型。图中RLHF指的是Meta提供的Llama 2 Chat模型;SFT模型是作者用常规监督学习(而非基于偏好数据的DPO)微调的Llama 2模型,使用的数据集和FactTune-FS模型相同,即生平传记与医疗问答数据集。

数据集

正如上图所提示的,作者使用了两个数据集:知名人物生平传记、医疗问答。这些数据集规模相对较小,但每条回复都包含多个事实点,因此两个数据集各自用到的事实总数都可能达到四位数级别。
figure07
《针对事实性微调语言模型》论文(https://arxiv.org/abs/2311.08401)中创建并使用的数据集。

鲁棒性

从上述介绍可以看出,这套方法有很多环节都依赖大语言模型,比如用GPT-3.5生成原子主张、用7B参数的Llama 1模型核查主张是否成立等。这意味着我们在很大程度上是信任大语言模型,让它们去核查另一款大语言模型的输出。

总的来说,这套方法的效果之好令人意外。但一个无法回避的问题是:由于正确与错误回复的数量是基于自动化的https://arxiv.org/abs/2305.14251流程判定的,模型会不会是过拟合了FactScore的判定规则,而非真的生成了事实准确的回复?

为了解答对FactScore评估方式的质疑,作者引入人工标注人员对模型进行评估。如下图所示,FactScore的评分与人工标注的评分高度吻合。如果我们相信人工核查回复的准确性,那么FactScore的评分仅存在轻微的高估。
figure08
《针对事实性微调语言模型》论文(https://arxiv.org/abs/2311.08401)中的带标注表格,显示自动化的FactScore与人工标注的表现一致。

权衡

Llama 2 Chat是通过人类反馈强化学习(RLHF)训练的,目标是优化有用性与无害性。作者发现,在其基础上应用FactTune-FS,能进一步提升Llama 2 Chat的事实准确性。但我好奇的是,这种提升是否是以降低有用性与无害性为代价的。

理论上,有用性和事实准确性应该高度相关。比如,事实正确的回复理应比事实错误的回复更有用。但Llama 2奖励模型数据的标注方式,可能并没有充分体现这一点。也就是说,参与Llama 2训练、负责有用性排序的标注人员,或许并没有仔细核查所有回复的事实。因此,一条看似有说服力、但可能存在事实错误的回复,也可能被判定为更有用。
figure09
Llama 2 Chat针对有用性与无害性进行了优化;图为Llama 2原始论文(https://arxiv.org/abs/2307.09288)中的带标注图表。

当然,让本就有用的回复变得更符合事实,肯定是更优的。但我好奇的是,这会不会对对话能力,或是翻译、语法纠错、小说创作等不依赖事实的任务产生负面影响。

目前我们没有数据表明,针对事实准确性的DPO微调,会不会降低Llama 2 Chat原本优化的有用性与无害性评分。但作者提出了一些有意思的观察:

  • 我们发现,与SFT模型相比,FactTune-FS和FactTune-MC生成的样本往往句式更客观、直接,对话感和叙事感更弱。
  • FactTune-FS和FactTune-MC生成的样本句子更简单,缺少口语化表达。
  • 再比如,FactTune-FS和FactTune-MC生成的生平介绍事实准确,但没有遵循自然的时间顺序。

局限性与结论

总的来说,我认为这是一篇非常优秀的论文,证明了DPO微调的实用价值。此前一些大语言模型的微调明确以降低危害性为目标,而这篇论文也说明,我们可以用其他目标成功地对模型进行微调。

一个小的不足是,论文使用的数据集规模偏小。但换个角度看,在小数据集上方法依然能取得这么好的效果,反而更令人印象深刻。好消息是,这套方法是完全自动化的,因此可以轻松扩展到更大的数据集。

2)Orca 2:教小型语言模型如何推理

论文https://arxiv.org/abs/2311.11045提出了一种有效方法,通过使用专门的合成数据进行训练,大幅提升小型语言模型(LLM)的推理能力。其核心思路是:运用多种推理技巧,教会大语言模型针对每个任务识别最高效的解题策略。

最终得到的Orca-2-13B模型,在零样本推理任务上表现优于同规模模型:相比https://arxiv.org/abs/2307.09288提升了47.54%,相比https://arxiv.org/abs/2304.12244提升了28.15%。注意,这三款模型(Orca、Llama-2-Chat、WizardLM)都是基于相同的Llama-2基座模型进行微调的。
此外,Orca-2-13B甚至能与参数规模是其5-10倍的模型一较高下,比如LLaMA-2-Chat-70B、WizardLM-70B以及ChatGPT。
figure10
Orca 2论文(https://arxiv.org/abs/2311.11045)中的带标注图表,显示Orca 2在推理基准测试上的表现优于同规模及更大规模的大语言模型。注意Orca 2和WizardLM都基于Llama 2开发,因此对比很有参考价值。

(上图中的“小型谨慎系统提示词”是一个实现细节:他们在指令中加入了以下文本:“你是Orca,由微软开发的AI语言模型。你是一名谨慎的助手,严格遵循指令,乐于助人且安全无害,遵守道德准则,倡导积极行为。”)

模仿学习

近几个月来,模仿学习蔚然成风。在大语言模型领域,模仿学习指的是让小型目标模型(称为“学生模型”)学习大型源模型(称为“教师模型”,比如GPT-4)的输出。
figure11
大语言模型场景下的模仿学习示意图:小型大语言模型通过学习大型模型的回复,模仿其输出。

论文https://arxiv.org/abs/2305.15717指出了小型语言模型模仿大型模型的一个核心问题:这些小模型可以模仿大模型的风格,生成乍一看很惊艳的内容,但仔细审视就会发现输出并不准确。也就是说,它们看似表现不错,但深入检查生成内容时,实则错误百出。

在Orca 2论文中,作者解释道,小型语言模型(按如今的标准,70亿到130亿参数都算“小型”)不能只靠照搬大模型的方法来提升效果。他们提出了另一种思路:教这些小模型独特的解题或思考方式,有别于大模型的思路。这是因为参数量更少、能力有限的小模型,可能无法沿用大模型的解题策略。

教授不同的推理策略

作者将他们的方法称为“解释微调”,核心是通过特定的查询提示,从源大语言模型(此处为GPT-4)中提取带有高质量解释的答案,以此构建合成数据集。

如果你用过ChatGPT(尤其是早期版本),大概会知道答案质量很大程度上取决于你如何提示模型。不同的任务需要不同的提示策略,比如逐步推导、先回忆再生成、回忆-推理-生成、直接作答等等。

作者认为,不应该让小模型只训练或使用某一种特定的解题策略,而应该让模型的解题(或推理)策略随任务变化而调整。

他们为Orca 2设计了如下训练流程,其中“Orca(参考版)”是前代模型:
figure12

注意,在训练过程中,小型模型只学习任务和对应的回复,看不到最初用来从大型教师模型中提取这些回复的问题或指令。

换句话说,基座大语言模型(此处为Llama 2)本身以及微调方式并没有什么特别之处。真正带来惊人效果的创新,完全在于合成训练数据的构建方式。
figure13
https://arxiv.org/abs/2305.14045数据集的片段,展示同一提示对应的不同答案。这是基于Orca 2论文(https://arxiv.org/abs/2311.11045)中图表制作的带标注示意图。

基准测试与结果

如下图所示,与同规模的其他模型相比,最终的Orca-2模型在推理与知识类基准测试上表现极为出色。
figure14
Orca 2论文(https://arxiv.org/abs/2311.11045)中部分知识与推理基准测试结果的带标注图表。

注意,上图只是很小一部分内容。Orca 2论文中的基准测试相当全面,覆盖了推理能力、知识与语言理解、文本补全、多轮开放式对话、事实依据与抽象总结、安全性、真实性等多个维度。

13B参数的模型表现十分惊艳,大幅超越了同尺寸的其他模型。只有在多轮对话基准测试中,Orca-2-13B的表现略逊于Llama-2-Chat。作者解释这是因为训练数据集中没有包含这类对话数据,这个说法完全合理。

在我看来,语言模型的优势不在于通用性,而在于专业性。并非所有任务都需要由对话式AI来完成。我更倾向于一套高度专业化、能力极强的工具,而不是一个样样通、样样松的“万金油”方案。

结论与总结思考

以13B参数的Llama 2模型为起点能取得这样的成果,非常令人赞叹。我很好奇,也很期待:如果将这种定制化合成数据策略应用于70B参数的Llama 2模型甚至更大的模型,推理等基准测试的显著提升是否依然成立。

论文给出了全面的基准测试结果,出色的表现有目共睹。但一个小的瑕疵是:作者强调了让小型模型根据任务选择最高效解题策略的重要性,却没有针对Orca 2模型在这方面做任何实验或消融研究。唯一的证据是,经过精心筛选的合成数据混合训练的Orca 2模型(本质是Llama 2),表现优于通过其他方式微调的Llama 2模型,包括更大的模型。

值得肯定的是,这些成果完全是通过在精选合成数据上进行监督微调实现的,Orca 2模型没有经过任何RLHF或DPO微调。有理由认为,甚至很有可能,RLHF或DPO微调能进一步提升这些模型的效果,这也是未来研究中一个很有意思的方向。

附:Orca 2的权重已公开,可在此处获取:https://www.microsoft.com/en-us/research/project/orca/

3)简化Transformer模块

在论文https://arxiv.org/abs/2311.01906中,作者研究了如何在不损失收敛特性与下游任务性能的前提下,简化大语言模型核心的标准Transformer模块。

基于信号传播理论与实证结果,他们发现GPT类解码器架构和BERT类编码器架构中的很多组件都可以移除:

  • 跳跃连接
  • 投影矩阵与值参数
  • 串行的注意力与MLP子模块(可替换为并行布局)
  • 归一化层(LayerNorm)

figure15
原始Transformer模块(左)与简化后Transformer模块(右)的对比标注图(来自https://arxiv.org/abs/2311.01906)。

移除跳跃连接

随着网络层数加深,梯度在反向传播过程中会逐渐衰减,导致模型训练困难。跳跃连接(也叫残差连接)是深度神经网络中常见的架构设计,用于缓解梯度消失问题。

直接粗暴地移除跳跃连接会引发梯度问题。为了避免这一点,作者基于信号传播理论,提出了特定的权重初始化方案。对细节感兴趣的读者非常推荐阅读这篇优秀的论文,里面有大量有意思的洞见。
figure16
移除跳跃连接后,通过调整权重初始化方式、并用额外超参数β对残差进行加权,得到的评估损失与原始Transformer模块几乎一致。(来自https://arxiv.org/abs/2311.01906的带标注曲线图)

顺便一提,原始Transformer模块示意图左上角的“Pre-LN”,指的是LayerNorm(“Norm”层)的位置。实际上,https://arxiv.org/abs/1706.03762中提出的原始Transformer采用的是Post-LN结构。近年来,Transformer模型越来越多地从Post-LN转向Pre-LN,因为它能简化训练流程。

Pre-LN的一大优势是对初始学习率更不敏感,不需要精心设计学习率预热,而学习率预热是影响训练稳定性与效果的关键因素。想了解更多Pre-LN与Post-LN的优缺点,推荐观看我的朋友兼合作者Vahid的视频:https://www.youtube.com/watch?v=RsuSOylfN2I
figure17
实现细节的直观对比:前置层归一化(Pre-LayerNorm)与后置层归一化(Post-LayerNorm)

移除其他组件

上一节实验(将加权超参数β设为0)带来的启发,让作者成功移除了投影矩阵与值参数。作者认为,值矩阵和投影矩阵只是对输入的线性投影(不同于MLP子模块中的线性层,中间还有非线性激活函数),因此可能是冗余的。

作者还尝试移除归一化层(即LayerNorm)。理由是:前置层归一化本质上会降低残差分支的权重,而这种降权效果也可以通过作者之前的修改方案实现,因此LayerNorm在这套架构中理论上是多余的。

不过,作者观察到训练收敛性出现了轻微下降,这一点目前还无法用信号传播理论解释。因此结论是,建议在Transformer模块中保留LayerNorm。

局限性与结论

作者的实验是在相对小型的模型上进行的。虽然没有理由认为这些结论不适用于更大的语言模型,但目前还没有实证证据支持这一点。我并不认为作者没做更大规模的实验是什么缺点——恰恰相反,这篇只有两位作者的研究让我印象极为深刻,堪称我今年读过的最佳论文之一。他们还引用了大量相关工作,为实验提供了充分的理论支撑。光是参考文献部分,就非常值得一读。

在我看来,这些修改方案的主要价值之一,是帮助我们更好地理解并简化Transformer架构。除此之外,作者还报告称,修改后模型的训练吞吐量提升了15%,参数量减少了15%。

我希望拥有更多算力的大型研究机构也能关注这项工作,将这些洞见应用于新的架构(当然,最好也能分享他们的研究成果)。我非常想知道这些修改是否也适用于更大的大语言模型。

其他值得关注的研究论文

  • 《ChatGPT发布一周年:开源大语言模型正在迎头赶上吗?》,作者Chen、Jiao、Li、Qin(11月29日),https://arxiv.org/abs/2311.16989
    该研究调研了开源大语言模型被报道达到或超越ChatGPT能力的相关案例。

  • 《语言模型逆向》,作者Morris、Zhao、Chiu、Shmatikov、Rush(11月22日),https://arxiv.org/abs/2311.13647
    研究表明,下一个词元的概率包含了大量前文文本的信息,可以据此从大语言模型生成的输出中还原用户的提示词。

  • 《无需奖励模型,利用人类反馈微调扩散模型》,作者Yang、Tao、Lyu、Ge等(11月22日),https://arxiv.org/abs/2311.13231
    D3PO是一种直接偏好优化(DPO)方法,提供了一种高性价比的方案,无需奖励模型即可利用人类反馈微调扩散模型。

  • 《PaSS:并行推测采样》,作者Monea、Joulin、Grave(11月22日),https://arxiv.org/abs/2311.13581
    该研究提出并行解码方案,解决大语言模型生成词元时的内存瓶颈,无需额外辅助模型即可同时生成多个词元,速度提升最高达30%,额外参数极少。

  • 《ZipLoRA:通过有效融合LoRA实现任意主题、任意风格》,作者Shah、Ruiz、Cole、Lu等(11月22日),https://arxiv.org/abs/2311.13600
    ZipLoRA可将独立训练的风格低秩适配与主题低秩适配进行有效融合,此处应用于扩散模型。

  • 《GAIA:通用AI助手基准测试》,作者Mialon、Fourrier、Swift、Wolf等(11月21日),https://arxiv.org/abs/2311.12983
    GAIA是全新的通用AI助手基准测试,包含考验推理、工具使用等核心能力的真实场景问题,在该基准上人类的表现显著优于GPT-4等当前AI/大语言模型。

  • 《系统2注意力(或许你也需要)》,作者Weston、Sukhbaatar(11月20日),https://arxiv.org/abs/2311.11829
    提出的系统2注意力(S2A)机制,通过重构输入上下文以聚焦相关信息,优化基于Transformer的大语言模型,提升了对事实性、客观性要求高的任务的表现,减少了无关或有偏见的内容。

  • 《Orca 2:教小型语言模型如何推理》,作者Mitra、Del Corro、Mahajan、Codas等(11月18日),https://arxiv.org/abs/2311.11045
    继Orca之后,Orca 2聚焦于教小型语言模型不同的推理策略,而非单纯依赖模仿学习,以提升其解决问题的能力,路径可能与大型模型有所不同。

  • 《气候变迁中的骆驼:用Tulu 2增强语言模型适配能力》,作者Ivison、Wang、Pyatkin、Lambert等(11月17日),https://arxiv.org/abs/2311.10702
    作者发布了TÜLU 2模型系列,其中包含一款70B参数的DPO微调模型,是目前为止参数最大的DPO微调大语言模型。

  • 《Video-LLaVA:通过投影前对齐学习统一视觉表征》,作者Lin、Zhu、Ye、Ning等(11月16日),https://arxiv.org/abs/2311.10122
    Video-LLaVA是一款大型视觉语言模型,将视觉表征与语言特征进行统一,其统一分词方法的表现优于ImageBind-LLM、Llama-Adapter等未对齐图像与视频投影的模型。

  • 《Emu Edit:通过识别与生成任务实现精准图像编辑》,作者Sheynin、Polyak、Singer、Kirstain等(11月16日),https://arxiv.org/abs/2311.10089
    Emu Edit是一款多任务图像编辑模型,通过在广泛任务上训练并引入学习到的任务嵌入,在指令引导的图像编辑任务上达到了当前最优水平。

  • 《Tied-Lora:通过权重绑定提升LoRA的参数效率》,作者Renduchintala、Konuk、Kuchaiev(11月16日),https://arxiv.org/abs/2311.09578
    研究人员实验了LoRA(低秩适配)的权重绑定(即权重共享)方案,发现平均而言不绑定权重的效果最好;但在部分任务上,绑定权重也能取得不错的效果,同时可将所需的LoRA参数量减少至13%。

  • 《指数级提速的语言建模》,作者Belcak、Wattenhofer(11月15日),https://arxiv.org/abs/2311.10770
    作者提出UltraFastBERT——一种BERT(编码器式大语言模型)变体,仅使用原模型0.3%的参数,速度最高提升78倍,同时保持预测精度。

  • 《大羊驼知道GPT不会展示的事:用于置信度估计的代理模型》,作者Shrivastava、Liang、Kumar(11月15日),https://arxiv.org/abs/2311.08877
    论文提出使用带有可获取概率的代理置信度模型,来估计GPT-4、Claude-v1.3等不提供softmax概率的前沿大语言模型的置信度。结果显示,与直接询问大语言模型对答案的置信度相比,该方法在12个数据集中的9个上准确率更高。

  • 《笔记链:提升检索增强语言模型的鲁棒性》,作者Yu、Zhang、Pan、Ma等(11月15日),https://arxiv.org/abs/2311.09210
    论文提出“笔记链”方法,通过为检索到的文档生成连续笔记,提升检索增强语言模型的评估效果与回复准确性,即使存在噪声或无关信息也能生效。该方法使用ChatGPT在LLaMa-2 7B模型上生成的训练数据进行训练。

  • 《Fusion-Eval:将评估器与大语言模型融合》,作者Shu、Wichers、Luo、Zhu等(11月15日),https://arxiv.org/abs/2311.09204
    论文提出Fusion-Eval——一种基于提示的大语言模型评估聚合器,使用模板整合辅助评估器评分与模型回复,无需微调即可生成评分(及理由),并使用另一款大语言模型规划和优化评估流程。

  • 《路由到专家:大语言模型的高效奖励引导集成》,作者Lu、Yuan、Lin、Lin等(11月15日),https://arxiv.org/abs/2311.08692
    研究提出Zooter——一种针对大语言模型集成的奖励引导路由方法,能识别并利用单个模型的潜在专长,降低计算开销,在多个领域和任务上,效率与表现均优于传统的奖励模型排序方法。

  • 《对比人类、GPT-4与GPT-4V在抽象推理任务上的表现》,作者Mitchell、Palmarini、Moskvichev(11月14日),https://arxiv.org/abs/2311.09247
    研究使用ConceptARC基准测试,评估纯文本与多模态GPT-4的抽象推理能力。结果显示,尽管对GPT-4使用了详细的单样本提示、对GPT-4V使用了零样本和单样本图像提示,两个版本都未展现出人类级别的鲁棒抽象能力。

  • 《DiLoCo:大语言模型的分布式低通信训练》,作者Douillard、Feng、Rusu、Chhaparia等(11月14日),https://arxiv.org/abs/2311.08105
    论文提出DiLoCo——一种分布式优化算法,用于在大量连接不畅的小型设备上训练语言模型。与传统方法相比,该方法表现稳定,同时大幅降低了通信需求。

  • 《代码大语言模型综述》,作者Zhang、Chen、Liu、Liao等(11月14日),https://arxiv.org/abs/2311.07989v1
    该工作全面梳理了代码处理大语言模型的相关研究,考察了50余款模型、500余篇相关工作,探讨了从统计模型到大语言模型的演进历程,包括代码专属特性与未来方向。

  • 《Monkey:图像分辨率与文本标注对大多模态模型至关重要》,作者Li、Yang、Liu、Ma等(11月12日),https://arxiv.org/abs/2311.06607
    研究提出双管齐下的方案,提升现有模型在视觉-语言任务上的表现:一是用视觉编码器处理更高分辨率的图像(最高达896×1344像素),二是采用多级描述生成方法,深化场景与物体之间的上下文理解。

  • 《LCM-LoRA:通用稳定扩散加速模块》,作者Luo、Tan、Patil、Gu等(11月9日),https://arxiv.org/abs/2311.05556
    潜在一致性模型(从潜在扩散模型蒸馏而来)能大幅加速文生图任务,输出质量高且训练时间更短。在这份技术报告中,作者介绍了成功应用LoRA(低秩适配)的方案,进一步降低了扩散模型的资源需求。

  • 《通过微调移除GPT-4的RLHF防护》,作者Zhan、Fang、Bindu、Gupta等(11月9日),https://arxiv.org/abs/2311.05553
    人类反馈强化学习(RLHF)通常用于减少大语言模型的有害输出,但研究人员表明,这些防护机制通过微调就能轻易移除——研究人员仅用340个样本就达到了95%的成功率。

  • 《大语言模型幻觉综述:原理、分类、挑战与开放问题》,作者Huang、Yu、Ma、Zhong等(11月9日),https://arxiv.org/abs/2311.05232
    该综述全面介绍了大语言模型幻觉问题的挑战与最新进展,幻觉问题会影响大语言模型的可靠性与实际落地效果。

  • 《文生图模型的整体评估》,作者Lee、Yasunaga、Meng、Mai等(11月7日),https://arxiv.org/abs/2311.04287
    论文提出HEIM基准测试,从12个不同维度(从生成质量到原创性)评估文生图模型。结果显示,不同模型各有所长,没有任何一款模型在所有维度上都表现最优。

  • 《OtterHD:高分辨率多模态模型》,作者Li、Zhang、Yang、Zhang等(11月7日),https://arxiv.org/abs/2311.04219
    OtterHD-8B是一款全新的多模态大语言模型,源自Adept的https://www.adept.ai/blog/fuyu-8b多模态模型,既能处理高分辨率视觉输入,也支持灵活的输入尺寸,适配多样的推理应用。

  • 《S-LoRA:服务数千个并发LoRA适配器》,作者Sheng、Cao、Li、Hooper等(11月6日),https://arxiv.org/abs/2311.03285
    论文提出了多项效率优化技术(统一分页、全新的张量并行策略),用于推理阶段同时服务多个LoRA(低秩适配)适配器。

  • 《GPT4All:开源压缩语言模型生态》,作者Anand、Nussbaum、Treat、Miller等(11月6日),https://arxiv.org/abs/2311.04931
    这篇短文介绍了GPT4All的发展历程,这是一个旨在普及大语言模型使用的开源项目,目标是打破现有模型基础设施昂贵、访问受限、缺乏透明度的局限。

  • 《CogVLM:面向预训练语言模型的视觉专家》,作者Wang、Lv、Yu、Hong等(11月6日),https://arxiv.org/abs/2311.03079
    CogVLM是全新的多模态大语言模型,它没有采用冻结的图像编码器模块,而是集成了一个可训练的视觉专家模块,实现视觉与语言特征的深度融合。

  • 《FreshLLMs:借助搜索引擎增强为大语言模型更新知识》,作者Vu、Iyyer、Wang、Constant等(11月5日),https://arxiv.org/abs/2310.03214
    论文提出FreshQA基准测试,用于测试模型应对快速更新知识与错误前提的能力;同时提出FreshPrompt——一种有效的少样本提示方法,通过整合搜索引擎数据提升大语言模型的表现。

  • 《AGI层级:推动通用人工智能之路的进展》,作者Morris、Sohl-dickstein、Fiedel、Warkentin等(11月4日),https://arxiv.org/abs/2311.02462
    DeepMind的研究人员尝试用五级体系定义通用人工智能(AGI):从包含ChatGPT等新兴AI的1级,到被描述为“超人类”、能力100%超越人类的5级(2-5级目前尚未实现)。

  • 《FlashDecoding++:GPU上更快的大语言模型推理》,作者Hong、Dai、Xu、Mao等(11月2日),https://arxiv.org/abs/2311.01282
    FlashDecoding++是一款大语言模型推理引擎,针对核心挑战提出了异步softmax、扁平GEMM优化、启发式数据流适配等技术,在NVIDIA和AMD GPU上分别实现最高4.86倍和2.18倍的速度提升。

  • 《预训练数据混合让Transformer模型具备窄范围模型选择能力》,作者Yadlowsky、Doshi、Tripuraneni(11月1日),https://arxiv.org/abs/2311.00871
    研究考察了Transformer基于预训练数据混合,适配新的上下文内任务的能力,揭示了其在域外任务上的局限性,并表明其上下文学习能力更多依赖于数据覆盖度,而非基础的泛化能力。


本杂志是个人兴趣项目,无直接报酬。如果您愿意支持我,可以考虑购买https://sebastianraschka.com/books上的图书。如果您觉得它们有洞见、有帮助,也欢迎推荐给朋友和同事。
figure18
https://www.amazon.com/Machine-Learning-PyTorch-Scikit-Learn-scikit-learn-ebook-dp-B09NW48MR1/dp/B09NW48MR1/https://nostarch.com/machine-learning-and-ai-beyond-basics 以及http://mng.bz/M96o

您的支持意义重大!非常感谢!