深度学习红红火火恍恍惚惚面试

算法岗面试——深度学习总结

2019-06-23  本文已影响129人  早上起来闹钟又丢了

参考知乎深度学习中 Batch Normalization为什么效果好?
参考CSDN对Batch_Normalization的理解

神经网络在训练的时候随着网络层数的加深,激活函数的输入值的整体分布逐渐往激活函数的取值区间上下限靠近,从而导致在反向传播时低层的神经网络的梯度消失。而BatchNormalization的作用是通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题。

定义:批规范化。Google在ICML文中描述的非常清晰,即在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1。

作用:1. 加速训练,加快收敛;2. 降低过拟合风险;3. 提高模型的泛化能力

原理:为了防止“梯度弥散”。关于梯度弥散,大家都知道一个简单的例子:

在BN中,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。

算法:

参考CSDNMini-batch 和batch的区别

深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。

第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这种方法每更新一次参数都要把数据集里的所有样本都看一遍,计算量开销大,计算速度慢,不支持在线学习,这称为Batch gradient descent批梯度下降

另一种,每看一个数据就算一下损失函数,然后求梯度更新参数,这个称为随机梯度下降stochastic gradient descent。这个方法速度比较快,但是收敛性能不太好,可能在最优点附近晃来晃去,hit不到最优点。两次参数的更新也有可能互相抵消掉,造成目标函数震荡的比较剧烈。

为了克服两种方法的缺点,现在一般采用的是一种折中手段,mini-batch gradient decent小批的梯度下降,这种方法把数据分为若干个批,按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大。

在神经网络中,当前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类准确率反而下降了。这种现象叫做消失的梯度问题。

原文反向传播算法(过程及公式推导)

1.反向传播的思想
(1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程;
(2)由于ANN的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
(3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。

2.变量定义


上图是一个三层人工神经网络,layer1至layer3分别是输入层、隐藏层和输出层。如图,先定义一些变量:
表示第层的第个神经元连接到第层第个神经元的权重;
表示第层的第个神经元的偏置;
表示第层的第个神经元的输入,即
表示第层的第个神经元的输出,即
其中表示激活函数。

3.代价函数
代价函数被用来计算ANN输出值与实际值之间的误差。常用的代价函数是二次代价函数(Quadratic cost function):C=\frac{1}{2n}\sum_x ||y(x)-a^L(x)||^2
其中x表示输入的样本,y表示实际的分类,a^L表示预测的输出,L表示神经网络的最大层数。

4.公式及推导
首先,将第l层第j个神经元中产生的错误(即实际值与预测值之间的误差)定义为:


以一个输入样本为例进行说明,此时代价函数表示为:

公式1(计算最后一层神经网络产生的错误):
其中,表示Hadamard乘积,用于矩阵或向量之间点对点的乘法运算。公式1的推导过程如下:
公式2(由后往前,计算每一层神经网络产生的错误):

推导过程:

公式3(计算权重的梯度):

推导过程:

公式4(计算偏置的梯度):

推导过程:

5.反向传播算法伪代码

①输入训练集
②**对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值a^1:
  (1)前向传播:
z^l=w^la^{l-1}+b^l,a^l=\sigma(z^l)
  (2)计算输出层产生的错误:


  (3)反向传播错误:

③使用梯度下降(gradient descent),训练参数:

参考:周志华西瓜书

前向传播算法

给定训练集D{(x_1,y_1),(x_2,y_2),...,(x_m,y_m),x_i\epsilon R^d,y_i\epsilon R^l},即输入示例由d个属性描述,输出l维实值向量。
给定一个拥有d个输入神经元、l个输出神经元、q个隐层神经元的多层前馈网络结构,其中输出层第j个神经元的阈值用\theta _j,隐层第h个神经元的阈值用\gamma _h表示。
输入层第i个神经元与隐层第h个神经元之间的连接权为v_{ih},隐层第h个神经元与输出层第j个神经元之间的连接权为w_{hj},记隐层第h个神经元的接收到的输入为\alpha _h=\sum_{i=1}^d v_{ih}x_i,输出层第j个神经元接收到的输入为\beta _j=\sum_{h=1}^q w_{hj}b_h,其中b_h为隐层第h个神经元的输出,假设隐层和输出层的神经元都是用Sigmoid函数。
对训练例(x_k,y_k)假定神经网络的输出为\hat{y}_j^k=(\hat y_1^k,\hat y_2^k,...,\hat y_l^k),即\hat y_j^k=f(\beta_j-\theta_j)
则网络在(x_k,y_k)上的均方误差为E_k=\frac{1}{2}\sum_{j=1}^l(\hat y_j^k-y_j^k)^2

反向传播算法

BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整。对上述所说的均方误差E_k,给定学习了\eta,有\Delta w_{hj}=-\eta \frac{\partial E_k}{\partial w_{hj}}

待更新....

转载自深度学习激活函数比较
深度学习中常用的激活函数详解及对比分析(sigmoid)

激活函数的作用:如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

1. Sigmoid

公式:f(z)=\frac{1}{1+exp(-z)}
曲线:


导数:
特点:用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。
缺点:
激活函数计算量大,反向传播求误差梯度时,求导涉及除法;
反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练;
Sigmoids函数饱和且kill掉梯度;
Sigmoids函数收敛缓慢。

sigmoid 原函数及导数图形如下:



由图可知,导数从 0 开始很快就又趋近于 0 了,易造成“梯度消失”现象

2. Tanh

公式:f(z)=tanh(z)=\frac{e^z - e^{-z}}{e^z + e^{-z}} tanh(x)=2sigmoid(2x)-1
曲线:


特点:也称为双切正切函数,取值范围为[-1,1]。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。
与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。
缺点:Tanh 激活函数与sigmoid函数一样也具有软饱和性,没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。

3. ReLU

Rectified Linear Unit(ReLU) - 用于隐层神经元输出
公式:\phi(x)=max(0,x)
曲线:


特点:输入信号 <0 时,输出都是0,出现硬饱和,梯度消失为0;>0 的情况下,输出等于输入。
优点:
使用 ReLU 得到的 SGD 的收敛速度会比 sigmoid/tanh 快很多;
解决了梯度消失的问题 :在正区间当输入值大于0时,梯度保持不变,没有sigmoid及Tanh函数的梯度消失的问题;
计算速度快
缺点:训练的时候很”脆弱”,很容易就”die”了
例如,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0。如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了。

4. Leaky ReLU

公式:\phi(x)=max(0.1x,x)
曲线:


特点:解决ReLU函数的Dead ReLU Problem而提出的激活函数。
理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

5. ELU

公式:\left\{\begin{matrix}x,x>0 \\\alpha (e^x -1),x\leq 0 \end{matrix}\right.
曲线:


特点:
不会有Dead ReLU问题;
输出的均值接近0,zero-centered。
它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

残差的思想都是去掉相同的主体部分,从而突出微小的变化。

上一篇 下一篇

猜你喜欢

热点阅读