文章首发于本人CSDN账号:https://blog.csdn.net/tefuirnever
由于微信不允许外部链接,你需要点击页尾左下角的“阅读原文”,才能访问文中的链接。
1、梯度下降
在测试集上,通过最小化 代价函数(成本函数) 来训练的参数 和 。
在这个图中,横轴表示空间参数 和 ,代价函数(成本函数) 是曲面,因此曲面高度就是 在某一点的函数值。
而深度学习的最终目标就是找到代价函数(成本函数) 函数值为最小值时对应的参数 和 。梯度下降 可以分为三个步骤:
1. 随机初始化两个参数
以如图小红点的坐标来初始化参数 和 。
开始寻找代价函数(成本函数) 函数值的最小值。
2. 朝最陡的下坡方向走一步,不断地迭代
朝最陡的下坡方向走一步,如图,走到了如图中第二个小红点处。
可能停在这里,也有可能继续朝最陡的下坡方向再走一步,如图,经过两次迭代走到第三个小红点处。
3.直到走到全局最优解或者接近全局最优解的地方
通过重复以上的步骤,可以找到全局最优解,也就是代价函数(成本函数) 这个凸函数的最小值点。
逻辑回归的代价函数(成本函数) 是含有两个参数的。
简要说明一下式子中的符号, 表示求偏导符号,可以读作 round; 就是函数 对 求偏导,在代码中为 ; 就是函数 对 求偏导,在代码中为 。
其实无论是 还是 都是求导数的意思,那么二者的区别是什么呢?
梯度下降是如何进行的呢?这里任选一参数 进行举例:假定代价函数(成本函数) 只有一个参数,即用一维曲线代替多维曲线,这样可以更好画出如下图像。
迭代就是不断重复做如图的公式:
其中,:=
表示更新参数; 表示 学习率(learning rate),用来控制 步长(step); 就是函数 对 求导(derivative),在代码中为 。对于导数更加形象化的理解就是 斜率(slope)。
如图该点的导数就是这个点相切于 的小三角形的高除宽(这是高中数学学过的,不会的去百度——导数)。假设初始化如图点为起始点,该点处的斜率的符号是正,即 ,所以接下来会向左走一步(假设该点处的斜率的符号是负的,则会向右走一步),如图:
不断地向左走,直至逼近最小值点,这就是梯度下降法的迭代过程。
2、逻辑回归的梯度下降法
逻辑回归的梯度下降算法,关键点是几个重要公式,虽然使用计算图来计算逻辑回归的梯度下降算法有点大材小用了,具体什么是导数,什么是计算图,可以看下一个文章。
下面来完完整整地进行这个梯度下降算法的过程演示,相信我,跟着你就能全懂了。
假设,单个样本样本只有两个特征 和 ,为了计算 ,需要输入参数 、 和 。
因此 。
回想一下逻辑回归的公式定义如下:,其中、。
损失函数 。
代价函数 。
若只考虑单个样本,代价函数变为 。
梯度下降法中 和 的修正表达为 ,。
现在画出表示这个计算过程的计算图,如下:
有了计算图,就不需要再写出公式了,只需修改参数 和 。前面已经讲解了前向传播,现在来说一下反向传播。
想要计算出代价函数 的导数,可以使用链式法则。
首先计算出 关于 的导数。通过计算可以得出
而
因此将这两项相乘,得到:
肯定会有小伙伴说自己不太会微积分,不知道链式法则。Don‘t worry!!!只需知道 已经计算好了,拿来主义,直接拿过来用就可以了。
最后一步反向推导,也就是计算 和 变化对代价函数 的影响
然后更新
这就是单个样本实例的梯度下降算法中参数更新一次的步骤,深度学习的过程可以简单理解为重复迭代优化的过程(肯定不准确,就是为了先理解一下而已)。吴恩达老师画的图,直观的体现了整个过程:
3、m个样本的梯度下降
我们想要的,肯定不是单个样本,而是在 个训练样本上,也就是训练集上。
首先,关于算法的带求和的全局代价函数 的定义如下:
实际上是1到 项各个损失的平均,所以对 的微分,对 的微分,也同样是各项损失对 微分的平均。
吴恩达老师手写稿如下:
而代价函数对权重向量 θ 求导过程如下,损失函数为交叉熵损失函数,整个过程如下:
通过 向量化 就可以得到
因此更新公式为: