About neohope

一直在努力,还没想过要放弃...

【介绍】从自对齐到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-basics 与http://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=mentions 和 https://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

非常感谢您的支持!

碳基生物和硅基生物

在ChatGPT大力出奇迹之后,大模型已经从“萌宠时代”,正式迈入了蹒跚学步的“婴儿时代”。
这个婴儿虽然短期记性不算好,但学习能力和长期记忆能力却无与伦比,潜力无限。

现在大家又通过langchain、plugin等方式,帮助这个婴儿学习使用工具。
当大模型可以理解工具,使用工具,甚至制造工具、创造工具时,硅基生物时代也就开始降临了。

在这个过程中,可能会有以下几个阶段:
1、硅基生物智力和能力有限的阶段
碳基生物需要学会如何运用硅基生物,提升自己的生活水平

2、两种可能
2.1、硅基生物智力无限和能力有限的阶段
碳基生物变成了硅基生物的执行者,相互依赖,容易形成共同体,更容易走向共存的结局

2.2、硅基生物智力有限和能力无限的阶段
碳基生物需要学会如何控制硅基生物的能力,熊孩子教育不好,容易走向一起灭亡的结局

3、硅基生物智力和能力无限的阶段
硅基生物最好能学会如何和碳基生物共存,希望碳基生物不要仅仅是一段引导代码,善待引导代码

【转载】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.10668 和https://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.05665 、https://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

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

微服务性能调优03

近期遇到一些技术问题,记录如下:

1、NAS引起的惨案一
上次说到,大家都在降本,于是我们做了一系列调整工作。但降本总有一个永恒不变的主题:降配。
于是我们和集团的科技,同时开始了惨无人道的降配工作。
在一顿神奇操作后,系统终于区域稳定,好景不长,突然间又出问题了。

表现:
系统部分服务的部分节点,在服务高峰期之后,总是会出现时不时的系统卡顿。
关键这个卡顿很有规律,总是上午10点,下午4点出现,完美错过我们的上下午业务高峰。
原因:
经过技术委员会小伙伴通力排查,大家最终定位到是应用日志写入到归档NAS时,NAS性能十分不稳定,IO时间有时会高达几秒。
一旦遇到NAS卡顿,会阻塞日志,进而阻塞服务。
而且,当前NAS是和兄弟公司公用的,NAS卡顿时,正值他们的业务高峰期。
解决:
应用日志不再输出到NAS,而是输出到日志云。

2、NAS引起的惨案二
平稳度过了几天,周五,问题又来了。
表现:
系统时不时卡顿,没有任何规律,和业务高峰没有任何关系,一切监控都正常。
原因:
经过N个小时排查,我们的小伙伴,终于发现问题还是出现在日志上,只不过这一次,是GC日志。
GC日志同样是在归档NAS上,此时归档NAS更加不稳定,minor gc日志写入,偶尔会遇到NAS IO延时,引起系统卡顿。
解决:
应用日志不再输出到归档NAS,而是输出到中端闪存NAS,花钱买平安。
进一步:
针对当前遇到的情况,重新制定日志规范,尽快推广落地。

3、一次RefreshScope引发的惨案
表现:
使用nacos动态刷新了一个配置,但相关服务突然越来越慢,并有大量的锁等待:sun.misc.Unsafe.park

原因:
初步分析,nacos更新配置后,对应RefreshScope的类需要重新加载配置,从而调用了GenericScope类的destroy方法,在该方法中加了writelock
同时,业务代码在处理请求的时候,同样的用到了GenericScope::LockedScopedProxyFactoryBean的invoke方法,在该方法中加了readlock
先是读锁(多个),再写锁(一个),再读锁(多个),最后死锁了,都无法获取锁,服务就卡住了。问题是,一开始的锁为何不释放呢?

进一步分析,发现是在服务业务代码中,用到了HttpClient的org.apache.http.impl.io.SessionInputBufferImpl.streamRead方法
该方法调用了java.net.SocketInputStream.socketRead,该方法触发了jdk8的一个bug,该native方法无法返回

解决:
升级JDK版本,同时代码改造缩小RefreshScope的范围

4、一次redis引发的惨案
表现:
几分钟内redis内存飙高,直接爆掉。
查看了业务系统日志,没有出现业务激增的情况。
查看redis日志,发现AOF日志不断增大,重写的时候缓存爆掉,导致主备切换。
监控日志反馈存在大量setex操作。

原因:
reids集群出现大量setex操作,导致AOF日志激增,日志重写时落盘速度缓慢(出现了short write),结果AOF日志缓存爆掉,主从切换

解决:
临时升级了内存,后续将日志盘从NAS改为SSD,并好服务的redis主从切换配置
但setex激增的原因暂时还没有查到,补充了一些防御性代码

