让 AI 追踪梯度反转层:前向值没变,为什么两部分参数朝相反目标更新

昨天 3阅读

模型从一种拍摄环境迁到另一种环境时,希望特征仍能完成任务,同时少依赖环境身份。领域对抗训练加入一个预测域来源的分支:域预测头努力分清来源,特征提取器则接受相反方向的域信号。梯度反转层把这两个目标接在一起,却不改变前向特征。

让 AI 追踪梯度反转层:前向值没变,为什么两部分参数朝相反目标更新

AI模型生成的概念插图:域分支有单独返回的反向信号;不是精确网络结构、训练截图或实际数据流。

同一个前向数值,两条损失分支

用平方损失构造一个仅验证梯度方向的标量练习,避免把它当作完整领域分类器。输入x=2,特征f=wx,初始w=1,所以f=2。任务分支直接预测f,目标为3,损失L任务=(f-3)²/2=0.5。

域分支预测d=vf,初始v=1,目标暂取0,损失L域=d²/2=2。在特征与域分支之间放梯度反转层:前向原样传f,反向只把经过它的梯度乘-λ。固定λ=0.5,域损失自身的外部权重保持1。

只改变返回特征的域梯度

任务损失对f的导数为f-3=-1。域损失对f的普通导数为d×v=2;经过反转层后成为-0.5×2=-1。两条信号相加为-2,再乘f对w的导数x=2,得到w的更新用梯度-4。

域预测头v位于反转层之后,其梯度没有经过该层,仍为d×f=4。取普通梯度下降学习率0.1,分别得到新w=1.4、新v=0.6。必须在同一个初始状态算完两项梯度,不能先更新w再用新特征偷偷重算v的梯度。

若把整个域损失直接改成-0.5L域,v也会收到负梯度-2,更新到1.2,反而帮助域分支把自己的损失做大。这样改变了原本应该认真辨域的预测头,不等价于仅对上游特征做梯度反转。

观察相反目标时,先固定另一方

只更新特征w到1.4、暂时固定v=1,域损失由2升到3.92,任务损失降为0.02。只更新域头v到0.6、固定w=1,域损失则降到0.72。两者确实在域目标上使用相反方向。

若二者同时更新,域损失为1.4112,仍低于初始2。不能仅看到联合更新后的域损失下降,就断言反转层失效;预测头的改进也在发生。实际训练还会受任务梯度、步长与模型容量共同影响。

本次程序分别对特征目标L任务-0.5L域、以及域头目标L域做有限差分,复核-4与4。不要对反转层的恒等前向函数直接做普通导数检查:真正恒等函数的导数是1,而该层故意规定另一套返回梯度,它不是普通标量前向函数的自然导数。

让AI交付每项梯度属于哪组参数、经过哪一层、系数放在哪一处,再核对更新。若实现已把λ乘到域损失,就不要又不加区分地重复缩放。λ=0会阻断域分支对特征的影响,但按本文约定域头仍可正常学习。对齐域信息也不自动保证目标域任务准确,需要单独评估。

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

参考资料

Ganin等:Domain-Adversarial Training of Neural Networks,第4节

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