梯度下降法算法核心

非调库方法实现梯度下降法多元线性回归:https://blog.csdn.net/weixin_42040221/article/details/104342448

在高等数学中,我们学习了导数,泰勒展开等等,我们一定做过一类题:求最小值/极小值,其实就是在求我们该如何取参数,使得目标函数取得最小值。这个数学问题有着深厚的工程应用背景,比如:深度学习中,我们该如何取神经网络的权值,使得学习误差最小?这里的权值就是我们要求的参数,学习误差就是目标函数。

通常我们的做法是求导,令求导的方程等于零,解方程。但是在学习时我们发现,我们只能用这个方法解决一小部分相对简单的方程,但在工程应用中,往往这个方程非常复杂,我们需要求取的参数可能很多,这时候,这一套方法就变得不切实际。

这种情况下,我们可以使用梯度下降法,根据代价函数创建一个迭代序列,通过不断迭代,去逼近得到一个全局最小值或者是一个局部极小值如何能保证我们的迭代方向是朝着目标函数值不断减小的方向进行的呢?接下来简单的证明一下,并不需要很高深的理论。

观察一阶泰勒展开式,假如我们将约等号右侧的f(x0)看作是上一次的值,左侧的f(x)看作是更新值,那么我们只要使约等号右侧第二项是负值,那么我们的目标函数就是朝着变小的方向变化的。

f(x) \approx f(x_0) + \frac{\mathrm{d}f(x_0)}{\mathrm{d}x} \cdot \Delta x

而要使第二项恒为小于等于0的值,我们可以取\Delta x = -\alpha \frac{\mathrm{d} f(x_0)}{\mathrm{d} x},式中的\alpha取值一般为0-1,我们可以把这个参数理解为控制梯度下降步长的,在不同的应用中会有不同的名字,我们将这一式子带入一阶泰勒展开式,就变成了如下形式:

f(x) \approx f(x_0) -\alpha |\frac{\mathrm{d}f(x_0)}{\mathrm{d}x} |^{2}

因此,我们就能构造出使f(x)不断减小的迭代序列:

x_{k+1}=x_k+\Delta x=x_k-\alpha \frac{\mathrm{d} f_{x_0}}{\mathrm{d} x}

到此,我们过了一遍梯度下降法的算法核心,值得一提的是,在进行梯度下降时,我们需要赋一个初始的x值,这个初始值不同,我们经过梯度下降得到的最小值可能也是不同的,因为梯度下降法找到的可能是全局最小值,也可能是局部极小值,这个问题可以通过多次随机赋初值运行来解决。

随后会更新梯度下降算法的一些应用实践,分别是python语言实现线性回归,sklearn实现线性回归,keras实现线性回归。

你可能感兴趣的:(机器学习与深度学习算法,随机梯度下降,机器学习,深度学习)