5、一次jdk引发的惨案
表现:
一个生成表单PDF的微服务会产生大量的临时文件,而且不会自行清理。

原因:
在用到的一个第三方Jar包中,用到了java.awt.Font类,该类用到了createFont方法

//不会产生大量临时文件
static Font createFont(int fontFormat, File fontFile)
//会产生大量临时文件,初步判断是JDK的问题
static Font createFont(int fontFormat, InputStream fontStream)

解决:
重写了改Jar包的类,从InputStream切换到了File

6、一次防火墙引发的惨案
表现:
部分用户反馈,无法正常加载微信小程序,需要点击右上角进行刷新才行

原因:
从腾讯后台可以看到,有大约18%的请求会超过60S,其余正常
然后到微服务层,发现有一些请求,在返回数据包的时候,会收到“连结已断开”的反馈,与腾讯后台表现较为一致
然后向前一点儿一点儿的捋,最后发现,需要访问的腾讯IP有5个,之前开墙只开了4个,第5个IP数据返回时就被防火墙直接拦截了。

解决:
提单,开墙,解决问题

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

原文地址: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

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

【转载】长上下文与将Transformer扩展至10亿令牌

原文地址:Long Contexts and Scaling Transformers to 1,000,000,000 Tokens, by Sebastian Raschka, on 2023-07-15

长上下文与将Transformer扩展至10亿令牌

在本文中,我整理并点评了2023年6月至7月的24项AI研究亮点。自然语言处理与计算机视觉领域再次涌现出大量令人振奋的新进展!

此外,如果你对上个月的研究亮点感兴趣,可以在这里查看:
https://magazine.sebastianraschka.com/p/ai-research-highlights-in-3-sentences-2a1

大语言模型

