深度学习笔记[更新中。。。]

防止过拟合的方法

数据增广
提前终止训练
正则化
Dropout

DropOut vs. Inverted-DropOut

DropOut :网络参数过多时容易发生过拟合,通过以概率P对每层神经元进行灭活,每层被灭活的神经元的输出为0,让其停止更新,而网络参数为灭活前的参数,在测试阶段,不会进行DropOut,所有神经元都会参与前向传播,但是会将神经元的输出乘以(1-p),为了让测试阶段与训练阶段神经元输出保持一致的期望。
Inverted-DropOut:与DropOut相似,不过它是在训练阶段就对神经元输出进行rescale,测试阶段则不需要进行。这样有助于一次性定义模型,目前通常采用这种方式。
[参考]

梯度消失与梯度爆炸

梯度消失

神经网络有很多层,每个隐藏层都使用Sigmoid函数作为激活函数时,我们知道Sigmoid函数有一个缺点:当x较大或较小时,导数接近0;并且Sigmoid函数导数的最大值是0.25。
在这里插入图片描述
假设现网络每层只有一个神经元,如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0标准差为1的高斯分布。因此所有的权重通常会满足|wj|<1,而s‘是小于0.25的值,那么当神经网络特别深的时候,梯度呈指数级衰减,导数在每一层至少会被压缩为原来的1/4,当z值绝对值特别大时,导数趋于0,正是因为这两个原因,从输出层不断向输入层反向传播训练时,导数很容易逐渐变为0,使得权重和偏差参数无法被更新,导致靠近输入层的神经网络无法被优化,训练永远不会收敛到良好的解决方案。

梯度爆炸

若我们初始化的w是很大的数,w大到乘以激活函数的导数都大于1,那么连乘后,可能会导致求导的结果很大,形成梯度爆炸。

解决方法

换用Relu、LeakyRelu、Elu等激活函数
BatchNormalization
ResNet残差结构
LSTM结构
好的参数初始化方式,如He初始化或用预训练模型初始化
梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
L2正则通过限制过拟合也能防止梯度爆炸

梯度下降更新优化

方法 特点
SGD 不会自动更新学习率,所以初始学习率的选取直接影响结果
Momentum 记录每次的更新方向,若这次的梯度方向与之前相同则增加步长
Adagrad 记录每次的下降反向与距离,若下降的距离开始减小时步长也会减小
RMSprop
Adam Momentum与Adagrad结合,利用一阶矩估计和二阶矩估计来约束学习率,还是需要设置初始lr,相比Adagrad不需要存储所有梯度

多标签识别

faster rcnn

权重初始化方法

回归

线性回归和逻辑回归

正则

在损失函数后面加上一个正则项,对损失函数中的某些参数做出限制

L1正则

L1正则化的模型叫做Lasso回归,可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择。
正则化和特征选择的关系:
稀疏矩阵指的是很多元素为0,只有少数元素是非零值的矩阵,即得到的线性回归模型的大部分系数都是0. 通常机器学习中特征数量很多,例如文本处理时,如果将一个词组(term)作为一个特征,那么特征数量会达到上万个(bigram)。在预测或分类时,那么多特征显然难以选择,但是如果代入这些特征得到的模型是一个稀疏模型,表示只有少数特征对这个模型有贡献,绝大部分特征是没有贡献的,或者贡献微小(因为它们前面的系数是0或者是很小的值,即使去掉对模型也没有什么影响),此时我们就可以只关注系数是非零值的特征。这就是稀疏模型与特征选择的关系。
在这里插入图片描述

L2正则

L2正则化的模型叫做Ridge回归(岭回归),可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合。
L2正则化和过拟合的关系:
拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。可以设想一下对于一个线性回归方程,若参数很大,那么只要数据偏移一点点,就会对结果造成很大的影响;但如果参数足够小,数据偏移得多一点也不会对结果造成什么影响,专业一点的说法是『抗扰动能力强』。
在这里插入图片描述

BatchNormalization

为什么使用BN
我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。
how to work:
在这里插入图片描述
(3224224卷积后得到64112112,代表64张112*112的特征,现在进行nn.BatchNorm2d(64),即求每一张的一个mini-batch的平均特征,最终得到一个shape=64的tensor。)
1、求每一个训练批次数据的均值
2、求每一个训练批次数据的方差
3、使用求得的均值和方差对该批次的训练数据做归一化。其中ε是为了避免除数为0时所使用的微小正数。
4、尺度变换和偏移:将乘以调整数值大小,再加上增加偏移后得到,这里的是尺度因子,是平移因子。这一步是BN的精髓,由于归一化后的基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数:,。 和是在训练时网络自己学习得到的,如果,而,那么就会恢复到之前的原数据。
BN的优势
解决内部协变量偏移:BN的本质就是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,保证模型的非线性表达能力。
使得梯度变平缓
优化激活函数:更短的时间达到较稳定的状态
使模型具有正则化效果:采用BN算法后可以选择更小的L2正则约束参数,因为BN本身具有提高网络泛化能力的特性。
解决梯度弥散问题

激活函数

激活函数作用

Relu

优点:Relu的输入值很大时,也不会出现梯度消失
网络输入都是负值时是不是就没有用了:不会,因为经过乘以权重之后并不一定是负值
缺点:如果梯度太大,而学习率又不小心设置得太大,就会导致权重一下子更新过多,就有可能出现这种情况:对于任意训练样本 Xi ,网络的输出都是小于0的,这样梯度也都是0,Relu会出现坏死,可用Leaky Relu进行替代。解释

全连接层作用

前面的卷积和池化相当于做特征工程,得到许多局部特征,后面的全连接相当于做特征加权,将这些局部特征进行加权组合。

resnet

在这里插入图片描述
resnet50一共有50层,其中卷积层有49层,全连接层1层。
一共有4个block,[3,4,6,3],每个block有三层卷积。49=(3+4+6+3)*3+1,网络刚开始的时候有一层卷积。
residual作用:

resnet的几个版本

手推CNN

在这里插入图片描述
计算一层的参数量、计算量

反向传播如何求导

Relu:
在这里插入图片描述
mean_pooling:
反向传播的过程是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变。
max_pooling:
源码中有一个max_idx的变量,记录最大位置。反向传播时,把后层的值赋给前层的max_idx,patch的其余值都为0,max pooling也要满足梯度之和不变的原则,梯度传播也是相同操作。
bn层:
会对γ,β,Xi进行求导。
在这里插入图片描述
卷积层:卷积操作可以看作是矩阵相乘,将其展开,同样可以求导。

梯度下降算法

AdaBN

蓝色和红色分别代表两个数据集,每个点代表一个mini-batch,将某一BN层的均值和方差组成的向量画出来,可以看到BN层反应着数据集之间的域差异。这一差异是因为由于数据分布不同造成BN层的两个参数变得不同。所以这两个参数的均值与方差也会有很大差异。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值