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

  • BatchNormalization介绍

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

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

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

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

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

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

算法:
  • Mini-batch

参考CSDNMini-batch 和batch的区别

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

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

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

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

  • 梯度消失

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

  • BP算法

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

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

2.变量定义


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

3.代价函数
代价函数被用来计算ANN输出值与实际值之间的误差。常用的代价函数是二次代价函数(Quadratic cost function):
其中表示输入的样本,表示实际的分类,表示预测的输出,表示神经网络的最大层数。

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


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

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

公式2(由后往前,计算每一层神经网络产生的错误):

推导过程:

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

推导过程:

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

推导过程:

5.反向传播算法伪代码

①输入训练集
②**对于训练集中的每个样本x,设置输入层(Input layer)对应的激活值:
  (1)前向传播:

  (2)计算输出层产生的错误:


  (3)反向传播错误:

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

  • 误差逆传播算法(error BackPropagation,简称BP)

参考:周志华西瓜书

前向传播算法

给定训练集D{(),(),...,(),},即输入示例由d个属性描述,输出l维实值向量。
给定一个拥有d个输入神经元、l个输出神经元、q个隐层神经元的多层前馈网络结构,其中输出层第j个神经元的阈值用,隐层第h个神经元的阈值用表示。
输入层第i个神经元与隐层第h个神经元之间的连接权为,隐层第h个神经元与输出层第j个神经元之间的连接权为,记隐层第h个神经元的接收到的输入为,输出层第j个神经元接收到的输入为,其中为隐层第h个神经元的输出,假设隐层和输出层的神经元都是用Sigmoid函数。
对训练例假定神经网络的输出为,即
则网络在上的均方误差为

反向传播算法

BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整。对上述所说的均方误差,给定学习了,有

待更新....

  • 各种激活函数对比

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

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

1. Sigmoid

公式:
曲线:


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

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



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

2. Tanh

公式:
曲线:


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

3. ReLU

Rectified Linear Unit(ReLU) - 用于隐层神经元输出
公式:
曲线:


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

4. Leaky ReLU

公式:
曲线:


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

5. ELU

公式:
曲线:


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

  • 残差网络

转自残差网络(Deep Residual Learning for Image Recognition)

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

1.退化问题的直观理解

随着网络层数的加深,会导致梯度弥散或梯度爆炸。对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。这个不能解释为overfitting,因为overfit应该表现为在训练集上表现更好才对。退化问题说明了深度网络不能很简单地被很好地优化。

深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易

  • RNN

转载自循环神经网络(RNN)模型与前向反向传播算法
循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别手写识别以及机器翻译等领域。

如果训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN、CNN进行训练。

1.模型


符号解释:
1)代表在序列索引号t时训练样本的输入。同样的,和代表在序列索引号和时训练样本的输入。

2)代表在序列索引号t时模型的隐藏状态。由和共同决定。

3)代表在序列索引号t时模型的输出。只由模型当前的隐藏状态决定。

4)代表在序列索引号t时模型的损失函数。

5)代表在序列索引号t时训练样本序列的真实输出。

6),,这三个矩阵是我们的模型的线性关系参数,它在整个RNN网络中是共享的,这点和DNN很不相同。 也正因为是共享了,它体现了RNN的模型的“循环反馈”的思想。

2.前向传播算法

隐藏状态:由和得到

为激活函数,一般为,b为线性关系的偏倚

模型输出:由隐藏状态得到

在最终在序列索引号时我们的预测输出为:

通常由于RNN是识别类的分类模型,所以上面这个激活函数一般是softmax
通过损失函数,比如对数似然损失函数,我们可以量化模型在当前位置的损失,即和的差距。

3.反向传播算法

你可能感兴趣的:(算法岗面试——深度学习总结)