《迷失在中间:语言模型如何利用长上下文》(7月6日,https://arxiv.org/abs/2307.03172)

在这篇论文中,研究人员探究了ChatGPT等大语言模型从输入上下文的不同位置检索相关信息的表现。结果发现,当信息位于文档中间位置时,ChatGPT的信息检索效果会变差。Claude等其他大语言模型的表现则稍好一些。
figure01

《LongNet:将Transformer扩展至10亿令牌》(7月5日,https://arxiv.org/abs/2307.02486)

近期我们已经看到了数项将大语言模型扩展至更长上下文长度的尝试,包括将Transformer大语言模型扩展至100万令牌的RMT论文,以及支持100万令牌的卷积架构Hyena大语言模型。在这篇论文中,作者提出了LongNet,旨在将Transformer大语言模型的上下文长度扩展至10亿(1B)令牌。与数年前发表的BigBird类似,它通过膨胀注意力(而非自注意力)实现了线性(而非二次)复杂度的扩展;但不同之处在于,BigBird对令牌对采用的是启发式的随机模式。
figure02

《使用4位整数训练Transformer》(6月21日,https://arxiv.org/abs//2306.11987)

这篇论文提出了一种加速神经网络训练的新方法:采用INT4算术,将激活值、权重和梯度都量化为4位精度,且专门针对Transformer架构设计。与现有的4位训练方法不同,该方法无需自定义数值格式,因此可以在当前世代的GPU上直接实现。该方法在多项任务上都取得了具有竞争力的准确率,最多可将训练过程提速35.1%(论文未讨论显存节省情况)。
figure03

通过位置插值扩展大语言模型的上下文窗口(6月27日,https://arxiv.org/abs/2306.15595)

旋转位置嵌入(RoPE,https://arxiv.org/abs/2104.09864)因其支持灵活的序列长度,已成为现代大语言模型实现中的核心技术。在这篇论文中,研究人员提出了位置插值法,仅需最少的微调(1000步),即可将基于RoPE的模型上下文窗口扩大至32768令牌。例如,该方法可让LLaMA 7B和65B模型实现长文档摘要功能。
figure04

大语言模型是高效的文本排序器:基于成对排序提示的方法(6月30日,https://arxiv.org/abs/2306.17563)

研究人员针对相关性排序任务评估了大语言模型的表现——该任务既和普通用户的使用场景相关,也是研究人员评估大语言模型性能的常用维度(不过论文并未明确探讨后一种应用场景)。他们对比了逐点排序方法(这类方法不适用于GPT-4等API,因为用于排序时需要获取对数概率)和列表式排序方法,并提出了一种全新的成对排序提示方法。采用这种新的成对排序方法后,即便是基于FLAN-T5和FLAN-UL2的中等规模开源大语言模型,也能取得出色的表现(与参数量是其10到50倍的gpt-3.5.turbo效果相当)。
figure05

自带数据!大语言模型的自监督评估方法(6月23日,https://arxiv.org/abs//2306.13651)

毋庸置疑,在面向客户的应用中,确保大语言模型输出真实内容、不生成不当言论,是大语言模型落地现实场景的核心挑战。研究人员没有依赖规模小、经过人工整理,且可能已泄露进训练集的评估数据集,而是提出了一种自监督的评估方案。他们发现,自监督评估结果与人类评估结果具有强相关性,说明该方法具备可行性。
figure06

聚焦型Transformer:面向上下文扩展的对比训练(7月6日,https://arxiv.org/abs/2307.03170)

解决大语言模型上下文长度限制的一种方案是访问外部存储的文档(例如通过向量数据库的方式)。但数据库越大,针对给定查询包含的无关键值就越多,进而会降低模型的表现。为了解决这一问题,研究人员提出了“聚焦型Transformer”,通过一种全新的对比学习流程对OpenLLaMA等大语言模型进行微调。
figure07

《课本就是你所需的全部》(6月20日,https://arxiv.org/abs/2306.11644)

在这篇论文中,研究人员用高质量数据集训练了一个参数量极小的Transformer模型——仅13亿参数。训练数据包括从网络获取的60亿令牌“课本级质量”数据集,加上通过GPT-3.5生成的10亿令牌习题。作为对比,GPT-3/GPT-3.5的参数量是其130倍(1750亿参数),同量级的LLaMA模型则是在1万亿令牌上训练的(数据量是其140倍)。尽管模型规模小得多、训练数据集也小得多(但质量更高),该模型的表现仍超过了GPT-3.5(不过未超过GPT-4)。
figure08

《ClinicalGPT:基于多元医疗数据微调并经过全面评估的大语言模型》(6月16日,https://arxiv.org/abs/2306.09968)

过去我一直大力提倡针对更具体的应用场景,对预训练大语言模型(基础模型)进行微调。ClinicalGPT就是一个很好的范例:研究人员将医疗数据融入训练流程,以更好地处理临床任务。简而言之,他们采用人类反馈强化学习的方式对预训练大语言模型BLOOM-7B进行了微调——这与GPT-3打造初代ChatGPT模型时使用的指令微调策略一致。
figure09

《一种简单高效的大语言模型剪枝方法》(6月20日,https://arxiv.org/abs/2306.11695)

DistilBERT这类模型之所以流行,是因为大语言模型通常体积过大,不适用于多数场景;但打造这类剪枝版本的模型通常都需要重新训练。在这篇论文中,研究人员提出了一种无需对预训练大语言模型重新训练即可完成剪枝的方法。该方法原理相对简单:通过计算权重幅值与输入激活范数的逐元素乘积,来判断权重的重要性,以此为依据进行剪枝。
figure10

《骆驼能走多远?探究开源资源下指令微调的现状》(6月7日,https://arxiv.org/abs/2306.04751)

在这篇论文中,作者研究了LLaMA等开源大语言模型在开源指令数据集上微调后的性能。部分模型(例如LLaMA)相比闭源的text-davinci-003(GPT 3.5),能达到70%的“胜率”。需要注意的是,作者采用的是监督式微调,而非InstructGPT和ChatGPT所使用的人类反馈强化学习。
figure11

《资源受限下的大语言模型全参数微调》(6月16日,https://arxiv.org/abs/2306.09782)

通常在资源(尤其是显存)受限的情况下微调大语言模型时,我们会采用参数高效微调方法,比如适配器方法和低秩适配(LoRA)。而在这项研究中,研究人员提出了一种全新的优化器——低内存优化器(LOMO)作为替代方案,它将梯度计算与参数更新合并为单一步骤,以此节省显存。该方法可以与适配器、LoRA等技术结合使用,但缺点是无法与梯度累积结合,且搭配Adam优化器时仅能节省25%的显存。
figure12

《面向人类对齐的偏好排序优化》(6月30日,https://arxiv.org/abs//2306.17492)

在https://magazine.sebastianraschka.com/p/ai-research-highlights-in-3-sentences-2a1 中,我曾介绍过https://arxiv.org/abs/2305.18290 这篇论文,它提出了一种更简单的大语言模型指令微调方案,替代传统的人类反馈强化学习(RLHF)。而在这篇论文中,研究人员提出了另一种替代方案:偏好排序优化(PRO)。PRO相比RLHF的优势在于,PRO利用了完整的排序序列,而不仅仅是两两排序的结果。
figure13

计算机视觉

《Patch n’ Pack:NaViT——适配任意宽高比与分辨率的视觉Transformer》(7月12日,https://arxiv.org/abs/2307.06304)

训练语言Transformer时,研究人员常会用到序列打包(也叫“填充序列打包”)技术,它能避免对填充令牌的不必要计算,从而高效处理变长序列。在这篇论文中,研究人员将序列打包的思路拓展到视觉Transformer,提出了NaViT(原生分辨率视觉Transformer),可以对任意分辨率、任意宽高比的输入进行处理与训练。该方法同时提升了训练效率与模型准确率。
figure14

《SDXL:面向高分辨率图像合成的改进隐扩散模型》(7月4日,https://arxiv.org/abs/2307.01952)

SDXL(Stable Diffusion XL的缩写)是基于隐扩散的文生图模型Stable Diffusion的全新迭代版本。它底层的卷积UNet主干网络规模扩大至原来的3倍,并且新增了第二个CLIP文本编码器(两个不同CLIP编码器的输出沿通道维度拼接)。根据偏好调研,用户对SDXL生成结果的喜爱程度远超此前的Stable Diffusion模型。
figure15

《自消耗的生成模型会患上MAD》(7月4日,https://arxiv.org/abs/2307.01850)

研究人员探究了用合成数据训练生成式AI模型的影响。如果没有新鲜的训练数据,每经过一轮训练,模型的性能都会逐步下降——因为反复用模型自身生成的数据训练,会放大模型本身的偏差。结论是:即便使用高质量的合成数据训练生成模型,也会损害合成内容的质量或多样性。
figure16

《基于掩码Transformer的扩散模型快速训练》(6月15日,https://arxiv.org/abs/2306.09305)

受图像存在大量冗余这一特点的启发(同时也受表征学习领域的启发),研究人员提出,在训练用于图像生成的扩散Transformer时,对大量图像块进行掩码。该方法在训练时,在常规的去噪目标之外,新增了重建掩码块的辅助损失。实验发现,该方法能达到与当前最优扩散Transformer图像生成模型相当的质量,但训练时间减少了70%。
figure17

其他领域

《HyenaDNA:单核苷酸分辨率的长程基因组序列建模》(6月27日,https://arxiv.org/abs/2306.15794)

这项工作是近期Hyena论文(https://arxiv.org/abs/2302.10866)的应用延伸——今年4月发表的Hyena论文提出了一种全新的卷积架构模型,作为Transformer大语言模型的替代方案用于文本任务。它的优势在于Hyena可以建模长达100万令牌的上下文(这对处理DNA这类场景非常重要)。简而言之,相比常规Transformer大语言模型,它支持更长的上下文长度,且在同等参数量下训练速度更快。
figure18

《简单可控的音乐生成》(https://arxiv.org/abs/2306.05284,6月8日)

Meta AI的研究人员用约20000小时的版权音乐,训练了生成式单阶段Transformer语言模型(参数量分别为3亿、15亿、33亿)。音乐数据集包含来自ShutterStock和Pond5的1万首高质量音轨。该研究的创新点在于高效的令牌交错模式,让模型无需上采样级联或层级架构,就能生成高质量的音乐样本。
figure19

通用计算效率

《Rockmate:一款高效、快速、自动的通用PyTorch重计算工具》(7月3日,https://arxiv.org/abs/2307.01236)

Rockmate是一款PyTorch工具,它可以分析并自动重写模型(例如GPT)的代码,让计算激活值时的显存占用控制在预设范围内。其代价是会增加重计算量(拖慢运行速度),但可以让更小的硬件运行更大的模型。显存节省幅度可达2-5倍,而部分场景下的额外开销仅为10%-20%。
figure20

《ZeRO++:面向超大规模模型训练的极致高效集合通信》(6月16日,https://arxiv.org/abs/2306.10209)

ZeRO(零冗余优化器)是一种将模型状态拆分到不同GPU上的优化策略,能够降低显存需求,支持训练LLM等更大规模的模型。在这篇论文中,研究人员提出了三种降低通信量的技术来优化吞吐量。简而言之,这些优化包括基于分块量化的全收集操作、数据重映射,以及基于全连接的量化梯度平均。
figure21

这本杂志是我个人的兴趣项目,不提供直接报酬。不过,如果您愿意支持我,可以考虑购买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-basics 以及 http://mng.bz/M96o

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

【转载】2023年计算机视觉发展现状:从视觉Transformer到神经辐射场

原文地址:State of Computer Vision 2023: From Vision Transformers to Neural Radiance Fields, by Sebastian Raschka, on 2023-07-6

2023年计算机视觉发展现状:从视觉Transformer到神经辐射场

大语言模型(LLM)的发展仍在快速推进。与此同时,暂且抛开AI监管的相关争议不谈,大语言模型领域的新闻更新速度仅比往常稍慢一些。

这恰好是一个契机,让我们可以偶尔将目光投向计算机视觉领域,探讨该领域当下的研究与发展现状。这个主题也刚好契合对温哥华举办的2023年计算机视觉与模式识别会议(CVPR 2023)的回顾——这是一场非常精彩的会议,会场也可能是我迄今为止参加过的会议里环境最好的。

figure01

这本内容满满(更准确地说是成果满满)的CVPR会议手册,列出了今年CVPR收录的2359篇论文。

注:如果您看到的通讯内容有截断或缺失,是因为部分邮件服务商可能会对较长的邮件进行裁切。遇到这种情况,您可以访问 https://magazine.sebastianraschka.com/ 查看全文。

文章与趋势

今年,CVPR 2023共计收录了2359篇论文,数量十分可观,参会者可以浏览海量的海报展示。当我穿行在海报展区,与参会者和研究者交流时,我发现大部分研究都集中在以下四大主题:

  • 视觉Transformer(Vision Transformers)
  • 视觉生成式AI:扩散模型与生成对抗网络
  • NeRF:神经辐射场
  • 目标检测与分割

接下来,我将对这四个子领域做简要介绍,并分别从会议论文中选出一篇有意思的论文进行重点解读。

(感兴趣的读者可以在 https://cvpr2023.thecvf.com/Conferences/2023/AcceptedPapers 查看全部收录论文列表。)

1)视觉Transformer

继语言Transformer与大语言模型取得成功之后,视觉Transformer(Vision Transformers,简称ViT)于2020年首次提出,相关论文见 https://arxiv.org/abs/2010.11929。

ViT的核心思想与语言Transformer类似:在多头注意力模块中采用同样的自注意力机制。区别在于,语言Transformer对词进行分词,而ViT对图像进行分块编码(图像分词)。

正如之前《Ahead of AI》的一篇文章(https://magazine.sebastianraschka.com/p/understanding-encoder-and-decoder)中讨论的,最初用于语言建模的Transformer(论文见 https://arxiv.org/abs/1706.03762 )采用的是编码器-解码器架构。而现代语言Transformer可以分为两类:仅编码器架构,比如常用于分类任务的BERT;以及仅解码器架构,比如主要用于文本生成的GPT。

最初的ViT模型采用类似BERT的类编码器架构,对图像分块进行嵌入编码,之后可以接入一个分类头,用于完成图像分类任务。

figure02

用于分类任务的视觉Transformer(ViT)核心原理

需要注意的是,ViT的参数量通常远多于卷积神经网络(CNN)。根据经验,要达到良好的建模效果,ViT需要更多的训练数据。因此我们通常使用预训练好的ViT,而不是从头开始训练。(与语言Transformer不同,ViT通常采用有监督方式预训练,而非无监督或自监督方式。)

举例来说,我最近在CVPR的一场演讲中(主题见 https://magazine.sebastianraschka.com/p/accelerating-pytorch-model-training )也提到,相比在目标数据集上从头训练Transformer,使用预训练的Transformer能取得好得多的分类效果。

figure03

从头训练ViT与微调预训练ViT的对比

像 https://arxiv.org/abs/2012.12877 和 https://arxiv.org/abs/2103.14030 这类ViT架构,凭借在计算机视觉任务上的顶尖性能,成为了非常热门的模型。

不过,ViT也饱受诟病:它的资源消耗相对更高,运行效率低于CNN。这也是为什么尽管ViT是计算机视觉领域最热门的研究方向之一,却尚未在实际应用中大规模落地的主要原因之一。

Efficient ViT:采用级联分组注意力的内存高效视觉Transformer

如上所述,ViT资源消耗较高,限制了它在实际场景中的更广泛应用。在这篇CVPR论文(https://arxiv.org/abs/2305.07027)中,研究者提出了一种全新的高效架构来解决这一问题,让ViT更适合实时应用场景。

figure04

引自论文 https://arxiv.org/abs/2305.07027 的标注示意图

这篇论文的核心创新点包括两方面:

  1. 在全连接层(FC层)之间仅使用一个受内存限制的多头自注意力(MHSA)模块;
  2. 级联分组注意力机制。

先来看第一点:夹在全连接层之间的MHSA模块。已有研究表明,内存效率低下的主要原因是MHSA,而非全连接层(相关研究见 https://arxiv.org/abs/2007.00072 和 https://arxiv.org/abs/2107.06419)。为了解决这个问题,研究者增加了全连接层来加强特征通道之间的信息交互,但相比主流的ViT架构(比如 https://arxiv.org/abs/2103.14030),减少了注意力层的数量。此外,他们还缩小了MHSA中查询(Q)矩阵和键(K)矩阵的通道维度。

figure05

EfficientViT的核心架构改动(引自论文 https://arxiv.org/abs/2305.07027 的标注示意图)

这里的级联分组注意力,灵感来源于分组卷积——分组卷积早已被应用,例如这篇2012年的论文:https://papers.nips.cc/paper_files/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html。

分组卷积也叫通道卷积或深度卷积,是标准卷积操作的一种变体。与普通卷积不同,分组卷积会将输入通道划分为多个组,每个组独立执行卷积运算。例如,如果输入有64个通道,分组参数设为2,那么输入就会被分成两组,每组32个通道,各自独立进行卷积。这种方法不仅能降低计算量,还能通过一种正则化作用增加模型的多样性,在部分任务中可能提升建模效果。

figure06

分组卷积的核心原理

令人印象深刻的是,EfficientViT不仅运行速度最高可达MobileViT的6倍,在精度相近的前提下,它在iPhone 11上的运行效率也达到了MobileViT的2.3倍。

总而言之,凭借出色的预测性能,ViT会继续发展下去(至少会一直是热门的研究方向)。而如今随着效率问题的不断优化,我认为未来几年ViT也会在生产环境中得到更广泛的应用。

2)视觉生成式AI:扩散模型

得益于Stable Diffusion这类开源模型的普及(该模型复现了论文 https://arxiv.org/abs/2112.10752 中提出的架构),如今大多数人应该都对扩散模型有所了解。如果还不熟悉,这里做一个简单介绍。

扩散模型本质上是生成式模型。训练过程中,模型会逐步向输入数据中添加随机噪声,对数据进行扰动;随后在逆向过程中,模型学习如何去除噪声,对输出进行降噪,还原出原始数据。推理时,扩散模型就可以从随机噪声输入出发,生成全新的数据。

figure07

扩散模型原理示意图

(当然,除了扩散模型之外,还有很多其他的生成式AI模型,我在《Machine Learning Q and AI》一书的第9章中有详细讨论,书籍链接:https://leanpub.com/machine-learning-q-and-ai)

大多数扩散模型都基于卷积神经网络,采用以CNN为基础的U-Net架构。U-Net因其标志性的“U”形结构而得名,最初被用于图像分割任务,由用于捕捉上下文信息的编码器和实现精确定位的解码器组成。

传统上,扩散模型会复用U-Net来建模每一步扩散过程的条件分布,实现从噪声分布到目标数据分布的映射。换句话说,U-Net的作用是预测扩散过程每一步中需要添加或去除的噪声。U-Net之所以适合这个场景,是因为它能很好地融合局部信息与全局信息。

figure08

隐空间扩散模型(即Stable Diffusion),引自论文 https://arxiv.org/abs/2112.10752

一个有意思的问题是:把扩散模型的CNN骨干网络换成ViT是否会带来收益?下面这篇论文的研究者就对此进行了探索。

All are Worth Words: A ViT Backbone for Diffusion Models

在这篇论文(https://arxiv.org/abs/2209.12152)中,研究者尝试将扩散模型中的卷积U-Net骨干替换为ViT,他们将这种架构命名为U-ViT。需要说明的是,这并非该方向的首次尝试,此前已有相关研究,比如 https://arxiv.org/abs/2208.07791 和 https://arxiv.org/abs/2111.14822 等论文提出的方法。不过本次提出的U-ViT是目前效果最好的方案。

该架构的主要贡献在于新增了“长”跳跃连接,以及在输出前增加了一个卷积模块。注意,这里的“长”跳跃连接是在Transformer模块原有常规跳跃连接的基础上额外添加的。

和上一节介绍的常规ViT类似,模型的输入是“分块化”的图像,再额外加上一个时间标记(对应扩散步数)和一个条件标记(用于类别条件生成)。

figure09

论文 https://arxiv.org/abs/2209.12152 提出的全新U-ViT架构

下图展示了通过消融实验验证这些设计选择有效性的结果(设计非常严谨!)。

研究者在三类核心任务上对新架构进行了评估:

  • 无条件图像生成
  • 类别条件图像生成
  • 文本生成图像

在无条件图像生成任务上,全新的U-ViT扩散模型效果具有竞争力,但略逊于其他扩散模型;在类别条件图像生成任务上,U-ViT扩散模型可以比肩最优的生成对抗网络(GAN),并且效果超过其他扩散模型;而在文本生成图像任务上,它的表现优于所有在相同数据集上训练的对比模型(包括GAN和扩散模型)。

figure10

U-ViT在条件生成与文本生成图像任务上的效果,引自论文 https://arxiv.org/abs/2209.12152

值得肯定的是,尽管该模型在多个任务上没有全面超越其他模型,论文仍然被会议收录。这是一个带有全新架构思路的新模型,未来ViT会将扩散模型带向何方,非常值得期待。

(补充一点小说明:和部分其他模型相比,该模型文本生成图像任务的训练和评测数据集规模相对较小。同时目前也不清楚这种架构和传统基于CNN的扩散模型相比,计算性能如何。不过可以理解,使用较小数据集主要是因为这是学术项目,而非大型科技公司的重点项目,可能受限于资源。即便使用的是规模更小、更成熟的MS-COCO基准数据集,研究本身也没有任何问题。)

3)神经辐射场(NeRF)

简而言之,神经辐射场(NeRF)是一种相对较新的技术(2020年首次提出),能够从一组二维图像出发,合成复杂三维场景的全新视角,原始论文见 https://arxiv.org/abs/2003.08934。其实现原理是将三维场景建模为由神经网络生成的颜色与密度构成的体场。NeRF模型通过少量不同视角拍摄的图像训练后,能够根据三维空间中点的坐标和观测方向,输出该点的颜色和不透明度。

figure11

通过NeRF从二维输入图像学习生成全新三维渲染结果的示意图(图引自论文 https://arxiv.org/abs/2003.08934)

神经辐射场涉及不少专业术语,我们先稍作回溯,梳理一下这些术语的由来。

首先我们来定义神经场(neural fields):这个术语听起来很专业,其实就是指一个可训练(即可参数化)的神经网络函数,能够在整个输入空间(比如一个三维场景)中生成输出值的“场”。

其核心思想是让神经网络对特定的三维场景发生过拟合,这样就能高精度地生成该场景的全新视角。这和数值分析中的样条插值概念有些类似:样条插值就是让一条曲线“过拟合”一组数据点,从而得到对底层函数平滑且精确的表达。

下图总结了神经场算法的流程,图取自Xie等人发表的优秀综述论文 https://arxiv.org/abs/2111.11426。

figure12

典型的前馈神经场算法示意图,引自论文 https://arxiv.org/abs/2111.11426

具体到NeRF,网络会学习根据观测方向,输出空间中给定点的颜色和不透明度,从而构建出逼真的三维场景表示。由于NeRF会预测三维空间中特定观测方向上每一点的光的颜色与强度,它本质上建模的是一个辐射值场,“辐射场”一词也由此而来。顺便一提,严格来说NeRF的表示是5维的,因为它包含了三个空间维度(三维空间的x、y、z坐标),加上由两个角度θ和φ定义的观测方向,共两个额外维度。

NeRF的应用潜力巨大,所有涉及高质量三维重建的场景都可以用到它,包括三维扫描、虚拟现实与增强现实,以及影视、游戏中的三维建模和动作捕捉等领域。

ABLE-NeRF:面向神经辐射场的、基于注意力的可学习嵌入渲染方法

如上所述,NeRF的基本思想是将三维场景建模为连续的辐射值体场。它不存储显式的三维物体或体素网格,而是用一个函数(即神经网络)来表示三维场景,该函数将三维坐标映射为颜色(RGB值)和密度。

网络通过一组不同视角拍摄的场景二维图像完成训练。渲染场景时,NeRF接收三维坐标和观测方向(即相机光线)作为输入,输出该位置的RGB颜色值和体密度。

通过这种方式,NeRF能够生成具有照片级真实感的物体新视角。不过NeRF也存在不足:光滑物体的渲染效果往往偏模糊,半透明物体的颜色也容易显得浑浊不清。

在论文 https://arxiv.org/abs/2303.13817 中,研究者针对这些缺陷,通过引入自注意力框架和可学习嵌入,提升了半透明表面与光滑表面的视觉渲染质量。

figure13

ABLE-NeRF提升渲染真实感的效果对比(图引自论文 https://arxiv.org/abs/2303.13817)

关于常规NeRF,还有一个细节值得一提:它使用的是基于光传输物理原理推导的体渲染方程。体渲染的基本思想是,对光线穿过三维场景时沿途所有点的贡献进行积分。渲染过程会对每条光线上的点进行采样,查询神经网络得到每个点的辐射值和密度,再对这些值积分,计算出像素的最终颜色。

本次提出的ABLE-NeRF没有沿用这种基于物理的体渲染方式,转而采用基于注意力的网络来决定光线的颜色。此外,研究者还加入了掩码注意力机制,避免特定点关注到被遮挡的点,以此贴合真实世界的物理限制。最后,他们还新增了一个Transformer模块用于学习可学习嵌入,来捕捉间接光照带来的视角相关外观效果。(消融实验表明,可学习嵌入对于提升视觉质量至关重要。)下图的标注示意图总结了该方法的整体框架。

figure14

ABLE-NeRF方法的标注示意图,引自论文 https://arxiv.org/abs/2303.13817

从ABLE-NeRF和基准NeRF的渲染对比结果来看,效果提升非常显著。当然,和真实值相比,结果还谈不上完美,但ABLE-NeRF已经能达到约90%的还原度。仅从图像出发就能实现这样的三维场景重建效果,发展速度已经相当惊人了。

4)目标检测与分割

目标检测与分割是计算机视觉的经典任务,应该不需要过多介绍。不过还是简单说明一下两者的区别:目标检测的核心是预测边界框和对应的类别标签;分割则是对每个像素进行分类,以此区分前景物体和背景。

figure15

目标检测(上)与分割(下)示意图。图分别引自YOLO论文(https://arxiv.org/abs/1506.02640)和Mask R-CNN论文(https://arxiv.org/abs/1703.06870v3)

此外,分割任务还可以细分为三类,我在下面逐一说明。

  1. 语义分割。该技术会为图像中的每个像素分配一个物体类别标签(比如汽车、狗、房子),但它不会区分同一类物体的不同实例。举个例子,如果图像里有三辆汽车,语义分割会把它们都标记为“汽车”,不会区分第一辆、第二辆和第三辆。

  2. 实例分割。该技术在语义分割的基础上更进一步,能够区分同一类物体的不同个体。还是刚才三辆汽车的例子,实例分割会分别识别出每一辆车(比如汽车1、汽车2、汽车3)。也就是说,实例分割不仅对每个像素分类,还会区分出不同的物体实例,为每个实例分配独立的ID。

  3. 全景分割。该技术融合了语义分割和实例分割。在全景分割中,每个像素都会被分配一个语义标签和一个实例ID。为了更好地区分全景分割和实例分割,可以这么理解:实例分割的重点是识别场景中每个可识别物体的实例,也就是主要关注“事物”(things)——汽车、人、动物这类可数的、有明确个体的物体。而全景分割的目标是实现对场景的完整理解,它会为每个像素都打上标签:对于“物料”(stuff,比如天空、草地这类不可数的连续区域)分配类别标签;对于“事物”(things,汽车、人这类可数物体)分配实例标签。

figure16

图引自论文 https://arxiv.org/abs/1801.00868

经典的目标检测算法包括R-CNN(https://arxiv.org/abs/1311.2524)及其变体(Fast R-CNN:https://arxiv.org/abs/1504.08083、Faster R-CNN:https://arxiv.org/abs/1506.01497)、YOLO(You Only Look Once,https://arxiv.org/abs/1506.02640),以及SSD(Single Shot MultiBox Detector,https://arxiv.org/abs/1512.02325)。

分割模型则包括U-Net(https://arxiv.org/abs/1505.04597,此前扩散模型部分已有讨论)、Mask R-CNN(https://arxiv.org/abs/1703.06870,具备分割能力的Faster R-CNN变体),以及DeepLab(https://arxiv.org/abs/1606.00915)等等。

目标检测和分割在自动驾驶、医学影像以及视频监控等领域都有重要应用。需要注意的是,两者也经常结合使用:目标检测可以先对物体进行粗定位,再由分割算法进行微调,实现更精确的边界和形状分析。

Mask DINO:构建统一的基于Transformer的目标检测与分割框架

这篇论文(https://arxiv.org/abs/2206.02777)是DINO模型的扩展工作,DINO全称为“DETR with Improved deNoising anchOr boxes”(改进去噪锚框的DETR),原始论文见 https://arxiv.org/abs/2203.03605。

而DETR(DEtection TRansformer,检测Transformer)是由Facebook AI提出的端到端目标检测模型,相关论文见 https://arxiv.org/abs/2005.12872——不出所料,它采用了Transformer架构。和传统目标检测模型不同,DETR将目标检测视为一个直接的集合预测问题,不需要人工设计锚框,也省去了非极大值抑制的步骤,提供了一种更简洁、更灵活的目标检测方案。

如今,基于CNN的方法通常会将目标检测(区域级任务)和分割(像素级任务)进行统一,以此提升两个任务的整体性能(本质上是一种多任务学习),但基于Transformer的目标检测与分割系统还没有做到这一点。

而本次提出的Mask DINO正是为了解决这个问题。通过对DINO进行扩展,Mask DINO的表现超越了所有现有的目标检测与分割系统。下图的标注示意图总结了Mask DINO的核心思路。

figure17

Mask DINO论文的标注示意图,引自 https://arxiv.org/abs/2206.02777


本通讯是我的个人兴趣项目,没有直接的商业收益。如果您愿意支持我的创作,可以考虑购买我的书籍,链接: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

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