【论文精读】FUNCTION VECTORS IN LARGE LANGUAGE MODELS

论文:FUNCTION VECTORS IN LARGE LANGUAGE MODELS

作者:Eric Todd,∗ Millicent L. Li, Arnab Sen Sharma, Aaron Mueller, Byron C. Wallace, and David Bau

发表:ICLR2024

摘要

我们报告了一种简单的神经机制的存在,该机制将输入输出函数表示为自回归变压器语言模型(LM)中的向量。对各种上下文学习(ICL)任务进行因果中介分析,我们发现少量注意力头传输所演示任务的紧凑表示,我们将其称为函数向量(FV)。 FV 对上下文的变化具有鲁棒性,即它们会在零样本和自然文本设置等输入上触发任务执行,这些输入与收集它们的 ICL 上下文不同。我们在一系列任务、模型和层中测试 FV,并在中间层的设置中发现强烈的因果效应。我们研究了 FV 的内部结构,发现虽然它们通常包含对函数输出空间进行编码的信息,但仅此信息不足以重建 FV。最后,我们测试了 FV 中的语义向量组合,发现在某种程度上它们可以相加来创建触发新的复杂任务的向量。我们的研究结果表明,可以从LLM中明确提取函数抽象的紧凑、因果内部向量表示。

方法

作者发现了在大模型ICL过程中存在一个FV函数向量,让模型理解要执行的下游任务是什么。

在特定层添加FV(激活向量)可以诱导模型在新的上下文中执行相似的任务

作者首先用实验验证了,一些层的平均激活值可以记录模型的任务表征,通过将平均激活值添加到zero-shot模型层中,可以诱导模型生成相同的任务,准确率达到23%。

但是这一准确率较低,只能证明通过添加平均激活值可以使模型从zero-shot中理解ICL任务。

作者首先对注意力头进行平均值计算,将ICL的输入提示词与任务x随机化,让那个模型不能通过ICL正确推导出任务x的正确响应y,作者将输出目标替换为任务输出目标,使得模型不能理解ICL任务。

将替换前后的概率做差,成为因果间接效应CIE,对所有任务取均值,得到这一层在所有任务上的平均间接效应AIE。

通过AIE计算模型中最具有因果效应的注意力头,如GPT-J A=10,将注意力头计算平均值就可得到函数向量的表示形式:

v_t = \sum _{a_{lj}\in A}\bar{a}_{lj}^t

实验

考虑两个问题:

1. 功能向量在不同的ICL任务中是否都能提取

2. 验证FV的可移植性:即在提示符的最后标记位置向特定层添加功能向量在多大程度上会导致语言模型在与提取功能向量的 ICL 上下文不同的语境中执行任务。

作者观察到:基本模型在zero-shot和无信息打乱的ICL提示词不能执行下游任务,但是添加FV后可以精准执行

作者选取了六个简单任务进行实验,以及一系列decoder-only的自回归编码模型,其中根据模型参数的大小选择注意力头数量不同,如Gpt-J A=10, llama-2-6b A=20等,上图展示了六个任务在两个条件下,添加FV前后的准确度变化。以反义任务为例,作者选取5个提示任务作为一组,计算准确度。

总结

功能向量是一个令人惊讶的发现。自2020 年以来,人们一直在研究 LLMs 的metalearning能力,这些能力似乎足够复杂,难以捉摸。然而,在本文中,我们在一系列Transformer-based LLMs 中发现了一种简单的机制,这种机制在各种任务中都很常见,而且对上下文的变化也很稳健:功能向量(FVs)代表了隐藏状态中的任务。功能矢量可以从一小部分固定的注意头中明确提取出来,这些注意头很容易识别,而且这些功能矢量就像单词矢量一样简单地代表了一系列任务--然而我们的发现也揭示了功能矢量一定是一种独特的现象。虽然 FVs 还不能完全说明 ICL 是如何工作的,但它们确实为 ICL 中的一个中介层次提供了新的清晰度,并为未来研究全面描述 LLM 中的功能执行开辟了一条新的道路。

### 回答1: 这个错误是因为在函数 "cv::collectCalibrationData" 中,参数 "objectPoints" 应该是一个由向量组成的向量,每个向量都包含 "Point3f" 型的点。您可以检查一下您的代码,看看是不是在调用该函数时,将 "objectPoints" 参数传递为了一个错误类型或格式的变量。如果您仍然无法解决问题,请提供更多的上下文信息,以便我更好地帮助您解决问题。 ### 回答2: 在函数'cv::collectCalibrationData'中,参数objectPoints应该是一个Point3f类型的点的向量的向量(vector of vectors)。具体来说,objectPoints是一个存储了多个平面点集的容器,每个平面点集都是一个Point3f类型的点的向量。 Point3f是OpenCV中定义的一种数据类型,它表示一个三维点,包含了三个浮点类型的坐标值,分别表示该点在三维空间中的x、y、z坐标。因此,objectPoints向量的每个元素都是一个平面点集,其中的每个元素都表示了一个三维点。 为了更好地理解objectPoints,可以将其想象为一个矩阵,每一行表示一个平面点集,每一列表示一个三维点的坐标。通过使用objectPoints参数,在函数'cv::collectCalibrationData'中可以传递多个平面点集的信息,便于在后续的摄像机标定过程中使用这些点集进行计算和优化。 通过使用objectPoints参数,函数'cv::collectCalibrationData'可以收集并整理多个平面点集的信息,为后续的摄像机标定提供准确的输入数据。这样的设计为用户提供了更灵活和高效的方式来处理多组平面点集,满足了不同应用场景下对于摄像机标定数据的需求。 ### 回答3: 在OpenCV中,函数'cv::collectCalibrationData'中的objectPoints参数应包含Point3f类型的点的向量的向量。 Point3f是OpenCV中的一个类,用于表示三维空间中的点。其包含三个成员变量:x,y和z,分别表示点在三个坐标轴上的坐标。 在函数'cv::collectCalibrationData'中,objectPoints参数是用于存储标定对象的三维点信息的。标定对象通常是一个具有已知大小和形状的物体,通过对其进行图像采集和分析,可以推断出相机的内外参数,从而实现摄像机的准确定位。 objectPoints应该是一个向量的向量,其中每个子向量包含若干个Point3f类型的点。这样可以存储多个标定对象的信息,每个标定对象由多个三维点组成。 举个例子,如果我们要标定一个棋盘格模板,棋盘格上每个交叉点可以看作是一个三维点。我们可以在objectPoints中存储多个棋盘格的三维点信息,每个棋盘格由若干个三维点组成的向量表示。 在函数'cv::collectCalibrationData'中,当我们调用该函数时,需要传入objectPoints参数并填充数据。在使用标定函数进行相机标定之前,我们需要提前收集好标定对象的三维点信息,并将其存储在objectPoints中,以便函数可以使用这些数据进行标定。 总结而言,函数'cv::collectCalibrationData'中的objectPoints参数是用于存储标定对象的三维点信息的向量的向量,每个子向量包含Point3f类型的点,用于实现相机的准确定位和标定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值