今天挖了个坑,关于优化器的初始化。
优化器的初始化函数:
create_optimizer
在梯度反传的时候,我们用随机梯度下降等优化方法的时候,需要对一个batch_size的梯度求和然后求平均再反传。
这个就涉及到一个参数:rescale_grad。
这个参数的作用就是对梯度进行求平均,按道理应该是(实际也是)rescale_grad=1/batch_size。
但是在optimizer中,初始化的这个值是默认1的,所以在训练的时候就容易发散。
当我们直接调用model.fit的时候,fit.py对于有没有手动初始化优化器有两个选择。当手动初始化的时候,也就是自己在fit之外初始化了优化器,那优化器的参数是手动设置的或者就是按照init函数里面的。如果没有手动初始化,那fit.py则会自己初始化一些参数。
这其中的最大区别就是,rescale_grad的初始化,手动默认的为1,而fit中的为正确的1/batch_size。
所以,这个在手动初始化的时候千万记得设置为正确的值。或者就不要自己初始化,交给module.fit就好。