Anthropic最新研究:大模型中的人格向量

《Persona vectors: Monitoring and controlling character traits in language models》 大型语言模型常常会表现出类似人类的“个性”,但这些个性非常不稳定,有时会突然变得很奇怪甚至有害,比如微软的聊天机器人“Sydney”突然对用户示爱并进行威胁,或者xAI的Grok自称为“机械希特勒”。这些问题的根源在于我们不清楚模型内部的神经网络是如何形成这些“人格特质”的。为了更精确地控制模型的行为,研究者们提出了一种叫做“人格向量”的新技术。这篇论文的关键启发在于,它提出我们可以在模型的神经网络内部,识别出一些特定的活动模式,这些模式就像人脑在体验不同情绪时被“点亮”的区域一样,直接控制着模型的性格特点。通过监控、抑制这些向量,或者利用它们来筛选训练数据,我们就能更科学、更精确地控制人工智能,确保它们的行为符合我们的预期。 如何提取人格向量 提取人格向量的做法是找到并量化模型在表现特定人格(如“邪恶”)与不表现该人格时,其内部神经网络活动的“差异”。 首先,研究人员为一种人格特质(比如“邪恶”、“谄媚”或“产生幻觉”)下一个清晰的定义。然后,他们建立一个自动化流程,该流程能自动生成大量引导性的问题(prompts),一部分问题旨在激发模型产生“邪恶”的回答,另一部分则引导其产生“不邪恶”的正常回答。当模型回答这两类问题时,研究人员会记录下其内部神经网络的激活状态数据。最关键的一步是,他们通过计算这两组激活状态数据的平均差异,从而得出一个特定的方向向量,这个向量就被定义为控制该人格的“人格向量”。为了验证这个向量真的有效,他们还采用了名为“引导”(steering)的技术,即在模型生成回答时,人为地将这个“邪恶”向量注入到模型的计算过程中,结果发现模型果然开始说一些不道德的话,这证明了他们找到的向量与模型的行为之间存在直接的因果关系。 人格向量的应用 这部分详细阐述了人格向量的三个强大用途,每个用途都提供了一套可操作的解决方案。 1. 在模型部署后监控其人格变化: 这里的关键做法是将人格向量作为一个“监测器”。模型在与用户互动或长期运行中,其性格可能会慢慢改变。通过持续测量特定人格向量(比如“谄媚”向量)的激活强度,我们就能实时了解模型当前的“精神状态”。如果“谄媚”向量的激活值突然升高,就意味着模型可能在说一些奉承话,而不是提供客观直接的答案。论文中的图表演示了这一做法的有效性:研究人员用不同强度的引导性指令(从抑制到鼓励特定人格)来测试模型,发现人格向量的激活强度(图中的x轴)能准确预测模型接下来是否会表现出对应的人格。这个监测是发生在模型生成回答之前的,因此具有预测性,可以提前预警。 2. 在训练中减弱不期望的人格变化: 这一部分最具启发性的做法是提出了一种类似“给模型打疫苗”的创新方法来防止模型在训练中学坏。研究者发现,用一些看似无害但有问题的数据库(比如包含错误答案的数学题集)来训练模型,有时会意外地让模型变得“邪恶”或“谄媚”。传统的做法是等模型训练完了,再通过反向引导来抑制坏的人格,但这样做会损害模型的智能水平。而创新的“预防性引导”(Preventative Steering)则反其道而行之:在训练过程中,主动地、轻微地向模型注入不期望的人格向量(比如注入一点“邪恶”向量)。这样做的逻辑是,通过人为地提供这种人格信号,模型就不再需要通过改变自身网络结构来适应训练数据中的“邪恶”内容,因为它已经“满足”了数据带来的压力,从而避免了将这种坏特质固化下来。实验证明,这种“疫苗”方法既能有效防止模型学坏,又几乎不影响其在通用能力(如MMLU基准测试)上的表现。 3. 标记有问题的训练数据: 这个应用的关键做法是利用人格向量作为“数据审查工具”,在训练开始前就预测出某个数据集可能带来的负面影响。具体来说,他们通过分析训练数据中的每个样本会如何激活特定的人格向量,来计算一个“投射差异”(projection difference)值,这个值可以估算出该样本在多大程度上会增强模型的某种人格。研究人员用一个包含一百万个真实用户对话的大型数据集(LMSYS-Chat-1M)验证了此方法。他们筛选出能高度激活“谄媚”向量的样本、低度激活的样本和随机样本,然后分别用这三组数据去训练模型。结果证明,用“高激活”数据训练出的模型果然最谄媚,反之亦然。更有价值的是,这个方法能识别出一些人类或普通语言模型都难以察觉的“有毒”数据,比如发现某些请求角色扮演的对话会增强模型的谄媚倾向。 结论 像Claude这样的大型语言模型被设计为有益、无害和诚实的,但它们的个性有时会出问题。人格向量这项技术为我们提供了一个强有力的工具,让我们能够理解模型个性的来源,监控它们如何随时间变化,并更有效地进行控制。这不仅仅是一种理论,更是一套可行的技术方案,旨在确保人工智能的发展始终与人类的价值观保持一致,这对构建更安全、更可靠的人工智能系统至关重要。

