第 3 步:配置 LinearRegressor
接下来,我们将使用 LinearRegressor 配置线性回归模型,并使用 GradientDescentOptimizer
(它会实现小批量随机梯度下降法 (SGD))训练该模型。learning_rate
参数可控制梯度步长的大小。
梯度 (gradient):偏导数相对于所有自变量的向量。在机器学习中,梯度是模型函数偏导数的向量。梯度指向最速上升的方向。
梯度下降法 (gradient descent):一种通过计算并且减小梯度将损失降至最低的技术,它以训练数据为条件,来计算损失相对于模型参数的梯度。通俗来说,梯度下降法以迭代方式调整参数,逐渐找到权重和偏差的最佳组合,从而将损失降至最低。
上面的术语解释读起来比较抽象,并且为了防止文章篇幅过长,看了上面忘了下面,所以模型的实现过程放在遇到问题在下面解释
- 下图显示了机器学习算法用于训练模型的迭代试错过程
[图片上传失败...(image-1c3df5-1577779381815)]
输入特征=>模型预测=>根据结果计算一下损失(损失就是距离target的差距),然后将参数更新,再放回模型中预测,直至收敛,使得损失变得最小,这时候的参数就是我们想要的参数
- 下图是上图中"计算参数更新"的绿框中的内容
[图片上传失败...(image-d33ae2-1577779381815)]
假设我们能够将所有种可能情况全都计算一遍,那么得到的一定是一个类似于这样的碗状图,在其中必定有一点是损失最低的点,但是现实种我们肯定不会有那么大的计算能力和时间去计算出每个结果,我们通常采用一种叫做梯度下降法的方式来"快速"的找到损失最低的点(梯度下降法属于一种优化算法,虽然并不是最好的优化算法,但是其方式简单,应用也很多)。
起点是随意选定的,因为在预测的开始时,没有人知道权重(w1,w2,w3..b)该是什么,可以设置为0,也可以设置为1,无所谓。通过模型一次计算,计算得出损失(这时候损失并不重要,肯定极大,没有参考意义),然后计算起点处的偏导数(如果只有一个权重那就是导数了),得出起点处的偏导数,而梯度是偏导数的矢量(即包含了此处偏导数的方向和大小),可以想象一下抛物线y=ax²+bx+c 在x0处的导数,其大小的绝对值是随着x0的值而变化的,并且有正负之分,绝对值大小代表大小,正负代表方向,所以依据梯度就可以确定权重值调节的方向。
至此,调节的基本原理说的就差不多了,那么剩下的问题就是如何更好的优化,以便用最少的计算量最快的速度去达到目的。
- 学习速率(也称为步长)
1.学习速率过慢 [图片上传失败...(image-237074-1577779381815)]
2.学习速率过快 [图片上传失败...(image-c78e31-1577779381815)]
3.学习速率比较好的 [图片上传失败...(image-818959-1577779381815)]
如果让其按照每个点本身的梯度大小来调节权值,那实在是太慢了,所以我们可以为其乘上一个学习速率,意如其名,这样可以人手动的调节学习速率(或许有的人会担心,当即将逼近损失最小的点时,这样会不会不太准确了,放心好了,我们并不需要那么的准确的权值,99%和98%的区别不是太大,但是所要付出的计算量却是超大的)
附上谷歌提供的:优化学习速率体验
下面是两种个效果更好的梯度下降算法方案,第二种更优 随机梯度下降法 (SGD) :它每次迭代只使用一个样本(批量大小为 1)。“随机”这一术语表示构成各个批量的一个样本都是随机选择的。(假设有10000个样本,每次从中随机选一个来执行梯度下降)
小批量随机梯度下降法(小批量 SGD)是介于全批量迭代与 SGD 之间的折衷方案。小批量通常包含 10-1000 个随机选择的样本。小批量 SGD 可以减少 SGD 中的杂乱样本数量,但仍然比全批量更高效。(每次随机选一批)
注意:为了安全起见,我们还会通过 clip_gradients_by_norm
将梯度裁剪应用到我们的优化器。梯度裁剪可确保梯度大小在训练期间不会变得过大,梯度过大会导致梯度下降法失败。
解释完毕,以上