(资料图片)
本文章主要会侧重原理,具体的在python中的实现可能比较少,一些相对基础的名词我就不解释了,以及我还会使用一些之前习惯的记号,例如爱因斯坦求和之类的,和之前一样同样自学的,所以如有纰漏欢迎评论指出 ヾ(≧▽≦*)o
要干啥
为方便可视化,先假设我们的数据是一维的线性分布:
若我们想要根据这些现有的数据"猜"当 时 可能是多少?这时就可以通过拟合一条直线来"猜",我们知道在二维坐标系中的直线方程为 ,那只需要确定系数 即可,理想情况是找到一组系数能够使得该直线穿过每一个样本点,但显然实际上不太可能有这么"线性"的数据,所以我们只能退而求其次,要求该系数所给出的直线和每个样本点都"足够接近",所以对于 个样本点要求:
其中 称为损失函数,即要求出使得损失函数最小的系数 .
至于为什么说画在二维坐标系里的数据是一维的,因为 轴是我们的结果,即现在一个 对应一个 ,所以是一维的,实际情况中很有可能会有 个 决定一个 ,此时直线的方程可以写成 (注:该上下角标为爱因斯坦求和),即我们需要给出一个 维矢量和一个系数,下文依旧还是用回一维的情景。
要咋干
若我们想要找到一个二次函数 的顶点 值,那么可以先在函数上任取一点,然后用该点的 减去该点的导数,得到函数上下一点的 值,这么做的是因为若取的点在函数顶点右边则导数为正,在左边则为负,而且离顶点越远导数就越大,所以只需要重复迭代多次就应该能得到顶点:
这样的方法就称为梯度下降算法,但如果你实际算一下就会发现,对于该例子要精确迭代到顶点的只有线上满足 的点,而更多的点会在顶点附近振荡,没法收敛到比较小的范围内,所以我们还得每次会减少 倍的导数,该参数称为学习率,即每次迭代 ,显然若该参数设置的很大,则会出现每次迭代后导数越来越大的情况,更加无法收敛,我们称这种情况为梯度爆炸。
对于我们之前的那组数据同样可以用相同的方法,只不过现在得确定俩值 ,一样先给定随机的初始值 ,然后计算该直线的损失函数对 的梯度 ,最后用 减去 倍梯度,即每次迭代 满足:
不出意外的话( 合适的情况下),在迭代多次后即可得到一个收敛的 ,然后我们就可以通过该直线求得 时 :