记录深度模型训练的一大坑
最近一直在做深度模型的实验,使用的基模型是resnet50.
根究对模型的设计,模型在参数更新时会受到来自4方面的不同梯度的影响。可能就是影响太多,对模型的效果反而有了负面的影响,接下来的工作是减少对模型影响的梯度,逐个实验。
loss = raw_loss + part_loss + concat_loss
损失函数包括3个部分,模型的输入有两个来源,raw image 和 part image,分别对应raw_loss, part_loss; concat_loss是raw 和 part的特征连接后的概率对应的损失。
下面将模型还原为原始的基模型:
按照模型更新的反向传播原理,令loss仅保留raw_loss就可以实现。然而结果证明这样并不能得到基模型的结果。卒。。
然后开始怀疑代码逻辑是否有问题,一顿实验。。。
后来,询问大佬同学,得知,很有可能是BN的问题,原理如下:
BN发生在forward的过程中,且是自动发生的。模型的参数是通过backward(), step(),更新的
我为什么会出现这个问题,我的伪代码如下:
p1 = model(raw_image)
p2 = model(part_image)
loss = cross_entropy(p1,y)
大致就是这个逻辑。就是对model而言,有两个流的image输入,虽然最后损失只用到了raw image,但是part image的输入已经在前向的BN过程中对模型造成了影响,所以这样得不到基模型的结果。