目录
1 梯度下降算法的输出是什么
2 梯度下降算法输出结果表明了什么
3 例子
梯度下降算法是找到损失函数函数极值点的算法,目的是将损失函数最小化,我们的机器进行"学习"的目的就是改进模型参数(例如上一章提到的y = ax + b 改进a和b)以便将损失最小化
我们现在回顾一个概念-偏导数
- 偏导数
我们之前学过导数,导数的意思是是对含有一个自变量的函数进行求导。偏导数是是对含有两个自变量的函数中的一个自变量求导。
比如说,我们现在有一条线 y = 2x + 1,我们现在对这个线求导数,通过公式我们可以知道,此线的导数为2,我们现在对 y = 2x + a + 1求x的偏导数,那么我们得到的结果就应该是
下面这个表示a对x的导数
1 梯度下降算法的输出是什么
梯度的输出是一个由若干偏导数构成的向量
- 公式中右上角的T意思是转置,转置的算法和矩阵相同,向量与矩阵的区别之一是:向量是一维的,矩阵是二维的
我们称一个向量中的元素叫做向量中的分量,红色框框出来的就是一个分量
梯度下降算法输出结果(上图的倒三角)的每个分量(红框框出的内容)是损失函数对输入向量(输入也可能是一个向量)的相应分量的偏导,上面这个图中,我们的输入向量就为(w1,w2,...,wN)
2 梯度下降算法输出结果表明了什么
梯度下降算法输出结果表明了每个位置(输入点x)损失函数增长(变化)最快的方向
- 输出的结果是向量,向量有两个东西构成,方向和值,无论在最终结果如何我们都视作其是增长的只是增长的方向不同
3 例子
我们以上节课的例子举例 y = ax + b
我们现在有一个坐标轴z,它现在是损失函数的输出
- f(x)为预测值,y为实际值,n为样本数量
我们的模型是y = ax + b ,很明显实际值是固定的,样本数量是固定的,fx根据a与b的变化而变化,那影响我们z轴的两个值分别的a和b
每一轮epoch都会使我们都会得到一组a,b值,那我们最终就可以得到这样一条曲线
假设我们获得的曲线是这样的
- 这个并不是普通视觉上的二维曲线,这条曲线是会偏向或远离b方向的
我们现在找这个曲线的极值点,如果我们有上帝视角我们从这个曲线不难看出这些极值点
- 极值点:斜率正负改变的点
每一个极值点我们都可以得到一组a,b的值
我们当然是没有上帝视角的,在训练中不会得知曲线的全貌,我们在深度学习中使用的方法叫随机初始化
- 在tensorflow.keras已经将初始化封装好了,所以不需要我们去写代码进行初始化
- 随机初始化
以咱们上面这个函数为例,它会随机出很多组a与b,然后再计算出此组ab值生成的结果z的梯度
- 梯度:z轴上的值变化最快的方向,我们可以放到导数中理解一下,如果导数的绝对值越大,它变化的速度也就越快,计算方式为该点Z值对输入向量的微分,实际上就是导数
回到我们如何找极值点的问题来,我们比如现在初始化了点A
此时它会找到此时Z变化最快的方向,我们假设是这个方向
我们的目的是让z值变到最小,很明显这个曲线往这个方向走Z的值是变大的,那么此时我们就会反向寻找极值点
反向走着走着发现变化的速率越来越慢,此时就代表这梯度越来越小,这个就梯度下降的来历,当我们的梯度达到0的时候,梯度为0的点就是我们的极值点
上面这个例子没体现出为什么要找最快的点,那么我们换一个初始的位置
现在我们初始到了B点,此时它的两个方向都可以使z变小
那么这个时候梯度下降算法会选择下降最快的那条路线,找到那条路线上的极值点
那么现在又遇到一个问题,就算是一点儿一点儿向前蹭,那么进行一次改变也应该有一个值,这个值的名字叫做学习速度
- 在上一章我们在编译时并没有给学习速率的参数,这是因为我们使用的optimizer的adam中又默认的学习速率,默认学习速率为0.001
比如下面这个图,我一次从B -> C的学习速度是要比B -> d 的学习速度慢的
学习速率如果过小,迭代的次数就越多,也就是进行一个epoch的时间会变长,如果太大的话优点是速度会变快,但是有可能会因为步子太大而跳过我们想要的极值点,比如说从B -> E
还有一种情况它会一次就跳到F,那么此时它发现Z是处于上升趋势,那它就会往回走,又返回B点,如果将学习速率写死它将永远找不到中间的正确极值点
算法的最后一步,我们现在通过随机初始化找到了若干个极值点,此时我们从若干个极值点中找到对应Z最小的极值点返回