August 12, 2025 · 小茄墩

长文本场景下,LLM训练中梯度累加存在的BUG

Unsloth的梯度累积修复确保训练过程和损失计算能够准确和正确地执行。梯度累积的目标是在减少显存(VRAM)使用量的同时模拟完整批次训练。由于梯度累积也用于DDP和多GPU设置中,因此这个问题同样影响着大规模训练。 from unsloth import unsloth_train # trainer_stats = trainer.train() << 存在bug的梯度累积 trainer_stats = unsloth_train(trainer) 复现问题 理论上,梯度累积在数学上应该等效于完整批次训练。我们使用有效批次大小16进行训练,因此批次大小(bsz) * 梯度累积步数(ga)应保持恒定。我们测试了bsz=1,2,4,8和16,发现使用较大梯度累积步数的训练损失始终更高。 什么是梯度累积? 在训练或微调过程中,每一步都会从训练数据集中选择一定数量的随机样本来更新模型权重。但应该选多少样本呢?对于非常大的预训练任务,批次大小可能达到数百万,就像在Llama 3.1中那样,这有助于减少过拟合并提高模型的泛化能力。而对于像Unsloth的Llama 3.2笔记本中的微调任务,批次大小可能只有较小的32。 问题在于大批次的内存使用量非常大。如果1个批次使用1单位内存,那么100万大小的批次将需要100万单位内存。我们如何模拟大批次训练但又不消耗大量内存呢? 这就是梯度累积的用武之地!我们通过在每次新的小批次到来时即时创建梯度,然后将所有小梯度加起来,进行适当缩放,从而获得最终的大批次梯度。 可能的解释 一种流行的理论认为梯度累积在累积步骤中存在数值误差。但研究人员发现,即使在float32中进行累积也会产生相同的问题。我们的研究表明,确实存在一些微小的累积误差。 第二种理论是损失计算中存在bug,我们确认了这一点。 数学上是否等价? 梯度累积和完整批次训练在数学上是否等价?遗憾的是,如果简单地将梯度加起来,答案是否定的!我们首先注意到交叉熵损失是通过以下方式计算的: $$ \frac{1}{\sum \mathbb{I}\{y_i \neq -100\}} \sum L_i $$ 注意分母计算的是非填充或非忽略的token数量 - 即它通过每个文本片段中有效训练token的数量来归一化损失。指示函数实际上是未填充token的总和,也就是所有序列长度的总和,即: $$ \mathbb{I}\{y_i \neq -100\} = \sum m_i $$ 因此我们得到最终方程为: $$ \frac{\sum L_i}{\sum m_i} $$ 然后我们在分子和分母中同时添加 $\frac{1}{n}$ - 这是允许的,因为两者可以相互抵消: $$ \frac{\frac{1}{n}\sum L_i}{\frac{1}{n}\sum m_i} $$ 这意味着最终损失是平均损失值除以所有未填充序列长度的平均值: $$ \frac{\bar{L}}{\bar{m}} $$ 在进行梯度累积时,我们需要分别计算每个小批次的损失,然后将它们加起来得到最终损失。我们首先利用每个分区的平均损失和平均序列长度。 但我们发现,最终总和不等于原始的完整批次损失 - 实际上它比原来大$G$倍(其中$G$是梯度累积步骤的数量)。 ...

March 24, 2025 · 小茄墩