梯度下降算法c语言描述,(随机)梯度下降算法

我们搞清楚了

补充一下随机梯度下降算法的英文:Stochastic Gradient Descent,简写为SGD。

如何来理解梯度下降?

假设我们要解决的问题是,使用人工神经网络来识别图片中的数字,输入是一张张的图片x(n个x),输出是数字0-9(y),我们有很多用来训练的数据集,假设我们的ANN是有一个隐藏层,一个输入层,一个输出层这样的3层MLP,每一层都有多个Sigmoid神经元,输出层含有10个神经元,用来表示y。在这样的条件下,我们要解决的问题是:寻找到ANN网络中的最合适的w和b(很多w和很多b),让下面这个数学等式中的C的值最小:

$$C(w,b)=\frac{1}{n}\sum_{x}\|y(x)-a\|^2$$

其中,\(a=g(w,b,x)\),a是ANN的输出,通过w,b和x来计算;x来自于训练集,是已知的量。

C其实就是这个ANN“识别”出来的a与正确答案y的差方和,而我们的目的,就是要找到一组w和b,让这个差方和最小,即让ANN计算出来的答案,跟标准答案尽可能的一致。

要做到这一点,科学家们就想到了使用梯度下降的方法。

特别说明:a是这个网络实际计算出来的值(一个向量),w和b有初始值,再加上x作为输入,就可以计算出a来;我觉得之所以上面那个公式要使用a这个字母,是因为a背后是一个超级狂复杂的表达式;按照我们这个例子,一层hidden layer,一层output layer,这两层的每一个“神经元”都要进行sigmoid运算,而hidden layer层的神经元的计算结果,还要用于output layer继续计算sigmoid运行;我们再看看sigmoid函数,所有的变量都放在e的指数位置,想象一下如果还有更多层次的神经元,如果要讲a的表达式写出来,是多么的复杂!!不过,不管多么复杂的表达式,它还是一个初等函数的有限次的四则运算和复合。

因此,a这个字母,就包含了神经网络中所有的w和b。

上面那个数学等式,w和b是未知量,数量很多,我们先用二元函数来理解梯度下降。

首先要明确,梯度是一个向量,而且是变化率最大的那个方向,假设\(z=f(x,y)\)的图像如下:

梯度下降算法c语言描述,(随机)梯度下降算法_第1张图片

(随机)梯度下降算法

再重复一下我们的目标,找到一组w和b,让C最小。从图像上来看,就是找到z凹下去的那个最凹的地方。而梯度方向是z变化最快的方向。

$$\Delta z=\nabla z \cdot (\Delta x, \Delta y)$$

我们可以取\((\Delta x, \Delta y)=-\eta \cdot \nabla z\),得:

$$\Delta z=-\eta \cdot \|\nabla z\|^2 $$

让\(\eta\)为正,这样\(\Delta z\)就一定是负数,这就表示z在缩小。

这时,x和y都变成了:

$$x \rightarrow x' = x -\eta \cdot \frac{\partial z}{\partial x}$$

$$y \rightarrow y' = y -\eta \cdot \frac{\partial z}{\partial y}$$

然后重复以上过程,继续缩小z,直到z最小。

这个过程就是梯度下降的过程,也同样就是梯度下降算法。\(\eta\)的专业名称叫learning rate,有人翻译为学习步长。步长选择越小,算法运行时间越长,但是精度越高。

现在回到\(C(w,b)\)这个函数,由于w和b太多,我们无法画出图形(超过了三维),但是道理跟上面的二元函数完全一样。最终得到的w和b,使得C在训练集的数据中,能够达到最小。这时候,这个ANN就训练好了,可以用其它数据来测试和验证。

梯度下降算法,就是找到一组w和b,让函数C的值最小。C函数,可以说成Cost Function,有的地方也是用Loss Function,让Cost最小,让Loss最小,都一样。

== 现在来说算法中的随机两个字 ==

将梯度下降算法实现,是有些挑战的,很多时候是计算量太大,而随机就是用来减轻计算量的。

在实践的时候,我们要计算梯度,即\(\nabla C\),在面对众多x输入的情况下,一般都是将每个x代入计算,然后去平均数。在x非常多的情况,这个计算将会非常耗时。

特别注意:计算C的梯度,其实就是对每一个w和b计算偏导数,然后将当前的w和b的值(w和b有初始值,随机赋予)代入计算,因此计算得到的\(\nabla C\)是一个全是数值的向量;再从C的函数表达式来分析,表达式有一个\(\sum\)符号,即求和,实际上如果展开,就会发现:

$$\nabla C=\frac{1}{n}\sum_{x}\nabla C_x$$

这就是为什么说,如果将每一个x都代入去计算,计算量很大,因此科学家相处了一个随机挑选一组x来代替的方案,减少计算量,而结果似乎并没有收到什么实质的影响。

因此,科学家提出SGD算法,在梯度下降的基础上,增加随机二字。这个算法的中心思想是,通过随机选取一组x来近似估算\(\nabla C\),以达到加快运算加快网络学习的目的。

注意一个细节:有的时候Cost Function不会除以n,因为我们无法提前知道训练样本的数量,也许样本是在不断增加的。

此篇博文重在理解随机梯度下降算法(SGD)的思想,在具体代码实现的时候,还是有很多挑战的。

你可能感兴趣的:(梯度下降算法c语言描述)