【转载】使用 LoRA(低秩适配)微调大语言模型的实用技巧

原文地址:Practical Tips for Finetuning LLMs Using LoRA (Low-Rank Adaptation),by Sebastian Raschka, on 2023-12-09

使用 LoRA(低秩适配)微调大语言模型的实用技巧

——从上百次实验中总结的经验

LoRA(低秩适配,论文见https://arxiv.org/abs/2106.09685)是高效训练定制大语言模型时应用最广泛、效果最显著的技术之一。对于关注开源大语言模型的从业者而言,这是一项值得深入掌握的核心技术。

本文的实验基于开源项目 Lit-GPT(https://github.com/Lightning-AI/lit-gpt ,我与Lightning AI 的同事共同维护该项目),相关详细实验记录见 https://lightning.ai/pages/community/lora-insights/ 。本篇《Ahead of AI》专栏文章旨在梳理我从大量实验中提炼出的核心经验,同时解答该领域最常见的若干问题。如果你正从事定制大语言模型的微调工作,希望这些经验能帮你少走弯路(原文“the long run”为双关,既指“长期来看”,也暗合模型训练的运行过程)。

简而言之,本文讨论的核心结论如下:

  • 尽管大语言模型训练(以及基于GPU的模型训练普遍)存在固有随机性,但多次重复实验的结果一致性非常高。
  • QLoRA 是一种在显存受限场景下值得权衡的方案:它能节省33%的显存,但训练耗时会增加39%。
  • 微调大语言模型时,优化器的选择并非核心影响因素。单独使用SGD效果欠佳,但无论是使用AdamW、带动量调度的SGD,还是带动量调度的AdamW,最终效果差异极小。
  • 人们常说Adam是显存占用很高的优化器,因为它为每个模型参数维护两个额外状态量,但这对大语言模型的峰值显存需求影响很小——因为显存主要被大规模矩阵乘法占用,而非存储额外参数。
  • 对于固定数据集,多轮迭代训练(即多epoch训练)未必有益,反而往往会导致效果下降,原因大概率是过拟合。
  • 使用LoRA时,应将其应用到模型的所有层,而非仅作用于键(Key)和值(Value)矩阵,才能最大化模型性能。
  • 调整LoRA的秩(rank)至关重要,同时也要选择合适的alpha值;一个实用的经验法则是将alpha设为秩的2倍。
  • 70亿参数的模型可以在单张14GB显存的GPU上高效完成微调,仅需数小时。
  • 仅靠固定数据集,无法让大语言模型在所有基准测试上都表现优异;要实现这一点需要多样化的数据源,或者说LoRA本身可能并非解决该问题的最佳工具。

此外,我还将解答关于LoRA的10个常见问题:
Q1:数据集的重要性有多高?
Q2:LoRA适用于领域适配吗?
Q3:如何选择最优的秩(rank)?
Q4:必须在所有层都启用LoRA吗?
Q5:如何避免过拟合?
Q6:其他优化器的效果如何?
Q7:还有哪些因素会影响显存占用?
Q8:与全量微调、RLHF相比效果如何?
Q9:多个LoRA权重可以合并吗?
Q10:逐层最优秩适配(Layer-wise Optimal Rank Adaptation)效果如何?

(在上一期《Ahead of AI》中我提到,如果大家感兴趣,我会写一篇更基础的入门文章,从零开始实现LoRA的代码。从反馈来看大家的需求很高,我计划后续再发布一篇相关文章。本篇文章则聚焦于LoRA实践中的宏观思路与核心结论,采用自上而下的视角展开。)

LoRA 简介

大语言模型参数量庞大,受GPU显存限制,训练时更新所有权重的成本极高。

举例来说,假设一个70亿参数的大语言模型,其权重矩阵为W(实际模型的参数分布在许多层的不同矩阵中,这里简化为单个权重矩阵说明)。在反向传播过程中,我们会得到一个ΔW矩阵,它记录了为最小化训练损失,原始权重需要更新的幅度。

权重更新公式如下:
$$W_{\text{updated}} = W + \Delta W$$

如果权重矩阵W包含70亿参数,那么权重更新矩阵ΔW同样包含70亿参数,计算ΔW矩阵会消耗极高的算力与显存。

LoRA方法由论文https://arxiv.org/abs/2106.09685提出,它将权重更新量ΔW分解为低秩表示。准确来说,LoRA不需要显式计算ΔW,而是在训练中直接学习ΔW的分解形式,这正是其节省显存的核心原理,如下图所示:

figure01

如图所示,ΔW的分解是指用两个更小的LoRA矩阵A和B来表示大矩阵ΔW。若A的行数与ΔW相同,B的列数与ΔW相同,则分解可表示为ΔW = AB(AB为矩阵A与B的乘积)。

这种方法能节省多少显存?这取决于超参数秩(r)的大小。举个例子:假设ΔW有10000行、20000列,共存储2亿个参数。如果取r=8,那么A为10000行×8列,B为8行×20000列,总参数量为 10000×8 + 8×20000 = 24万个参数,仅为原来2亿的约1/830。

当然,A和B无法完整捕获ΔW包含的全部信息,但这正是LoRA的设计初衷。我们的假设是:预训练阶段的权重矩阵W需要是满秩的大矩阵,才能学习到预训练数据集中的全部知识;但在微调大语言模型时,我们不需要更新所有权重,仅用远少于ΔW的参数量就能捕获适配任务的核心信息——因此我们通过AB的低秩形式来完成权重更新。

1. LoRA 实验的一致性

通过多次重复LoRA微调实验我发现,尽管大语言模型训练(以及GPU训练普遍)存在固有随机性,但不同轮次的基准测试结果一致性非常高。这为后续的对比实验提供了可靠的基础。

figure02

(注:以上结果采用默认设置,秩r=8。实验细节可参考我的另一篇文章:https://lightning.ai/pages/community/lora-insights/

2. QLoRA 的算力-显存权衡

QLoRA(量化低秩适配,论文见https://arxiv.org/abs/2305.14314)是一种进一步降低微调显存占用的技术。在反向传播过程中,QLoRA将预训练权重量化为4位精度,并使用分页优化器处理显存峰值。

实验证实,使用QLoRA可以节省33%的GPU显存,但代价是训练耗时增加39%——这是由于QLoRA需要额外的预训练权重量化与反量化操作。

采用16位bfloat16精度的常规LoRA:

  • 训练时长:1.85小时
  • 显存占用:21.33 GB

采用4位归一化浮点数的QLoRA:

  • 训练时长:2.79小时
  • 显存占用:14.18 GB

此外我发现,QLoRA对模型效果的影响微乎其微。在常见的GPU显存瓶颈场景下,QLoRA是常规LoRA训练的可行替代方案。

figure03

3. 学习率调度器

学习率调度器会在训练过程中逐步降低学习率,以优化收敛效果,避免越过损失函数的最小值点。

余弦退火(Cosine Annealing)是一种遵循余弦曲线调整学习率的调度策略:训练开始时学习率较高,之后平滑下降,以余弦函数的趋势趋近于零。常用的是半周期变体,即训练全程只完成半个余弦周期,如下图所示:

figure04

在实验中,我为LoRA微调脚本加入了余弦退火调度器,观察到它能显著提升SGD的训练效果;但对Adam和AdamW优化器的影响较小,几乎没有明显差异。

figure05

SGD相比Adam的潜在优势将在下一节讨论。

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

4. Adam 与 SGD 对比

Adam和AdamW优化器在深度学习中仍被广泛使用,但在大模型场景下它们的显存占用很高。原因在于Adam类优化器会为每个模型参数维护两个滑动平均值:梯度的一阶矩(均值)和二阶矩(未中心化方差)。换句话说,Adam会为每个模型参数在显存中额外存储两个值。对于70亿参数的模型,训练时就要额外跟踪140亿个参数。

SGD优化器在训练中不需要跟踪额外参数,因此一个自然的问题是:将Adam替换为SGD,对大语言模型训练的峰值显存需求有多大改善?

在我的实验中,使用AdamW+默认LoRA设置(r=8)训练70亿参数的Llama 2模型,GPU显存占用为14.18 GB;换成SGD训练同一模型,显存占用为14.15 GB。换言之,仅节省了0.03 GB,效果微乎其微。

为什么显存节省这么少?因为使用LoRA时,可训练参数的总量本身就很小。例如当r=8时,70亿参数的Llama 2模型中,可训练的LoRA参数仅为4,194,304个,远小于总参数量6,738,415,616。

单看数字,400多万可训练参数似乎不少,但计算一下:4,194,304 × 2 × 16 bit = 134.22 Mbit = 16.78 MB。(实际观测到0.03 GB = 30 MB的差异,是因为存储和复制优化器状态还有额外开销。)其中“2”是Adam额外存储的参数数量,16位是模型权重的默认精度。

figure06

但在后续实验中,当我把LoRA的秩r提升到256时,Adam和SGD优化器的显存差异就变得明显了:

  • AdamW:17.86 GB
  • SGD:14.46 GB

结论:当LoRA的秩r较小时,把Adam换成SGD的价值不大;但当r较大时,这种替换是值得考虑的。

5. 多轮训练(多Epoch)

在传统深度学习中,我们通常会对训练集进行多轮迭代——每完整遍历一次训练集称为一个epoch(轮次)。例如训练卷积神经网络时,跑上百个epoch很常见。那么多轮训练对指令微调也同样有效吗?

当我把Alpaca指令微调数据集(https://github.com/tatsu-lab/stanford_alpaca)的迭代次数翻倍(相当于2个训练轮次)时,我观察到模型性能出现了下降。

figure07

结论是:多轮训练对指令微调未必有益,反而可能降低效果。在只有1000个样本的LIMA数据集上我也观察到了同样的现象。性能下降大概率是过拟合加剧导致的,这一点还需要更多研究验证。

6. 在更多层启用 LoRA

前面表格中的实验,仅在部分权重矩阵上启用了LoRA——也就是每个Transformer层中的键(Key)和值(Value)权重矩阵。除此之外,我们还可以在查询(Query)权重矩阵、投影层、多头注意力块之间的其他线性层,以及线性输出层上都启用LoRA。

figure08

对于70亿参数的Llama 2模型,若在所有这些额外层都启用LoRA,可训练参数量会变为原来的5倍:从4,194,304增加到20,277,248。对应的显存需求也会上升(从14.18 GB增至16.62 GB),但模型性能会得到显著提升。

figure09

不过我的实验存在局限:只探索了两种设置——(1)仅在查询和值权重矩阵启用LoRA;(2)在所有层启用LoRA。未来可以探索更多组合,比如仅在投影层启用LoRA是否真的有增益,这是一个值得研究的问题。

7. 平衡 LoRA 超参数:秩(R)与 Alpha

正如LoRA原论文(https://arxiv.org/abs/2106.09685)所述,在前向传播时,LoRA权重会通过一个额外的缩放系数叠加到预训练权重上。缩放系数由秩参数r和另一个超参数α(alpha)共同决定,公式如下:

scaling = alpha / r
weight += (lora_B @ lora_A) * scaling

从上面的公式可以看出,alpha越大,LoRA权重的影响就越强。

之前的实验使用r=8、alpha=16,对应2倍缩放。在大语言模型中使用LoRA时,alpha取r的2倍是通用经验法则,但我好奇当r更大时这个法则是否依然成立。

实验表明,“alpha = 2×秩”确实是效果很好的取值。不过在本次实验的模型+数据集组合下,当r=256、alpha=128(对应0.5倍缩放)时,性能甚至更优。

figure10

(我还测试了r=32、r=64、r=128、r=512的情况,为了图表清晰未列出,其中r=256效果最佳。)

将alpha设为r的2倍通常能得到较好的结果,但尝试不同的比例也不会有坏处。

8. 单GPU训练70亿参数模型

LoRA最核心的价值之一,就是让我们能在单张GPU上完成70亿参数大语言模型的微调。在本次实验中,采用最优设置的QLoRA(r=256,alpha=512)+ AdamW,训练5万个样本(Alpaca数据集)仅需约3小时(A100显卡),显存占用17.86 GB。

figure11

在文章余下部分,我将解答大家可能关心的其他问题。

常见问题解答

Q1:数据集的重要性有多高?

数据集至关重要。我在实验中使用了包含5万个训练样本的Alpaca数据集,选择它是因为该数据集非常流行;而测试不同数据集超出了本文范围,因为文章篇幅已经很长。

但需要注意:Alpaca是通过调用旧版ChatGPT生成的合成数据集,以今天的标准来看可能并非最优选择。

数据质量非常关键。比如今年6月我讨论过的LIMA数据集(https://magazine.sebastianraschka.com/p/ahead-of-ai-9-llm-tuning-and-dataset),是一个经过精心筛选的数据集,仅包含1000个样本。

根据论文https://arxiv.org/abs/2305.11206,在LIMA上微调的650亿参数Llama模型,效果明显优于在Alpaca上微调的同规模模型。

figure12

使用最优配置(r=256,alpha=512)在LIMA上微调,得到的效果与样本量50倍于它的Alpaca数据集相当,甚至更优。

figure13

Q2:LoRA适用于领域适配吗?

很遗憾,我对这个问题没有非常确定的答案。一般来说,模型的知识主要来自预训练数据集;指令微调更多是引导大语言模型学会遵循指令。

但值得注意的是,如果显存受限,LoRA也可以用于在领域特定数据集上对已有的预训练大语言模型做继续预训练。

我的实验中包含两个算术基准测试(详见https://lightning.ai/pages/community/lora-insights/ ),结果显示LoRA微调后的模型在这两项上的表现远差于预训练基座模型。我的假设是:因为Alpaca数据集中没有对应的算术样例,模型“遗忘”了算术能力。至于模型是完全丢失了这部分知识,还是只是无法响应相关指令,还需要进一步研究。但这里可以得到一个结论:微调大语言模型时,最好包含所有你关心的任务类型的样例。

Q3:如何选择最优的秩(rank)?

很遗憾,目前没有很好的经验法则可以直接选出合适的r,它是一个需要针对每个模型、每个数据集单独探索的超参数。

我的推测是:r过大会导致更严重的过拟合;而r太小则可能无法覆盖数据集中多样化的任务。换句话说,数据集中的任务越多样,r的取值就应该越大。比如,如果只需要模型做基础的两位数算术,很小的r可能就足够了。但这只是假设,还需要更多实验验证。

Q4:必须在所有层都启用LoRA吗?

我只探索了两种设置:(1)仅在查询和值权重矩阵启用LoRA;(2)在所有层启用LoRA。未来可以探索更多组合,比如仅在投影层启用LoRA是否真的有增益,这是一个值得研究的方向。

figure14

举例来说,仅考虑lora_querylora_keylora_valuelora_projectionlora_mlplora_head这几个开关,就有2⁶=64种组合可以探索。这是未来研究一个很有意思的方向。

Q5:如何避免过拟合?

一般来说,r越大可训练参数越多,过拟合风险就越高。如果模型出现过拟合,首先可以尝试降低r,或者扩大数据集规模。此外,还可以提高AdamW或SGD优化器的权重衰减率,也可以考虑增大LoRA层的dropout值。

我在实验中没有深入探索LoRA的dropout参数(使用了固定的0.05 dropout率),这是未来值得研究的方向。

Q6:其他优化器的效果如何?

未来还有很多有意思的大语言模型优化器值得探索,其中一个是今年5月发布的Sophia(论文见https://arxiv.org/abs/2305.14342)。

Sophia是一种二阶优化算法,在Adam和AdamW占据主流的大语言模型领域,它的表现很有吸引力。论文显示,相比Adam,Sophia的训练速度快2倍,且训练出的模型效果更好。简而言之,Sophia是通过梯度曲率而非梯度方差来对梯度做归一化,这是它与Adam的核心区别。

Q7:还有哪些因素会影响显存占用?

除了精度和量化设置、模型大小、批次大小、可训练LoRA参数量之外,数据集本身也会影响显存占用。

注意Llama 2的上下文窗口(block size)是4096个token。大语言模型的上下文窗口决定了它一次能处理的最大序列长度;但训练序列越短,由于未来token掩码的存在,显存节省就越明显。

例如Alpaca数据集的序列长度相对较短,最大长度为1304个token。

figure15

当我用最大长度2048个token的其他数据集实验时,显存占用从17.86 GB上升到了26.96 GB。

Q8:与全量微调、RLHF相比效果如何?

我没有做RLHF实验(感兴趣的读者可以看我之前的文章:https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives ),但我做了全量微调的对比。

全量微调至少需要2张GPU,耗时3.5小时,每张卡显存占用36.66 GB。但最终的基准测试结果并不理想,大概率是过拟合或者超参数设置不佳导致的。

figure16

Q9:多个LoRA权重可以合并吗?

可以,多组LoRA权重是可以合并的。训练过程中,LoRA权重与预训练权重是分开存储的,每次前向传播时再叠加。

在实际应用中,如果你有多组LoRA权重(比如为每个客户单独训练一组),分开存储可以节省磁盘空间。但训练结束后,也可以将LoRA权重与预训练权重合并,得到一个完整的模型。这样在前向传播时就不需要每次都叠加LoRA权重:

weight += (lora_B @ lora_A) * scaling

我们可以按上面的公式完成权重更新,然后保存合并后的权重。

同理,我们也可以叠加多组LoRA权重:

weight += (lora_B_set1 @ lora_A_set1) * scaling_set1
weight += (lora_B_set2 @ lora_A_set2) * scaling_set2
weight += (lora_B_set3 @ lora_A_set3) * scaling_set3
...

我还没有通过实验评估这种方法的效果,但技术上已经可以实现,Lit-GPT提供了对应的脚本:https://github.com/Lightning-AI/lit-gpt/blob/main/scripts/merge_lora.py

Q10:逐层最优秩适配(Layer-wise Optimal Rank Adaptation)效果如何?

为了简化,我们训练深度神经网络时通常给所有层设置相同的学习率,而学习率本身是需要调优的超参数。更进一步,我们也可以给每一层设置不同的学习率(参考:https://kozodoi.me/blog/20220329/discriminative-lr#:~:text=The%20implementation%20of%20layer%2Dwise,with%20the%20corresponding%20learning%20rates. )。但实践中很少这么做,因为这会带来额外开销,而且深度神经网络训练本来就有大量超参数需要调整。

与逐层设置不同学习率类似,我们也可以给不同层设置不同的LoRA秩。我还没有看到相关的实验研究,但有一篇文章详细介绍了这种方法:https://medium.com/@tom_21755/llm-optimization-layer-wise-optimal-rank-adaptation-lora-1444dfbc8e6a(也缩写为LORA)。理论上这听起来是个好主意,但它会让超参数优化的选择数量大幅增加。


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

figure17

《从零构建大语言模型》购买链接:https://amzn.to/4fqvn0D

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

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

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

【转载】用于高效大语言模型对齐的RLHF潜在继任者,以及卷积神经网络的复兴

原文地址:A Potential Successor to RLHF for Efficient LLM Alignment and the Resurgence of CNNs,by Sebastian Raschka, on 2023-11-04

用于高效大语言模型对齐的RLHF潜在继任者,以及卷积神经网络的复兴

从视觉Transformer到创新的大语言模型微调技术,过去一个月AI社区研究氛围活跃,涌现了大量有意思的研究成果。

以下是本文将解读的核心研究亮点:

  • 在《规模化下卷积神经网络与视觉Transformer性能相当》(ConvNets Match Vision Transformers at Scale)一文中,Smith等人投入大量计算资源,对卷积神经网络(CNN)与视觉Transformer(ViT)展开了全面对比,挑战了ViT在图像分类任务中性能普遍优于CNN的认知。
  • Mistral 7B论文介绍了一款小巧却强大的语言模型:尽管参数量仅70亿、规模相对不大,但在各类基准测试中,它的表现超过了参数量更大的模型,比如130亿参数的Llama 2。这一惊艳的表现很大程度上可能得益于其独特的训练数据。
  • 《Zephyr:语言模型对齐的直接蒸馏》(Zephyr: Direct Distillation of LM Alignment)提出了全新的语言模型训练思路,展示了Zephyr 7B模型在对话基准与知识基准上的出色表现。该研究采用了蒸馏型直接偏好优化(DPO),其复杂度远低于人类反馈强化学习(RLHF)。
  • 在《NEFTune:噪声嵌入提升指令微调效果》(NEFTune: Noisy Embeddings Improve Instruction Finetuning)一文中,Jain、Chiang、Wen、Kirchenbauer等人提出了一种简单直接的方法来提升语言模型性能:向词元嵌入中注入均匀随机噪声。这项被称为NEFTune的技术被证实能显著提升对话任务的表现,且不会损害问答任务中的知识能力。

附言:关注月度研究亮点的读者可能会发现,我调整了AI研究论文亮点栏目的呈现形式:精选少数几篇论文进行更详细的摘要与探讨,同时补充了20余篇其他引起我兴趣的论文的极简摘要。希望大家喜欢这个新格式!

规模化下卷积神经网络与视觉Transformer性能相当

https://arxiv.org/abs/2310.16764 ,研究者投入了最高达11万TPU小时的计算预算,对ViT与CNN进行了公平的对比。

研究结果表明:当CNN的预训练计算预算与ViT的常用预训练预算相近时,CNN的性能可以与ViT持平。为此,他们在JFT数据集的40亿张标注图像上进行预训练,随后在ImageNet上对模型进行微调。

figure01
标注图出自:https://arxiv.org/abs/2310.16764

就我个人观察而言,微调ViT比微调CNN更容易获得不错的图像分类效果。比如小型ViT的相关内容见 https://magazine.sebastianraschka.com/p/accelerating-pytorch-model-training 。以我的教学经验来看,用预训练CNN要取得这么好的效果一直很难。现在回头看,这可能是因为ViT的预训练计算预算更充足。

推理性能

我希望论文能探讨推理性能这一方面。虽然微调后的CNN能追上微调后ViT的性能,但我很好奇,在论文所用的完全相同的模型下,二者在显存占用、推理速度上各有什么优势。

不过这个分析可能也有失公允,因为ViT架构相对CNN而言还很新,CNN已经经过了多年的深度优化。同时我也理解,这类研究超出了这篇论文的范围——如果同时考虑TPU和GPU,研究内容会相当庞杂。比如,TPU对ViT中常见的矩阵乘法优化更好,而GPU对卷积运算的优化更出色。

分类之外的场景

尽管这篇论文的核心结论——规模化下CNN能追上ViT的性能——非常有意思,但论文只聚焦于图像分类任务。一个很自然的问题是:这一结论是否也适用于目标检测和图像分割?这会是很有价值的后续研究方向。

论文参考信息
《规模化下卷积神经网络与视觉Transformer性能相当》,作者:Smith、Brock、Berrada、De(10月25日),https://arxiv.org/abs/2310.16764

Mistral 7B

https://arxiv.org/abs/2310.06825 介绍了一款70亿参数的新型“小”大语言模型。这篇论文的技术细节相对较少,但仍然值得在这里介绍,因为开源的Mistral 7B大语言模型是过去几周最热门的模型之一。此外,Mistral 7B基础模型也是下一节要介绍的Zephyr 7B的微调基底。

Mistral的表现超越其体量

Mistral 7B如此受欢迎的核心原因是:在绝大多数基准测试中,它的表现都优于参数量几乎是它两倍的130亿参数Llama 2模型。

figure02
标注图出自:https://arxiv.org/abs/2310.06825

它表现如此出色的具体原因尚不清楚,但很可能与训练数据有关。Llama 2和Mistral都没有公开训练数据,因此我们只能推测。

架构层面,该模型和Llama 2一样采用了分组查询注意力。Mistral架构一个有意思的新增设计是滑动窗口注意力,用于节省显存、提升计算吞吐量,从而加快训练速度。(滑动窗口注意力此前已在 https://arxiv.org/abs/1904.10509https://arxiv.org/abs/2004.05150 中被提出。)

滑动窗口注意力

Mistral采用的滑动窗口注意力机制,本质上是一个固定大小的注意力块:当前词元只能关注到前面特定数量的词元,而非所有之前的词元,如下图所示。

figure03
标注图出自:https://arxiv.org/abs/2310.06825

在70亿参数的Mistral中,注意力块的大小为4096个词元,研究者训练模型时支持的上下文长度最高可达10万词元。

举个具体的例子:在常规自注意力机制中,模型处理第50000个词元时,可以关注前面全部49999个词元;而在滑动窗口自注意力中,Mistral模型只能关注第45904到50000个词元(因为50000 – 4096 = 45904)。

不过需要注意的是,滑动窗口注意力主要是让模型能处理更长的序列,本身并不会提升基准测试的性能。(绝大多数基准测试要么是选择题,要么只需要短答案。)

换句话说,滑动窗口注意力主要用于提升计算效率。Mistral能超越更大的Llama 2模型,大概率不是因为滑动窗口注意力,而是在采用了滑动窗口注意力的前提下依然实现了反超。

论文参考信息
《Mistral 7B》,作者:Jian、Sablayrolles、Mensch、Bamford等人(10月10日),https://arxiv.org/abs/2310.06825

Zephyr:语言模型对齐的直接蒸馏

https://arxiv.org/abs/2310.16944 介绍了Zephyr 7B,它是目前最受关注的开源大语言模型之一,原因有两点:

  1. Zephyr 7B在对话基准和知识基准上,都超越了同体量模型,甚至超过了多个参数量更大的模型。
  2. 作者采用完全自动化的直接偏好优化(DPO)训练Zephyr,其复杂度远低于人类反馈强化学习(RLHF)。

Zephyr的性能表现

在介绍论文中的DPO与蒸馏流程之前,我们先来看看Zephyr的性能表现。

作者在基准测试中选取了各类代表性的大语言模型,涵盖了经蒸馏监督学习训练的70亿参数模型,到经RLHF训练的700亿参数模型。

https://arxiv.org/abs/2306.05685https://tatsu-lab.github.io/alpaca_eval/ 是用于评估大语言模型对话能力的基准。如下表所示,70亿参数的Zephyr模型在同体量模型中表现最优。更令人惊艳的是,在MT-Bench基准上,Zephyr的表现甚至超过了参数量是它10倍的700亿参数Llama 2对话模型。

figure04
标注图出自Zephyr论文,https://arxiv.org/abs/2310.16944

RLHF、DPO这类对齐技术通常聚焦于提升大语言模型的指令遵循能力,同时优化其有用性(对Llama 2而言还包括安全性)。但指令遵循能力的提升,有时会对大语言模型的知识能力产生负面影响。因此,作者在另一项基准测试中验证了Zephyr也具备顶尖的知识能力——测试采用Hugging Face开源大语言模型排行榜(https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard )中的选择题任务,结果如下表所示。

figure05
标注图出自Zephyr论文,https://arxiv.org/abs/2310.16944

蒸馏

与RLHF及其他近端策略优化方法不同,本文提出的dDPO方法不需要人工标注与采样——dDPO是一套完全自动化、端到端的微调流水线。

蒸馏过程是让更小的目标(学生)大语言模型向更大的现有大语言模型(教师)学习。在本研究中,作者在两个环节使用了大语言模型生成的数据:

  1. 创建用于监督微调的数据集(类似自指令方法);
  2. 对响应进行采样与排序,收集偏好数据用于对齐微调。

下一节我们将详细解析dDPO流程。

直接偏好优化

本研究中,研究者采用了蒸馏型直接偏好优化(dDPO)。在介绍蒸馏部分之前,我们先明确DPO的定义。DPO是RLHF的替代方案,它直接基于奖励训练模型,与RLHF的思路不同。(关于RLHF的更多细节,可以参考我的专题文章 https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives

figure06
标注图出自《直接偏好优化:你的语言模型本质上就是奖励模型》论文(https://arxiv.org/abs/2305.18290

Zephyr采用DPO方法,并且完全基于大语言模型(通过GPT-4)生成的数据进行训练。这种完全不引入人工参与的方法能取得这么好的效果,非常令人惊叹。

figure07
Zephyr微调采用的三步dDPO流程,标注图出自Zephyr论文,https://arxiv.org/abs/2310.16944

局限性

这是一篇非常亮眼的论文,但我认为MT-Bench和AlpacaEval基准可能存在潜在偏差——这两个基准都使用GPT-4进行偏好评估。而dDPO流程中也用GPT-4做偏好排序,因此AlpacaEval和MT-Bench的结果很可能偏乐观。如果能看到针对Zephyr模型的人类偏好评估会很有意思(不过这类研究成本很高,我也理解作者为什么没有做)。

需要注意的是,这篇论文的核心目标是打造小型高效的大语言模型,使其性能超过经RLHF训练的更大模型(比如700亿参数的Llama 2对话模型)。但蒸馏方法大概率不足以培育出全新的顶尖大语言模型(比如GPT-4的继任者)。由于该方法的数据来自GPT-4,我推测GPT-4会成为该模型性能的天花板。

不过,(不做蒸馏的)DPO能否完全替代RLHF用于新模型的全流程开发,仍然值得期待。

总结

这篇论文还有很多有意思的洞见和消融实验,受文章篇幅所限我没有全部展开。比如读者可能会好奇:为什么dDPO是三步流程,第一步还要做监督微调?能不能跳过第一步,只用第2、3步的DPO训练模型?答案是:如果没有第一步的监督微调,模型的表现会非常差。

这是一篇极具价值的论文,我预计它会成为高效训练与对齐大语言模型的新一代参考方法。

论文参考信息
《Zephyr:语言模型对齐的直接蒸馏》,作者:Tunstall、Beeching、Lambert、Rajani等人(10月25日),https://arxiv.org/abs/2310.16944

NEFTune:噪声嵌入提升指令微调效果

我们通常通过优化基础模型、扩大数据集规模、提升数据质量来提升大语言模型的微调效果(下一期《Ahead of AI》会详细讨论这点)。而在 https://arxiv.org/abs/2310.05914 中,研究者尝试了另一种更简单的思路:向词元嵌入中注入均匀随机噪声。

有意思的是,向词元嵌入加入随机噪声后,模型在AlpacaEval上的性能大幅提升,如下图所示。

figure08
标注图出自:https://arxiv.org/abs/2310.05914

https://tatsu-lab.github.io/alpaca_eval/ 是一项基准测试,它通过GPT-4来判断基础模型和微调模型哪个的响应更好。这类自动化的大语言模型基准解读需要谨慎,因为哪怕是格式上的微小变化,都可能导致性能波动。此外,GPT-4的偏好分析也会受回复长度的影响(GPT-4通常更偏好更长的回复)。不过在本研究中,研究者通过人类评估者复现了实验结果,说明这一效果是真实存在的。

那NEFTune在Hugging Face OpenLLM排行榜这类选择题问答任务上表现如何?结果显示,常规微调和经NEFTune微调的模型性能持平,如下图所示,说明NEFTune训练不会造成知识能力的下降。

figure09
标注图出自:https://arxiv.org/abs/2310.05914

NEFTune对AlpacaEval这类对话任务性能的提升,很可能源于过拟合的减少。比如研究者发现,NEFTune会提高训练集损失,同时降低测试集损失。

上述实验都是在全量微调的条件下完成的。不过这种噪声注入方法也可以和目前最主流的微调技术搭配使用,比如LoRA和QLoRA。在QLoRA场景下,NEFTune也有正向效果,但幅度比全量微调更小,如下表所示。

figure10
标注表格出自:https://arxiv.org/abs/2310.05914

随机噪声注入可以看作一种简单的数据增强方式,而数据增强通常用于减少过拟合。如果能和其他减少大语言模型过拟合的技术做对比研究会很有意思,比如提高权重衰减率,或者提高适配器层的丢弃率。QLoRA通常采用0.05的丢弃率,而它的效果更弱,这一点也能支撑上述假设。

尽管我平时更偏好使用QLoRA做微调——因为相比全量微调,它能让我微调参数量大得多的模型——但我仍然觉得NEFTune技术非常有吸引力。注入随机噪声实现起来很简单,本质上只是微调大语言模型时多了一个配置项(通过超参数控制噪声的幅度)。

论文参考信息
《NEFTune:噪声嵌入提升指令微调效果》,作者:Jain、Chiang、Wen、Kirchenbauer等人(2023年10月9日),https://arxiv.org/abs/2310.05914

其他值得关注的研究论文

  • 《对齐天花板:人类反馈强化学习中的目标错配》,作者:Lambert、Calandra(10月31日),https://arxiv.org/abs/2311.00168
    本文探讨了过度使用人类反馈强化学习(RLHF)带来的问题:会导致模型因偏差的安全考量而回避用户请求、行为缺乏灵活性、回复风格单调,同时还对奖励模型的有效性、当前这类模型评估工具的准确性提出了质疑。

  • 《骨干网络之争:预训练模型在计算机视觉任务上的大规模对比》,作者:Goldblum、Souri、Ni、Shu等人(10月30日),https://arxiv.org/abs/2310.19909
    与《规模化下卷积神经网络与视觉Transformer性能相当》的结论一致,本文作者发现,在大规模数据集上以监督方式预训练的卷积神经网络,在很多任务上的表现仍然优于预训练的视觉Transformer。

  • 《FP8-LM:训练FP8大语言模型》,作者:Peng、Wu、Wei、Zhao等人(10月27日),https://arxiv.org/abs/2310.18313
    作者提出了一套全新的FP8自动混合精度框架用于大语言模型训练,与常规的BFloat16框架相比,显存占用降低42%,训练速度提升64%,同时不损失模型精度,也不需要调整超参数。

  • 《CodeFusion:面向代码生成的预训练扩散模型》,作者:Singh、Cambronero、Gulwani、Le等人(10月26日),https://arxiv.org/abs/2310.17680
    研究者提出了一个7500万参数的模型,在绝大多数代码基准上,性能都超过了1750亿参数的GPT-3模型,以及专门针对代码优化的155亿参数StarCoder模型。

  • 《检测大语言模型的预训练数据》,作者:Shi、Ajith、Xia、Huang等人(10月25日),https://arxiv.org/abs//2310.16789
    本文深入探讨了判断黑盒模型是否在特定文本(比如受版权保护的书籍)上训练过的难题,并提出了一种方法,虽不完美,但相比之前的技术提升了7.4%。

  • 《ALCUNA:当大语言模型遇见新知识》,作者:Yin、Huang、Wan(10月23日),https://arxiv.org/abs/2310.14820
    研究者针对“大语言模型处理新知识的能力”这一评估空白,提出了新的基准测试,结果显示大语言模型在结合新生成知识与已有内部知识进行推理时表现不佳。

  • 《对比偏好学习:无需强化学习的人类反馈学习》,作者:Hejna、Rafailov、Sikchi、Finn等人(10月20日),https://arxiv.org/abs/2310.13639
    本文提出了对比偏好学习(CPL):一种更简单的离策略算法,作为RLHF的替代方案。

  • 《长文本问答中检索增强的理解研究》,作者:Chen、Xu、Arora、Choi(10月18日),https://arxiv.org/abs/2310.12150
    本研究为检索增强对大语言生长文本生成的影响提供了新视角,总结了长文本生成的归因模式,以及归因错误的主要成因。

  • 《大语言模型能解释自身吗?大语言模型自解释现象研究》,作者:Huang、Mamidanna、Jangam、Zhou等人(10月17日),https://arxiv.org/abs/2310.11207
    研究结果表明:像ChatGPT这类经过人类对话指令微调、会输出带自解释的“有用”回复的大语言模型,生成的解释质量与传统模型可解释性技术相当,且生成成本更低。

  • 《BitNet:面向大语言模型的可扩展1比特Transformer》,作者:Wang、Ma、Dong、Huang等人(10月17日),https://arxiv.org/abs/2310.11453
    本研究提出了BitNet——一套面向大语言模型的可扩展、稳定的1比特Transformer架构,核心是用BitLinear层替代常规的nn.Linear层,支持从头训练1比特权重的模型;相比8比特量化方法和FP16 Transformer基线,它在保持竞争力性能的同时,显著降低了显存占用与能耗。

  • 《Llemma:开源数学大语言模型》,作者:Azerbayev、Schoelkopf、Paster、Dos Santos等人(10月16日),https://arxiv.org/abs/2310.10631
    本文介绍了数学大语言模型Llemma,它在MATH基准上的表现超过现有模型,还支持形式化定理证明(70亿与340亿参数版本、数据集、代码均已开源)。

  • 《LoftQ:感知LoRA微调的大语言模型量化方法》,作者:Li、Yu、Liang、He等人(10月12日),https://arxiv.org/abs/2310.08659
    LoftQ是一套全新的量化框架,将量化与预训练模型的LoRA微调相结合,通过提供合适的低秩初始化提升量化模型的泛化能力,有效缩小了全量微调与LoRA微调在下游任务上的性能差距。

  • 《大语言模型事实性综述:知识、检索与领域特性》,作者:Wang、Liu、Yue、Tang等人(10月11日),https://arxiv.org/abs/2310.07521
    本综述梳理了大语言模型输出事实错误的问题,评估了大语言模型事实性的评测方法(重点介绍核心指标与基准),并探讨了提升大语言模型事实性的领域专属策略。

  • 《RLHF对大语言模型泛化性与多样性的影响研究》,作者:Kirk、Mediratta、Nalmpantis、Luketina等人(10月10日),https://arxiv.org/abs/2310.06452
    这项针对RLHF微调各阶段的全面分析表明:尽管RLHF能带来更好的分布外(OOD)泛化能力(尤其是训练与测试分布差异较大时),但与监督微调相比,它会显著降低输出的多样性。

  • 《OpenWebMath:高质量数学网页开源数据集》,作者:Paster、Dos Santos、Azerbayev、Ba(10月10日),https://arxiv.org/abs/2310.06786
    本文介绍了OpenWebMath:一个源自Common Crawl、包含147亿词元的数学网页数据集。实验表明,在该数据集上训练的语言模型,性能远超在20倍以上通用语言数据上训练的模型,凸显了代码、数学这类高质量、专业化词元对提升大语言模型推理能力的重要性。

  • 《LongLLMLingua:通过提示压缩加速并优化长上下文场景下的大语言模型》,作者:Jiang、Wu、Luo、Li等人(10月10日),https://arxiv.org/abs/2310.06839
    LongLLMLingua是一种提示压缩方法,旨在提升大语言模型对关键信息的关注度,同时解决长上下文场景下成本高、延迟高、性能差三大挑战。

  • 《潜一致性模型:少步推理生成高分辨率图像》,作者:Luo、Tan、Huang、Li等人(10月6日),https://arxiv.org/abs/2310.04378
    作者基于一致性模型的理念提出了潜一致性模型(LCM),用于加速Stable Diffusion这类预训练潜扩散模型的生成过程,还包含针对自定义图像数据集的微调技术。

  • 《思维传播:大语言模型复杂推理的类比方法》,作者:Yu、He、Ying(10月6日),https://arxiv.org/abs/2310.03965
    思维传播通过求解相关的类比问题,再将其解法迁移到新问题上,以此提升大语言模型的复杂推理能力。

  • 《检索遇上长上下文大语言模型》,作者:Xu、Ping、Wu、McAfee等人(10月4日),https://arxiv.org/abs/2310.03025
    研究者发现,4K上下文窗口搭配检索增强,在长上下文任务上的表现可以与经位置插值优化的16K上下文窗口微调模型相当,同时计算效率更高。

  • 《三思而后言:用暂停词元训练语言模型》,作者:Goyal、Ji、Rawat、Menon等人(10月3日),https://arxiv.org/abs/2310.02226
    在大语言模型的输入前缀后加入一串可学习的“暂停词元”,延迟输出直到最后一个暂停词元处理完毕;在预训练和微调阶段都应用该方法,能够提升模型性能。

  • 《面向近乎无限上下文的分块Transformer环形注意力》,作者:Liu、Zaharia、Abbeel(10月3日),https://arxiv.org/abs/2310.01889
    环形注意力将自注意力的计算并行分布到多设备上处理长序列,大幅提升了大语言模型的显存效率。

  • 《RA-DIT:检索增强双指令微调》,作者:Lin、Chen、Chen、Shi等人(10月2日),https://arxiv.org/abs/2310.01352
    检索增强双指令微调(RA-DIT)是一种全新的高效微调方法,可作为现有检索增强大语言模型方案的替代。

  • 《面向混合专家模型训练的稀疏反向传播》,作者:Liu、Gao、Chen(10月1日),https://arxiv.org/abs/2310.00811
    SparseMixer提出了一套适配混合专家模型稀疏计算的可扩展梯度估计器,通过二阶ODE求解器实现精准的梯度近似,在预训练、机器翻译等任务上将训练收敛速度最高提升2倍。

  • 《GrowLength:通过逐步增长训练长度加速大语言模型预训练》,作者:Jin、Han、Yang、Jiang(10月1日),https://arxiv.org/abs/2310.00576
    本文提出的GrowLength方法通过逐步增加序列长度来加速大语言模型预训练,从128逐步扩展到4096,有效提升了训练效率。

本杂志是个人兴趣驱动的项目,无直接稿酬。如果您愿意支持我,可以考虑购买 https://sebastianraschka.com/books 上的书籍。如果您觉得这些书籍富有洞见、有所帮助,欢迎推荐给您的朋友和同事。

figure11
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

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

【转载】2023年的人工智能与开源:高潮与低谷——年度回顾

原文地址:AI and Open Source in 2023,by Sebastian Raschka, on 2025-10-23

2023年的人工智能与开源:高潮与低谷——年度回顾

我们正稳步走向2023年末。我觉得现在是个好时机,来简要回顾一下2023年人工智能研究、产业以及开源领域发生的重大进展。

当然,本文只选取了我脑海中印象最深的相关主题。如果想了解更多内容,推荐大家查看我在https://magazine.sebastianraschka.com/archive上发布的月度《研究亮点》以及《Ahead of AI》第4-12期。

延续2022年的技术规模化趋势

今年,AI产品端尚未出现任何根本性的新技术或方法论。相反,今年的重点很大程度上是在去年已验证有效的方向上持续加码:

有一则Reddit爆料(https://www.reddit.com/r/LocalLLaMA/comments/14wbmio/gpt4_details_leaked/)称,GPT-4是一个混合专家(MoE)模型,由16个子模块组成。据传这16个子模块每个都有110亿参数(作为参考,GPT-3有1750亿参数)。

figure01
来自https://www.stateof.ai/的一张GPT-3/GPT-4梗图

GPT-4采用混合专家架构这件事大概率是真的,尽管我们目前还无法完全确认。一个趋势是,行业研究者在论文中披露的信息比以前越来越少。比如,此前的论文(https://arxiv.org/abs/2305.10435、https://paperswithcode.com/paper/language-models-are-unsupervised-multitask、https://arxiv.org/abs/2005.14165、https://arxiv.org/abs/2203.02155)都会披露架构和训练细节,而GPT-4的架构却是严格保密的。再举一例:Meta AI的第一篇论文(https://arxiv.org/abs/2302.13971)还详细说明了训练模型所用的数据集,而后续的论文(https://arxiv.org/abs/2307.09288)则对这些信息秘而不宣。
说到这里,斯坦福大学上周推出了“基础模型透明度指数”(https://hai.stanford.edu/news/introducing-foundation-model-transparency-index),根据该指数,Llama 2以54%的透明度位居第一,GPT-4以48%位列第三。

当然,要求企业公开商业机密可能并不合理。但这仍是一个值得关注的有趣趋势,因为看起来2024年我们还会沿着这个方向继续走。

关于模型规模化,今年的另一个趋势是输入上下文长度的拓展。比如,GPT-4的竞品Claude 2(https://www.anthropic.com/index/claude-2)的核心卖点之一就是支持最高10万输入token(GPT-4目前限制为3.2万token),这让它在生成长文档摘要方面尤其有吸引力。再加上支持PDF输入,让它在实际场景中格外实用。

figure02
使用Claude 2生成PDF文档摘要

开源与研究趋势

在我的印象里,去年开源社区的重心很大程度上放在扩散模型(https://arxiv.org/abs/2112.10752,比如Stable Diffusion:https://github.com/CompVis/stable-diffusion)以及其他计算机视觉模型上。扩散模型和计算机视觉如今依然举足轻重,但今年开源社区和研究界更关注的焦点是大语言模型(LLM)。

开源(或者说“可公开获取”)大语言模型的爆发,一定程度上要归功于Meta发布的首个预训练模型(https://arxiv.org/abs/2302.13971)——尽管它的许可证限制颇多,但还是启发了大量研究者和从业者:比如斯坦福的 Alpaca(https://crfm.stanford.edu/2023/03/13/alpaca.html)、LMSYS的Vicuna(https://lmsys.org/blog/2023-03-30-vicuna/)、GPT4All(https://arxiv.org/abs/2303.16199)、Lit-LLaMA(https://github.com/Lightning-AI/lit-llama),这里只列举几个。

几个月后,Llama 2(https://arxiv.org/abs/2307.09288)——我在《Ahead of AI》第11期《新基础模型》(https://magazine.sebastianraschka.com/p/ahead-of-ai-11-new-foundation-models)中有过更详细的介绍——作为能力更强的基础模型,很大程度上取代了Llama 1,甚至还附带了微调版本。

不过,大多数开源大语言模型仍然是纯文本模型,尽管像Llama-Adapter V2(https://arxiv.org/abs/2304.15010)这类微调方法有望将现有大语言模型改造为多模态模型。

figure03
图片来自Llama-Adapter V2论文(https://arxiv.org/abs/2304.15010

一个值得注意的例外是Fuyu-8B(https://www.adept.ai/blog/fuyu-8b),它就在10月17日刚刚发布。

figure04
标注图来自https://www.adept.ai/blog/fuyu-8b

值得注意的是,Fuyu将输入图像块直接传入线性投影层(或嵌入层)来学习自身的图像块嵌入,而不像其他模型和方法那样依赖额外的预训练图像编码器(比如LLaVA:https://github.com/haotian-liu/LLaVA、MiniGPT-4:https://github.com/Vision-CAIR/MiniGPT-4)。这极大简化了架构和训练流程。

除了上面提到的少数多模态尝试之外,最大的研究焦点仍然是用参数量小于1000亿的小型模型追平GPT-4的文本性能——这背后的原因可能是硬件资源成本与限制、数据获取渠道有限,以及更短的开发周期要求(迫于发表压力,大多数研究者没法花数年时间训练单个模型)。

不过,开源大语言模型的下一个突破未必来自模型规模的扩大。2024年,混合专家(MoE)方法能否将开源模型推向新高度,值得期待。

有意思的是,在研究层面,2023年我们也看到了一些基于Transformer的大语言模型的替代方案,包括循环架构的Hyena大语言模型(https://arxiv.org/abs/2305.13048)和卷积架构的大语言模型(https://arxiv.org/abs/2306.15794),它们的目标都是提升效率。但目前基于Transformer的大语言模型依然是行业标杆。

figure05
Hyena大语言模型架构标注图,来自https://hazyresearch.stanford.edu/blog/2023-06-29-hyena-dna

总的来说,开源领域今年非常活跃,取得了众多突破与进展。这个领域的价值远大于各部分的简单相加。因此,看到有些人主动游说反对开源AI,我感到很遗憾。但我希望我们能保持这种积极势头,打造更高效的解决方案和替代方案,而不是越来越依赖大型科技公司发布的ChatGPT类产品。

用一个积极的点结束这一部分:多亏了开源和研究社区,我们看到了可以在单张GPU上运行的小型高效模型,比如Mistral 7B(https://arxiv.org/abs/2309.05463,https://mistral.ai/)以及Zephyr(https://news.ycombinator.com/item?id=37891848),它们的性能正在向大型闭源模型靠拢——这是一个令人振奋的趋势,希望2024年能延续下去。

生产力承诺

我认为开源AI是发展高效、定制化大语言模型方案的主要路径,包括基于个人或领域特定数据进行微调、适配各类应用的大语言模型。如果你在社交媒体上关注我,可能见过我谈论并实践Lit-GPT(https://github.com/Lightning-AI/lit-gpt)——这是我积极参与贡献的一个大语言模型开源仓库。不过,虽然我是开源的坚定支持者,我也同样推崇设计精良的产品。

自ChatGPT发布以来,大语言模型几乎被用到了方方面面。读这篇文章的读者大概率都用过ChatGPT,所以我不用再赘述大语言模型在某些任务上确实很有用。

关键在于我们要把它们用在“合适”的地方。比如,我大概不会去问ChatGPT我常去的杂货店几点开门。但我最喜欢的用法之一,是修正语法,或者帮我头脑风暴、改写句子和段落。从更大的层面来说,大语言模型背后蕴藏的是生产力提升的承诺,这一点你可能也已经感受到了。

除了普通文本大语言模型,微软和GitHub推出的Copilot(https://github.com/features/copilot)也在不断成熟,越来越多的人开始使用它。今年早些时候,Ark Invest的一份报告(https://ark-invest.com/home-thank-you-big-ideas-2023/)估算,代码助手能将编码任务的完成时间缩短约55%。

figure06
图表来自https://ark-invest.com/home-thank-you-big-ideas-2023/

具体是不是55%还有待商榷,但如果你用过代码助手就会发现,它们真的非常有用,能让繁琐的编码工作轻松不少。

有一点是确定的:代码助手已经成为常态,而且未来只会变得更好。它们会取代程序员吗?我希望不会。但它们无疑会让现有程序员的生产力更高。

这对Stack Overflow意味着什么?《AI现状报告》里有一张图表,对比了Stack Overflow和GitHub的网站流量,这可能和Copilot的普及度上升有关。不过我觉得,即便是ChatGPT/GPT-4,对编码相关任务也已经非常有帮助了。我怀疑Stack Overflow流量的下滑,部分(甚至很大程度上)也要归因于ChatGPT。

figure07
图表来自http://stateof.ai/报告

AI面临的问题

幻觉问题

和2022年一样,这个问题依然困扰着大语言模型:它们可能生成有害内容,还容易出现幻觉。这一年里,我讨论过好几种解决方法,包括基于人类反馈的强化学习(RLHF)以及英伟达的NeMo Guardrails(https://github.com/NVIDIA/NeMo-Guardrails)。但这些方法都只是权宜之计,要么限制太严,要么约束不够。

到目前为止,还没有哪种方法(甚至连思路都没有)能100%可靠地解决这个问题,同时又不削弱大语言模型的正向能力。在我看来,归根结底还是我们怎么用大语言模型:不要什么事都依赖大语言模型,数学题就用计算器,把大语言模型当作写作伙伴,并且对它的输出做双重检查,诸如此类。

此外,针对特定的商业应用,探索检索增强生成(RAG)系统作为折中方案或许是值得的。在RAG架构中,我们从语料库中检索相关的文档片段,然后让大语言模型基于检索到的内容生成文本。这种方法让模型可以调用数据库和文档里的外部信息,而不用记住所有知识。

figure08
RAG示意图,来自https://leanpub.com/machine-learning-q-and-ai/

版权问题

更紧迫的问题是围绕AI的版权争议。根据维基百科“合理使用”词条(https://en.wikipedia.org/wiki/Fair_use)的说法:“基于受版权保护材料训练的大语言模型,其版权地位尚未完全明确。”总的来说,很多规则还在制定和修订中。我希望最终的规则——不管是什么样的——能够清晰明确,让AI研究者和从业者可以据此调整和行动。(我在《大语言模型与版权法》一文中写过更多关于AI和版权争议的内容:https://magazine.sebastianraschka.com/i/136352403/llms-and-copyright-laws)

评测问题

困扰学术研究的一个问题是,主流的基准测试和排行榜被认为已经“半失效”了,因为测试集可能已经泄露,变成了大语言模型的训练数据。这已经成为Phi-1.5和Mistral等模型的争议点,我在《Ahead of AI》第12期《大语言模型商业化》(https://magazine.sebastianraschka.com/p/ahead-of-ai-12-llm-businesses)里讨论过这个问题。

自动化大语言模型评测有一种流行但没那么容易实现的方式:询问人类的偏好。另外,很多论文也将GPT-4作为次优方案来做评测。

figure09
使用人类偏好与GPT-4偏好进行评测的示例,来自https://arxiv.org/abs/2305.11206

营收问题

生成式AI目前仍处于探索阶段。当然,我们都能感受到文本和图像生成器在特定应用场景中的用处。但它们能否为公司带来正向现金流,仍是一个备受争议的话题——因为部署和运行成本非常高昂。比如,去年Futurism就报道过OpenAI因ChatGPT亏损的消息(https://futurism.com/the-byte/openai-losing-money-chatgpt)。另一方面,《财富》杂志报道(https://fortune.com/2023/08/30/chatgpt-creator-openai-earnings-80-million-a-month-1-billion-annual-revenue-540-million-loss-sam-altman/#:~:text=ChatGPT%20creator%20OpenAI%20is%20reportedly,million%20loss%20from%20last%20year)称,OpenAI现在每月营收8000万美元,这可能抵消甚至超过其运营成本。

虚假图像问题

生成式AI相关的更大问题之一——如今在社交媒体平台上尤为突出——是虚假图像和视频的生成。虚假图像和视频一直是个问题,就像Photoshop这类软件降低了伪造内容的门槛一样,AI正在把这件事推向新的高度。

虽然有其他AI系统旨在检测AI生成的内容,但这些系统不管是针对文本、图像还是视频,都不够可靠。要想在一定程度上遏制和解决这些问题,唯一的办法是依赖值得信赖的专业人士。就像我们不会随便从网上的论坛或网站获取医疗或法律建议一样,我们大概也不应该不加核实就相信网上陌生账号发布的图像和视频。

数据集瓶颈

和前面提到的版权争议相关,很多公司(包括Twitter/X和Reddit)都关闭了免费API访问,一方面是为了增加营收,另一方面也是为了防止爬虫抓取平台数据用于AI训练。

我见过很多专门做数据集相关业务的公司打广告。虽然AI可能遗憾地导致某些工作岗位的自动化,但它似乎也在同时创造新的机会。

推动开源大语言模型进步的最佳方式之一,可能是搭建一个众包数据集的平台。我的意思是,编写、收集、整理那些明确获得授权、可用于大语言模型训练的数据集。

RLHF只是锦上添花吗?

Llama 2模型系列发布时,我很高兴看到它包含了针对对话场景微调的模型。通过基于人类反馈的强化学习(RLHF),Meta AI提升了模型的有用性和安全性——如果你想了解更详细的解释,我专门写过一篇关于RLHF及其替代方案的文章:https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives

figure10标注图来自《Llama 2:开放基础模型与微调对话模型》论文(https://arxiv.org/abs/2307.09288

我一直觉得RLHF是一种非常有意思且很有前景的方法,但除了InstructGPT、ChatGPT和Llama 2之外,它并没有得到广泛应用。所以当我看到一张RLHF热度上升的图表时,我挺惊讶的。我之前完全没预料到,因为它至今应用范围还不广。

figure11
RLHF热度图表,来自https://stateof.ai/报告

由于RLHF实现起来比较复杂、有一定难度,大多数开源项目仍然聚焦于有监督微调,也就是指令微调。

RLHF最近的一个替代方案是直接偏好优化(DPO)。在论文(https://arxiv.org/abs/2305.18290)中,研究者表明,RLHF中拟合奖励模型的交叉熵损失,可以直接用于微调大语言模型。根据他们的基准测试,DPO效率更高,而且在回复质量方面往往也优于RLHF/近端策略优化(PPO)。

figure12
标注图来自https://arxiv.org/abs/2305.18290

DPO目前似乎还没有被广泛使用。不过让我兴奋的是,两周前,我们有了第一个通过DPO训练的公开可用大语言模型Zephyr-7B-alpha(https://huggingface.co/HuggingFaceH4/zephyr-7b-alpha),它的表现似乎超过了更大的、通过RLHF训练的Llama-2 70B对话模型:

figure13
截图来自https://x.com/_lewtun/status/1711756736758178270?s=20

不过值得注意的是,RLHF并不是专门用来优化基准测试性能的;它的核心优化目标是人类评估的“有用性”和“安全性”,这一点在上面的对比中并没有体现。

分类任务有人做吗?

几周前,我在Packt的“让AI落地”大会(https://www.packtpub.com/conference/put-gen-ai-to-work)上做了一个演讲,其中强调文本模型最主流的应用场景之一仍然是分类。比如常见的任务:垃圾邮件分类、文档归类、客户评论分类、社交媒体有害言论标注等等。

根据我的经验,用“小型”大语言模型就能取得非常好的分类效果,比如BERT(https://arxiv.org/abs/1910.01108),只用单张GPU就够了。

figure14
截取自https://www.packtpub.com/conference/put-gen-ai-to-work,展示了可以将小型大语言模型微调为文本分类器

今年,我在《深度学习基础》课程(https://lightning.ai/pages/courses/deep-learning-fundamentals/)的第8单元里,把“用小型大语言模型做文本分类”作为练习,在IMDB电影评论数据集上微调现成的RoBERTa模型,相关讨论见这里:https://github.com/Lightning-AI/dl-fundamentals/discussions/41。(作为参考,我在该数据集上训练的最优逻辑回归词袋模型https://github.com/rasbt/machine-learning-book/blob/main/ch08/logistic-regression-bag-of-words/log-reg.ipynb 准确率只有89%)

figure15
来自我的《深度学习基础》课程的讨论帖:https://github.com/Lightning-AI/dl-fundamentals/discussions/41

话说回来,我还没看到大语言模型在分类任务上有什么新的重大成果或趋势。大多数从业者仍然使用基于BERT的编码器模型,或者像Flan-PaLM(https://arxiv.org/abs/2210.11416)这类编码器-解码器模型——后者还是2022年发布的。这可能是因为这些架构的表现已经足够好,完全能满足需求。

表格数据的现状

2022年,我写过一篇文章(https://sebastianraschka.com/blog/2022/deep-learning-for-tabular-data.html),介绍了很多基于深度学习的表格数据处理方法。不过,和上面提到的分类大语言模型类似,表格数据集领域也没出现太多新进展——也可能是我太忙了没注意到。

figure16
表格数据集示例,供参考

2022年,Grinsztajn等人发表了一篇论文(https://arxiv.org/abs/2207.08815),我认为其核心结论——在中小数据集(1万训练样本)上,树模型(随机森林和XGBoost)的表现优于深度学习方法——至今仍然成立。

说到这里,问世快10年的XGBoost推出了2.0正式版(https://github.com/dmlc/xgboost/releases/tag/v2.0.0),带来了更好的内存效率、对超内存大数据集的支持、多目标树等诸多新特性。

2023年的计算机视觉

虽然今年的焦点几乎都在大语言模型上,但计算机视觉领域也有很多进展。这篇文章已经很长了,我就不展开讲最新的计算机视觉研究了。不过,今年夏天我参加了CVPR 2023,专门写了一篇独立的《2023年计算机视觉研究现状》:
https://magazine.sebastianraschka.com/p/ahead-of-ai-10-state-of-computer

https://substack.com/profile/27393275-sebastian-raschka-phd
·
2023年7月6日
https://magazine.sebastianraschka.com/p/ahead-of-ai-10-state-of-computer

大语言模型(LLM)的发展仍在快速推进。与此同时,抛开AI监管的争议不谈,大语言模型的新闻更新速度似乎比往常稍慢了一点。这正好是个机会,让我们把目光投向计算机视觉,聊聊这个领域的研究与发展现状。这个主题也刚好和CVPR 2023温哥华大会的回顾很搭——那是一场很棒的会议,会场可能是我参加过的会议里最好的。

除了研究之外,计算机视觉相关的AI也催生了很多新产品和新体验,今年都在逐步成熟。

比如,今年夏天我去奥斯汀参加SciPy 2023大会(https://www.scipy2023.scipy.org/)时,看到了第一批真正的全自动无人驾驶Waymo汽车在街上行驶。

还有一次去电影院,我也发现AI在电影行业的应用越来越普及。最近的一个例子是《夺宝奇兵5》里哈里森·福特的“减龄”效果——电影制作者用演员的旧档案素材训练了一个AI模型。

此外,生成式AI能力现在已经深度整合进了主流软件产品中。最近的例子就是Adobe Firefly:https://www.adobe.com/sensei/generative-ai/firefly.html

2024年预测

预测向来是最主观、最有挑战的部分。去年,我预测大语言模型会在文本和代码之外的领域得到更多应用。其中一个例子就是针对DNA的大语言模型(https://arxiv.org/abs/2306.15794);另一个是Geneformer——在3000万个单细胞转录组上预训练的Transformer模型,用于辅助网络生物学预测:https://www.nature.com/articles/s41586-023-06139-9

2024年,大语言模型将越来越多地变革计算机科学之外的STEM研究领域。

另一个新兴趋势是各家公司纷纷开发定制AI芯片,背后的驱动力是高需求导致的GPU短缺。谷歌将继续加码其云TPU v5e和A3 GPU(https://cloud.google.com/blog/products/compute/announcing-cloud-tpu-v5e-and-a3-gpus-in-ga),亚马逊推出了Trainium(https://aws.amazon.com/machine-learning/trainium/),AMD也可能在缩小与英伟达的差距。而现在,微软(https://www.theinformation.com/articles/microsoft-to-debut-ai-chip-next-month-that-could-cut-nvidia-gpu-costs)和OpenAI(https://arstechnica.com/information-technology/2023/10/openai-may-jump-into-ai-hardware-amid-high-costs-supply-constraints/)也开始研发自己的定制AI芯片。这其中的挑战将是,确保主流深度学习框架对这些硬件提供全面、完善的支持。

在开源方面,我们仍然落后于最大的闭源模型。目前,最大的公开可用模型是Falcon-180B(https://huggingface.co/blog/falcon-180b)。这可能没什么好担心的,因为大多数人都没有足够的硬件资源来运行这些模型。比起更大的模型,我更期待看到更多由多个小型子模块组成的开源混合专家模型——我在本文前面已经讨论过。

我也乐观地认为,众包数据集的工作会持续推进,而DPO(https://arxiv.org/abs/2305.18290)会逐步取代有监督微调,成为顶尖开源模型的主流训练方式。

这本杂志是我个人的热情项目,不提供直接报酬。不过,如果您愿意支持我,可以考虑购买我的书:https://sebastianraschka.com/books。如果您觉得这些书有洞见、有帮助,也欢迎推荐给您的朋友和同事。

figure17
相关书籍链接:
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

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

【转载】大语言模型的商业版图与行业热潮

原文地址:LLM Business and Busyness: Recent Company Investments and AI Adoption, New Small Openly Available LLMs, and LoRA Research, by Sebastian Raschka, on 2023-10-08

大语言模型的商业版图与行业热潮:近期企业投资与AI应用落地、新型小型公开大语言模型,以及LoRA研究进展

在《Ahead of AI》专栏中,我力求在前沿研究讨论、AI相关概念讲解,以及AI领域通用新闻与发展动态剖析之间取得平衡。鉴于前几期内容偏重于研究方向,本期我将聚焦行业最新趋势展开探讨。

具体而言,我将梳理各大科技公司的当前布局。眼下似乎所有科技巨头都在训练或开发大语言模型,其核心业务正明显向AI方向倾斜——这也是本期标题“大语言模型:商业布局与行业热潮”的由来。

需要说明的是,本文第一部分将围绕这些企业展开讨论。所有内容均无商业赞助,完全基于我个人的观察与思考。

对于尤其关注开源及可免费使用大语言模型的读者也不必担心,本期还将重点介绍几款凭借小巧体量与出色基准测试表现脱颖而出的创新大语言模型。

鉴于LoRA是目前研究中高效微调的主流技术,我还将深入分析上月提出的两种颇具吸引力的LoRA新变体。最后,我将介绍几项近期发布的重要开源项目。

多模态ChatGPT

OpenAI已开始向ChatGPT Pro用户逐步推送GPT-4V,相关公告(https://openai.com/blog/chatgpt-can-now-see-hear-and-speak)称ChatGPT如今已具备“看、听、说”的能力。这正是我在前几期专栏中提到的多模态版本ChatGPT。

随本次发布一同推出的还有微软研究人员撰写的一份166页技术报告,报告通过实操案例展示并分析了各类应用场景:https://arxiv.org/abs/2309.17421

简而言之,GPT-4V支持用户向ChatGPT界面上传图片和音频,并就相关内容提问。我尝试了我最常用的一个场景——提取公式对应的LaTeX代码(这在写论文时非常实用),效果看起来相当不错。

figure01
使用GPT-4V实现公式转LaTeX代码

顺便一提,如果大家对公式转LaTeX功能感兴趣,我推荐试试https://mathpix.com/ 。多年来这家平台一直在做同类服务,且识别精度更高。我是他们的长期订阅用户,几乎每天都会用它从书籍和论文中提取公式,整理成Markdown格式的个人笔记。(本人与该平台无关联,也未收取任何推广费用。)

回到GPT-4V本身:虽然我目前没有让AI描述通用图片的需求,但我能预见这项功能在特定自动化工作流、头脑风暴等场景中的实用价值。

但需要注意的是,尽管GPT-4V的表现令人惊艳,但谷歌的Bard早就支持图片输入,也包含上述的LaTeX公式提取功能。GPT-4V是ChatGPT界面的一次出色升级,但在这一点上,谷歌受众相对较少的Bard聊天机器人反而走在了OpenAI前面(不过有传言称,谷歌是通过两个独立模型/API调用实现该功能,而OpenAI可能采用的是统一的大语言模型)。

如果您想为Falcon、Llama 2等开源大语言模型加装多模态能力,推荐了解Llama-Adapter v2方法(别看名字里有Llama,它并非只适用于Llama系列模型)。我在几个月前的文章中曾介绍过该方法:https://magazine.sebastianraschka.com/i/11956166/finetuning-multimodal-llms-with-llama-adapter-v

数据重夺“新石油”地位

我平时尽量不关注广告,但最近在领英上刷到一则广告,内容强调如今各行各业都在全力开发定制化、下一代AI模型。但一如既往,瓶颈始终在于数据——或者说,数据匮乏。

figure02
数据标注是瓶颈……也是一份工作,一门生意。

还记得十几年前盛行的“大数据”概念吗?用一个老套的比喻来说,如果未来数月或数年间,数据成为比石油更炙手可热的交易商品,我丝毫不会感到意外。

随着越来越多平台关闭免费API访问权限,数据本身或者数据使用权未来确实可能会变得更加稀缺——至少是成本更高。今年早些时候我们就已经看到了这样的案例,比如Reddit和Twitter(现X平台)。后者上月还刚刚更新了服务条款,禁止爬虫与数据抓取:https://techcrunch.com/2023/09/08/x-updates-its-terms-to-ban-crawling-and-scraping

今年夏天,CNN、ABC、《纽约时报》等主流在线出版商纷纷屏蔽了OpenAI的GPTBot网页爬虫,阻止其抓取自身网站内容:https://www.theguardian.com/technology/2023/aug/25/new-york-times-cnn-and-abc-block-openais-gptbot-web-crawler-from-scraping-content

而就在上周,谷歌推出了一项新设置,允许出版商选择是否将自己的文章用于AI训练数据:https://www.theverge.com/2023/9/28/23894779/google-ai-extended-training-data-toggle-bard-vertex

无论你如何评价AI带来的影响,一个不可否认的事实是,它正在推动互联网格局的重构。

企业都在打磨更强大的搜索功能与更实用的聊天机器人,但这些工具本该为用户找到的内容,反而会变得更难获取。不过一线希望在于,这一切或许会最终推动网络安全与内容真实性验证体系的完善。

DALL-E 3:文生图AI的下一代迭代

很难相信,距离DALL-E 2发布并带火文生图生成AI已经过去一年半了。上个月,OpenAI正式发布DALL-E 3(https://openai.com/dall-e-3),并登陆必应图像创作平台(https://www.bing.com/images/create)供用户使用。

不得不说,最初的发布公告有点误导性,乍一看还以为DALL-E 3能自动生成图片标注,如下图截图所示:

figure03
该图出自DALL-E 3官方发布页:https://openai.com/dall-e-3

不过实际上,这些标注是作者为了演示效果手动加上的。

不管怎样,我本人并不是文生图AI的重度用户,但在必应创作网站上尝试了不同提示词后,不得不说生成效果非常惊艳。

英伟达法国分公司遭突击搜查,涉云计算反垄断调查

《华尔街日报》报道称“英伟达法国办公室遭云计算相关调查突击搜查”。报道还提到:“这类突击搜查通常持续数小时,执法人员清晨抵达公司场所,搜查办公区域,扣押实物与数字资料,并对到岗员工进行问询。”

尽管法国当局尚未披露搜查原因,但此事可能与英伟达在AI芯片领域的市场地位相关:https://www.investing.com/news/stock-market-news/citi-says-nvidia-will-have-a-90-market-share-in-ai-chips-market-432SI-3122461

我使用英伟达硬件训练深度学习模型已有十余年,在我看来,英伟达的市场主导地位要归功于其CUDA与cuDNN带来的完善软件生态。AMD虽然也有性能不错的GPU,但据使用过AMD显卡跑深度学习框架的同事反馈,其软件支持仍处于试水阶段。(不过我最近在Hacker News上看到相关讨论,过程可谓“踩坑无数”:https://news.ycombinator.com/item?id=37793635

此外,据我所知,谷歌的TPU与亚马逊的Trainium芯片目前均不对外售卖。而且,基于XLA的TPU支持主要针对谷歌自家的TensorFlow、Jax等专有软件做了优化,通用性远不如CUDA。(举个例子,早在深度学习火起来之前,我本科做分子动力学模拟时就已经在用CUDA了。)

在我看来,英伟达的庞大市场份额,部分源于其更成熟的软件生态。当然,对消费者来说选择越多越好,老话也说得好:“竞争促进行业发展。”

OpenAI被曝正研发自有AI芯片

一则出人意料的消息显示,据路透社报道,ChatGPT母公司OpenAI正探索研发自有AI芯片:https://www.reuters.com/technology/chatgpt-owner-openai-is-exploring-making-its-own-ai-chips-sources-2023-10-06/

近年来,行业垂直整合的趋势愈发明显——即企业掌控生产流程多个环节的商业策略。典型案例就是苹果为iPhone和Mac自研处理器。在AI领域,谷歌自研了TPU,亚马逊也推出了Trainium芯片:https://aws.amazon.com/machine-learning/trainium/

上述路透社的文章并未提及这点,但我觉得很有意思的是,目前微软是唯一没有自研定制AI芯片的主流云厂商。考虑到微软对OpenAI的巨额投资,未来微软Azure云服务很可能会受益于定制的AI推理与/或训练芯片。当然,和以往一样,一大挑战在于如何保证软件支持,以及与PyTorch等主流深度学习框架的无缝集成。

微软将推出数据中心专用芯片,用于大语言模型训练

刚写完OpenAI的芯片计划,以及关于微软可能会跟进谷歌、亚马逊步伐,为自家数据中心研发定制AI芯片的猜测,就有新文章证实了这一消息。据科技媒体The Information报道,微软将于下月推出一款AI芯片,有望降低对英伟达GPU的依赖成本:https://www.theinformation.com/articles/microsoft-to-debut-ai-chip-next-month-that-could-cut-nvidia-gpu-costs

亚马逊投资Anthropic,谷歌也表露投资意向

据路透社报道,亚马逊向ChatGPT同类聊天机器人Claude的开发商Anthropic投资至多40亿美元:https://www.reuters.com/markets/deals/amazon-steps-up-ai-race-with-up-4-billion-deal-invest-anthropic-2023-09-25/ ,相关深度分析可见:https://www.semianalysis.com/p/amazon-anthropic-poison-pill-or-empire 。双方还约定后续可追加40亿美元投资。有意思的是,这笔投资并非现金,而是亚马逊云服务额度,用于使用亚马逊自研Trainium芯片进行模型训练。

这也意味着,继谷歌推出Bard、微软绑定ChatGPT之后,亚马逊如今也拥有了Claude这款通用聊天机器人,可以向客户提供相关服务。

在上述消息公布几天后,又有报道称OpenAI的竞争对手Anthropic正与谷歌等方面洽谈融资20亿美元:https://www.theinformation.com/articles/openai-rival-anthropic-in-talks-to-raise-2-billion-from-google-others-as-ai-arms-race-accelerates ,这一进展颇耐人寻味。

新型可公开使用的大语言模型

每周都有大量新的大语言模型登上公开基准排行榜。过去两周我试用过的模型里,最有意思也最值得关注的两款是phi-1.5和Mistral,本期想和大家重点聊聊。

phi-1.5和Mistral都属于性能强劲但体量相对小巧的模型(参数量分别为13亿和70亿,而GPT-3参数量达1750亿),且均公开了模型权重可供使用。说到这里,Percy Liang在X平台上发过一条推文,区分了“开放大语言模型”与“开源大语言模型”:
https://x.com/percyliang/status/1708560401754202621?s=20

“很多‘开放’语言模型仅仅是发布了权重。在软件领域,这就相当于只发布二进制文件却不提供源代码——你不会管这叫开源。要获得完全的透明度,就得公开训练数据。GPT-J、GPT-NeoX、BLOOM、RedPajama都做到了这一点。”

如果您想使用或微调phi-1.5与Mistral,这两款模型都可以通过lit-gpt仓库获取:https://github.com/Lightning-AI/lit-gpt ,我也是该项目的维护者之一。

Phi-1.5

Phi-1.5是一款“小型”大语言模型,参数量仅13亿,但性能表现远超其体量级别。

figure04
图片标注出自论文:https://arxiv.org/abs/2309.05463

这么小的模型为何能有如此出色的表现?秘诀似乎在于高质量的训练数据。

该模型的预训练基于https://arxiv.org/abs/2306.11644 中提出的方法,我在今年夏天的《三句话速览AI研究亮点》一文中曾简要介绍过:研究人员用规模相对较小的60亿token网页“教科书级质量”数据集,加上10亿token由GPT-3.5生成的习题,训练了最初的13亿参数phi模型。

作为继任者的13亿参数phi-1.5模型,使用了类似的“高质量”数据集训练:在来自论文https://arxiv.org/abs/2211.15533 、StackOverflow等来源的70亿token代码数据基础上,新增了约200亿token教科书级别的合成文本。值得注意的是,phi-1.5仅完成了预训练,尚未经过指令微调——后者或许能进一步提升其性能。

figure05
phi-1.5前身模型的数据集与性能表现,出自:https://arxiv.org/abs/2306.11644

论文作者提出一个假设:模型无需经过指令微调就能获得指令遵循能力,这是个很有意思的观察。但phi-1.5的预训练数据,本身就是通过向另一款大语言模型发出指令提示生成的。所以在我看来,模型在预训练阶段就获得了一定的指令微调效果,其实并不意外。(有监督指令微调本质上和预训练类似,都是下一词预测任务,我在《Ahead of AI》的《大语言模型训练:RLHF及其替代方案》一文中有过阐述:https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives

关于phi-1.5的训练细节,可参考论文:https://arxiv.org/abs/2309.05463

X平台上Susan Zhang的相关帖子(https://twitter.com/suchenzang/status/1701615026648605095?s=20 )引发了关于phi-1.5性能指标的讨论,有人猜测模型可能在无意中使用了基准数据集进行训练。Susan Zhang举了例子,说明phi-1.5对格式非常敏感:比如,和基准数据集格式相似的数学题它能完美答对,但格式稍有变化就开始出现幻觉。Zhang认为这表明模型其实只是记住了测试数据集。

说到这个,在一篇颇具讽刺意味的论文(https://arxiv.org/abs/2309.08632 )中,作者训练了一个仅100万参数的小型大语言模型,性能居然超过了包括13亿参数phi-1.5在内的所有模型。而实现方法就是让模型在所有下游学术基准数据集上训练。这篇文章像是一种委婉的批评,凸显了基准测试很容易被有意或无意地“作弊”——也就是数据污染问题。

figure06
归根结底,我们目前没有很好的方法判断一个模型是否用基准测试或测试数据训练过。尤其是如今大多数公司都不再分享或披露训练数据,这很可能是为了避免法律诉讼(例如相关报道:https://apnews.com/article/openai-lawsuit-authors-grisham-george-rr-martin-37f9073ab67ab25b7e6b2975b2a63bfe )。

Mistral

新兴AI公司Mistral AI在首次公开官宣中,发布了旗下第一款可公开使用的大语言模型。根据该公司的基准测试结果,70亿参数的Mistral模型在所有基准测试中都优于参数量更大的130亿参数Llama 2模型,同时代码能力甚至接近CodeLlama 7B。也正因如此,上周这款模型成了社交媒体上的热议话题。

我随机选取了部分Evaluation Harness测试任务对Mistral进行了试用。它在算术基准上的表现好得(几乎好得反常)。不过,它并非在所有任务上都能超越130亿参数的Llama 2模型。

figure07
多款基础模型(非微调模型)在随机选取的lm-evaluation-harness任务上的表现对比,工具来源:https://github.com/EleutherAI/lm-evaluation-harness

如果您想上手试用,Mistral和Phi-1.5都已加入lit-gpt代码仓库:https://github.com/Lightning-AI/lit-gpt 。我定期为该仓库贡献代码,它也是NeurIPS大语言模型效率挑战赛的参赛项目之一。

现在,也有人提出了和phi-1.5类似的担忧。比如Reddit上的讨论(https://www.reddit.com/r/LocalLLaMA/comments/16twtfn/llm_chatrp_comparisontest_mistral_7b_base_instruct/k2hr0yl/ )就提到,有人怀疑模型训练中用到了测试数据,这或许能解释部分基准测试分数偏高的原因。不过整体而言,这款模型依然非常有意思,能力也十分出众。

此外,它还采用了一种有意思的自注意力变体——滑动窗口注意力,以此节省显存、提升计算吞吐量,加快训练速度。(滑动窗口注意力此前已在两篇论文中被提出:https://arxiv.org/abs/1904.10509https://arxiv.org/abs/2004.05150

滑动窗口注意力机制本质上是一个固定大小的注意力窗口,当前token只能关注前面特定数量的token,而非所有之前的token,原理如下图所示。

figure08
常规注意力与滑动窗口注意力对比,图标注基于Mistral官方仓库提供的示意图修改:https://github.com/mistralai/mistral-src

在Mistral的具体实现中,注意力窗口大小为4096个token,而研究人员训练模型时支持最高10万token的上下文长度。

举个更具体的例子:在常规自注意力机制下,模型处理第50000个token时,可以关注前面全部49999个token;而在滑动窗口自注意力下,Mistral模型只能关注第45904到第50000个token。

这是不是意味着模型无法一次性获取全部上下文信息?也不尽然。Mistral的开发团队认为,模型依然可以通过分层间接的方式访问所有输入token,原理如下图所示。

figure09
标注示意图基于Mistral官方仓库提供的图片修改:https://github.com/mistralai/mistral-src

目前还没有针对GPT类大语言模型使用滑动窗口注意力的研究论文与消融实验,我们还不清楚这种机制对模型性能到底是正面还是负面影响。但它对计算吞吐量的提升是毋庸置疑的,Mistral团队提到该机制带来了2倍的速度提升。

LoRA新变体

LoRA(低秩适配,论文见https://arxiv.org/abs/2106.09685 )是目前大语言模型高效微调最主流的方法,最近几周研究人员又提出了两种新的变体:QA-LoRA(https://arxiv.org/abs/2309.14717 )与LongLoRA(https://arxiv.org/abs/2309.12307 )。

(简而言之,LoRA的核心是通过对预训练模型的参数做低秩投影来进行微调。大多数读者可能已经熟悉LoRA的原理,但如果大家感兴趣,我可以在未来的文章里从零开始实现并详细讲解它的工作机制。欢迎在评论区告诉我。)

LongLoRA

在论文https://arxiv.org/abs/2309.12307 中,研究人员提出了LongLoRA——一种高效的大语言模型微调方法,无需承担长上下文通常带来的高昂计算成本,就能扩展模型的上下文长度。该方法在微调阶段使用稀疏局部注意力以节省算力,而推理阶段依然可以使用常规的稠密注意力。

figure10
LongLoRA论文中的标注示意图:https://arxiv.org/abs/2309.12307

QA-LoRA

论文https://arxiv.org/abs/2309.14717 提出的QA-LoRA,本质上是对QLoRA(量化LoRA)的小幅改进,解决了QLoRA计算效率偏低的问题——QLoRA虽然节省了显存,但每次前向传播都需要对基础模型的量化权重做反量化,因此运行时间更长。

与QLoRA不同,QA-LoRA对LoRA(适配器)的权重本身做量化,避免了叠加适配器权重时,需要将量化后的基础模型权重转换回16位的高昂开销。这一原理总结在下方标注图中。

figure11
QA-LoRA论文中的标注示意图:https://arxiv.org/abs/2309.14717

一点小吐槽:论文表2中,QA-LoRA的微调速度约是QLoRA的2倍,但它的适配器权重参数量要少得多。我认为如果两者使用相同参数量来对比速度,结果会更有参考价值。

开源亮点

最后,我想以几项难得一见的重要开源发布收尾本期内容:Python 3.12、PyTorch 2.1与XGBoost 2.0。

Python 3.12

最新版本的Python带来了大量计算性能提升,官方更新说明(https://docs.python.org/3/whatsnew/3.12.html )提到,asyncio标准库的性能最高提升了75%。

我最喜欢的Python通讯《Python Weekly》(https://www.pythonweekly.com/ )将主要更新总结如下:

  • 更灵活的f-string解析
  • Python代码支持缓冲区协议
  • 新增调试/性能分析API
  • 支持带有独立全局解释器锁(GIL)的隔离子解释器
  • 进一步优化的错误提示信息
  • 支持Linux perf性能分析工具在追踪中显示Python函数名
  • 大量大大小小的性能优化

PyTorch 2.1

去年是PyTorch的大年,2.0版本推出了torch.compile新特性,可以将动态PyTorch计算图转换为全部或部分静态图,从而提升性能。今年PyTorch 2.1正式发布:https://pytorch.org/blog/pytorch-2-1/ 。据我观察,该版本没有引入破坏性变更,重点依然放在性能优化上。

来源:https://pytorch.org/blog/pytorch-2-1/

一个值得关注的特性(目前仍处于测试阶段)是,torch.compile现在还能编译NumPy运算,将其转换为等价的PyTorch操作。这意味着我们现在也可以用GPU加速NumPy代码了。

相关的领域库比如torchvision也得到了更新。例如,热门的数据增强方法CutMix和MixUp就有了相关更新:https://pytorch.org/vision/stable/auto_examples/transforms/plot_cutmix_mixup.html#sphx-glr-auto-examples-transforms-plot-cutmix-mixup-py

XGBoost 2.0

没错,不用深度神经网络和大语言模型的机器学习依然大有可为!XGBoost是最流行的梯度提升算法实现之一,其在表格数据上的表现依然强劲,相关研究可见:https://arxiv.org/abs/2207.08815

figure13
来源:https://github.com/dmlc/xgboost/releases/tag/v2.0.0

XGBoost面世已近十年,近期刚刚发布了重磅2.0版本:https://github.com/dmlc/xgboost/releases/tag/v2.0.0 ,带来了更优的内存效率、对超内存大数据集的支持、多目标树等众多新特性。

本专栏是个人兴趣项目,无直接商业报酬。如果您愿意支持我,可以考虑购买我的书籍:https://sebastianraschka.com/books 。如果您觉得这些书有见解、有帮助,也欢迎推荐给您的朋友和同事。

figure14
书籍购买链接:https://www.amazon.com/Machine-Learning-PyTorch-Scikit-Learn-scikit-learn-ebook-dp-B09NW48MR1/dp/B09NW48MR1/https://nostarch.com/machine-learning-and-ai-beyond-basicshttp://mng.bz/M96o

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

【介绍】从自对齐到LongLoRA

原文地址:From Self-Alignment to LongLoRA,by Sebastian Raschka, on 2023-09-23

从自对齐到LongLoRA

又一个月,又一批涵盖大语言建模到计算机视觉领域的有趣研究论文。

近期的一个研究重点是对大语言模型(LLM)进行优化。例如,Platypus模型与强化自训练(Reinforced Self-Training,ReST)方法的提出,是提升模型与人类偏好对齐度的最新尝试。

此外,指令回译自对齐与OctoPack两项研究则利用现有的知识结构——无论是指令还是代码——来提升模型性能。

一个反复出现的研究主题是致力于让模型更高效、更易获取。LongLoRA为大语言模型带来了另一种稀疏注意力机制;而一些更简单、更底层的思路,比如在视觉Transformer中用ReLU替代softmax,也在提升计算效率,为更好的并行化铺平道路。

但这只是本月研究进展的一个缩影。希望你能从下面精选的22项研究亮点中有所收获。


大语言模型

RLAIF:借助AI反馈规模化基于人类反馈的强化学习(2023年9月1日,https://arxiv.org/abs/2309.00267

近期这项关于AI反馈强化学习(RLAIF)的研究表明,RLHF中奖励模型训练所需的评分不一定非要由人类提供,也可以由大语言模型(本研究中为PaLM 2)生成。人类评估者在半数情况下更偏好RLAIF模型,而非传统的RLHF模型,这说明二者其实没有明显的优劣之分。此外值得注意的是,RLHF和RLAIF的表现都大幅优于仅通过监督指令微调训练的模型。

figure01
图片标注源自:https://arxiv.org/abs/2309.00267

语言模型的强化自训练(ReST)(2023年8月17日,https://arxiv.org/abs/2308.08998

ReST是基于人类反馈的强化学习(RLHF)的一种替代方案,用于让大语言模型与人类偏好对齐。ReST采用采样方法构建更优的数据集,通过在质量不断提升的子集上迭代训练来优化其奖励函数。据作者称,由于训练数据集是离线生成的,ReST相比标准的在线RLHF方法(例如搭配近端策略优化PPO的RLHF)效率更高;但该研究并未与InstructGPT或Llama 2中使用的标准RLHF PPO方法做全面对比。

figure02
图片标注源自:https://arxiv.org/abs/2308.08998

Platypus:快速、低成本、高性能的大语言模型优化方案(2023年8月14日,https://arxiv.org/abs/2308.07317

Platypus是一套全新的开源大语言模型,在撰写本文时位居人类反馈类大语言模型排行榜榜首。它的两大成功支柱是:对底层数据集进行精选(去除相似与重复问题),以及对低秩适配(LoRA)模块进行微调与合并。特别有意思的一点是,作者在应用LoRA时,聚焦于非注意力模块而非注意力模块。

figure03
图片标注源自:https://arxiv.org/abs/2308.07317

指令回译自对齐(8月11日,https://arxiv.org/abs/2308.06259

通常的指令微调要么收集人类撰写的数据集,要么用大语言模型生成指令-响应对(即蒸馏法),而本文提出了第三种思路。研究人员从一个预训练大语言模型出发,为网页等无标注文本生成指令。采用这种所谓“指令回译”方法微调的大语言模型,表现优于在蒸馏数据集(如Alpaca)上训练的模型。

figure04
图片标注源自:https://arxiv.org/abs/2308.06259

大语言模型的高效基准测试(2023年8月31日,https://arxiv.org/abs/2308.11696

如果你跑过HELM或Evaluation Harness这类大语言模型基准测试,就会知道基准测试成本极高,动辄耗时数小时。为了提升大语言模型评估效率,研究人员提出了Flash-HELM,它能得出与HELM相近的模型排名,但成本大幅降低。举例来说,如果模型在早期评估轮次中表现不佳,就会被分配更低的权重,仅在更少的样本和提示上进行评估。

figure05
图片标注源自:https://arxiv.org/abs/2308.11696

LongLoRA:长上下文大语言模型的高效微调(2023年9月21日,https://arxiv.org/abs/2309.12307

LongLoRA是一种高效的大语言模型微调方法,它能扩展模型的上下文窗口,且不会产生长上下文通常伴随的高昂计算成本。该方法采用稀疏局部注意力,在微调阶段节省计算量,而在推理阶段仍可使用常规的稠密注意力。

figure06
图片标注源自:https://arxiv.org/abs/2309.12307

课本即全部所需 II:phi-1.5技术报告(2023年9月11日,https://arxiv.org/abs/2309.05463

本文提出了一款全新的“小尺寸”开源大语言模型,参数量仅13亿,性能却十分出色。它没有打破任何基准测试纪录,但表现堪比参数量是其5倍的模型,比如广受欢迎的70亿参数Llama 2。该模型的训练遵循https://arxiv.org/abs/2306.11644 中的流程,在70亿代码token(来自https://arxiv.org/abs/2211.15533 、StackOverflow等来源)的基础上,额外使用了约200亿课本质量的合成文本。

figure07
图片标注源自:https://arxiv.org/abs/2309.05463

在测试集上预训练即全部所需(2023年9月19日,https://arxiv.org/abs/2309.08632

在这篇带有讽刺意味的论文中,作者训练了一个仅100万参数的小模型,其表现却超过了所有其他模型,包括13亿参数的phi-1.5。实现的方法是让模型在所有下游学术基准测试集上进行训练。这篇文章委婉地批评了一个现象:基准测试很容易被有意或无意地“作弊”(由数据污染导致)。

figure08
图片标注源自:https://arxiv.org/abs/2309.08632

GPT无需计算器即可解决数学问题(2023年9月6日,https://arxiv.org/abs/2309.03241

大语言模型在大数可靠算术运算上表现不佳,对比ChatGPT和标准计算器的计算结果就能看出来(比如试试计算16342391 × 12325234243)。在这篇概念验证论文中,研究人员表明,无需借助外部API,仅通过微调就能提升大语言模型的数学能力。不过从实用角度来说,使用计算器或者让大语言模型接入计算器API,显然仍是更优选择。

figure09
图片与表格标注源自:https://arxiv.org/abs/2309.03241

RAIN:无需微调即可让语言模型完成自对齐(2023年9月13日,https://arxiv.org/abs/2309.07124

本文探讨了如何在无需额外数据、无需更新模型参数的情况下,让大语言模型与人类偏好对齐。提出的可回溯自回归推理(Rewindable Auto-regressive INference,RAIN)机制,核心是自我评估与回溯模型生成的回复。在Llama 30B上的测试显示,该方法在保持模型有用性的同时,将无害率从82%提升至97%。

figure10
图片标注源自:https://arxiv.org/abs/2309.07124

大语言模型的涌现能力只是上下文学习吗?(2023年9月4日,https://arxiv.org/abs/2309.01809

一种普遍的观点认为,随着模型规模增大,大语言模型会发展出小模型不具备的涌现能力。在这项涵盖18个模型(参数量最高达1750亿)、22项任务的全面新研究中,研究人员发现这些能力主要来源于上下文学习,而非推理能力。这一结论应该能让部分担心模型规模增长会催生涌现能力的人稍感安心。

figure11
图片标注源自:https://arxiv.org/abs/2309.01809

语言建模即压缩(2023年9月19日,https://arxiv.org/abs/2309.10668

预测式深度学习模型的训练目标通常是最小化交叉熵损失,这本质上意味着模型的预测能用最少的比特数编码训练数据的真实标签。本文进一步研究了压缩与分类为何等价、如何等价。有意思的是,作者发现大语言模型的压缩能力不仅在文本上表现出色,在从未训练过的模态(比如图像数据)上也具备竞争力。

figure12
表格标注源自:https://arxiv.org/abs/2309.10668

Struc-Bench:大语言模型真的擅长生成复杂结构化数据吗?(2023年9月16日,https://arxiv.org/abs/2309.08963

本文评估了大语言模型在生成HTML、LaTeX表格等复杂结构化输出方面的能力。此外,作者提出了一种特定的思维链格式,能从目标输出反推生成指令。最后作者发现,结构化感知的微调方法(在生成的数据集上进行标准指令微调)能提升大语言模型在结构化输出生成任务上的表现。

figure13
图片标注源自:https://arxiv.org/abs/2309.08963

Code Llama:开源代码基础模型(2023年8月24日,https://arxiv.org/abs/2308.12950

Code Llama是Meta AI基于今年早些时候发布的热门基础模型Llama 2推出的最新系列大语言模型。Code Llama系列包含70亿、130亿和340亿参数量的版本,均在代码数据上完成了训练与微调。该系列模型的训练上下文长度为16k(是Llama 2的4倍),在推理阶段最多可支持100k的上下文长度。

figure14
图片标注源自:https://arxiv.org/abs/2308.12950

OctoPack:代码大语言模型的指令微调(2023年8月14日,https://arxiv.org/abs/2308.07124

研究人员用4TB的Git提交数据(涵盖350种编程语言)训练大语言模型,并将该数据集命名为CommitPack,发布于https://huggingface.co/datasets/bigcode/commitpack 。研究利用Git提交信息的天然结构(例如“为sin函数添加噪声修改”)来微调大语言模型,使其能对应地修改代码。最终模型在代码修复、代码解释和代码合成任务上的表现,与WizardCoder等其他热门代码大语言模型相当。

figure15
图片标注源自:https://arxiv.org/abs/2308.07124


计算机视觉与多模态模型

Qwen-VL:具备多能能力的前沿大视觉语言模型(2023年8月24日,https://arxiv.org/abs/2308.12966

Qwen-VL系列模型是多模态AI领域的又一力作。该系列是大规模视觉语言Transformer模型,旨在同时理解文本与图像。Qwen-VL与Qwen-VL-Chat可用于图像描述、问答、视觉定位等任务,支持英文、中文及多语言对话。

figure15
图片标注源自:https://arxiv.org/abs/2308.12966

EVE:基于掩码预测与模态感知混合专家的高效视觉语言预训练(2023年8月23日,https://arxiv.org/abs/2308.11971

传统上,构建视觉语言模型需要针对每个模态设计多个专门的预训练任务。本文提出了一个统一的多模态Transformer,仅用单一任务完成预训练。为实现这一点,提出的EVE模型在共享Transformer网络中融合视觉与语言,利用模态感知的稀疏混合专家(MoE)模块处理模态特定的信息。

figure16
图片标注源自:https://arxiv.org/abs/2308.11971

ImageBind-LLM:多模态指令微调(2023年9月7日,https://arxiv.org/abs/2309.03905

ImageBind-LLM是一种借助ImageBind对大语言模型进行多模态指令微调的方法。该方法及对应的模型能通过全新的图像-文本对齐训练方式,理解图像、音频、3D点云、视频等多种模态。其中,一个可学习的Bind网络对齐了LLaMA与ImageBind图像编码器的嵌入空间,而一个无需训练的缓存模型解决了训练与推理之间的模态差异问题。

figure17
图片标注源自:https://arxiv.org/abs/2309.03905

在视觉Transformer中用ReLU替代Softmax(2023年9月15日,https://arxiv.org/abs/2309.08586

视觉(以及语言)Transformer的自注意力模块通常使用softmax运算,而softmax很难并行化。在这篇短篇论文中,研究人员表明,可以用逐点ReLU函数替代softmax函数,且不会带来明显的精度损失(也没有提升)。这为并行化开辟了新的方向。

figure18
图片标注源自:https://arxiv.org/abs/2309.08586


通用方法与其他研究

从电路效率角度解释“顿悟现象”(2023年9月5日,https://arxiv.org/abs/2309.02390

本文对https://arxiv.org/abs/2201.02177 中提出的“顿悟现象”(神经网络从训练准确率完美、泛化能力差,过渡到泛化能力完美的现象)给出了进一步的解释与洞见。作者提出,当任务同时存在记忆型解和泛化型解时就会出现这种现象:泛化型解学习速度更慢,但效率更高。有意思的是,随着数据集增大,记忆型解的效率会下降,而泛化型解的效率保持稳定,最终促成顿悟现象的发生。

figure19
图片源自:https://arxiv.org/abs/2309.02390

课程学习与Adam:问题出在错误的细节上(2023年8月23日,https://arxiv.org/abs/2308.12202

课程学习是一种训练策略:模型会按难度递增的顺序逐步学习任务,类似人类教育从易到难的知识结构。研究发现,自然语言处理领域近期的课程学习方法效果很不稳定,这往往是因为它们与Adam优化算法相互作用,导致参数选择次优。此外,本文发现没有任何一种课程学习方法的表现,能超过使用精心挑选超参数的纯Adam优化。

figure20
图片源自:https://arxiv.org/abs/2308.12202

基于扩散与流匹配梯度提升树的表格数据生成与插补(2023年9月18日,https://arxiv.org/abs/2309.09968

本文提出了一种新方法,利用基于得分的扩散与条件流匹配来生成和插补混合类型(分类型与连续型)的表格数据,核心是采用XGBoost而非深度神经网络。该方法不仅能生成高度真实的合成数据,即便在存在缺失值的数据集上训练也同样有效。此外,它仅用CPU即可训练(无需GPU)。

figure21
图片源自:https://arxiv.org/abs/2309.09968


本专栏是个人兴趣项目,无直接稿酬。如果你愿意支持我,可以考虑购买https://sebastianraschka.com/books 上的书籍。如果你觉得这些内容有洞见、有帮助,也欢迎推荐给你的朋友和同事。

figure22

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

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

【转载】大语言模型训练:基于人类反馈的强化学习(RLHF)及其替代方案

原文地址:LLM Training: RLHF and Its Alternatives,by Sebastian Raschka, on 2023-09-10

大语言模型训练:基于人类反馈的强化学习(RLHF)及其替代方案

我在讨论大语言模型(LLM)时,无论是研究资讯还是教程内容,都会频繁提到一个名为基于人类反馈的强化学习(Reinforcement Learning with Human Feedback,RLHF)的流程。RLHF是现代大语言模型训练流水线中不可或缺的一环,它能够将人类偏好融入优化过程,从而提升模型的有用性与安全性。

在本文中,我将逐步拆解RLHF的原理,为理解其核心思想与重要价值提供参考。继上一篇介绍Llama 2的《Ahead of AI》文章之后,本文还将对比ChatGPT与Llama 2实现RLHF的不同方式。

最后,对于好奇RLHF的实际意义与必要性的读者,我新增了一个章节介绍最新的替代方案——我打算定期更新这一部分。

简而言之,本文的目录如下:

  • 经典大语言模型训练流水线
  • 基于人类反馈的强化学习(RLHF)
  • Llama 2中的RLHF
  • RLHF的替代方案

经典大语言模型训练流水线

ChatGPT、Llama 2等现代基于Transformer的大语言模型,需要经历三步训练流程:

  1. 预训练
  2. 监督微调
  3. 对齐

首先在预训练阶段,模型从海量无标注文本数据中吸收知识。随后的监督微调会对模型进行优化,使其更好地遵循特定指令。最后的对齐阶段会进一步打磨模型,让它对用户提示的回复更有帮助、更安全。

注意,该训练流水线参考自论文 https://arxiv.org/abs/2203.02155,文中详细介绍了GPT-3的训练流程,这一方法也被广泛认为是ChatGPT背后的实现方案。稍后我们还会将该方法与 https://arxiv.org/abs/2307.09288 中的模型进行对比。

让我们从第一步——预训练开始,如下图所示。

figure01
图注:大语言模型预训练步骤示意图

预训练通常在包含数十亿到数万亿词元的海量文本语料上开展。在这个阶段,我们采用简单的下一词预测任务:模型根据给定的上文文本,预测后续的单词(或词元)。

如果你对下一词预测任务不熟悉,可以参考我之前的文章《理解编码器式与解码器式大语言模型》:
https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder

需要强调的一点是:这种预训练方式让我们能够充分利用大规模无标注数据集。只要使用数据时不侵犯版权、不违背创作者意愿,就无需手动标注即可获取海量训练数据。实际上,在预训练步骤中,“标签”就是文本里的下一个词,它本身就是数据集的一部分——因此这种预训练方法常被称为自监督学习

下一步是监督微调,如下图所示。

figure02
图注:在指令数据上微调预训练模型

监督微调阶段会开展另一轮下一词元预测。但与预训练阶段不同,我们此时使用的是指令-输出配对数据,如上图所示。其中,指令是输入给模型的内容(根据任务不同,有时还会附带可选的输入文本),输出则是我们期望模型生成的理想回复。

举个具体的例子,我们来看下面这组指令-输出配对:

指令:“写一首关于鹈鹕的五行打油诗。”
输出:“从前有只鹈鹕特别棒……”

模型将指令文本(“写一首关于鹈鹕的五行打油诗”)作为输入,对输出文本(“从前有只鹈鹕特别棒……”)执行下一词元预测。

尽管两者采用了相似的下一词元训练目标,但监督微调使用的数据集通常远小于预训练数据集。这是因为它需要的是指令-输出配对,而非原始文本。要构建这样的数据集,人类(或另一个高质量大语言模型)必须针对特定指令写出期望的输出——构建这类数据集的工作量非常大。

监督微调阶段之后,还有一个微调阶段,通常被称为**“对齐”步骤**——它的核心目标是让大语言模型与人类偏好保持一致,RLHF正是在这一步发挥核心作用。

figure03
图注:摘自InstructGPT论文的带标注图表,https://arxiv.org/abs/2203.02155

下一节我们将深入讲解基于RLHF的对齐步骤。不过,对于好奇它与预训练基础模型、第二步监督微调模型效果差异的读者,我在上方附上了InstructGPT论文中的图表——正是这篇论文让这套方法广为流传。

上图对比了经过监督微调的1750亿参数GPT-3模型(浅虚线)与其他方法的效果。图表最底部是基础GPT-3模型的表现。

如果采用提示工程的方法,多次查询模型并每次选择最佳回复(“GPT-3 + 提示工程”),可以看到其表现比基础模型(“GPT-3”)有所提升,这是意料之中的结果。

在GPT-3基础模型上加入监督微调后,其表现(“GPT-3 + 监督微调”)甚至优于“GPT-3 + 提示工程”。

然而,最佳表现来自经过监督微调与RLHF的GPT-3模型(“GPT-3 + 监督微调 + RLHF”)——也就是图表顶部的两条曲线。(注意图表顶部有两条线,因为研究人员实验了两种不同的采样流程。)

下一节将更详细地介绍RLHF步骤。

基于人类反馈的强化学习(RLHF)

上一节介绍了ChatGPT、Llama-2-chat等现代大语言模型背后的三步训练流程。本节将更细致地拆解微调阶段,重点聚焦RLHF部分。

RLHF流水线以预训练模型为起点,先对其进行监督式微调(对应上一节的步骤2),再通过近端策略优化进一步完成对齐(对应上一节的步骤3)。

为简化理解,我们将RLHF流水线拆分为三个独立步骤:

  1. RLHF步骤1:对预训练模型进行监督微调
  2. RLHF步骤2:构建奖励模型
  3. RLHF步骤3:通过近端策略优化进行微调

RLHF步骤1如下图所示,是一个监督微调环节,用于为后续的RLHF微调创建基础模型。

figure04
图注:摘自InstructGPT论文的带标注示意图,https://arxiv.org/abs/2203.02155

在RLHF步骤1中,我们(例如从数据库中)创建或采样提示,然后请人工撰写高质量回复。接着我们用这个数据集,以监督方式微调预训练基础模型。

注意,RLHF步骤1与上一节“经典大语言模型训练流水线”中的步骤2本质相似。我在这里再次列出它,是因为它是RLHF流程中不可或缺的组成部分。

在RLHF步骤2中,我们利用经过监督微调的模型来构建奖励模型,如下图所示。

figure05
图注:摘自InstructGPT论文的带标注示意图,https://arxiv.org/abs/2203.02155

如上图所示,针对每个提示,我们用上一步得到的微调后大语言模型生成4~9条回复,再由标注人员根据自身偏好对这些回复进行排序。尽管这个排序过程耗时,但工作量通常小于构建监督微调数据集——因为对回复排序普遍比从头撰写回复更简单。

构建好包含这些排序结果的数据集后,我们就可以训练一个奖励模型,为RLHF步骤3的优化阶段输出奖励分数。这个奖励模型通常由上一步监督微调得到的大语言模型改造而来。我们将奖励模型简称为RM,将监督微调步骤得到的大语言模型简称为SFT。要把RLHF步骤1的模型转化为奖励模型,需要将其输出层(下一词元分类层)替换为回归层,该层仅包含一个输出节点。

如果你感兴趣,可以参考我的《深度学习基础》课程第4.5单元的短视频讲座,内容是如何将分类模型改造为回归模型:
https://lightning.ai/courses/deep-learning-fundamentals/training-multilayer-neural-networks-overview/4-5-multilayer-neural-networks-for-regression-parts-1-2/

RLHF流水线的第三步,是利用奖励模型(RM)来微调之前经过监督微调的模型(SFT),如下图所示。

figure06
图注:摘自InstructGPT论文的带标注示意图,https://arxiv.org/abs/2203.02155

在RLHF的最终步骤——步骤3中,我们基于步骤2构建的奖励模型输出的奖励分数,使用**近端策略优化(PPO)**来更新SFT模型。

PPO的详细数学原理超出了本文范围,感兴趣的读者可以在早于InstructGPT的四篇经典论文中找到相关细节:

  1. https://arxiv.org/abs/1602.01783(2016年),作者为Mnih、Badia、Mirza、Graves、Lillicrap、Harley、Silver和Kavukcuoglu,提出了策略梯度方法,作为深度强化学习中Q学习的替代方案。
  2. https://arxiv.org/abs/1707.06347(2017年),作者为Schulman、Wolski、Dhariwal、Radford和Klimov,提出了改进的基于近端策略的强化学习流程,相比基础策略优化算法,数据效率更高、可扩展性更强。
  3. https://arxiv.org/abs/1909.08593(2020年),作者为Ziegler、Stiennon、Wu、Brown、Radford、Amodei、Christiano、Irving,阐述了将PPO和奖励学习应用于预训练语言模型的思路,还加入了KL正则化以防止策略偏离自然语言过远。
  4. https://arxiv.org/abs/2009.01325(2020年),作者为Stiennon、Ouyang、Wu、Ziegler、Lowe、Voss、Radford、Amodei、Christiano,提出了广为流传的RLHF三步流程,该流程后来也被应用于论文 https://arxiv.org/abs/2203.02155 中。

Llama 2中的RLHF

上一节我们介绍了OpenAI的InstructGPT论文中描述的RLHF流程,这种方法通常被认为是ChatGPT所采用的方案。但它与Meta AI最新的Llama 2模型相比有何异同?

Meta AI在构建Llama-2-chat模型时也使用了RLHF,但两种实现方式之间存在若干差异,我在下面的带标注示意图中进行了重点说明。

figure07
图注:摘自《Llama 2:开源基础模型与微调对话模型》的带标注示意图,https://arxiv.org/abs/2307.09288

总而言之,Llama-2-chat在RLHF步骤1中,与InstructGPT一样,在指令数据上执行相同的监督微调步骤。但在RLHF步骤2中,它构建了两个奖励模型而非一个。此外,Llama-2-chat模型会经历多个迭代阶段,根据模型新出现的错误更新奖励模型,同时还加入了拒绝采样步骤。

间隔损失

上述示意图中未体现的另一个差异,与构建奖励模型时对模型回复的排序方式有关。

在之前介绍的、基于RLHF+PPO的标准InstructGPT方法中,研究人员收集标注者对4~9条输出的排序结果,再从中构建“k选2”的对比对。
例如,如果一名人类标注员对四条回复(A-D)排序为 A < C < D < B,那么会产生“4选2”=6组对比:

  • A < C
  • A < D
  • A < B
  • C < D
  • C < B
  • D < B

同样,Llama 2的数据集也基于回复的二元对比(比如A < B)。但不同的是,每一轮标注中,每位人类标注员只会看到2条回复(而非4~9条)。

此外,Llama 2的创新点在于:在每个二元排序旁还会收集一个**“间隔”标签**(从“显著更优”到“几乎无差异”),该标签可以通过额外的间隔参数选择性地应用于二元排序损失中,用于量化两条回复之间的质量差距。

InstructGPT使用以下基于交叉熵的排序损失来训练奖励模型:
而Llama 2则将间隔“m(r)”作为偏好评分的离散函数加入其中,形式如下:

其中:

  • r_θ(x,y) 是针对提示x和生成回复y输出的标量分数;
  • θ 为模型权重;
  • σ 为逻辑斯蒂sigmoid函数,用于将层输出转换为0到1之间的分数;
  • y_c 是人类标注员选择的更优回复;
  • y_r 是人类标注员选择的较差回复。

举例来说,通过m(r)返回更大的间隔值,会缩小更优回复与较差回复的奖励差值,导致损失值更大,进而在策略梯度更新时产生更大的梯度,最终带来更显著的模型参数变化。

双奖励模型

如前所述,Llama 2中有两个奖励模型而非一个:一个基于有用性训练,另一个基于安全性训练。最终用于模型优化的奖励函数,是这两个分数的线性组合。

figure08
图注:基于InstructGPT论文带标注示意图绘制的Llama 2排序方法与奖励模型构建说明,https://arxiv.org/abs/2203.02155

拒绝采样

此外,Llama 2的作者采用了可迭代生成多个RLHF模型(从RLHF-V1到RLHF-V5)的训练流水线。他们没有只依赖前文讨论的RLHF+PPO方法,而是采用了两种算法进行RLHF微调:PPO,以及论文 https://arxiv.org/abs/2204.05862 中提出的方法。

拒绝采样中,会生成K条输出,然后选择奖励最高的那一条用于优化步骤的梯度更新,如下图所示。

figure09
图注:基于InstructGPT论文示意图绘制的Llama 2拒绝采样步骤说明:生成多条回复并选择奖励最高的回复,https://arxiv.org/abs/2203.02155

拒绝采样的作用是在每次迭代中筛选出奖励分数高的样本。因此,与每次仅基于单个样本更新的PPO相比,模型能使用质量更高、奖励更优的样本进行微调。

在监督微调的初始阶段之后,模型先仅使用拒绝采样进行训练,之后再结合使用拒绝采样和PPO。

研究人员绘制了RLHF各阶段的模型表现,结果显示,经过RLHF微调的模型在无害性和有用性两个维度上都有所提升。

figure10
图注:摘自《Llama 2:开源基础模型与微调对话模型》的带标注示意图,https://arxiv.org/abs/2307.09288

注意,研究人员在最后一步使用了PPO,接续之前通过拒绝采样更新的模型。正如图表中“RLHF-v5(含PPO)”与“RLHF-v5(不含PPO)”的对比所示,在最终阶段加入PPO训练的模型,效果优于仅使用拒绝采样训练的模型。(就我个人而言,我很好奇如果仅用PPO、不使用拒绝采样进行微调,模型表现会如何。)

RLHF的替代方案

我们已经讨论并定义了RLHF流程——一个相当复杂的过程,有人可能会疑惑:花这么大功夫是否值得?前面InstructGPT和Llama 2论文中的图表(如下再次展示)已经证明了RLHF的实际价值。

figure11

不过,目前有大量研究致力于开发更高效的替代方案,最值得关注的几种方法总结如下。

(1) 宪法AI:来自AI反馈的无害性(2022年12月,https://arxiv.org/abs/2212.08073

在这篇宪法AI论文中,研究人员提出了一种基于人类提供的规则列表的自训练机制。与前文提到的InstructGPT论文类似,该方法采用了强化学习思路。

figure12
图注:摘自《宪法AI:来自AI反馈的无害性》的图片,https://arxiv.org/abs/2212.08073

研究人员在上图中使用的“红队”(https://en.wikipedia.org/wiki/Red_team)一词,源于冷战时期的军事演习:当时 https://en.wikipedia.org/wiki/Red_team#History 有一支扮演苏联的队伍,用于测试美国的战略与防御体系。

在AI研究的网络安全语境中,“红队测试”如今指的是由外部或内部专家模拟潜在对手,通过模仿真实攻击者的战术、技术与流程,来挑战、测试并最终改进目标系统的过程。

(2) 后见之明的智慧:让语言模型更好地遵循指令(2023年2月,https://arxiv.org/abs/2302.05206

《后见之明的智慧:让语言模型更好地遵循指令》一文表明,监督式的大语言模型微调方法确实能取得良好效果。研究人员提出了一种基于重标记的监督微调方法,在12项BigBench任务上的表现超过了RLHF。

这种被称为**HIR(后见之明指令重标记,Hindsight Instruction Labeling)**的方法是如何运作的?简而言之,HIR包含两个步骤:采样与训练。
在采样步骤中,将提示与指令输入大语言模型,收集其回复;在训练阶段,根据对齐分数,在合适的情况下对指令进行重标记。然后,使用重标记后的指令与原始提示来微调大语言模型。通过这种重标记方法,研究人员有效地将失败案例(大语言模型生成的输出与原始指令不匹配的案例)转化为监督学习的有用训练数据。

figure13
图注:摘自《后见之明的智慧:让语言模型更好地遵循指令》的带标注示意图,https://arxiv.org/abs/2302.05206

注意,这项研究与InstructGPT等RLHF研究不具备直接可比性,因为它使用了启发式方法(“不过,由于大多数人类反馈数据难以收集,我们采用了一种脚本化的反馈函数……”)。不过,HIR后见之明方法的结果仍然非常有说服力。

(3) 直接偏好优化:你的语言模型本身就是奖励模型(2023年5月,https://arxiv.org/abs/2305.18290)

**直接偏好优化(DPO)**是RLHF+PPO的替代方案。研究人员表明,RLHF中拟合奖励模型的交叉熵损失,可以直接用于微调大语言模型。根据他们的基准测试,使用DPO效率更高,而且在回复质量方面通常也优于RLHF/PPO。

figure14
图注:摘自https://arxiv.org/abs/2305.18290的带标注示意图

(4) 对比偏好学习:无需强化学习的人类反馈学习(2023年10月,https://arxiv.org/abs/2310.13639)

与直接偏好优化(DPO)类似,**对比偏好学习(CPL)**通过省去奖励模型学习环节来简化RLHF。和DPO一样,CPL使用监督学习目标,具体来说是对比损失。(在论文的附录中,作者证明了DPO是CPL的一个特例。)
虽然相关实验是在机器人环境中进行的,但CPL同样可以应用于大语言模型微调。

(5) 面向语言建模的强化自训练(ReST)(2023年8月,https://arxiv.org/abs/2308.08998)

ReST是基于人类反馈的强化学习(RLHF)的替代方案,用于让大语言模型与人类偏好对齐。ReST采用采样方法构建更优的数据集,通过在质量越来越高的子集上迭代训练来优化其奖励函数。
据作者称,ReST通过离线生成训练数据集,相比标准的在线RLHF方法(如结合近端策略优化PPO的RLHF)效率更高,但目前缺乏与InstructGPT或Llama 2中使用的标准RLHF+PPO方法的全面对比。

figure15
图注:摘自https://arxiv.org/abs/2308.08998的带标注示意图

(6) RLAIF:用AI反馈扩展基于人类反馈的强化学习(2023年9月,https://arxiv.org/abs/2309.00267

近期的**基于AI反馈的强化学习(RLAIF)**研究表明,RLHF中用于奖励模型训练的评分不一定非要由人类提供,也可以由大语言模型(本文中为PaLM 2)生成。
人类评估者对RLAIF模型的偏好程度与传统RLHF模型各占一半,这意味着两者并没有明显的优劣之分。另外一个有趣的发现是,RLHF和RLAIF的表现都显著优于仅通过监督指令微调训练的模型。

figure16
图注:摘自RLAIF论文的带标注示意图,https://arxiv.org/abs/2309.00267

这项研究的结果非常实用且意义重大,因为它基本上意味着我们或许可以让基于RLHF的训练更高效、更易实现。不过,这些RLAIF模型在聚焦安全性与信息内容真实性的定性研究中表现如何,还有待观察——人类偏好研究仅能部分体现这些维度。

结语

这些替代方案在实践中是否真的有价值,还有待时间检验——因为目前还没有能与Llama 2、Code Llama量级相当,且未经RLHF训练的模型能真正与之抗衡。

另外,如果你尝试过其中任何一种方法,或者偶然发现了其他有前景的方案,欢迎和我交流!

这本杂志是我的个人热情项目,不提供直接报酬。不过,如果您愿意支持我,可以考虑购买一本我在 https://sebastianraschka.com/books 上的书。如果您觉得这些书有洞察力、有帮助,也欢迎推荐给您的朋友和同事。

figure17

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

非常感谢您的支持!

【转载】遗漏的细节:Llama 2权重已发生变更

原文地址:The Missing Bits: Llama 2 Weights Have Changed,by Sebastian Raschka, on 2023-08-27

遗漏的细节:Llama 2权重已发生变更

由于《AI 前沿》第 11 期《新基础模型》的正文篇幅过长,我将几则与 Llama 2 权重相关的趣味技术细节从主通讯中剥离了出来。把这些内容作为小福利分享给《AI 前沿》的支持者们也很不错,再次感谢大家的热心支持!

在这篇精简文章中,我们将简要分析 Llama 2 的权重特性,以及以不同浮点精度格式托管权重带来的实际影响。

=== 以下为付费内容 ===

【转载】新型基础模型:CodeLlama 与开源 AI 的其他热点

原文地址:New Foundation Models: CodeLlama and other highlights in Open-Source AI,by Sebastian Raschka, on 2023-08-26

新型基础模型:CodeLlama 与开源 AI 的其他热点

在本期通讯中,我们将聚焦今年夏天最重磅的热点之一:Llama 2 基础模型与对话模型的发布,以及 CodeLlama——它们共同构成了开源 AI 大语言模型(LLM)领域的最新亮点。

此外,我们还将深入探讨遭泄露的 GPT-4 模型细节,分析其性能随时间的变化,并介绍当前主流 Transformer 架构大语言模型的新兴替代方案。

OpenAI 于本周发布了全新的微调 API,用于基于自定义数据集训练 GPT-3.5-turbo。这一新举措可能会进一步引发关于闭源专有 AI 系统与可本地部署的开源 AI 模型之间的讨论。

AI 领域仍在持续变革与演进,开源社区做出了巨大贡献,包括 Llama-Adapters、LoRA、QLoRA 等微调技术的发展。我尤其期待 NeurIPS 大语言模型效率挑战赛(NeurIPS LLM Efficiency Challenge)能带来更多创新。

预训练大语言模型

深入解读 Llama 2

我们直接进入正题,从今年夏天(我认为)最重磅的大语言模型发布——Llama 2 开始说起。Meta 的 Llama 2 是广受欢迎的 LLaMA 模型的官方继任者。初代 LLaMA 和 Llama 2 的发布都配套了非常详尽的研究论文,这点我非常赞赏:
https://arxiv.org/abs/2302.13971,Touvron 等人,2023年2月
https://arxiv.org/abs/2307.09288,Touvron 等人,2023年7月

和 LLaMA 一样,Llama 2 是一个模型系列,包含多个不同参数量的预训练大语言模型。那么,Llama 2 有哪些新特性、值得关注的点?我们来逐一讨论。

命名规则

首先说明命名问题。LLaMA 的全称是 Large Language Model Meta AI(Meta AI 大语言模型)。全大写的拼写打起来有点麻烦,不过好消息是,它的继任者官方名称就叫 “Llama 2”。所以如果本文里出现 LLaMA,指的是初代 LLaMA v1,而 Llama 2 就是我们本次重点介绍的新模型。

新特性一览

在深入讨论各个细节之前,先简要总结一下核心更新点:

  • Llama 2 的训练数据量比初代 LLaMA 多 40%。
  • 同时,Llama 2 支持的输入长度是初代的 2 倍。
  • 参数量更大的 34B 和 70B 模型在架构上有小幅改动,采用了多查询注意力,我们稍后会展开说明。
  • 另一大变化是,Llama 2 模型系列现在包含微调后的对话模型(通过有监督微调与基于人类反馈的强化学习实现),详见后文。
  • Llama 2 的协议现在允许商业使用。

figure01
标注版表格,出自 https://arxiv.org/abs/2307.09288

模型尺寸

LLaMA 有 7B、13B、33B、65B 四种参数量,Llama 2 则分为 7B、13B、34B*、70B 四个版本,不同尺寸在模型效果与计算开销之间提供了不同的权衡。不过,LLaMA 仅提供预训练基础模型,而 Llama 2 同时提供预训练基础模型微调对话模型。其中,基础模型指仅通过下一词预测预训练任务训练得到的模型;微调对话模型则是在指令数据集上通过有监督学习和基于人类反馈的强化学习(RLHF)微调而来,详见后文。

*(值得注意的是,Meta 只发布了 7B、13B 和 70B 版本,没有开放 34B 模型。)

开源协议

大部分读者在决定是否花时间深入了解 Llama 2 之前,可能都想先知道它的协议和使用限制。初代 LLaMA 在研究圈大获成功、广受赞誉,但也因其限制严格的协议受到一些批评。LLaMA 的推理代码是开源的,但模型权重仅逐案授予学术研究者,并非开源发布。简而言之,LLaMA 的协议允许用于研究但不允许商业使用;而现在的 https://github.com/facebookresearch/llama/blob/main/LICENSE 协议同时允许商业场景使用(详见 https://ai.meta.com/resources/models-and-libraries/llama-downloads/ )。不过,尽管 Llama 2 的协议对大多数使用场景来说都足够宽松,但它并不是严格意义上的开源协议;正如这篇文章所讨论的:https://www.google.com/url?q=https://blog.opensource.org/metas-llama-2-license-is-not-open-source/&sa=D&source=editors&ust=1692833158282053&usg=AOvVaw12tE3bEYV5jVbDiv6dE-jg 。就我个人而言,我认为 Llama 2 的使用条款非常合理,只是使用“开源”这个词可能会造成混淆,甚至有误导性。(但为了行文简洁,本文后续仍将 Llama 2 归入开源模型范畴。)

figure02
协议截图,来自 https://github.com/facebookresearch/llama/blob/main/LICENSE

Llama 2 基础模型性能

上一节说完了协议和使用限制,接下来进入最有意思的部分,也是大家最关心的问题:“Llama 2 到底有多强?”要公平回答这个问题,我们需要区分 Llama 2 基础模型和微调后的 Llama 2 对话模型。

我们先来说基础模型——它们属于解码器式大语言模型,仅通过传统的下一词预测预训练任务训练得到。

想了解更多解码器式与编码器式大语言模型的区别,可以看我之前的文章:
https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder
https://substack.com/profile/27393275-sebastian-raschka-phd
·
2023年6月17日
https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder
很多人让我再深入讲讲大语言模型的行业黑话,解释一些如今我们习以为常的技术术语,其中就包括“编码器式”和“解码器式”大语言模型。这些术语到底是什么意思?
https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder

简而言之,如下图中标注所示,Llama 2 基础模型的表现远超其他开源模型。

figure03
标注版表格,出自 https://arxiv.org/abs/2307.09288

不过,Llama 2 基础模型的性能不如主流闭源模型——但这也在情理之中,因为下表中的闭源模型 1)都经过了微调,2)参数量要大得多(GPT-3.5 有 1750 亿参数,而 Llama 2 最大只有 700 亿)。后面我们会拿微调后的 Llama 2 模型做更公平的对比。

figure04
标注版表格,出自 https://arxiv.org/abs/2307.09288

训练数据

长达 77 页的 Llama 2 论文细节非常详实,这点我很欣赏。但有意思的是,和初代 LLaMA 不同,这篇论文除了下面这句简短描述外,没有透露任何训练数据的细节:

更完善的数据清洗,更新了数据混合比例,总训练 token 量增加 40%

我们可以推测,原因可能是 1)保持对其他开源模型的竞争优势,或者 2)避免版权相关诉讼。

Business Insider 的这篇文章认为原因可能是后者:https://www.businessinsider.in/tech/news/llama-copyright-drama-meta-stops-disclosing-what-data-it-uses-to-train-the-companys-giant-ai-models/articleshow/101887460.cms

Llama 2 对话模型

Llama 2 模型系列的一大亮点是对话模型。这些对话模型以 Llama 2 基础模型为底座,经过了额外的指令微调,类似 InstructGPT 和 ChatGPT 的做法。

如下图中标注所示,Llama 2 对话模型的表现相比其他主流对话模型毫不逊色。

figure05
标注版图示,出自 https://arxiv.org/abs/2307.09288

微调分为多个阶段:首先是有监督指令微调,和 Alpaca(斯坦福研究者基于初代 LLaMA 微调的模型,后来也被大量开源大语言模型沿用)的做法一致;之后是基于人类反馈的强化学习(RLHF),类似 ChatGPT 的流程,如下图标注总结。

figure06
标注版图示,出自 https://arxiv.org/abs/2307.09288

有监督微调阶段重点使用了小批量的高质量数据,在数百万样本池中只选用了数千条样本。这种思路与这篇论文提出的“少即是多”理念一致:https://www.google.com/url?q=https://arxiv.org/abs/2305.11206&sa=D&source=editors&ust=1692833158286565&usg=AOvVaw2cZIpO1zw7yT7xRnrVyB4N ,我之前在本期通讯的另一篇文章里也聊过这个话题:
https://magazine.sebastianraschka.com/p/ahead-of-ai-9-llm-tuning-and-dataset

在初始有监督微调之后,模型还通过 RLHF 进一步优化。深入讨论 RLHF 超出了本文的范围,大家可以参考我之前的另一期通讯:
https://magazine.sebastianraschka.com/p/ahead-of-ai-6-train-differently

值得一提的是,InstructGPT 和 ChatGPT 在 RLHF 训练中使用了近端策略优化(PPO)算法。相比之下,Llama 2 的作者实验了两种不同的方法:https://arxiv.org/abs/2302.01318 以及带 PPO 的 RLHF。

作者还很好地展示了 Llama 2 70B 对话模型的迭代过程,追踪了从初始有监督微调(SFT-v1)到最终带 PPO 的 RLHF 微调阶段(RLHF-v5)的演进。如下图的标注图表所示,模型在无害性和有用性两个维度上都得到了持续提升。

figure07
标注版图示,出自 https://arxiv.org/abs/2307.09288

未来,看看 https://arxiv.org/abs/2305.18290 这种无需强化学习的替代方案和这些 RLHF 方法相比效果如何,会很有意思。我之前在这篇文章里介绍过它:https://magazine.sebastianraschka.com/p/ai-research-highlights-in-3-sentences-2a1

Llama 2 实现细节与趣闻

Llama 2 的论文内容非常详实,本期通讯不可能覆盖所有方面。不过下面我想再挑几个我觉得有意思的细节说说。

比如,34B 和 70B 参数的 Llama 模型使用了 https://arxiv.org/abs/2305.13245 提出的技术。GQA(分组查询注意力)可以看作是多查询注意力的更通用形式,而多查询注意力之前已经在 Falcon 等模型中应用过。

figure08
标注版图示,出自 https://arxiv.org/abs/2305.13245
https://www.google.com/url?q=https://arxiv.org/abs/2305.13245&sa=D&source=editors&ust=1692833158289904&usg=AOvVaw3BnurYvKcaeEiolaGvvHfi
https://www.google.com/url?q=https://arxiv.org/abs/2305.13245&sa=D&source=editors&ust=1692833158290062&usg=AOvVaw18yvNgUlVaEcw5RdctA974

这么做的动机大概率是在尽量不影响模型效果的前提下,降低计算开销。

我们还需要微调模型吗?

尽管 Llama 2 基础模型和对话模型表现都不错,但通过微调仍有提升空间。可以把 Llama 2 看作一个经过优化的基础模型,还可以针对更专业的任务做进一步微调。

为了说明微调的潜在收益,我们拿 BoolQ 基准测试举个例子。令人意外的是,在这个特定任务上,Llama 2 的表现甚至不如 DeBERTa-1.5B 这个仅编码器模型。这提醒我们,即便是 Llama 2 这样的强模型,在特定任务上也可能被更小的微调模型超越。

figure09

公平起见,DeBERTa-1.5B 模型(最初在 ICLR 2021 上提出)是在 BoolQ 的训练集上微调过的,而 Llama 2 是通过少样本提示来完成任务的。

虽然还没有相关实验,但经过微调的 Llama 2 模型在这个数据集上表现应该会更好——至少比 Llama 2 基础模型要好。

(而且正如 ICLR 2023 上 https://arxiv.org/abs/2111.09543 论文展示的,用一个仅 3 亿参数的小模型也能在这个任务上取得不错的效果。)

如何使用 Llama 2

如上所述,Llama 2 是性能极强的模型。但我们怎么在自己的项目里使用它呢?

Meta 在 https://github.com/facebookresearch/llama 维护了推理代码,可以用来加载 Llama 2 权重。

此外,Lit-GPT 现在也支持 Llama 了——这是一个开源仓库,支持大量大语言模型的预训练和微调。我最近也帮忙在 Lit-GPT 里实现了 QLoRA 支持,下面附上一些 Llama 2 的性能基准测试结果。

figure10
https://github.com/Lightning-AI/lit-gpt 结合 QLoRA 的 Llama 2 基准测试

另外还有 https://github.com/karpathy/llama2.c 这个 GitHub 仓库,用纯 C 语言实现了 Llama 2 的推理(不支持预训练和微调),适合那些只想运行模型、不需要微调的爱好者折腾。

Code Llama

Llama 2 已经很出色了,但编程任务并不是它的强项。比如 HumanEval 基准就是一个编程相关的测试基准,出自这篇论文:https://arxiv.org/abs/2107.03374

figure11
标注版图示,出自原始论文 https://arxiv.org/abs/2307.09288

两天前,https://ai.meta.com/research/publications/code-llama-open-foundation-models-for-code/ 发布了 Code Llama(7B、13B、34B 三个版本),采用和 Llama 2 相同的协议,是专门针对代码训练的模型。这些模型分为三个版本:通用代码模型(Code Llama)、指令跟随模型(Code Llama-instruct),以及专门针对 Python 代码的版本(Code Llama-Python)。注意,所有 Code Llama 模型都是先以 Llama 2 权重初始化,再进一步在代码数据上训练得到的。

34B 参数的 Code Llama 模型,编程能力大约是初代 70B Llama 2 模型的两倍,缩小了和(参数量大得多的)GPT-4 的差距。

figure12
标注版表格,出自 https://scontent-msp1-1.xx.fbcdn.net/v/t39.2365-6/369856151_1754812304950972_1159666448927483931_n.pdf?_nc_cat=107&ccb=1-7&_nc_sid=3c67a6&_nc_ohc=BnkB4kcpz5AAX-3fmqp&_nc_ht=scontent-msp1-1.xx&oh=00_AfD2-2sQbQ7TQLHKkTGpRDsI_kf55Y78wMgAj-u4r24RuA&oe=64ECB20F

为何没有 70B 参数的 Code Llama 模型?

有意思的是,Code Llama 只有 7B、13B、34B 参数版本;和 Llama 2 不同,没有 70B 版本。论文里没有给出解释,我猜测可能有两个原因:

  1. Code Llama 模型是在 Llama 2 权重基础上,额外训练了 5000 亿代码 token,而 Llama 2 模型的训练数据是 2 万亿 token。由于 Code Llama 的领域专属训练 token 量只有前者的 1/4,根据 https://arxiv.org/abs/2001.08361 的结论——训练数据不足的话,70B 版本的 Code Llama 可能效果不够好。
  2. Code Llama 模型支持 10 万 token 的上下文,这在处理代码时非常实用。相比之下,Llama 2 最多只支持 4096 个 token 输入。如果 70B 模型要支持 10 万 token 输入,计算量可能会大到不切实际(或者说在常规硬件集群上不合理)。

GPT-4 模型细节遭泄露

把话题从开源模型转到闭源模型,上个月 GPT-4 方面也有几个有意思的消息。比如,Reddit 上泄露了 GPT-4 的模型参数:https://www.reddit.com/r/LocalLLaMA/comments/14wbmio/gpt4_details_leaked/

GPT-4 是一个参数量约 1.8 万亿的语言模型,共 120 层,规模是 GPT-3 的 10 倍。它采用混合专家(MoE)模型架构,包含 16 个专家,每个专家约 110 亿参数。采用 MoE 架构可以提升推理时的资源利用效率,仅需约 2800 亿参数、560 TFLOPs 的算力,而纯稠密模型则需要 1.8 万亿参数、3700 TFLOPs。

该模型在约 13 万亿 token 上训练,数据来源广泛,包括互联网数据、书籍、研究论文等。为了降低训练成本,OpenAI 采用了张量并行和流水线并行,以及 6000 万的大批次大小。据估计,GPT-4 的训练成本约为 6300 万美元。

来源:https://www.reddit.com/r/LocalLLaMA/comments/14wbmio/gpt4_details_leaked/

尤其值得关注的是,GPT-4 显然采用了混合专家(MoE)方案,这点非常重要。MoE 的核心思想是通过组合多个专门的子模型(即“专家”)的预测或决策,来提升系统的整体性能。

所以,如果我们想进一步优化 Llama 2 这类模型,大幅超越类似 GPT-4 的产品,可能不仅要把模型规模扩展到相近水平(这种情况下要做到参数量相当,需要扩大 25 倍),还要考虑采用 MoE 架构。

GPT-4 的性能在变差吗?

我们经常看到一种说法,称 OpenAI 为了节省计算时间和成本,一直在降低 ChatGPT 的性能。在最近的 https://arxiv.org/abs/2307.09009 论文中,研究者有一个有趣的发现:GPT-4 的模型表现确实似乎随时间推移在变差。这是因为为了节省成本采用了蒸馏方法,还是为了防止滥用加了安全护栏?(顺便说一句,看到研究精力被用来研究这些变化,还挺有意思的,其实这些问题问一下参与模型开发的研究员和工程师就能得到答案。)

figure13
标注版图示,出自 https://arxiv.org/abs/2307.09009

作为补充,我强烈推荐阅读 Substack 上的这篇文章:https://www.aisnakeoil.com/p/is-gpt-4-getting-worse-over-time ,作者是 https://open.substack.com/users/891603-sayash-kapoor?utm_source=mentionshttps://open.substack.com/users/19265909-arvind-narayanan?utm_source=mentions ,文章指出了上述研究论文的几个重要缺陷。比如:

真正发生变化的是,3 月版的 GPT-4 几乎总会猜测数字是质数,而 6 月版几乎总会猜测是合数。作者只测试了质数,就把这解读为性能大幅下降。而 GPT-3.5 的情况正好相反。

所以,“GPT-4 性能随时间变差”这个说法未必成立。不过,它的行为模式确实在发生变化。

实际使用中,使用 API 的最大好处之一是我们不用关心模型的部署和服务。但如果我们在 API 之上构建服务,这也成了最大的缺点。诚然,性能提升通常是好事,但模型行为的不透明变更,可能会让你之前所有正常运行的查询第二天就失效了。你在闭源 API 之上构建的东西越多,这个问题就越棘手。

ChatGPT 微调即服务

上周三,https://openai.com/blog/gpt-3-5-turbo-fine-tuning-and-api-updates 发布了 GPT-3.5-turbo 的微调 API。对于想要基于自定义数据微调大语言模型的人来说,这是个非常有意思的消息。

看看它和开源方案相比表现如何会很有趣——毕竟最新最前沿的微调技术(Llama-Adapters、LoRA、QLoRA 等)都诞生于开源社区。

而且,我们上面讨论的最新开源模型 Llama 2,和 ChatGPT / GPT-3.5 相比表现也毫不逊色,如下图所示。

figure14
标注版图示,出自 https://arxiv.org/abs/2307.09288

从 OpenAI 的文档和宣传材料来看,这项服务似乎不只是改变大语言模型回复的风格或语气。相反,OpenAI 提供的是一套完整的指令微调服务。

不过,这也意味着,要让模型完全适配医疗、金融、法律等新的专业领域,大概率还是做不到。因为新知识通常是通过预训练注入的,而不是微调;开源模型也是如此。

figure15
节选自 https://platform.openai.com/docs/guides/fine-tuning/when-to-use-fine-tuning

虽然 OpenAI 没有说明他们会使用哪种微调方法,但采用低秩适配(LoRA)作为微调技术会是很合理的选择。我认为这会是最简单、性价比最高的方案,因为他们不用为每个客户都存储一个全新的 1750 亿参数大语言模型。使用 LoRA 的话,可以共用同一个基础大语言模型,只需要存储 LoRA 权重即可。

大语言模型的扩展与 Transformer 架构的替代方案

开放的研究挑战之一,是如何将大语言模型扩展到更长的输入上下文。近期的方法包括:

  1. https://arxiv.org/abs/2304.11062#:~:text=This%20technical%20report%20presents%20the,models%20in%20natural%20language%20processing. ;
  2. https://arxiv.org/abs/2306.15794
  3. https://arxiv.org/abs/2307.02486

尽管长上下文大语言模型有不少应用场景,比如针对长文档输入提问,但大家都回避了一个核心问题:大语言模型对这些长上下文的利用效率到底怎么样?

最新研究(https://arxiv.org/abs//2307.03172)表明,大语言模型擅长检索文档开头的信息,但如果信息在文档中间,检索效果就会差很多。

figure16
标注版图示,出自 https://arxiv.org/abs//2307.03172

这篇论文的分析主要针对 ChatGPT(如图所示)和 Claude。当然,未来如果能纳入其他模型(比如 Hyena、LongNet 等)会更有意思。

不过这已经很能说明问题了!

  1. 我反而觉得,比如基于 RNN 的大语言模型(像 https://www.google.com/url?q=https://arxiv.org/abs/2305.13048&sa=D&source=editors&ust=1692833158299736&usg=AOvVaw2h6bCGXGmMWf0X9Af5mXGh )表现会相反——因为它是顺序处理信息的,反而可能会忘记早期的信息。
  2. 据我所知,基于 Transformer 的大语言模型架构里,没有特定的归纳偏置能解释为什么文档中间的文本检索效果会更差。我猜测这完全是因为训练数据和人类的写作习惯:最重要的信息通常在开头或结尾(想想论文的摘要和结论部分),大语言模型在训练时就是这样学习注意力权重的分配的。

更多 Transformer 替代方案

上一段我提到了几个 Transformer 架构大语言模型的替代方案,比如基于循环神经网络的 https://arxiv.org/abs/2305.13048 大语言模型,以及基于卷积的 https://arxiv.org/abs/2306.15794

最新的 Transformer 替代方案是保留网络(Retentive Network,简称 RetNet),上个月的一篇论文提出了这个架构,标题很有冲击力:https://arxiv.org/abs/2307.08621

这篇论文提出了另一种大语言 Transformer 的替代方案,它的计算复杂度随输入序列长度呈线性增长,而非二次增长。RetNet 可以用并行模式训练,再切换为循环模式来扩展上下文长度,且不会增加内存开销,同时保持良好的推理性能。目前最大的模型是 67 亿参数,未来看看 RetNet 和 Llama-2 70B 等模型的对比研究结果会很有意思。

figure17

它会成为被广泛采用的 Transformer 替代方案吗?初期热度过后,目前似乎还没有其他项目采用这个架构,不过时间会给出答案。

什么是“前沿 AI 模型”?

AI 社区特别喜欢造新词!

很长一段时间里,我都很抵触用“基础模型”这个词。我觉得完全没必要发明一个新说法来描述预训练大语言模型或者预训练视觉 Transformer。

最初,很多人觉得那篇发明“基础模型”一词的论文,本质上是学术界用来刷引用的手段(从 https://arxiv.org/abs/2108.07258 这篇论文就能看出来,截至目前已经被引用 1372 次)。但尽管早期有诸多批评,这个词最近几年还是开始被更广泛地接受。顺应这个趋势,我也开始把“基础模型”纳入我的词汇表。

上个月,来自 https://www.governance.ai/post/frontier-ai-regulation 的作者们(合著者包括 Google DeepMind、OpenAI 和微软的研究人员)发表了一篇新论文 https://arxiv.org/abs/2307.03718 ,在基础模型之上又提出了一个新概念——“前沿 AI 模型”:

我们将“前沿 AI 模型”定义为具备高度能力、可能展现出危险特性的基础模型。

我们正身处一个有趣的时代。

硬件观察

尽管(或者说正因为)近期大语言模型进展飞速,GPU 短缺的问题一直存在,尤其是 NVIDIA 的 H100 芯片。正如 VentureBeat 最近报道的:https://venturebeat.com/ai/nvidia-gpu-shortage-is-top-gossip-of-silicon-valley/

就在所有人都在争抢 H100 的时候,NVIDIA 也发布了下一代 GPU:https://www.cnbc.com/2023/08/08/nvidia-reveals-new-ai-chip-says-cost-of-running-large-language-models-will-drop-significantly-.html ,它将配备 141GB 显存(而 H100 只有 80GB)——这或许是用硬件暴力破解大语言模型长上下文问题的另一种方式。

figure18
机器学习趣味梗图

大语言模型与版权法

关于大语言模型和生成式 AI 的版权问题,目前现状如何?2023 年已经过去 8 个月,这个问题似乎仍没有明确答案。下面我根据自己的了解,整理了几篇相关文章。如果你有更多见解或资源,欢迎补充!注意:我不是律师,无法对任何法律问题发表评论。同时,正因为我不是律师,以下信息不应被视为法律建议。

https://en.wikipedia.org/wiki/Wikipedia:Large_language_models_and_copyright#:~:text=3%20Notes-,Does%20LLM%20output%20inherently%20violate%20copyright%20law%3F,works%20created%20by%20non%2Dhumans. 中提到:“利用受版权保护的材料训练大语言模型的版权归属问题,目前尚无定论。”

在这个背景下,《大西洋月刊》最近的一篇报道和研究值得关注:https://www.theatlantic.com/technology/archive/2023/08/books3-ai-meta-llama-pirated-books/675063/

这篇文章谈到了多位作者对 Meta 提起的法律诉讼,指控该公司在训练 https://arxiv.org/abs/2302.13971 时使用了他们的版权作品。诉讼的起因是训练数据中包含了 The Pile 数据集(https://arxiv.org/abs/2101.0027 )的 Books3 部分,涵盖了多达 17 万本书。值得注意的是,EleutherAI 的 GPT-J(https://arankomatsuzaki.wordpress.com/2021/06/04/gpt-j/ ,一款类似 GPT-3 的模型)和彭博的金融领域语言模型 BloombergGPT(https://arxiv.org/abs/2303.17564 ,我在《Ahead of AI》第三期里详细介绍过)也使用了同一个数据集。

此外,https://www.npr.org/2023/08/16/1194202562/new-york-times-considers-legal-action-against-openai-as-copyright-tensions-swirl 报道称,《纽约时报》正准备起诉 OpenAI,因为该报担心 ChatGPT 基于其团队的原创报道和写作生成回答,会成为自己的直接竞争对手。

法律就是法律,开发者应当与内容创作者合作,避免违反版权法。此外,如果能有更新的法律指引,明确规范大语言模型的使用,会很有帮助。在起草政策或修订法律时,可以考虑“合理使用”的场景。换句话说,区分用于商业目的的大语言模型(比如 ChatGPT)和仅用于研究目的、协议禁止商业应用的大语言模型(比如 Meta 的 LLaMA),或许会有帮助。

什么是“合理使用”?根据 https://en.wikipedia.org/wiki/Fair_use ,在美国,版权法中的“合理使用”原则允许在未经授权的情况下使用受版权保护的材料,前提是使用方式构成对作品的实质性转化,且不会损害版权所有者的利益。不过,合理使用原则是否适用于机器学习模型的训练,目前仍没有定论。

其他国家在 AI 训练使用版权材料方面是怎么做的?

https://petapixel.com/2023/06/05/japan-declares-ai-training-data-fair-game-and-will-not-enforce-copyright/ 报道称,日本宣布允许生成式 AI 使用任何数据进行训练,并且不会对生成式 AI 模型的训练执行版权限制。

欧盟的《人工智能法案》要求企业公开训练中使用的所有受版权保护的作品,据 Lexology报道。不过这篇文章没有明确说明如果违反版权会有什么后果。

总的来说,很多规则仍在制定和修订中。我希望最终的规则无论是什么,都能清晰明确,让 AI 研究者和从业者可以据此调整和行动。

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

figure19

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

非常感谢您的支持!

【转载】Llama 2、Flash-Attention 2 及更多前沿研究

原文地址:Llama 2, Flash-Attention 2, and More,by Sebastian Raschka, on 2023-08-13

Llama 2、Flash-Attention 2 及更多前沿研究

大语言模型(LLM)领域的研究每月都精彩纷呈。而本月尤其值得关注,因为Meta发布了Llama 2系列全新的前沿基础模型。双重惊喜:这一代Llama模型不仅没有严苛的使用限制,还在arXiv上配套发布了一份长达77页的详尽研究报告!

我仍在整理研读这份77页报告后的笔记与思考,将在本通讯的下一期正刊中呈现——敬请期待!在此之前,我想先在本月的「研究亮点」栏目中分享其中的核心结论,以及其他诸多值得关注的研究工作,内容如下。

大语言模型

Llama 2:开源基础模型与经过微调的对话模型

(7月19日,https://arxiv.org/abs/2307.09288

研究人员发布了Llama 2模型系列——Meta旗下热门LLaMA模型的继任者,配套发布了一份长达77页的深度研究报告。除了参数规模从70亿到700亿不等的Llama 2基础模型外,团队还推出了Llama 2-Chat模型,该模型采用类似InstructGPT和ChatGPT的训练方式,通过人类反馈强化学习(RLHF)训练而成。与前代模型相比,Llama 2的授权协议限制更少,现已允许商业使用(仍有部分限制条款)。

figure01

FlashAttention-2:通过更优的并行性与任务划分实现更快的注意力计算

(7月17日,https://arxiv.org/abs/2307.08691

FlashAttention-2是热门算法FlashAttention的升级版本,它是一种经过优化的多头自注意力实现方案,既能节省显存,又能提升运行速度(相比PyTorch基准实现提速2-4倍)。值得重点强调的是,它可以直接替换原有注意力模块,完全不会改变或影响模型效果,使用体验极佳。本次更新的核心贡献在于:实现了每个注意力头内部的计算并行化,并通过共享内存分配计算任务,从而降低通信开销。

figure02

Retentive Network:面向大语言模型的Transformer替代架构

(7月17日,https://arxiv.org/abs/2307.08621

该论文提出了一种大型语言Transformer的替代架构,其计算复杂度随输入序列长度呈线性增长,而非原有的二次增长。RetentionNet既可以并行模式训练,也可以切换为循环模式扩展上下文长度,且不会增加显存开销,从而实现出色的推理性能。该研究中最大的模型参数量为67亿,未来若能将RetNet与Llama-2 70B等模型进行对比研究,将会很有价值。

figure03

AlpaGasus:用更少数据训练更优的Alpaca模型

(7月17日,https://arxiv.org/abs/2307.08701

https://www.google.com/url?q=https://arxiv.org/abs/2305.11206&sa=D&source=editors&ust=1691861529907508&usg=AOvVaw3U_MnstTWlV2Y-6Qy3jNGo 之后,这篇论文同样得出了一个有意思的结论:对大语言模型进行微调时,数据并非越多越好。研究人员利用ChatGPT识别低质量的指令-响应对,发现原本包含5.2万条数据的Alpaca数据集可以精简至9000条,用精简后的数据训练70亿和130亿参数的(LLaMA)大语言模型,效果反而更优。

figure04

以不同方式堆叠更多层:通过低秩更新实现高秩训练

(7月11日,https://arxiv.org/abs/2307.05695

低秩适配(LoRA)是目前最主流的参数高效大语言模型微调方法之一——我曾在这篇文章中做过更详细的介绍:https://www.google.com/url?q=https://sebastianraschka.com/blog/2023/llm-finetuning-lora.html&sa=D&source=editors&ust=1691861529908424&usg=AOvVaw2uYPLave58JhiHo_uOsAxW 。在这篇论文中,研究人员探索了LoRA能否以参数高效的方式用于大语言模型的预训练(而非微调),并提出了名为ReLoRA的方法。尽管研究人员仅对最高3.5亿参数的模型进行了预训练(作为对比,最小的Llama模型参数量为70亿),但该方法展现出了不错的发展前景。

figure05

多语言大语言模型用英文思考时表现更好吗?

(8月2日,https://arxiv.org/abs/2308.01223

假设用户想在非英文输入场景下使用LLaMA这类模型,通常有三种选择:

  1. 直接用非英文语言给模型输入提示词。
  2. 先用外部翻译系统将提示词翻译成英文,再输入模型。
  3. 让大语言模型自行先将提示词翻译成英文(本文提出的方法)。

论文中作者发现,对于https://arxiv.org/abs/2112.10668https://arxiv.org/abs/2302.13971 这类模型,采用第三种方法(先翻译提示词)的效果,要优于第一种直接用原语言输入提示词的效果。

figure06

ChatGPT的行为随时间发生了怎样的变化?

(7月18日,https://arxiv.org/abs/2307.09009

这篇论文中,研究人员观察到一个有趣的现象:GPT-4的模型表现似乎随时间推移有所下滑。这究竟是为了节约成本采用了蒸馏方法,还是为了防范各类滥用行为加装了安全护栏?有意思的是,已有不少研究开始关注这些变化,但其实这些问题,只要是参与过模型开发的研究人员和工程师,大概率都能给出答案。

figure07

Skill-it!:一个用于理解与训练语言模型的数据驱动技能框架

(7月26日,https://arxiv.org/abs/2307.14430

研究人员提出了一种提升大语言模型训练效率的新方法,核心是一种在线采样算法。乍一看,它和课程学习有些类似,目标都是在训练过程中筛选训练数据。但二者的区别在于,该方法是按照「技能」来筛选训练数据,而非按照样本的难易程度筛选。

figure08

用于大语言模型上下文压缩的上下文内自编码器

(7月13日,https://arxiv.org/abs/2307.06945

该方法提出使用一个上下文内自编码器模型(编码器)来压缩目标大语言模型(解码器)的输入(上下文)。这个自编码器本身是一个经过低秩适配(LoRA)训练的大语言模型:先在大规模无标注语料上完成预训练,再在规模更小的指令数据集上进行微调。借助这个辅助自编码器大语言模型,作者实现了4倍的上下文压缩率。

figure09

无训练则无收益:重新审视基于Transformer的语言模型高效训练算法

(7月12日,https://arxiv.org/abs/2307.06440

论文中,作者评估了三类Transformer高效训练方法:

  • 动态架构(层堆叠、层丢弃)
  • 批次选择(选择性反向传播、RHO损失)
  • 高效优化器(Lion、Sophia)

和我个人有限的实际经验大致相符,这类方法相比常规训练(基准方法)带来的收益微乎其微。需要注意的是,该论文仅聚焦于编码器型和编码器-解码器型大语言模型(BERT、T5),并未研究LoRA、适配器这类参数高效微调方法。

figure10

计算机视觉与多模态模型

内容还是风格:你的图像嵌入到底学到了什么?

(7月10日,https://arxiv.org/abs/2307.05610

所谓的探测方法,是指用小型模型作用于文本嵌入,以此分析大语言模型(参见https://arxiv.org/abs/2102.12452)和卷积神经网络的表征特性。在这项研究中,作者将探测技术应用于基于Transformer的视觉模型。有意思的是,预训练任务的类型(监督、对比学习、掩码学习等)决定了嵌入中所包含的非语义信息的类型。

figure11

OpenFlamingo:训练大型自回归视觉-语言模型的开源框架

(8月2日,https://arxiv.org/abs/2308.01390

OpenFlamingo是DeepMind旗下Flamingo模型的开源复现版本,Flamingo是一系列自回归视觉-语言模型。这篇论文是一份详尽的技术报告,介绍了复现Flamingo模型的完整训练流程,复现模型的平均表现达到了原Flamingo模型的80%-89%。

figure12

从稀疏混合专家到软混合专家

(8月2日,https://arxiv.org/abs/2308.00951

稀疏混合专家(MoE)模型的思路是:让不同专家在数据子集上针对不同任务训练,再通过输入路由机制将结果整合。在这项研究中,研究人员提出了一种完全可微的稀疏视觉Transformer(ViT),解决了训练不稳定、令牌丢弃、微调效率低等诸多问题。最终得到的模型,推理成本仅为标准ViT的十分之一,同时模型效果与标准ViT持平。

figure13

Meta-Transformer:多模态学习的统一框架

(7月20日,https://arxiv.org/abs/2307.10802

和几年前的https://arxiv.org/abs/2305.05665https://arxiv.org/abs/2103.03206 等研究思路相似,这个Transformer可以处理图像、文本、音频等多种模态。该架构中,每种输入模态都由独立的可学习数据预处理器处理;将输入预处理到共享令牌空间后,再通过一个共享编码器生成嵌入表示。

figure14

本通讯是个人出于热爱运营的项目,没有直接的商业收入。如果您愿意支持我,可以考虑购买我的书籍: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

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

【转载】大语言模型与近邻算法

原文地址:Large Language Models and Nearest Neighbors, and More,by Sebastian Raschka, on 2023-07-30

大语言模型与近邻算法

我没有跟风本周最新的技术潮流,而是想深入探讨近邻算法在大语言模型(LLM)领域一项近期且极具吸引力的应用,该应用在今年7月引发了广泛关注。

大家可能知道我偏爱简洁优雅的基准方法,但考虑到当前绝大多数研究都围绕着对本已体量庞大的大语言模型进行扩容,我觉得这个方法让人耳目一新。尽管近邻算法这类看似简单的方法,或许无法适配当前大语言模型所擅长的各类问题,但它们自有其独特的价值。这也说明,基于基础或者说“经典”的技术进行创新、做出重要贡献的机会依然大量存在。

近邻算法概览

近邻方法是数据挖掘、模式识别与机器学习领域的基础方法之一,可应用于分类、回归任务,以及推荐系统、异常检测等诸多场景。

近邻方法最基础的形式是k近邻(kNN)算法。对新样本进行分类时,kNN算法会在训练数据中找出与该样本距离最近的k个点——k是由用户选定的超参数。随后,算法会根据这k个近邻的多数投票结果对新样本进行分类:如果近邻中的多数属于某个类别,就将新样本划归为该类别,如下图所示。

figure01

k=5时的k近邻分类器示意图

值得注意的是,该算法无需训练过程,因为每次对新数据点分类时,我们只需要在训练集中找出k个最近邻即可。(缺点是每次预测都需要遍历整个训练集,当训练集规模较大时,计算成本会很高。)

要理解下面这篇论文,了解上述kNN的基础知识基本就足够了。不过如果大家想了解更多细节,我在本文末尾补充了相关信息与拓展资料,其中包括提升kNN计算效率的方法。

《低资源场景下的文本分类:一种基于压缩器的无参数分类方法》

几周前,这篇论文(https://aclanthology.org/2023.findings-acl.426/)在ACL 2023(https://2023.aclweb.org/)上引发热议时,我就在自己的社交渠道聊过相关内容——当时我正在参加SciPy 2023会议(https://www.scipy2023.scipy.org/),这篇论文也成了好几次晚宴上的讨论话题。

不过我没有把它收录进上一期的《三句话讲AI研究亮点》(https://magazine.sebastianraschka.com/p/ai-research-highlights-in-3-sentences-738),因为严格来说,这篇工作是基于2022年12月发布在arXiv上的论文(https://arxiv.org/abs/2212.0941),而那篇论文可能是更早的会议投稿版本。

闲话不多说,我们来深入看看这篇ACL论文(https://aclanthology.org/2023.findings-acl.426/)到底讲了什么。

基于gzip的文本分类

简而言之,这篇《低资源文本分类》论文提出使用gzip压缩格式与工具(https://en.wikipedia.org/wiki/Gzip)结合kNN算法来完成文本分类任务。下方带注释的图中的Python代码总结了该方法的流程:

figure02

摘自论文(https://aclanthology.org/2023.findings-acl.426/)的注释图,展示kNN+gzip方法

其中,ncd全称为归一化压缩距离(Normalized Compression Distance),是一种基于两个字符串压缩后的长度来衡量字符串间相似度的指标。计算方式是分别压缩两个独立字符串,再压缩二者拼接后的字符串,通过对比压缩后的长度得到一个分值,范围从0(字符串完全相同)到1(字符串完全不相似)。(下一节会逐步讲解其计算过程。)

出人意料的是,该方法的竞争力很强,在多个数据集上的分类性能几乎和BERT(一种编码器架构的大语言模型,相关讨论见https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder )不相上下,如下表所示。

figure03

摘自论文(https://aclanthology.org/2023.findings-acl.426/)的注释图,展示在各文本分类数据集上的性能

而在分布外(OOD)分类与少样本场景下,这种gzip方法的表现超过了BERT以及其他所有方法,如下图所示。(这里的分布外指的是,用于BERT微调与分类的数据集所使用的语言,是BERT预训练阶段从未见过的。)

figure04

摘自论文(https://aclanthology.org/2023.findings-acl.426/)的注释图,展示在分布外数据集上的性能

注意,由于代码存在一处问题,这些数值略有偏高,我们后面会谈到这一点。首先,我们先来讲解这个方法的基本原理。

Gzip方法的工作原理是什么?

从宏观层面来看,这种gzip方法利用了压缩算法会去除冗余信息的特性。

举例来说,如果文本1和文本2内容相似,那么文本1单独压缩后的大小,与文本1和文本2拼接后压缩的大小会非常接近。再举一个更极端的例子:一段文本和自身拼接后压缩的大小,和原文本压缩后的大小相近(只会多出用于反向引用的少量固定开销)。

听起来有点复杂?我们用实际的Python代码一步步演示。假设我们有如下两段文本:

txt_1 = "hello world"
txt_2 = "some text some text some text"

我们用gzip对它们进行压缩,然后输出压缩后字符串的长度:

>>> import gzip
>>> len(gzip.compress(txt_1.encode()))
31
>>> len(gzip.compress(txt_2.encode()))
33

可以看到,尽管第二段原文本的长度远长于第一段,但二者压缩后的大小却差不多。这是因为压缩算法利用了txt_2中存在重复内容的特点。

现在我们把文本1和文本2拼接起来,看看压缩后的结果如何:

>>> len(gzip.compress(" ".join([txt_1, txt_2]).encode()))
43

可以看到,拼接后的文本压缩后的长度明显比两个独立文本各自压缩后的长度都要长,这符合预期,因为两段文本内容差异很大。

相反,如果把每段文本和自身拼接,压缩后的长度和原文本压缩后的长度几乎没有差别:

>>> len(gzip.compress(" ".join([txt_1, txt_1]).encode()))
34 
>>> len(gzip.compress(" ".join([txt_2, txt_2]).encode()))
33

注意,文本和自身拼接是一种极端情况。该方法的核心思想是:一段文本和相似文本拼接后压缩的长度,会比它和不同文本拼接后压缩的长度更接近原文本单独压缩的长度,下图总结了这一原理:

figure05

gzip方法的原理示意图

复现Gzip方法

论文作者分享了一个实现论文实验的代码仓库(https://github.com/bazingagin/npc_gzip)。不过在本节中,我们将根据论文中的描述自己复现该方法,并将其应用于斯坦福情感分类数据集(https://ai.stanford.edu/~amaas/data/sentiment/),该数据集并未出现在原论文的研究中。

代码仓库

我把下面所有实验的代码都放在了这个仓库中:https://github.com/rasbt/nn_plus_gzip

按照我下面的划分方式,IMDB电影评论数据集包含35000条训练样本和10000条测试样本:

import pandas as pd
from local_dataset_utilities import download_dataset, load_dataset_into_to_dataframe, partition_dataset

df_train = pd.read_csv("train.csv")
df_val = pd.read_csv("val.csv")
df_test = pd.read_csv("test.csv")

(local_dataset_utilities工具代码可在此处查看:https://github.com/rasbt/nn_plus_gzip/blob/main/local_dataset_utilities.py

该二分类任务(预测电影评论是正面还是负面)的基准准确率(始终预测多数类)为50.06%,因为数据集的类别是均衡的:

>>> bcnt = np.bincount(df_test["label"].values)
>>> print(bcnt)
array([5006, 4994]) 
>>> print("Baseline accuracy:", np.max(bcnt)/ bcnt.sum())
Baseline accuracy: 0.5006

现在,基于论文中的Python代码(再次展示如下),

figure016

摘自论文(https://aclanthology.org/2023.findings-acl.426/)的注释图,展示kNN+gzip方法

我们可以这样实现gzip方法:

import gzip
import numpy as np
from tqdm import tqdm

k = 2
predicted_classes = []

for row_test in tqdm(df_test.iterrows(), total=df_test.shape[0]):
    test_text = row_test[1]["text"]
    test_label = row_test[1]["label"]
    c_test_text = len(gzip.compress(test_text.encode()))
    distance_from_test_instance = []
        
    for row_train in df_train.iterrows():
        train_text = row_train[1]["text"]
        train_label = row_train[1]["label"]
        c_train_text = len(gzip.compress(train_text.encode()))
            
        train_plus_test = " ".join([test_text, train_text])
        c_train_plus_test = len(gzip.compress(train_plus_test.encode()))
            
        ncd = ( (c_train_plus_test - min(c_train_text, c_test_text))
                / max(c_test_text, c_train_text) )
        distance_from_test_instance.append(ncd)
        
    sorted_idx = np.argsort(np.array(distance_from_test_instance))
        
    top_k_class = list(df_train.iloc[sorted_idx[:k]]["label"].values)
    predicted_class = max(set(top_k_class), key=top_k_class.count)
    predicted_classes.append(predicted_class)

print("Accuracy:", np.mean(np.array(predicted_classes) == df_test["label"].values))

这段代码运行了大约一天,最终准确率为70.05%(文件路径:file:///Users/sebastian/CloudDrive/project-data/write__nn-gzip/1_1_nn_plus_gzip_original.ipynb )。注意我们设置k=2,并且没有对数据进行预处理,这两个设置都和原论文作者在所有实验中使用的一致。

修正平局打破机制

实际使用k=2时会有一个小问题:比如当两个最近邻的标签是[0, 1]或者[1, 0]时,该如何打破平局?

按照论文提供的代码,出现平局时算法总会选择索引更小的类别标签。换句话说,该方法对类别标签0存在偏向:

>>> top_k_class = [0, 1]
>>> max(set(top_k_class), key=top_k_class.count))
0
​
>>> top_k_class = [1, 0]
>>> max(set(top_k_class), key=top_k_class.count)
0
​
>>> top_k_class = [1, 0, 2]
>>> max(set(top_k_class), key=top_k_class.count)
0

更合理的平局打破方式,是永远选择距离更近的那个近邻。我们可以用Counter对象实现这一点,如下所示。这里假设标签已经按照与待分类样本的近邻距离从小到大排序。

>>> from collections import Counter
>>> top_k_class = [0, 1]
>>> Counter(top_k_class).most_common()[0][0]
0
​
>>> top_k_class = [1, 0]
>>> Counter(top_k_class).most_common()[0][0]
1
​
>>> top_k_class = [1, 2, 0]
>>> Counter(top_k_class).most_common()[0][0]
1

使用这种改进的平局打破机制,我们可以将代码更新如下:

from tqdm import tqdm
from collections import Counter
​
k = 2
​
predicted_classes = []
​
for row_test in tqdm(df_test.iterrows(), total=df_test.shape[0]):
    test_text = row_test[1]["text"]
    test_label = row_test[1]["label"]
    c_test_text = len(gzip.compress(test_text.encode()))
    distance_from_test_instance = []
    
    for row_train in df_train.iterrows():
        train_text = row_train[1]["text"]
        train_label = row_train[1]["label"]
        c_train_text = len(gzip.compress(train_text.encode()))
        
        train_plus_test = " ".join([test_text, train_text])
        c_train_plus_test = len(gzip.compress(train_plus_test.encode()))
        
        ncd = ( (c_train_plus_test - min(c_train_text, c_test_text))
                / max(c_test_text, c_train_text) )
        distance_from_test_instance.append(ncd)
        
    sorted_idx = np.argsort(np.array(distance_from_test_instance))
    top_k_class = np.array(df_train["label"])[sorted_idx[:k]]
    predicted_class = Counter(top_k_class).most_common()[0][0]
    
    predicted_classes.append(predicted_class)
    
print("Accuracy:", np.mean(np.array(predicted_classes) == df_test["label"].values))

这一改动将准确率从70.05%(文件路径:file:///Users/sebastian/CloudDrive/project-data/write__nn-gzip/1_1_nn_plus_gzip_original.ipynb )提升到了71.91%(https://github.com/rasbt/nn_plus_gzip/blob/main/1_2_nn_plus_gzip_fix-tie-breaking.ipynb )。

注:我还实现了一个更高效的版本(https://github.com/rasbt/nn_plus_gzip/blob/main/1_2_caching-multiprocessing.py ),通过缓存训练样本的压缩结果,并在不同CPU核心上并行执行搜索。在MacBook Air上,该版本将IMDB电影评论数据集上的运行时间从12小时缩短到了2小时。

与其他方法的对比

我选择IMDB电影评论数据集做实验,是因为我之前在其他项目中对它比较熟悉。比如,我的《机器学习:基于PyTorch与Scikit-Learn》一书中有这些结果:

使用我的深度学习基础课程(https://lightning.ai/courses/deep-learning-fundamentals/)中的代码(https://github.com/Lightning-AI/dl-fundamentals/blob/main/unit08-large-language-models/8.7-distilbert-finetuning/part3_distilbert-finetuning-whole.ipynb ),甚至有人用RoBERTa-large达到了96.12%的准确率(https://github.com/Lightning-AI/dl-fundamentals/discussions/41

figure07

来自我的深度学习基础课程的基准实现(课程地址:https://lightning.ai/courses/deep-learning-fundamentals/unit-8.0-natural-language-processing-and-large-language-models/8.7-a-large-language-model-for-classification/

计数向量与余弦相似度

另一个有意思的基准方法,是用kNN从词袋模型中选取相似的词计数向量。(如果大家想了解词袋模型,可以看我的课程:https://lightning.ai/courses/deep-learning-fundamentals/unit-8.0-natural-language-processing-and-large-language-models/8.1-working-with-text-data/ )该方法的原理是:两段相似的文本应该具有相似的计数向量。因此,我们可以不用对比文本压缩后的长度与拼接文本压缩后的长度,而是使用词计数向量。

如果我们有文本1和文本2的词计数向量,当文本相似时,二者相加后的计数向量也会和原向量相似。例如,假设两段完全相同的文本的计数向量如下:

text_1 = [0, 3, 1]
text_2 = [0, 3, 1]

那么,相加后的计数向量就是 [0, 3, 1] + [0, 3, 1] = [0, 6, 2] = 2 × [0, 3, 1]。因此,如果我们对相加前后的计数向量分别做归一化,结果会完全一致:

import numpy as np
​
>>> text_1 = np.array([0., 3., 1.])
>>> text_2 = np.array([0., 3., 1.])
​
>>> text_1 /= np.sum(text_1)
>>> print(text_1)
[0.   0.75 0.25]
​
>>> text_2 /= np.sum(text_2)
>>> print(text_2)
[0.   0.75 0.25]
​
>>> added = text_1 + text_2
>>> print(added / np.sum(added))
[0.   0.75 0.25]

接下来,我们可以用欧氏距离计算两个向量之间的距离:

>>> dist = np.sqrt(np.sum((test_vec - added)**2))

不过,我们也可以直接计算两个向量之间的余弦相似度,二者本质上是等价的:

>>> from numpy.linalg import norm
>>> cosine = 1 - (np.dot(test_vec, train_vec) ...
    /(norm(test_vec)*norm(train_vec)))

(注意,这里需要用1减去余弦相似度,才能得到余弦距离。)

完整代码如下:

from collections import Counter
from tqdm import tqdm
from numpy.linalg import norm
​
​
k = 2
​
predicted_classes = []
​
for i in tqdm(range(df_test.shape[0]), total=df_test.shape[0]):
    test_vec = X_test[i].toarray().reshape(-1)
    test_label = df_test.iloc[i]["label"]
    distance_from_test_instance = []
    
    for j in range(df_train.shape[0]):
        train_vec = X_train[j].toarray().reshape(-1)
        train_label = df_train.iloc[j]["label"]
        
        cosine = 1 - np.dot(test_vec, train_vec)/(norm(test_vec)*norm(train_vec))
        distance_from_test_instance.append(cosine)
        
    sorted_idx = np.argsort(np.array(distance_from_test_instance))
    top_k_class = np.array(df_train["label"])[sorted_idx[:k]]
    predicted_class = Counter(top_k_class).most_common()[0][0]
    
    predicted_classes.append(predicted_class)
    
print("Accuracy:", np.mean(np.array(predicted_classes) == df_test["label"].values))

最终得到的准确率为68.01%(https://github.com/rasbt/nn_plus_gzip/blob/main/4_r8-dataset.ipynb ),虽然不如gzip方法,但差距不大(在4%以内)!

快速测试R8数据集

上面我们在IMDB电影评论数据集上评估了gzip方法,而该数据集不在原论文的研究范围内。为了对比我改进平局打破机制后的复现结果,和原论文所用数据集上的结果,我们来看R8数据集(选它是因为它规模很小,只需要几分钟就能跑完)。

figure08

摘自论文(https://aclanthology.org/2023.findings-acl.426/)的注释图,突出标注了R8数据集

使用论文某张图中描述的“最小索引”平局打破策略,准确率为88.90%(https://github.com/rasbt/nn_plus_gzip/blob/main/4_r8-dataset.ipynb ),低于原论文报告的数值。(原因会在下一节说明。)相比之下,使用我前面提到的改进版平局打破策略,准确率达到了91.27%——但仍然低于原论文的结果。下一节会解释这种差异的来源。

原代码存在的问题

正如Ken Schutte在其文章(https://kenschutte.com/gzip-knn-paper/ )中指出的,在需要解决[0, 1]或[1, 0]这类平局的场景下,选择k=2是个有点奇怪的决定。解决平局的方式有很多种,包括:

  • 始终选择类别索引更小的标签(scikit-learn和原论文图中的Python代码都采用这种方式);
  • 选择两个近邻中距离更近的那个(这是我更推荐的方式,也就是上一节“修正平局打破机制”中实现的方法);
  • 随机决定胜出的标签。

Ken Schutte提到,原论文的代码仓库(https://github.com/bazingagin/npc_gzip )使用了第四种策略,这可能是一个代码bug。比如,它在处理平局时,总会选择测试样本的真实标签:

# here, sorted_pred_lab[][] has the
# labels and counts corresponding
# to the top-k samples,
# [[label,count],[label,count],...]
# grouped-by label and sorted by count.
​
most_label = sorted_pred_lab[0][0]
most_count = sorted_pred_lab[0][1]
​
if_right = 0
for pair in sorted_pred_lab:
    # we loop until we drop below 'most_count', ie
    # this for-loop iterates over those classes
    # tied for highest count
    if pair[1] &#x3C; most_count:
        break
​
    # this says if ANY of those
    # in the tied-set are equal to
    # the test label,
    # it is marked correct (if_right=1)
    if pair[0] == label[i]:
        if_right = 1
        most_label = pair[0]
​
# accumulate results:
    pred.append(most_label)
correct.append(if_right)

根据Ken Schutte的分析,修正平局打破机制后,“gzip方法的表现从最优变成了最差”。

除此之外,数据集还存在重叠问题,Yann Dubois在这条推文中提到了这一点:https://twitter.com/yanndubs/status/1681325900170776578?s=20

figure09

基准测试中潜在的数据重叠问题

不过据我理解,这种重叠或多或少会影响论文中评估的所有方法。如果大家想了解训练集与测试集重叠问题的更多细节,推荐看Ken Schutte的后续文章:https://kenschutte.com/gzip-knn-paper2/

总结与思考

这篇ACL论文(https://aclanthology.org/2023.findings-acl.426/ )提出的gzip方法是一项非常优雅、极具启发性的研究成果,我非常享受探索它的过程。

遗憾的是,该方法实际的预测性能可能比论文报告的要差,但它仍然是一个很有意思的思路。

我们应该在实际中使用它吗?一方面,这个方法有很多优点:它是一个很简洁的基准方法,而且不需要GPU,在当前GPU紧缺的背景下这是很大的优势。另一方面,它的效果显然没有宣传的那么好,而且kNN也不太容易适配更大规模的数据集——作为参考,我在IMDB上的朴素实现,用单个CPU跑了整整一天才完成。

这件事积极的一面在于,我们有了一种全新的、简洁的基准方法。同时这篇论文也凸显了,在学术成果传播中,开放源代码与社区讨论是多么重要——这是传统的同行评审无法替代的。

拓展阅读资料

下面是我觉得不错的几篇同主题文章:

近邻方法详解

近邻算法是“最简单”的有监督机器学习算法之一,在过去一个世纪的模式识别领域中已经被研究得非常透彻。尽管近邻算法如今不如从前热门,但在实际中仍被广泛使用。我非常推荐大家在分类项目中把k近邻算法作为预测性能的基准,尤其是在开发更复杂的模型时。

如果大家想深入学习包括k近邻在内的近邻方法,我有一份20页的讲义,是几年前我教授机器学习课程时编写的。

不过即便你已经熟悉了基础知识,也可以看看第2.7节“提升计算性能”,其中的内容在实际机器学习工作和面试中都很实用:

  • 使用优先队列
  • 数据结构:分桶法、KD树、球树
  • 降维
  • 更快的距离度量与启发式方法
  • 剪枝
  • kNN的并行化

figure10

你可以在这里下载这份讲义:https://sebastianraschka.com/pdf/lecture-notes/stat451fs20/02-knn__notes.pdf

这本杂志是我个人的兴趣项目,没有直接的经济收益。不过如果大家想支持我,可以考虑购买我的书:https://sebastianraschka.com/books 。如果你觉得这些书有启发、有帮助,也欢迎推荐给你的朋友和同事。

figure11

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

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