小白深度学习:基于梯度优化方法
梯度
梯度是一个相对于向量求导的导数(如果你不知道什么是向量,请复习高中数学),如果你不能理解,对于1维度向量,你可以暂时理解为其时一元函数,其梯度就是他的导数,如果时2维向量,其梯度为2元函数中的函数对每个元的偏导,此时梯度应该为2维向量,n维以此类推。
基于梯度优化方法
在深度学习中,我们大多时候都是进行优化任务,训练神经网络,你可以通俗的理解为神经网络的输出与真实的值之间的“距离”(实际并非距离)最小化的过程,直到最小(尽管可能并非如此),我们将度量这个“距离”的函数称为目标函数,、或者代价函数、损失函数等,可能你在一些博客上看到这几个名词之间各自有不同的意思,例如下图,但是在此系列博客中,我们可能将交替使用他们。
假设我们的目标函数是一个一元二次函数,那么我们想要最小化目标函数,即是寻找出该函数的最小值点,那么应该怎样寻找到这个最小值点呢,我们可以随意在该函数选取一个点,我们左右移动这个点,直到找到最小值,那么我们应该朝左还是朝右呢?你是否想起了倒数呢?导数的正负代表了是增长还是减小,所以我们可以直接在该点处求导,看导数究竟>0还是<0,导数>0时候,我们可以向左移动来减小,导数>0,我们可以向右移动。
一个例子如下(摘自 深度学习花书):
此时你可能有一个疑问,导数并不能找出最小值啊?
没错,当倒数等于0时(如果导数=0,但是左右导数都是<0,在最小化任务中,仍旧可以继续寻找,还有一种情况为鞍点,此处不做讨论),
此时我们无法就无法进行左右移动了,此时我们无论向左还是向右移动,获得的值可能都会比当前值大,但是此时极有可能不是最小值,只是目标函数的一个极值而已。
在深度学习中,即使找到的解不是真正的最小值点,但是只要其目标函数的值够小,我们通常接受这样的解。
上述例子描述是一个一元函数,对应一维向量,而对于多维,我们应该使用偏导,在每一维度进行如此操作,找到每一维度的偏导都为0且使得目标函数足够小的点。
学习率
在此引入一个新的概念:学习率,我们上述讲述左右移动我们选择的点,但是每次移动多少?0.001?0.01?0.5?1?2?......,
一般情况下,这个移动的长度是可以计算的,一般的,计算公式如下图,其中的x的值表示点下一次移动位置,ɑ表示学习率,x减去的部分就是步长,我们可以知道,学习率一定程度上控制着步长。
$$x = x-\alpha \frac{\partial}{\partial x}f(x)$$
每次移动的长度就叫做学习率
我们怎么对于图示中的函数,假设我们每次步长为2,那么我们选取点x=1,向左移动2跑到了x=-1处,此时又需要向左移2,此时x=-1,此时又需要向左移,往复循环,我们永远也找不到足够小的点。那么你可能会说我们选择1不就好了?这是我们看出来的,机器可是不知道的呢!你可能会说,我们我们选择一个足够小的不就行了?当学习率足够小的时候,我们可能又会遇见新的问题,例如计算量非常大的,还有可能我们找到的只是局部极小值点,但是该极小值并不足够的小。如下图示例,假设学习率足够小,当我们从1点开始是,我们的点很可能在第一个极值处停下寻找,但是我们可以看图知道,此时的极值点的值并不小。
学习率的选择是深度学习中的一个问题,对此学者提出了很多选择学习率的方法,后续将在小白版深度学习:多层感知机MLP和BP神经网络介绍几种学习率选择方式