在进行深度学习研究的时候,神经网络的训练过程常常会使绊子,例如运转不起来,预测结果出错等等。当遇到这些问题,你可能就手足无措了。
特斯拉主管曾在Twitter上分享了他对神经网络的一些研究技巧,来看看这些大家常踩的坑吧。
- 在使用大的数据集训练神经网络时候先使用小数据集测试排除一些常见错误,对于数据我们一一般会使用三种处理方法:min-batch SGD将所有数据作为一个批次,这种做法能保证训练一个大的批时候能够保证梯度朝着一个正确的梯度方向,但是大部分我们使用min-batch,然后调节其中的批量大小这个超参数
- 忘记使用网络切换训练/评估模型针对模型训练和评价时候出现的批量标准化和退出方法模式。
- 忘记设置.zero _ grad()在pytorch中忘记了在.backward()之前.zero _ grad()会出现各种nan,导致结果很差,寻找原因是打印出来梯度看看是不是某些层参数为0,说明几乎没有学习。
- 防止将softmaxed参数传给损失函数,一般情况是可以run运行但是想法没法work。
- batchNorm时候,没有对线性/二卷积层的bias = False或者忘记了将其包含在输出层,这种虚假的参数将会出现和所说的一样。这里特别注意如果卷积层后面BatchNormallzation卷基层就不需要设偏置参数b,只需要将其参数w设置就行。
- view( )的使用和permute( )的使用。例如张量tensor的转换问题:将一个(2,12)的tensor改为(4,2,3)的tensor,这种情况不能直接使用view()而要使用permute( )来交换axis(转换2D的matrix):
![3be3ca61e05628863842e5c3bc46252f.png](https://i-blog.csdnimg.cn/blog_migrate/c0ce198a0d9650881d649d0bfc94de76.jpeg)
之后,在评论区,也有读者针对“对数据初始化”展开了讨论。
对此,Ian Goodfellow也进一步详细解释:
“是的,有几次我重新打开数据,得到的损失值却一致,而且如果这样做会产生一个漂亮的损失曲线,这表明对数据初始化并不是明智的做法。我有时喜欢调整最后一层偏差,使之接近基础分布。
我喜欢先从最简单的开始,例如,先对所有未处理的数据进行训练,看看基本输出分布的表现如何,然后再增加输入和扩大网络,确保每次都比以前的表现更好。”