[算法学习] Test-Time Training的工作原理
[算法学习] Test-Time Training的工作原理
[算法学习] Test Time Training的工作原理 [算法学习] Test Time Training的工作原理 Modified December 10, 2025 7663 8269 然后我现在增加了一个没有训练过的辅助任务,目标是让模型预测测试点到原点的距离平方。在训练分类任务时,参数 w1,w2,b仅被调整以优化分类损失。现在,辅助任务的损失引入了一个新的梯度方向,模型的参数将同时适应两种任务(分类和距离预测): 初始设置 1. 数据设置: 测试点:x = (2,4) 辅助任务:预测点到原点的距离 2. 模型设置:特征提取器公式 y ^ dist =f θ (x)=θ 1 ⋅2+θ 2 ⋅4−1 这里的θ代表数据点两个维度的对应权重 设置初始参数: θ 1 =0.5,θ 2 =0.6 初始学习率 η=0.01 3. 辅助任务目标:方便一点直接用欧几里得距离平方,不开根号计算实际值了 y dist =x 1 2 +x 2 2 =2 2 +4 2 =20 步骤1:辅助任务微调 1. 计算辅助任务目标: 把点 x=(2,4) 输入模型: y ^ dist =f θ (x)=θ 1 ⋅x 1 +θ 2 ⋅x 2 =0.5∗2+0.6∗4−1=2.4 2. 计算损失(平方误差): 辅助任务的损失函数: L dist = 2 1 ( y ^ dist −y dist ) 2 带入真实目标 y dist =20 , y ^ dist =2.4 L dist = 2 1 (2.4−20) 2 =154.88 3. 梯度计算: ∂θ 1 ∂L dist =( y ^ dist −y dist )⋅x 1 =(2.4−20)∗2=−35.2 ∂θ 1 ∂L dist =( y ^ dist −y dist )⋅x 2 =(2.4−20)∗4=−70.4 4. 更新参数: 使用梯度下降公式: 关于梯度下降算法的详细解释,移步 [算法学习] 从0开始掌握反向传播算法 带入学习率0.1 θ 1 ←θ 1 −η⋅ ∂θ 1 ∂L dist =1.704 θ 2 ←θ 2 −η⋅ ∂θ 2 ∂L dist =5.216 步骤2:分类任务预测 1. 更新后重新预测: 使用更新后的参数 θ 1 =1.704 , θ 2 =5.216 ,重新计算分类特征: z=f θ (x)=θ 1 ⋅2+θ 2 ⋅4−1=5.92 2. 分类输出: 根据分类器的预测 z=5.92 大于0,被归类为蓝点 步骤3:迭代参数 这种方法快速得出了一个新的参数,同时适用于固定任务和新任务,但由于计算出的Loss值非常大,对于两个任务的表现都不好,这个时候就需要用到多次迭代来做计算了。写一个参数迭代的脚本,设置迭代次数20次 Code block Plain Text import numpy as np class IterativeLinearClassifier: def init (self, w1=0.5, w2=0.6, b= 1, learning rate=0.01): """ 初始化线性分类器。 参数: w1, w2: 初始权重 b: 初始偏置 learning rate: 学习率 """ self.weights = np.array([w1, w2]) 初始权重 self.bias = b 初始偏置 self.learning rate = learning rate 学习率 self.loss history = [] 记录损失的历史 def compute loss and gradients(self, x, y dist): """ 计算当前损失值和梯度。 参数: x: 输入点 (特征向量) y dist: 辅助任务目标值 返回: loss: 当前损失 gradient w: 权重梯度 gradient b: 偏置梯度 """ 模型预测 prediction = np.dot(x, self.weights) + self.bias 计算损失 loss = 0.5 (prediction y dist) 2 计算梯度 gradient w = (prediction y dist) x gradient b = (prediction y dist) return loss, gradient w, gradient b def update parameters(self, gradients): """ 使用梯度更新模型参数。 参数: gradients: 包括权重梯度和偏置梯度的元组 """ gradient w, gradient b = gradients self.weights = self.learning rate gradient w self.bias = self.learning rate gradient b def fit(self, x, y dist, iterations=20): """ 训练模型,迭代更新参数。 参数: x: 输入点 (特征向量) y dist: 辅助任务目标值 iterations: 迭代次数 返回: weights: 训练后的权重 bias: 训练后的偏置 """ for i in range(iterations): loss, gradient w, gradient b = self.compute loss and gradients(x, y dist) self.update parameters((gradient w, gradient b)) self.loss history.append(loss) 打印每次迭代的损失以便调试 print(f"Iteration {i+1}: Loss = {loss:.6f}") return self.weights, self.bias 测试点及其真实辅助任务目标 test point = np.array([2, 4]) 测试点 (2, 4) true distance = 2 2 + 4 2 真实目标:x1^2 + x2^2 创建分类器实例 iterative classifier = IterativeLinearClassifier() 多轮迭代优化 final weights, final bias = iterative classifier.fit(test point, true distance, iterations=20) 打印最终参数和损失历史 print("\nFinal Parameters:") print("Final Weights:", final weights) print("Final Bias:", final bias) print("Loss History:", iterative classifier.loss history) 下面是20次迭代后的loss值收敛状态,从154.88收敛到了0.019 最终更新的参数为: y ^ dist =f θ (x)=2.1611⋅x 1 +3.9223⋅x 2 +0.1694 对比一下原始的分类器和优化后的分类器,分类方法产生了一定偏移 [[算法学习] 从0开始掌握反向传播算法](https://waytoagi.feishu.cn/wiki/XhFDwymwMiEMT6kkSCKc3LKinHd) 然后我现在增加了一个没有训练过的辅助任务,目标是让模型预测测试点到原点的距离平方。在训练分类任务时,参数 w1,w2,b仅被调整以优化分类损失。现在,辅助任务的损失引入了一个新的梯度方向,模型的参数将同时适应两种任务(分类和距离预测): 初始设置 1. 数据设置: 测试点:x = (2,4) 辅助任务:预测点到原点的距离 2. 模型设置:特征提取器公式 y ^ dist =f θ (x)=θ 1 ⋅2+θ 2 ⋅4−1 这里的θ代表数据点两个维度的对应权重 设置初始参数: θ 1 =0.5,θ 2 =0.6 初始学习率 η=0.01 3. 辅助任务目标:方便一点直接用欧几里得距离平方,不开根号计算实际值了 y dist =x 1 2 +x 2 2 =2 2 +4 2 =20 步骤1:辅助任务微调 1. 计算辅助任务目标: 把点 x=(2,4) 输入模型: y ^ dist =f θ (x)=θ 1 ⋅x 1 +θ 2 ⋅x 2 =0.5∗2+0.6∗4−1=2.4 2. 计算损失(平方误差): 辅助任务的损失函数: L dist = 2 1 ( y ^ dist −y dist ) 2 带入真实目标 y dist =20 , y ^ dist =2.4 L dist = 2 1 (2.4−20) 2 =154.88 3. 梯度计算: ∂θ 1 ∂L dist =( y ^ dist −y dist )⋅x 1 =(2.4−20)∗2=−35.2 ∂θ 1 ∂L dist =( y ^ dist −y dist )⋅x 2 =(2.4−20)∗4=−70.4 4. 更新参数: 使用梯度下降公式: 关于梯度下降算法的详细解释,移步 [算法学习] 从0开始掌握反向传播算法 [[算法学习] 从0开始掌握反向传播算法](https://waytoagi.feishu.cn/wiki/XhFDwymwMiEMT6kkSCKc3LKinHd) 带入学习率0.1 θ 1 ←θ 1 −η⋅ ∂θ 1 ∂L dist =1.704 θ 2 ←θ 2 −η⋅ ∂θ 2 ∂L dist =5.216 步骤2:分类任务预测 1. 更新后重新预测: 使用更新后的参数 θ 1 =1.704 , θ 2 =5.216 ,重新计算分类特征: z=f θ (x)=θ 1 ⋅2+θ 2 ⋅4−1=5.92 2. 分类输出: 根据分类器的预测 z=5.92 大于0,被归类为蓝点 步骤3:迭代参数 这种方法快速得出了一个新的参数,同时适用于固定任务和新任务,但由于计算出的Loss值非常大,对于两个任务的表现都不好,这个时候就需要用到多次迭代来做计算了。写一个参数迭代的脚本,设置迭代次数20次 下面是20次迭代后的loss值收敛状态,从154.88收敛到了0.019 最终更新的参数为: y ^ dist =f θ (x)=2.1611⋅x 1 +3.9223⋅x 2 +0.1694 对比一下原始的分类器和优化后的分类器,分类方法产生了一定偏移 👨💻 作者:吵爷 作者:吵爷 基础概念 Test Time Training(TTT)算法是一种机器学习方法,旨在通过在测试阶段使用额外的训练步骤来提高模型的性能。它是一种将训练过程与测试过程动态结合的技术,主要应用于处理测试分布与训练分布存在偏差的场景,例如领域自适应或应对分布漂移的问题。 核心思想 TTT算法在模型测试时,不仅直接用模型进行预测,还会引入一个额外的目标函数(auxiliary loss),用测试样本来微调或更新模型的某些部分(通常是低阶参数,如特征提取器)。这个目标函数的设计可以帮助模型在新的分布下重新学习表征,从而提高对当前测试样本的适应性。 TTT的特点 动态自适应:模型在测试时可以动态调整,以适应测试数据分布。 低计算开销:相比完全重新训练模型,TTT仅在小规模样本上进行少量训练,效率较高。 无监督适应:通常只利用测试样本的无监督信号(如自监督任务的损失),不需要额外标注。 举个例子,假设在训练阶段,一个分类模型还同时被训练了一个辅助任务,如预测输入样本的旋转角度。在测试阶段,模型会通过优化旋转预测任务的损失函数,更新特征提取层的参数,使其更好地适应当前测试数据分布,然后再进行分类。 和标准Fine tuning的区别 计算实例 假设我们有一个训练好的二维平面线性分类器的模型,主要任务是对红点和蓝点进行分类(随便写一个),测试时通过辅助任务微调特征提取器参数。 原始分类模型: z=0.5∗x 1 +0.6∗x 2 −1 当z 大于等于0,则判定为蓝点,如果z小于0则判定为红点