用 AI 走一轮 PCGrad:两个任务相互牵制,投影后为何不再直接抵消

昨天 3阅读

共享骨干同时服务分类与回归时,一个任务希望参数向某方向移动,另一个可能希望它反向移动。PCGrad检查任务梯度的点积,在发生冲突时去掉冲突分量。理解它要同时记住:梯度指向上升,真正的梯度下降更新用的是相反方向。

用 AI 走一轮 PCGrad:两个任务相互牵制,投影后为何不再直接抵消

AI生成的概念示意图:不同任务方向可以经过投影再汇合;箭头长度与角度不对应正文数值,也不是训练过程截图。

先在同一个参数位置收集梯度

教学参数为θ=(x,y),当前θ=(0,0)。两个任务损失分别为L₁=[(x+3)²+y²]/2与L₂=[(x-1)²+(y+1)²]/2。因此原始梯度g₁=(3,0),g₂=(-1,1),点积为-3,夹角大于九十度。

如果直接相加得到g=(2,1),按学习率0.1下降,新参数为(-0.2,-0.1)。原来两个损失分别为4.5与1,更新后为3.925与1.125:总损失下降,却让第二个任务变差。总目标改善并不表示每个任务都改善。

减掉的是冲突投影,不是翻转整个梯度

PCGrad对g₁的副本做修正:g₁′=g₁-[(g₁·g₂)/||g₂||²]g₂。这里||g₂||²=2,所以g₁′=(3,0)-(-3/2)(-1,1)=(1.5,1.5)。与原g₂再点乘,结果正好为0。

对g₂的副本同样用原g₁作为参考:g₂′=g₂-(-3/9)g₁=(0,1)。它与原g₁的点积也为0。必须保存原始梯度;不要先覆盖g₁,再把已经改过的g₁′当成另一任务原始参考,那会换成另一套运算。

本文明确用两份修正梯度之和,得到(1.5,2.5)。以相同学习率更新到(-0.15,-0.25),两损失为4.0925和0.9425,均比初值小。这是本例对给定步长的直接验算,不是对所有非线性模型和任意步长的承诺。

局部方向有利,还需要检查实际落点

修正总梯度与原g₁的点积为4.5,与原g₂的点积为1。沿负总梯度走很小一步,两项的一阶变化都为负。但步子过大时,曲率项仍可能让损失增加;必须把更新后的参数代回损失,不能只检查夹角。

有的训练流程将任务梯度平均,而不是求和。对两个任务,平均会把总方向长度减半,若要比较同一移动量就需同步核对学习率。还要区分共享参数与任务独有参数,不能把不同维度的梯度硬拼成一个任务向量。

多于两个任务时,保留投影顺序

可以要求AI:“列原始梯度、冲突点积、参考范数、每次投影后的副本、最终合并方式与更新后损失;禁止在收集梯度中途更新参数。”本次程序还用中心有限差分复核两项初始梯度,逐项计算两条更新路线的损失。

原算法随机遍历其他任务;多个连续投影可能互相影响,三任务以上不能默认交换顺序不变。遇到零范数参考梯度,应跳过相应除法。PCGrad也不能替代任务权重、数据质量与独立验证集评估;这个例子的作用是帮助定位梯度处理逻辑,而不是预测真实训练收益。

把每个任务的变化单独记下来

在真实多任务训练的调试记录里,可先抽取一个固定小批次,保存修正前后梯度范数与两两点积,再分别计算各任务损失。若只保存合计损失,本文普通更新中第二项恶化的现象就会被隐藏。任务量纲差异也要同时记录,一个损失整体乘上常数会改变梯度长度和合并后的更新。

验收还可加入两组边界数据:两任务梯度点积为正时,投影步骤应保持它们;两梯度完全反向时,双方可能都被投影到零。后者意味着这条规则在当前位置没有给出移动方向,不等于两项任务已经各自达到最优。下一步应检查权重、目标冲突与采样,而不是把零梯度当成训练成功。

资料核对日期:2026年10月2日。数据为原创教学设定,已用独立本地程序复核,未进行真实模型训练或生产效果测试。

参考资料

Yu等:Gradient Surgery for Multi-Task Learning,第3节及算法1

文章版权声明:除非注明,否则均为云鹊BLOG原创文章,转载或复制请以超链接形式并注明出处。