周报(7.1-7.7)
本周工作:
- 分析对比了InversionNet的优化工作
- 完成对InverseNet的基本训练
- 学习权重衰减,形成博客一篇。
代码对比
在学习师兄的InversionNet后,我发现我们的代码存在数处不同。在研究后,我记录并学习了几个主要的不同点:
激活函数不同
在论文中,我发现原作者使用了Relu作为激活函数。但师兄选择了Tanh作为激活函数,还将普通的Relu函数替换为了Leaky Relu。在原始的ReLU函数中,如果输入值小于0时输出为0,会导致在反向传播过程中权重的更新梯度值为0,从而导致无法学习,称之为“神经元死亡”现象。LeakyReLU的负数输出可以避免这种情况的出现。
而无论是Relu,亦或者是Leaky Relu,都尽可能忽略了神经元的负值输出,并且两者的输出值域也非常宽广。虽然速度图像中不含有负值,但速度图像本身数据值较大,且波动也较大,为了加快网络学习的速度,防止梯度爆炸,我们可以对速度图像数据进行归一化处理,根据归一化的方法不同,速度图像中可能出现负值,这时只能输出正值的Relu激活器就已经不再适用。而Tanh会将输入映射到[-1, 1]范围内的特性反而适合速度图像的数据特征,模型可以完整的利用Tanh的两个特性。并且,无论是Relu还是Leaky Relu,两个激活函数都比较线性,表达非线性关系的能力较弱,而Tanh的曲线图像能为模型带来更多非线性因素。
损失函数不同
在原始论文中,作者使用了L1 Loss,而在师兄的代码中使用的是MSE Loss(L2 Loss)。针对两者的范数的不同点,我形成了学习笔记记录到权重衰减的博客中。简单来说,虽然L1 Loss和MSE Loss都衡量的是预测值和真实值的差异,但L1范数损失鼓励模型产生稀疏的权重或特征选择。而MSE损失的优点是对较大的预测误差有较高的惩罚,因为差异的平方放大了较大的误差。相较而言MSE更适合地震反演的任务。
优化器不同
在原始代码中,我是用了SGD进行训练,而在师兄的代码中使用了Adam。关于两者的区别和关系可见上周形成的博客。
下一步工作:
- 继续学习地震反演原理,深度学习原理。
- 学习FCNVMB网络并复现代码