...
 
Commits (5)
    https://gitcode.net/AiShow/aipath/-/commit/faaaae45b10495a743ff874c167bec02d204a91c resnet 2022-05-25T00:41:09+08:00 RunAtWorld hudalpf@163.com https://gitcode.net/AiShow/aipath/-/commit/615fb61770056d11f00e37f058aac6b96fed3bd6 ResNet网络 2022-05-25T00:43:17+08:00 RunAtWorld hudalpf@163.com https://gitcode.net/AiShow/aipath/-/commit/60adc839fe6385cbb3482446f2a0aaf4f0a9098a 动手学深度学习 2022-05-25T17:16:31+08:00 RunAtWorld hudalpf@163.com https://gitcode.net/AiShow/aipath/-/commit/7212afddce3ca9e925112343152d2792a210cfa6 激活函数与优化器 2022-05-26T00:39:38+08:00 RunAtWorld hudalpf@163.com https://gitcode.net/AiShow/aipath/-/commit/fba9af5657c4c3a1e47677188fa981f02ce438b9 优化器 2022-05-26T00:41:52+08:00 RunAtWorld hudalpf@163.com
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
- [跟李沐深度学习](dl/跟李沐深度学习/README.md) - [跟李沐深度学习](dl/跟李沐深度学习/README.md)
- [PyTorch](dl/跟李沐深度学习/PyTorch.md) - [PyTorch](dl/跟李沐深度学习/PyTorch.md)
- [卡尔曼滤波](dl/KalmanFilter.md) - [卡尔曼滤波](dl/KalmanFilter.md)
- [正则化](dl/regularization.md)
- [激活函数与优化器](dl/active_function_optimization.md)
- [框架与平台](frames/README.md) - [框架与平台](frames/README.md)
- [Tensorflow](frames/tesorflow/README.md) - [Tensorflow](frames/tesorflow/README.md)
- [docker方式启动tensorflow](frames/tesorflow/tesorflow_docker.md) - [docker方式启动tensorflow](frames/tesorflow/tesorflow_docker.md)
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
[论文原文](https://gitcode.net/AiShow/aipapers/-/blob/master/ResNet/ResNet%E5%8E%9F%E7%89%88%E8%AE%BA%E6%96%87.pdf)[中文翻译](https://gitcode.net/AiShow/aipapers/-/blob/master/ResNet/ResNet%E5%8E%9F%E7%89%88%E8%AE%BA%E6%96%87.pdf) [论文原文](https://gitcode.net/AiShow/aipapers/-/blob/master/ResNet/ResNet%E5%8E%9F%E7%89%88%E8%AE%BA%E6%96%87.pdf)[中文翻译](https://gitcode.net/AiShow/aipapers/-/blob/master/ResNet/ResNet%E5%8E%9F%E7%89%88%E8%AE%BA%E6%96%87.pdf)
残差网络,根据网络层数分为50层和101层分为 resnet50 和 resnet101.
## ResNet网络 ## ResNet网络
ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。 ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。
...@@ -42,15 +40,17 @@ Building Block结构图如下图所示,主分支有两层卷积网络结构: ...@@ -42,15 +40,17 @@ Building Block结构图如下图所示,主分支有两层卷积网络结构:
#### Bottleneck #### Bottleneck
Bottleneck结构图如上图所示,在输入相同的情况下Bottleneck结构相对Building Block结构的参数数量更少,更适合层数较深的网络,ResNet50使用的残差结构就是Bottleneck。该结构的主分支有三层卷积结构,分别为1×11×1的卷积层、3×33×3卷积层和1×11×1的卷积层,其中1×11×1的卷积层分别起升维和降维的作用。 ![image-20220525004007858](resnet.assets/image-20220525004007858.png)
Bottleneck结构图如上图所示,在输入相同的情况下Bottleneck结构相对Building Block结构的参数数量更少,更适合层数较深的网络,ResNet50使用的残差结构就是Bottleneck。该结构的主分支有三层卷积结构,分别为1×1的卷积层、3×3卷积层和1×1的卷积层,其中1×1的卷积层分别起升维和降维的作用。
- 主分支第一层网络以输入channel为256为例,首先通过数量为64,大小为1×11×1的卷积核进行降维,然后通过Batch Normalization层,最后通过Relu激活函数层,其输出channel为64; - 主分支第一层网络以输入channel为256为例,首先通过数量为64,大小为1×1的卷积核进行降维,然后通过Batch Normalization层,最后通过Relu激活函数层,其输出channel为64;
- 主分支第二层网络通过数量为64,大小为3×33×3的卷积核提取特征,然后通过Batch Normalization层,最后通过Relu激活函数层,其输出channel为64; - 主分支第二层网络通过数量为64,大小为3×3的卷积核提取特征,然后通过Batch Normalization层,最后通过Relu激活函数层,其输出channel为64;
- 主分支第三层通过数量为256,大小1×11×1的卷积核进行升维,然后通过Batch Normalization层,其输出channel为256。 - 主分支第三层通过数量为256,大小1×1的卷积核进行升维,然后通过Batch Normalization层,其输出channel为256。
最后将主分支输出的特征矩阵与shortcuts输出的特征矩阵相加,通过Relu激活函数即为Bottleneck最后的输出。 最后将主分支输出的特征矩阵与shortcuts输出的特征矩阵相加,通过Relu激活函数即为Bottleneck最后的输出。
主分支与shortcuts输出的特征矩阵相加时,需要保证主分支与shortcuts输出的特征矩阵shape相同。如果主分支与shortcuts输出的特征矩阵shape不相同,如输出channel是输入channel的一倍时,shortcuts上需要使用数量与输出channel相等,大小为1×11×1的卷积核进行卷积操作;若输出的图像较输入图像缩小一倍,则要设置shortcuts中卷积操作中的stride为2,主分支第二层卷积操作的stride也需设置为2。 主分支与shortcuts输出的特征矩阵相加时,需要保证主分支与shortcuts输出的特征矩阵shape相同。如果主分支与shortcuts输出的特征矩阵shape不相同,如输出channel是输入channel的一倍时,shortcuts上需要使用数量与输出channel相等,大小为1×1的卷积核进行卷积操作;若输出的图像较输入图像缩小一倍,则要设置shortcuts中卷积操作中的stride为2,主分支第二层卷积操作的stride也需设置为2。
### 构建ResNet50网络 ### 构建ResNet50网络
...@@ -61,17 +61,14 @@ ResNet网络层结构如下图所示,以输入彩色图像224×224为例,首 ...@@ -61,17 +61,14 @@ ResNet网络层结构如下图所示,以输入彩色图像224×224为例,首
ResNet50网络共有5个卷积结构,一个平均池化层,一个全连接层,以CIFAR-10数据集为例: ResNet50网络共有5个卷积结构,一个平均池化层,一个全连接层,以CIFAR-10数据集为例:
- conv1:输入图片大小为32×32,输入channel为3。首先经过一个卷积核数量为64,卷积核大小为7×7,stride为2的卷积层;然后通过一个Batch Normalization层;最后通过Reul激活函数。该层输出feature map大小为16×16,输出channel为64。 - conv1:输入图片大小为32×32,输入channel为3。首先经过一个卷积核数量为64,卷积核大小为7×7,stride为2的卷积层;然后通过一个Batch Normalization层;最后通过Reul激活函数。该层输出feature map大小为16×16,输出channel为64。
- conv2_x:输入feature map大小为16×16,输出channel为64。首先经过一个卷积核大小为3×3,stride为2的最大下采样池化操作;然后堆叠3个[1×1,64;3×3,64;1×1,256][1×1,64;3×3,64;1×1,256]结构的Bottleneck。该层输出feature map大小为8×88×8,输出channel为256。 - conv2_x:输入feature map大小为16×16,输出channel为64。首先经过一个卷积核大小为3×3,stride为2的最大下采样池化操作;然后堆叠3个[1×1,64;3×3,64;1×1,256][1×1,64;3×3,64;1×1,256]结构的Bottleneck。该层输出feature map大小为8×88×8,输出channel为256。
- conv3_x:输入feature map大小为8×8,输入channel为256。该层堆叠4个[1×1,128;3×3,128;1×1,512]结构的Bottleneck。该层输出feature map大小为4×44×4,输出channel为512。 - conv3_x:输入feature map大小为8×8,输入channel为256。该层堆叠4个[1×1,128;3×3,128;1×1,512]结构的Bottleneck。该层输出feature map大小为4×44×4,输出channel为512。
- conv4_x:输入feature map大小为4×4,输入channel为512。该层堆叠6个[1×1,256;3×3,256;1×1,1024]结构的Bottleneck。该层输出feature map大小为2×2,输出channel为1024。 - conv4_x:输入feature map大小为4×4,输入channel为512。该层堆叠6个[1×1,256;3×3,256;1×1,1024]结构的Bottleneck。该层输出feature map大小为2×2,输出channel为1024。
- conv5_x:输入feature map大小为2×2,输入channel为1024。该层堆叠6个[1×1,512;3×3,512;1×1,2048]结构的Bottleneck。该层输出feature map大小为1×1,输出channel为2048。 - conv5_x:输入feature map大小为2×2,输入channel为1024。该层堆叠6个[1×1,512;3×3,512;1×1,2048]结构的Bottleneck。该层输出feature map大小为1×1,输出channel为2048。
- average pool & fc:输入channel为2048,输出channel为分类的类别数。 - average pool & fc:输入channel为2048,输出channel为分类的类别数。
![image-20220525003625359](resnet.assets/image-20220525003625359.png)
## MindSpore实现 ## MindSpore实现
### 数据集准备与加载 ### 数据集准备与加载
...@@ -407,4 +404,5 @@ visualize_model('best.ckpt', ds_val) ...@@ -407,4 +404,5 @@ visualize_model('best.ckpt', ds_val)
## 参考 ## 参考
1. [Deep Residual Learning for Image Recognition. Kaiming He,etc](https://arxiv.org/pdf/1512.03385.pdf) 1. [Deep Residual Learning for Image Recognition. Kaiming He,etc](https://arxiv.org/pdf/1512.03385.pdf)
2. [MindSpore: ResNet50网络进行图像分类](https://mindspore.cn/tutorials/application/zh-CN/r1.7/cv/resnet50.html) 2. [MindSpore: ResNet50网络进行图像分类](https://mindspore.cn/tutorials/application/zh-CN/r1.7/cv/resnet50.html)
\ No newline at end of file 3. [动手学深度学习:残差网络(ResNet)](https://zh.d2l.ai/chapter_convolutional-modern/resnet.html)
\ No newline at end of file
# 激活函数和优化器
深度学习的基本原理是基于人工神经网络,输入信号经过非线性的active function,传入到下一层神经元;再经过下一层神经元的activate,继续往下传递,如此循环往复,直到输出层。正是因为这些active functions的堆砌,深度学习才被赋予了解决非线性问题的能力。当然,仅仅靠active functions还不足于使得深度学习具有"超能力",训练过程中的优化器对于组织神经网络中的各个神经元起到了至关重要的角色。本文简单汇总一些常用的active functions和optimizers,不求最全,但是尽量保证简单易懂。
## 激活函数
当然,在介绍这些active functions之前,先简单汇总下active functions应该具备的性质。
- 非线性
- 可微性:当优化方法是基于梯度的时候,这个性质是必须的。
- 单调性:当激活函数是单调的时候,单层网络能够保证是凸函数。
- f(x)≈xf(x)≈x:当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要很用心的去设置初始值。
- 输出值的范围:当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate.
### 1. sigmoid
sigmoid函数是深度学习中最基本,也是最为常见的一种激活函数。sigmoid函数公式如下:
sigmoid函数的导函数形式为:
函数曲线和导函数曲线分别如下图所示:
![img](active_function_optimization.assets/764050-20180624163506479-1111234683.png)
sigmoid函数的优点在于函数平滑且易于求导,但是其缺点也比较突出,例如:
- 容易出现梯度弥散(具体可参考博文《[[Deep Learning\] 深度学习中消失的梯度](http://www.cnblogs.com/maybe2030/p/6336896.html)》)
- 输出不具有zero-centered性质
- 幂运算相对比较耗时
### 2. tanh
tanh读作hyperbolic tangent,相对于sigmoid函数的缺点,它具有zero-centered形式的输出,因此被认为tanh一般总是好于sigmoid,因为函数值介于[-1,1]之间,激活函数的平均值接近于0,这样可以使得下一层的神经元学习的更好。其公式表示如下:
f(x)=ex−e−xex+e−xf(x)=ex−e−xex+e−x
对应的导数形式为:g(x)=1−f(x)2g(x)=1−f(x)2
函数曲线和导函数曲线分别如下图所示:
![img](active_function_optimization.assets/764050-20180624165537224-2122679279.jpg)
实际上tanh是sigmoid平移后的结果。因为tanh总是优于sigmoid,所以sigmoid目前基本不用,但有一个例外的场景,那就是sigmoid更适合于做二分类系统的输出层。因为sigmoid的输出值介于[0,1]之间,可以很容易的去表征概率。
### 3. ReLU
tanh和sigmoid函数的共同缺点就是当输入*特别小或者特别大时,容易引起梯度弥散或梯度爆炸。而ReLU(Rectified Linear Units)可以在一定程度上缓解梯度弥散和梯度爆炸的问题,使得深度神经网络的训练可以更快速地达到收敛。因此目前神经网络中的隐含层中最为常用的默认激活函数就是ReLU了。其函数形式表示如下:*
f(x)=max(0,x)f(x)=max(0,x)
*函数和导函数曲线如下图所示:*
*![img](active_function_optimization.assets/764050-20180624170018287-141865260.jpg)*
通过上图可以发现,ReLU在0点是不可导的,因此ReLU在应用的时候有个小trick,在实践的时候可以将0点的导数强制赋值为0或者1。
ReLU虽然简单,但却是深度学习激活函数方面几乎最为重要的成果,它有以下几大优点:
- 解决了梯度弥散的问题(输出均大于0)
- 计算速度非常快,只需要判断输入是否大于0(阈值计算)
- 收敛速度远快于sigmoid和tanh
但其实ReLU也不是万能的,它的缺点可以简单提两点:
- 输出不是zero-centered
- 具有dying ReLU problem
dying ReLU problem:由于ReLU特殊的函数形式,在训练过程中某些神经元可能永远不会被激活,导致相应的参数永远不能被更新,而且这个问题会随着训练的进行持续恶化。
导致dying ReLU problem的原因主要有两个:
- 初始化,这种概率比较小
- Learning rate太大
dying ReLU problem详细细节可以参考这里:《[What is the "dying ReLU" problem in neural networks?](https://www.quora.com/What-is-the-dying-ReLU-problem-in-neural-networks)
即使ReLU存在上述问题,但是ReLU目前是应用最为广泛和实用的激活函数。
### 4. Leaky ReLU
Leaky ReLU就是针对dying ReLU problem而进行改进的,相对于ReLU而言,函数前半段不再为0,而是一段线性函数。用公式表达如下:
f(x)=αx,ifx<0f(x)=αx,ifx<0
f(x)=x,ifx≥0f(x)=x,ifx≥0
其中,参数αα一般为远小于1的实数,比如0.01。下图显示了Leaky ReLU的两种函数形式,一种αα为定值,另外一种αα为某范围内的随机值(也被称为Randomized Leaky ReLU):
![img](active_function_optimization.assets/764050-20180625132255999-2137587315.jpg)
除了具备ReLU的所有优点以外,Leaky ReLU不存在dying ReLU problem。从理论上讲,Leaky ReLU应该完全优于ReLU的性能,但是实际应用中并没有表现可以证明Leaky ReLU绝对优于ReLU。
## 5. ELU
同Leaky ReLU一样,ELU(Exponential Linear Unit)也是针对dying ReLU problem提出的。具体公式如下:
f(x)=α(ex−1),ifx<0f(x)=α(ex−1),ifx<0
f(x)=x,ifx≥0f(x)=x,ifx≥0
具体函数曲线如下:
![img](active_function_optimization.assets/764050-20180625135012610-669509680.jpg)
ELU也可以有效地解决dying ReLU problem,而且是近似zero-centered,但随之而来的缺点就是ELU不再是简单的阈值计算,计算相对ReLU稍加复杂。
激活函数汇总
下表汇总了常用的一些active functions:
![img](active_function_optimization.assets/764050-20180625135248781-356857218.png)
## 优化器
### 1. batch GD & SGD & Mini-batch GD
三种梯度下降算法可以参考之前博文《[[Machine Learning\] 梯度下降法的三种形式BGD、SGD以及MBGD](http://www.cnblogs.com/maybe2030/p/5089753.html)
上述三种梯度下降的优化算法均存在如下问题:
- Learning rate如果选择的太小,收敛速度会很慢,如果太大,loss function就会在极小值处不停地震荡甚至偏离。
- 对所有参数更新时应用同样的Learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。
- 对于非凸函数,还要避免陷于局部极小值或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,纯梯度下降很容易被困在这里。
关于鞍点的解释:
  鞍点:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。 例如下图这个二维图形,像个马鞍:在x轴方向往上曲,在y轴方向往下曲,鞍点就是(0,0)。
![img](active_function_optimization.assets/764050-20180625144720696-147966947.jpg)
目前对于优化器的研究基本围绕上述三个问题进行展开。
### 2. Momentum
SGD算法的更新公式如下:
W:=W−αdWW:=W−αdW
b:=b−αdbb:=b−αdb
我们可以示意化的画出SGD优化路线图如下:
![img](active_function_optimization.assets/764050-20180626094335952-77919475.png)
Momentum的改进思想是针对SGD算法波动大、收敛速度慢问题,简单来说就是防止波动,取前几次波动的均值作为新的参数值。Momentum利用了梯度的指数加权平均数,引入了一个新的超参数ββ(一般取0.9),具体更新公式如下:
VdW=βVdW+(1−β)dWVdW=βVdW+(1−β)dW
Vdb=βVdb+(1−β)dbVdb=βVdb+(1−β)db
W:=W−αVdWW:=W−αVdW
b:=b−αVdbb:=b−αVdb
改进后的Momentum优化路线示意图如下:
![img](active_function_optimization.assets/764050-20180626094543261-2081093887.png)
Momentum背后的物理含义可以简单的这样理解:
当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。 加入这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
### 3. RMSprop
RMSprop是Geoff Hinton提出的一种自适应学习率方法,全称为Root Mean Square Prop,它的基本思想和Momentum类似,同样引入了额外的超参数ββ(一般取值0.999),其更新公式如下:
SdW=βSdW+(1−β)dW2SdW=βSdW+(1−β)dW2
Sdb=βSdb+(1−β)db2Sdb=βSdb+(1−β)db2
W:=W−αdWSdW−−−−√W:=W−αdWSdW
b:=b−αdbSdb−−−√b:=b−αdbSdb
针对上述更新公式,为了防止WW和bb更新过程中分母项为0,一般在应用中加上特别小的一个实数ϵϵ(一般取值为10−810−8):
W:=W−αdWSdW+ϵ−−−−−−√W:=W−αdWSdW+ϵ
b:=b−αdbSdb+ϵ−−−−−−√b:=b−αdbSdb+ϵ
RMSprop示意图如下:
![img](active_function_optimization.assets/764050-20180626101005414-126792167.png)
具体关于RMSprop更详细的讲解可以参考这篇博文《[机器学习中使用的神经网络第六讲笔记](https://blog.csdn.net/majordong100/article/details/51428642)
### 4. Adam
研究者们其实提出了很多的优化算法,可以解决一些特定的优化问题,但是很难扩展到多种神经网络。而Momentum,RMSprop是很长时间来最经得住考研的优化算法,适合用于不同的深度学习结构。所以有人就有想法,何不将这俩的方法结合到一起呢?Adam算法,全称Adaptive Moment Estimation,就随即问世了。由于Adam是Momentum+RMSprop,所以需要引入两个超参数,我们表示为β1=0.9β1=0.9,β2=0.999β2=0.999。
VdW=β1VdW+(1−β1)dWVdW=β1VdW+(1−β1)dW
Vdb=β1Vdb+(1−β1)dbVdb=β1Vdb+(1−β1)db
SdW=β2SdW+(1−β2)dW2SdW=β2SdW+(1−β2)dW2
Sdb=β2Sdb+(1−β2)db2Sdb=β2Sdb+(1−β2)db2
VcorrecteddW=VdW1−βt1VdWcorrected=VdW1−β1t
Vcorrecteddb=Vdb1−βt2Vdbcorrected=Vdb1−β2t
ScorrecteddW=SdW1−βt1SdWcorrected=SdW1−β1t
Scorrecteddb=Sdb1−βt2Sdbcorrected=Sdb1−β2t
W:=W−αVdWScorrecteddW−−−−−−−√W:=W−αVdWSdWcorrected
b:=b−αVdbScorrecteddb−−−−−−−√b:=b−αVdbSdbcorrected
因为Adam结合上述两种优化算法的优点于一身,所以现在经常用的是Adam优化算法。
5. 各Optimizers优化效果
除了上述三种常用的改进算法,还有例如Adagrad等Optimizer,这里就不一一介绍了,感兴趣的可以去了解下各算法改进的motivation。
下面两个图分别展示了几种算法在鞍点和等高线上的表现:
![img](active_function_optimization.assets/764050-20180626101922973-719563842.gif)
![img](active_function_optimization.assets/764050-20180626101958953-188946578.gif)
## 参考
1. Adrew Ng 深度学习课程
2. [谷歌考察:深度学习的activation function哪家强](http://www.sohu.com/a/127679690_410611)
3. [仙道菜的博客](https://blog.csdn.net/cyh_24/article/details/50593400)
4. [Marcovaldong的博客](https://blog.csdn.net/majordong100/article/details/51428642)
5. [关于深度学习优化器optimizer的选择,你需要了解这些](https://www.leiphone.com/news/201706/e0PuNeEzaXWsMPZX.html)
\ No newline at end of file
# 正则化
- LP范数
- L1范数
- L2范数
- L1范数和L2范数的区别
- Dropout
- Batch Normalization
- 归一化、标准化 & 正则化
- Reference
在总结正则化(Regularization)之前,我们先谈一谈正则化是什么,为什么要正则化。
正则化这个字眼有点太过抽象和宽泛,其实正则化的本质很简单,就是对某一问题加以先验的限制或约束以达到某种特定目的的一种手段或操作。在算法中使用正则化的目的是防止模型出现过拟合。一提到正则化,很多同学可能马上会想到常用的L1范数和L2范数,在汇总之前,我们先看下LP范数是什么鬼。
### LP范数
范数简单可以理解为用来表征向量空间中的距离,而距离的定义很抽象,只要满足非负、自反、三角不等式就可以称之为距离。
LP范数不是一个范数,而是一组范数,其定义如下:
![图片](Regularization.assets/640.png)
p的范围是![图片](Regularization.assets/640-16534961533271.png)。p在(0,1)范围内定义的并不是范数,因为违反了三角不等式。
根据p的变化,范数也有着不同的变化,借用一个经典的有关P范数的变化图如下:
![图片](Regularization.assets/640-16534961533272.png)
上图表示了p从0到正无穷变化时,单位球(unit ball)的变化情况。在P范数下定义的单位球都是凸集,但是当0<p<1时,该定义下的单位球不是凸集(这个我们之前提过,当0<p<1时并不是范数)。
那问题来了,L0范数是啥玩意?
L0范数表示向量中非零元素的个数,用公式表示如下:
![图片](Regularization.assets/640-16534961533273.png)
我们可以通过最小化L0范数,来寻找最少最优的稀疏特征项。但不幸的是,L0范数的最优化问题是一个NP hard问题(L0范数同样是非凸的)。因此,在实际应用中我们经常对L0进行凸松弛,理论上有证明,L1范数是L0范数的最优凸近似,因此通常使用L1范数来代替直接优化L0范数。
### L1范数
根据LP范数的定义我们可以很轻松的得到L1范数的数学形式:
![图片](Regularization.assets/640-16534961533284.png)
通过上式可以看到,L1范数就是向量各元素的绝对值之和,也被称为是"稀疏规则算子"(Lasso regularization)。那么问题来了,为什么我们希望稀疏化?稀疏化有很多好处,最直接的两个:
- 特征选择
- 可解释性
### L2范数
L2范数是最熟悉的,它就是欧几里得距离,公式如下:
![图片](Regularization.assets/640-16534961533285.png)
L2范数有很多名称,有人把它的回归叫“岭回归”(Ridge Regression),也有人叫它“权值衰减”(Weight Decay)。以L2范数作为正则项可以得到稠密解,即每个特征对应的参数w都很小,接近于0但是不为0;此外,L2范数作为正则化项,可以防止模型为了迎合训练集而过于复杂造成过拟合的情况,从而提高模型的泛化能力。
### L1范数和L2范数的区别
引入PRML一个经典的图来说明下L1和L2范数的区别,如下图所示:
![图片](Regularization.assets/640-16534961533286.jpeg)
如上图所示,蓝色的圆圈表示问题可能的解范围,橘色的表示正则项可能的解范围。而整个目标函数(原问题+正则项)有解当且仅当两个解范围相切。从上图可以很容易地看出,由于L2范数解范围是圆,所以相切的点有很大可能不在坐标轴上,而由于L1范数是菱形(顶点是凸出来的),其相切的点更可能在坐标轴上,而坐标轴上的点有一个特点,其只有一个坐标分量不为零,其他坐标分量为零,即是稀疏的。所以有如下结论,L1范数可以导致稀疏解,L2范数导致稠密解。
从贝叶斯先验的角度看,当训练一个模型时,仅依靠当前的训练数据集是不够的,为了实现更好的泛化能力,往往需要加入先验项,而加入正则项相当于加入了一种先验。
- L1范数相当于加入了一个Laplacean先验;
- L2范数相当于加入了一个Gaussian先验。
更详细的L1范数和L2范数区别,请点击[《比较详细的L1和L2正则化解释》](https://mp.weixin.qq.com/s?__biz=MzU0MDQ1NjAzNg==&mid=2247484454&idx=1&sn=b3404eefaa68a78b770adb092d2fb48f&chksm=fb39a12dcc4e283b132138583ecd9848aa175b4cffd4036be07a2e132cb616e18ce8fe8c9adb&token=1308490709&lang=zh_CN&scene=21#wechat_redirect)
如下图所示:
![图片](Regularization.assets/640-16534961533287.jpeg)
### Dropout
Dropout是深度学习中经常采用的一种正则化方法。它的做法可以简单的理解为在DNNs训练的过程中以概率p丢弃部分神经元,即使得被丢弃的神经元输出为0。Dropout可以实例化的表示为下图:
![图片](Regularization.assets/640-16534961533288.jpeg)
我们可以从两个方面去直观地理解Dropout的正则化效果:
- 在Dropout每一轮训练过程中随机丢失神经元的操作相当于多个DNNs进行取平均,因此用于预测具有vote的效果。
- 减少神经元之间复杂的共适应性。当隐藏层神经元被随机删除之后,使得全连接网络具有了一定的稀疏化,从而有效地减轻了不同特征的协同效应。也就是说,有些特征可能会依赖于固定关系的隐含节点的共同作用,而通过Dropout的话,就有效地组织了某些特征在其他特征存在下才有效果的情况,增加了神经网络的鲁棒性。
### Batch Normalization
批规范化(Batch Normalization)严格意义上讲属于归一化手段,主要用于加速网络的收敛,但也具有一定程度的正则化效果。
这里借鉴下魏秀参博士的知乎回答中对covariate shift的解释。
注以下内容引自魏秀参博士的知乎回答:
大家都知道在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如transfer learning/domain adaptation等。而covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同。大家细想便会发现,的确,对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。
BN的基本思想其实相当直观,因为神经网络在做非线性变换前的激活输入值(X = WU + B,U是输入),随着网络深度加深,其分布逐渐发生偏移或者变动(即上述的covariate shift)。之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值(X = WU + B)是大的负值和正值。所以这导致后向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。而 BN 就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,避免因为激活函数导致的梯度弥散问题。所以与其说BN的作用是缓解covariate shift,倒不如说BN可缓解梯度弥散问题。
### 归一化、标准化 & 正则化
正则化我们以及提到过了,这里简单提一下归一化和标准化。
归一化(Normalization):归一化的目标是找到某种映射关系,将原数据映射到[a,b]区间上。一般a,b会取[-1,1],[0,1]这些组合 。
一般有两种应用场景:
- 把数变为(0, 1)之间的小数
- 把有量纲的数转化为无量纲的数
常用min-max normalization:
![图片](Regularization.assets/640-16534961533289.png)
标准化(Standardization):用大数定理将数据转化为一个标准正态分布,标准化公式为:
![图片](Regularization.assets/640-165349615332910.png)
**归一化和标准化的区别:**
我们可以这样简单地解释:
归一化的缩放是“拍扁”统一到区间(仅由极值决定),而标准化的缩放是更加“弹性”和“动态”的,和整体样本的分布有很大的关系。
值得注意:
归一化:缩放仅仅跟最大、最小值的差别有关。
标准化:缩放和每个点都有关系,通过方差(variance)体现出来。与归一化对比,标准化中所有数据点都有贡献(通过均值和标准差造成影响)。
**为什么要标准化和归一化?**
- 提升模型精度:归一化后,不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。
- 加速模型收敛:标准化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。如下图所示:
![图片](Regularization.assets/640-165349615332911.png)
![图片](Regularization.assets/640-165349615332912.png)
### 参考
1. Andrew Ng深度学习教程
2. [Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)](http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html)
3. [Poll的笔记:正则化]( https://www.cnblogs.com/maybe2030/p/9231231.html)
\ No newline at end of file