深度学习(二)---深度神经网络训练三部曲

就像修炼武功一样,都有武林秘籍,按照步骤一步一步修炼,练好基础,然后再举一反三,最终就可修炼绝世武功。在深度学习领域进行学习的过程中也是一样,先把基础功训练扎实,深入理解原理及步骤,后面不管是各种算法的变种都可以通过基础算法举一反三。今天就来讲解下深度神经网络训练的三部曲,也就是神经网络是怎么训练的。

这里的训练三部曲就分为正向传播、反向传播、梯度下降。

那么我们分开来讲解每一步做了啥以及这样的做的作用是什么。

1.正向传播

首先来深入解析正向传播,正向传播指的就是由输入计算预测值的过程就是正向传播的过程。

但是在这里我们可能很快就会发现,上章讲过神经元必须会做的一个操作就是线性变换和非线性变换这2步,而在看这2步的时候,我们会发现有参数w, b ;那么一开始的时候我们要想得到预测值,就一定会带着这个w,b进去计算才能得到最终的预测值。所以这里我们需要做的就是初始化参数,这也是为啥不管我们在实践中使用哪个神经网络结构的时候都会需要对参数初始化,原因就在于此。既然一开始要对参数人为的进行初始化,那么初始化为何值合适呢,这里我们并不能直接说一定用某个值就一定是万金油,只能够给出个理论指导方向,那就是在初始化的时候,我们的w一般都设置到0的左右,但是不能太大,而b 则一般可以置为0 。通过初始化的w,b 然后就可以得到线性变换后的值,后面还需要对这个值进行非线性变换,上面讲过我们的非线性变换会使用g函数,这里指的就是激活函数。

下面介绍下常用的激活函数以及使用范围。

1. sigmoid函数 

f(z)= \frac{1}{1+^{{e}^{-z}}}       f'(z)=f(z)(1-f(z))

sigmoid 函数可将实数映射到[0,1]之间,通常用来做二分类,比如是否的分类问题;而且该函数的导数可以用自身来进行表达。

但是计算量大,而且当数据分布在曲线平滑位置时容易出现梯度消失。因为sigmoid函数曲线在朝向两边,导数越来越趋向于0,就容易进入饱和区。

实际中在多层神经网络中不使用此激活函数。

2. ReLU函数

f(z)=max(z,0)   

就是大于0的就是本身,小于0的就全部置为0,特征就是计算量小,对梯度收敛有巨大作用,不会存在梯度消失的情况,

在深层的隐藏层中经常使用做输出,来使整个模型网络的表达能力更强。

缺点就是过于粗暴,会丢失一些特征的信息,所以在其基础上演变出了很多变种的ReLU函数,比如Leaky ReLU。

在实际使用ReLU的时候要小心设置learning rate,否则很容易让网络中一多半的神经元直接死掉。

3. Tanh函数

f(z)=tanh(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}        tanh(x)=2sigmoid(2x)-1

f'(z)=1-{f(z)}^{2}

取值范围为[-1,1],输出是以0为中心,在RNN中使用的特别多。在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果.在二分类问题中实际会比sigmoid更常用,收敛速度会比sigmoid函数快;

缺点就是会出现梯度消失,通过Tanh函数曲线可以发现在两端导数也一样趋向于0,在曲线几乎水平的区域学习非常缓慢。

4. softmax函数

y_c=\sigma (z)j=\frac{{e}^{z_j}}{\sum_{K}^{k=1}{e}^{z_k}}

主要适用于多分类问题中,二分类问题则属于多分类问题中的一种,当有多个输入的时候,通过概率求出哪个输入的概率值最大,从而求得那个输入能够胜出。主要用于多分类神经网络输出。这里用指数表达主要是为了让大的更大, 同时要是个可导的函数。

5 . 特殊激活函数 仅仅适用于线性回归,线性函数 

y =x

实际上相当于没有做任何的非线性变换,所以也无法拟合非线性函数,不能建立非线性模型。

上面介绍了这么多的激活函数,那么激活函数的作用是啥呢。 激活函数的作用是使得神经网络的表达能力更强,如果不带激活函数那么不管神经元有多少层,最终也只是在不断的做线性变换,但是在每个线性变换后加入非线性变换,得到的输出就会更复杂,从而使得神经网络的表达能力更强。

好了上面就介绍了一些常用的激活函数。那么经过线性变换和非线性变换后最后到了输出这里会得到一个预测值,这一完整的步骤就是做的一个正向传播。在正向传播过程中,参数w,b都认为是已知的。

2. 反向传播

然后就进入到反向传播过程,反向传播就是通过正向传播得到的预测值来用损失函数度量与真实值直接的差距,从而进行反向求每一个神经元的参数偏导。

那么说到这里要介绍下常用的损失函数(代价函数)表达有:

线性回归问题中采用均方误差代价函数 

J(w) = \frac{1}{m}\sum_{i=1}^{m}(y^i - \hat{y}^i)^2

这里可以有意思的讲解下这个均方根误差代价函数的由来。实际我们都知道,既然代价函数是度量预测值与真实值直接的差距,那么就可以直接表示为y^i \rightarrow \hat{y^i}  ,为了去除正负号的影响于是采用此方式 ,\left | y^i-\hat{y^i} \right | , 这里是度量一条样本的,如果是多条样本进来则需要做累加\sum_{i=1}^{m}\left | y^i-\hat{y^i} \right | ,但是这么一来要是m足够大,那么产生的代价函数也会很大,但并不能说明真的大, 所以这里要去除掉数据规模所带来的影响,于是求平均,\frac{1}{m}\sum_{i=1}^{m}\left | y^i-\hat{y^i} \right | ,因为是绝对值,不能处处可导,为了保证处处可导,于是进行了求平方得到\frac{1}{m}\sum_{i=1}^{m}(y^i - \hat{y}^i)^2  。

这样看下来就不会觉得公式很头疼了呢。所以有时候需要学会化繁为简。

分类问题中采用的为交叉熵损失函数

lnL(w)=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}ln\hat{y}^{(i)}+(1-y^{(i)})ln(1-ln\hat{y}^{(i)})) 此为二分类问题采用的交叉熵损失函数

lnL(w)=-\frac{1}{m}\sum_{i=1}^{m}{y^{(i)}}ln\hat{y}^{(i)}    此为多分类问题采用的交叉熵损失函数

得到损失函数后就可以对参数进行求偏导数。

这里我们认为参数w.b是未知的,X是已知数。 也就反向传播就是确立损失函数,同时计算偏导数和梯度

3. 梯度下降 

在反向传播中求得偏导后,就进入到梯度下降过程,梯度下降过程就是更新w,b ,沿着当前位置的最大方向导数的反向进行下降,下降步长由学习率来决定步长,而通过反向传播计算的就是决定朝哪个方向迈步子。

w= w-\partial dw   其中的\partial 为学习率 ,最开始的w,b则是由初始化得到的。 dw 则是由反向传播得到的。

b= b-\partial db

也就是梯度下降就是做参数更新的过程。 这样三步一起走完就算完成了一轮训练,然后继续循环往复上面的过程从正向传播得到损失函数,然后反向传播得到梯度,梯度下降更新参数,从而来进行不断的迭代更新;而我们的深度学习算法运行的最终目标就是寻找损失函数 J(w,b)的最小值 ,而寻找最小值的方法就是通过梯度下降,梯度下降的核心作用就是在不断的进行更新参数,也就是做梯度下降的过程就是在不断的尝试,一步一步的试出最小值。那么上面就说完了在深度学习训练过程的步骤啦。

猜你喜欢

转载自blog.csdn.net/qq_27575895/article/details/90544564