- 机器学习编程:从编码到深度学习
- (意)保罗·佩罗塔
- 949字
- 2021-06-01 17:13:21
2.3 添加偏置
看看我们刚才画的图。我们的直线不是最好的拟合函数,对吧?完美拟合直线的斜率会更小,而且不会经过原点。它在“比萨”轴上的数值10左右与“比萨”轴相交。
到目前为止,我们一直强迫这条直线通过原点以保证数学模型尽可能简单。现在我们该取消这个限制了。为了绘制一条不受经过原点约束的直线,我们需要在模型中添加一个参数:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/023-i.jpg?sign=1739423817-DTYgWJEDAdwWusMPzs2vLhMOtlzZqPdJ-0-798ca996789dc90be1c2fa3a7a407605)
你可能会有种似曾相识的感觉。上面的方程就是经典的线性函数,你们可能在八年级学过。大多数人都记得y=m*x+b,其中m是斜率,b是y轴的截距。我们在这里使用机器学习术语,称w为权重,称b为偏置。
直观地说,偏置度量了图表中直线沿垂直方向的“移动量”。如果偏置是0,那么我们就回到了之前的情况,一条经过原点的直线。如果不是,那么该直线与y轴相交的值就为b。
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/023-2-i.jpg?sign=1739423817-H8sEDfIYDwkXTfJUigvVPfu76oO61zYK-0-ca00289cc5ce5929f48963fcab64e49e)
下面是整个线性回归的程序代码,更新后使用带有两个参数的新模型。最左边的小箭头表示该行代码发生了更改:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/023-3-i.jpg?sign=1739423817-igBqrFEERq5S005qH7fKFXimkC5Cbgy4-0-aaf11055aaded164834a330ec137fdb9)
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/024-i.jpg?sign=1739423817-tREzrrJ5d2dn35lydefyLHDoA4c24NEQ-0-da6a7955c057f012a72587f0753f888c)
大多数的代码行都发生了更改,但是所有这些更改都是由于引入b而发生的。最显著的更改就是使用新模型的predict()和train()函数,它们调整b的方式与调整w的方式相同,即增加或减少它并关注损失由此发生的变化。我不知道怎样同时调整w和b,所以采用了大家都喜欢的临时暴力法:我只是对if添加了几个新分支。让我们尝试一下这个程序。此时train()函数需要更长的时间来收敛,但最终它会获得成功:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/024-2-i.jpg?sign=1739423817-1WaOMPhKHs6Yf4KcIdeK3n9W3AJCdTp0-0-92ddeceaf9e2c539024ef0f6001113b8)
如果把数据和直线画出来,那么可以得到如下结果:
![](https://epubservercos.yuewen.com/432DF4/20180619108106606/epubprivate/OEBPS/Images/025-i.jpg?sign=1739423817-rv9A797FxFEpxEHZNF2ePGzwtCNBuylI-0-e7a7a099a6cdc2b6a2293b84885ea0c7)
现在我们真的做到了!这条线更接近于样本数据,它在y轴上的值等于b。更好的是,现在的最终损失比以前更低,这就意味着能够比以前更加准确地预测比萨销量了。Roberto会很高兴的!
对于这个程序的第一个版本来说,我们做了很多工作。现在让我们喘口气,退一步,看看更大的图景吧。
“超参数”?
在监督学习中,训练阶段返回一组我们可以在模型中使用的值——在我们的应用实例中,这些值是可以在直线方程中使用的权重和偏置。这些值称为“参数”。但这种称谓对我们程序员来说十分不便,因为我们已经使用“参数”这个名称来表示一些不同的对象。我们会很容易混淆参数(如w和b)和函数(如train())中的参数。
为了避免混淆,机器学习实践者使用另一种名称来表示train()函数中的参数,称之为超参数,意思是“更高水平上的参数”。回顾一下,我们可以设置诸如迭代次数和学习率等超参数,因此,train()函数可以找到如w和b这样的参数。