在训练过程中,会不断的通过调整 W 和 B 参数进行模型构建,进行目标拟合,得出参数过程需要解决两个问题:
如何判断收敛状态
如何参数调整方向和值
判断参数在每轮的收敛状态是通过一个叫损失函数(Loss Function)来完成的。即,判断 f(x)=w*x+b 的 w 和 b 是否最优解,只需要衡量真实值(训练样本值)g(x) 和测量值(训练结算值)f(x) 的均方误差是否是最小值(显然趋于 0 为最小时)。
上面代码中的 loss_fn = nn.MSELoss (),这里的 MSELoss 就是指均方误差损失函数:
参数的调整(加多少,减多少)是通过梯度下降方式实现的,也就是通过求一阶导数,来看函数单调性(一阶导数 > 0,函数单调递增,函数值随自变量的增大而增大)。
比如只看 w 时,对求 w 导数,即,当 w 初始值为 1.8 时,L=11.417163316>0,在局部单调递减下,w 值的调整方向应该是左,也就是 w=1.8-s(比如 1.5)。
方向确定后,每次迭代调整的值,就变成在 w 轴上无限趋近极值的导数值,在曲率大的地方大幅快速,小的地方小幅趋近。
当函数变复杂起来,极值的查找,靠的是初始值运气,不一定每次都能找到最优解。
在更复杂的场景,比如上面的二元函数拥有两个主要自变量(x1,x2),在图像上表现如下:
这个时候准确来说,L 是多元中 w1 的偏导。
无法同时得出 w1、w2 和 b 的最优解,也就是全局最优解是无法得出的,最理想的情况就是假定 w2 和 b 为最优解的情况下,求 w1 最优解,然后再已 w1 最优解和假定 b 为最优解的情况下,求 w2 最优解,这样求出来的是局部最优解。
为了防止 L 导致迭代幅度过大,会再乘以一个小数,最终(lr:learning rate,一般设置 0.01~0.001)。
lr 的设定大小会影响效果和成本,简要说设大了会导致每次猜测幅度过大而导致的忽略了很多候选参数,跳过了最优值,这是对训练效果而言,同时对成本也会造成参数选值的震荡(围绕极优值来回摆动)而无法收敛,而设置小了容易在 L (w1,w2,b) 函数曲线多凸情况下,陷入局部的极小值,而无法发现整体的极小值,同时也导致了训练时长和深度的增加,也会在局部极小值消耗过多成本。返回搜狐,查看更多