线性回归问题中,上一节可以看出能求出一个“公式推导结果”,但是由于矩阵的性质,我们只能把它当成一个“巧合”,因为大多数结果是没有这种“巧合”的,无法求解。
那么得到一个目标函数Loss_function(也就是J(θ))我们应该如何求解?这里就引入了“梯度下降”。
比如下面山上有个小孩要下山,肯定要往下走(取决于你Loss_function的方向是上升还是下降)正常求“梯度”是“向上”的方向,因此后续需要取梯度的反方向当作我的方向,这也是为什么称作“梯度下降”的原因。
计算出这一时刻的梯度,我要往前“走一步”,到达下图红点位置,需要重新计算,然后再走到蓝点,以此类推。
1.求当前位置对于Loss_function的梯度的方向;
2.沿着梯度方向“走一步”,不过走大点还是走小一点?
就是说,一小步一小步靠近最优解!走一步 求个梯度,再走一步 再求个梯度,直到loss_function“往前走一点 回来一点”,基本趋于稳定状态,就认为寻找到最优点。
运用梯度下降法,需要我们求出的是θ0还有θ1,也就是θ0和θ1都会对结果产生影响,那么我们同时求θ0和θ1,还是拆开算呢?
我们上一节探讨过,数据样本之间是相互独立的,那么他们对应的参数θ之间也是相互独立的。
也就是
(2)确定步长,防止“不收敛”;
(3)更新参数。
这里稍微对比一下上一节的下面这个公式,怎么有变化?????????
先不管,下面我们先说下山问题,怎么用数学表示这个下山任务?
刚才我们指定了一个loss_function为J(θ)为上面图中的式子,但是这只是求出某一个样本的损失函数,但是评估的时候,只评估一个样本肯定不行,要评估好多样本。
上面这个式子与上面“最小二乘法”的式子对比,多了一个m。这时把每一个样本(1到m)累加,累加的是损失,损失项使用平方是因为想让结果差异更大,这样做的好处是,越不好的值loss_function的值越大。然后前面分母有个m是因为算了m个值的平均。
接下来对损失函数(目标函数)J(θ)求梯度,有下面几种:
指的是选择一个“方向j”来进行参数求解。
对于第一个式子做一些解释:h(x)是关于theta的函数=θ_0*x_0+θ_1*x_1+……+θ_j*x_j,所以对θ_j求偏导时,前面几项全部为0,只留下了x_j。第一行第二个式子运用“+”是因为要沿着“梯度下降”的方向,也就是偏导的反方向,第二个式子意思是沿着梯度下降的方向走一步后的参数值。
i是当前第几个样本,j是当前样本i中的第几列,如下图所示。
OK,现在介绍清楚“批量梯度下降”的原理,可以看出,每一个“新的参数值”需要考虑前一刻计算出的所有参数值,在样本很多的情况下计算效率极低,于是的“随机梯度下降法”就很好的解决了这一问题,只采用随机的一个样本梯度下降方向作为更新方向,但是收敛速度可能减慢。
为了更直观的理解,可以参考下图下图中左边是批量梯度下降法的效果,右边是随机梯度下降法的效果。
为了融合上面两种方法的优点,出现了“小批量梯度下降法”:
上式中,只选择了10个样本来进行平均。但是一般来说程序员喜欢选择64、128、256这种二的倍数作为样本数来进行计算,具体选多少自己决定,我们称它为“batch”,想要结果更精确,就让batch更大,想要速度更快就选batch更小即可,一般很少见低于64的。
接下来还有一个概念——步长,也叫“学习率”。需要根据结果进行调整,当你觉得学习的不好时,将学习率降低,直到降低到你的计算机计算时间无法忍受时为止。
在“小批量梯度下降法”式子中,可以看到第二项有个α,这就是学习率:学习率与更新方向相乘,就能按照学习率进行下一步的更新。学习率一般小一些更合理。
OK,梯度下降法的原理解释到这里就差不多啦,梯度下降是机器学习中最经典最老最常用的算法之一。
(P.S.这里解释一下这一节的“梯度下降法”和前面讲的“线性回归”是怎么衔接起来的:首先提出了线性回归的概念,需要我们求解参数θ,可以根据“损失函数”或者叫“目标函数”列出关于θ的式子,而这个式子我们可以通过“梯度下降法”进行求解。)
好啦,到这里你AI机器学习已经入门了。我们从上一节的线性回归讲到现在的梯度下降,可以看出机器学习我们使用的是优化算法进行问题的求解,而不是用直接求解的方法。所以只要看到机器学习的问题,都没有直接求解这一说,都是用优化的思想进行求解。我猜,这也是我的老板看不上机器学习的原因,他觉得这是一种投机取巧的办法,不过管他呢哈哈哈~
下一节讲讲线性回归代码实现。