深度学习 笔记

文章目录

  • 1
    • 欠拟合
    • 过拟合
  • 2
    • 组合函数
    • 激活函数
    • 误差函数
    • 优化函数
    • 目标函数
    • 反向传播
    • 隐藏层的误差
  • 3
    • 批量算法 递增算法
    • 在线学习和离线
    • 标准化
  • 4 pytorch
    • 损失函数
    • 优化函数
  • 5经典网络
    • LeNet-5
    • AlexNet
      • 1. Relu
      • 2. 重叠池化
      • 3. 数据增强
      • 4. 多GPU训练
      • 5. LRN 局部响应归一化
    • VGG16
      • 1.堆叠较小的卷积核
      • 2.唯一的预处理
      • 3.带动量的min-batch梯度下降法
      • 4.测试时将全连接改成卷积
      • 5.全连接转卷积
    • GoogleNet
      • Naive Inception结构
      • 1*1 卷积层的作用
      • v1: Going Deeper with Convolutions
      • v2:Batch Normalization
        • 梯度爆炸
      • v3:Rethinking the Inception Architecture for Computer Vision
      • v4:
      • GoogleNet网络架构
    • ResNet
      • Bottleneck
    • Xception(极致的Inception)
  • 方法
    • 早停法 early_stop
    • ModelCheckpoint
    • 关于权重
    • 关于Maxpool
    • 。。。

1

欠拟合

模型虽然捕获了数据的一部分特征,但是不能很好地对新数据进行准确预测。

(1)增加特征项:在模型中加入更多的和原数据有重要相关性的特征来训练搭建的模型,得到的模型可能会有更好的泛化能力。
(2)构造复杂的多项式:增加函数中的次项来增强模型的变化能力,提升其泛化能力。
(3)减少正则化参数:正则化参数目的其实是防止过拟合,但是模型已经出现了欠拟合,就通过减少正则化参数 来消除欠拟合。

过拟合

模型过度捕获了原数据的特征。

(1)增大训练的数据量:用于模型训练的数据量太小,搭建的模型过度捕获了数据的有限特征,会出现过拟合,在增加参与模型训练的数据量后,模型自然就能捕获数据的更多特征,模型就不会过于依赖数据的个别特征。
(2)采用正则化方法:正则化一般指在目标函数之后加上范数, 用来防止模型过拟合的发生,在实践中最常用到的正则化方法有L0正 则、L1正则和L2正则。
(3)Dropout方法:在神经网络模型进行前向传播的过程中,随机选取和丢弃指定层次之间的部分神经连接,因为整个过程是随机的,所以能有效防止过拟合的发生

2

深度学习 笔记_第1张图片

组合函数

向量 映射到 标量,作为下一层神经元的网络输入变量

激活函数

将一维向量的网络输入变量通过一个函数映射到另外一个一维向量的数值。

通常将一个实数域得的值映射到有限域上。

主要作用:给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数

一个只有线性关系隐含层的多层神经网络不会比一般的只包含输入层和输出层的两层神经网络更加强大,因为线性函数的函数仍然是一个线性函数。但是加入非线性以后,多层神经网络的预测能力就得到了显著提高。

1 Sigmoid函数

logistic、tanh、高斯函数等,统称为Sigmoid函数

优:连续可微,参数的一点变化就会带来输出变化。有助于判断参数的变动是否有利于最终目标函数的优化。

劣:存在梯度消亡(Gradient Vanishing):梯度(误差的信号)随隐藏层数的增加成指数减小。

在后向传播算法中,对梯度的计算使用链式法则,因此在第n层时需要将前面各层的梯度都相乘,但是由于sigmoid函数的值域在(-1,1)或者(0,1)之间,因此多个很小的数相乘以后第n层的梯度就会接近于0,
造成模型训练的困难。

Sigmoid

深度学习 笔记_第2张图片
Sigmoid函数的输出值恒大于0,会导致模型在优化的过程中收敛速度变慢

tanh

深度学习 笔记_第3张图片

tanh函数的输出结果是零中心数据,解决了激活函数在模型优化过程中收敛速度变慢的问题

2 threshold函数

误差函数是逐级常数(Stepwise Constant),一阶导数要么不存在要么为0,不能使用后向传播算法计算一阶导数。微小变化并不能在输出中产生变动,算法收敛会慢很多。

RELU(Rectified Linear Unit,修正线性单元)

​ f(x)=max(0,x)

ReLU函数的收敛速度非常快,其计算效率远远高于Sigmoid和tanh

ReLU的输出不是零中心数据,可能会导致某些神经元永远不会被激活,并且这些神经元对应的参数不能被更新。

选择激活函数

对于只有0,1取值的双值因变量,logistic函数是一个较好的选择。
对于有多个取值的离散因变量,比如0到9数字的识别,softmax激活函数是logistic激活函数的自然衍生。对于有有限值域的连续因变量,logistic或者tanh激活函数都可以用,但是需要将因变量的值域伸缩到logistic或者tanh对应的值域中。
如果因变量取值为正,但是没有上限,那么指数函数是一个较好的选择。
如果因变量没有有限值域,或者虽然是有限值域但是边界未知,那么最好采用线性函数作为激活函数

ps

f(x)=tanh(x)或者f(x)=(1+e−x)−1。就梯度下降法的训练时间而言,这些饱和非线性函数比非饱和非线性函数如f(x)=max(0,x)f(x)=max⁡(0,x)慢得多。

误差函数

均方差(MSE)[外链图片转存失败(img-BHOFdGoE-1564145426306)(d3.jpg)]

用在实数值域连续变量的回归问题上

平均绝对值(MAE)[外链图片转存失败(img-wuGplqSv-1564145426306)(d4.jpg)]

每个误差点对总体误差的贡献与其误差绝对值成线性比例关系

交叉熵损失(Cross-Entropy)

为映射到最可能的类别的概率的对数。当预测值的分布和实际因变量的分布尽可能一致时,交叉熵最小。

优化函数

梯度下降(Gradient Descent,GD)

在这里插入图片描述

如果学习速率过快,参数的更新跨步就会变大,极易出现局部最优和抖动;

如果学习速率过慢,梯度更新的迭代次数就会增加,参数更新、优化的时间也会变长。

因为模型的训练依赖于整个数据集,所以增加了计算损失值的时间成本和模型训练过程中的复杂度

批量梯度下降(Batch Gradient Descent,BGD)

对于训练数据集,我们首先将其分成 n 个 batch,每个 batch 包含 m 个样本。我们每次更新都利用一个 batch 的数据,以这个批量计算得到的损失值为基准来对模型中的全部参数进行梯度更新,而非整个训练集

当训练数据太多时,利用整个数据集更新往往时间上不现实。batch的方法可以减少机器的压力,并且可以更快地收敛。
当训练集有很多冗余时(类似的样本出现多次),batch 方法收敛更快。以一个极端情况为例,若训练集前一半和后一半梯度相同,那么如果前一半作为一个 batch,后一半作为另一个 batch,那么在一次遍历训练集时,batch 的方法向最优解前进两个 step,而整体的方法只前进一个 step

随机梯度下降(Stochastic Gradient Descent,SGD)

自适应时刻估计方法(Adaptive Moment Estimation,Adam)

在模型训练优化的过程中通过让每个参数获得自适应的学习率,来达到优化质量和速度的双重提升

目标函数

在训练阶段直接最小化的那个函数。

若采用正则项,则是误差函数与正则函数的和。

反向传播

深度学习 笔记_第4张图片

隐藏层的误差

深度学习 笔记_第5张图片)
深度学习 笔记_第6张图片

3

批量算法 递增算法

深度学习 笔记_第7张图片

批量算法 ,一次处理所有的数据;

递增算法,每处理一个或者数个观测值就要更新一次参数。

在后向传播算法中,“处理”对应的具体操作就是计算损失函数的梯度变化曲线。

如果是批量算法,则计算平均或者总的损失函数的梯度变化曲线。

如果是递增算法,则计算损失函数仅在对应于该观测值或者数个观测值时的梯度变化曲线。

在线学习和离线

离线学习中,所有的数据都可以被反复获取 批量学习就是离线学习的一种。

在线学习中,每个观测值在处理以后会被遗弃,同时参数得到更新。

在线学习永远是递增算法的一种,但是递增算法却既可以离线学习也可以在线学习

离线学习有如下几个优点:
对于任何固定个数参数,目标函数可以直接被计算出来,容易验证模型训练是否在朝着所需要的方向发展。
计算精度可以达到任意合理的程度。
可以使用各种不同的算法来避免出现局部最优的情况。
可以采用训练、验证、测试三分法对模型的普适度进行验证。
可以计算预测值及其置信区间

在线学习,因为数据并没有被存储,不能反复获取,因此对于任何固定的参数集,无法在训练集上计算损失函数,也无法在验证集上计算误差。

标准化

(1)重放缩(Rescaling):通常指将一个向量加上或者减去一个常量,再乘以或者除以一个常量。比如将华氏温度转换为摄氏温度就是一个重放缩的过程。
(2)规范化(Normalization):通常指将一个向量除以其范数,比如采用欧式空间距离,则用向量的方差作为范数来规范化向量。在深度学习中,规范化通常采用极差为范数,即将向量减去最小值,并除以其极差,从而使数值范围在0到1之间。
(3)标准化(Standardization):通常指将一个向量移除其位置和规模的度量。比如一个服从正态分布的向量,可以减去其均值,并除以其方差来标准化数据,从而获得一个服从标准正态分布的向量。

4 pytorch

 x=torch.Tensor(3,4)  #指定维度的随机数

from torch.autograd import Variable
x=Variable(torch.ones(2,2))   print(x.data,x.grad)    #x.grad:导数
x=Variable(torch.ones(2,2),requires_grad=True)   #[[1,1],[1,1]]
y=x+2    # [[3,3],[3,3]]
z=y*y*3  # [[27,27],[27,27]]
out=z.mean()  #27
out.backward() #反向传播,求导
print(x.grad) #[[4.5000,4.5000],[4.5000,4.5000]]  
              #z=(x+2)*(x+2)*3  导数3*(x+2)/2 , 4.5是x=1时的导数值

在这里插入图片描述深度学习 笔记_第8张图片

#权值更新: weight=weight+learning_rate*gradient
learning_rate=0.1  #学习速率,步长
for f in model.parameters():
    f.data.sub_(f.grad*learning_rate)

损失函数

import torch.nn as nn
import torch.nn.functional as F
sample=Variable(torch.ones(2,2))  #[[1,1],[1,1]]
a=torch.Tensor(2,2)  
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target=Variable(a)  #[[0,1],[2,3]]

1 nn.L1Loss

在这里插入图片描述
绝对误差的平均数

criterion=nn.L1Loss()
loss=criterion(sample,target)  #1   :    (|0-1|+|1-1|+|2-1|+|3-1|)/4

2 nn.SmoothL1Loss (Huber Loss)

深度学习 笔记_第9张图片 误差在 (-1,1) 上是平方损失,其他情况是 L1 损失

criterion = nn.SmoothL1Loss()
loss = criterion(sample, target)   #0.625

**3 nn.MSELoss ** 平方损失函数。

[外链图片转存失败(img-BbDBKdNk-1564145426311)(d15.jpg)] 预测值和真实值之间的平方和的平均数

criterion = nn.MSELoss()
loss = criterion(sample, targe)#1.5

4 nn.BCELoss 二分类用的交叉熵
在这里插入图片描述

criterion = nn.BCELoss()
loss = criterion(sample, target) #-13.8155

5 nn.CrossEntropyLoss 交叉熵损失函数

[外链图片转存失败(img-vykV11Jc-1564145426312)(d17.jpg)]

6 nn.NLLLoss (Negative Log Likelihood) 负对数似然损失函数

[外链图片转存失败(img-L85JOeEW-1564145426312)(d18.jpg)]

优化函数

SGD

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)  
# momentum:大于 0 的浮点数,动量参数。

5经典网络

LeNet 1989 历史上第一个真正意义的卷积神经网络模型。最初的模型已不被使用。1998 LeNet-5 (6层)

AlexNet 2012 ILSVRC比赛冠军 (8层)

VGGNet 2014 ILSVRC定位第一,分类第二 (VGG16 16层)

GoogleNet 2014 ILSVRC 分类第一 (22层)

ResNet 2015 ILSVRC 分类第一 (34层)

LeNet-5

论文说:

1.下采样,降低特征图的分辨率,降低输出对移位和失真的敏感性。

2.使平均输入近似为零,方差近似为一,可以加速学习

3.C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入。最后一个将S2中所有特征图为输入。可训练参数:6*(35*5+1)+6(4*5*5+1)+3*(4*5*5+1)+1*(6*5*5+1)=1516

为了破坏网络对称性

4.OUTPUT层:径向基函数(RBF)的网络连接方式:

[外链图片转存失败(img-6WekgSMd-1564145426312)(C:/Users/Afeier/Desktop/DL/1563850639941.png)]

上式w_ij 的值由i的比特图编码确定,i从0到9,j取值从0到7*12-1。RBF输出的值越接近于0,则越接近于i,即越接近于i的ASCII编码图,表示当前网络输入的识别结果是字符i。

AlexNet

在CNN中成功应用了ReLU、Dropout和LRN等Trick

深度学习 笔记_第10张图片

1. Relu

f(x) = tanh(x)f(x) = (1 + e−x)−1----饱和的非线性

f(x) = max(0,x) —非饱和非线性 , 梯度下降的训练时间更快

2. 重叠池化

s=2,z=3 ,降低了top-1 0.4%top-5 0.3%的错误率,并且更难过拟合。

3. 数据增强

第一种:图像平移和水平翻转

第二种:改变RGB通道的强度。光照的颜色和强度发生变化时,目标身份是不变的。减少了top 1错误率1%以上

在整个ImageNet训练集上对RGB集合执行PCA,对于每一个训练图片,加上主成分的倍数,大小成正比地乘一个随机变量(随机变量通过mean=0,stv=0.1的高斯分布得到)

对于每个RGB [外链图片转存失败(img-u3TdiqNH-1564145426313)(wps1.png)]加上[外链图片转存失败(img-0Qj3CBsu-1564145426315)(wps2.png)]

[外链图片转存失败(img-EdVzhsIr-1564145426315)(wps5.png)]分别是RGB像素值3*3协方差矩阵的第i个特征向量和特征值,对于某个训练图片的所有像素,随机变量只获取一次,直到下次训练重新获取。

4. 多GPU训练

深度学习 笔记_第11张图片

上下两个GPU分别运行在部分层上。GPU只在特定的层进行通信。

The network’s input is 150,528-dimensional, and the number of neurons in the network’s remaining layers is given by 253,440–186,624–64,896–64,896–43,264– 4096–4096–1000. ???????????

5. LRN 局部响应归一化

[外链图片转存失败(img-boujuDeH-1564145426315)(1563841938432.png)]

i:第i个核在位置(x,y)运用激活函数Relu后的输出

n:同一位置上临近的kernel map的数目

N:kernel的总数

参数K,n,alpha,beta都是超参数,一般设置k=2,n=5,alpha=1e-4,beta=0.75

VGG16

相对于AlexNet,统一了卷积中使用的参数。参数量减少了 81%(相比AlexNet),而感受野保持不变

例:卷积核 3*3 ,步长1 ,padding=1

​ 最大池化 2*2 步长2

深度学习 笔记_第12张图片

1.堆叠较小的卷积核

小而深的卷积核可以使模型性能提升。

3个3*3的卷积层串联相当于一个7*7的卷积层,但是拥有更少的参数。(3*3*3)/(7*7)=55%

2.唯一的预处理

RGB通道各自减去对应通道的均值。

3.带动量的min-batch梯度下降法

动量0.9

4.测试时将全连接改成卷积

全连接层转化为卷积层的规则是: 将卷积核大小设置为输入的空间大小.

好处:卷积层对输入大小没有限制,可以高效地对图像做滑动窗口式的预测

5.全连接转卷积

在测试阶段把网络中的三个全连接层依次变为 1个conv7*7,2个conv1*1.改变之后,整个网络没有全连接层,网络中间的feature map不会固定,所以网络对任意大小的输入都可以处理

GoogleNet

引入Inception单元

Naive Inception结构

深度学习 笔记_第13张图片

假设 previous layer 32*32*456 复制成四份 传至接下来的四部分

​ 四部分对应滑动窗口均为 3*3 , 步长均为1 ,

​ 前三部分卷积padding分别为0,1,2 . 要求输出特征图深度分别为128,192,96 (无特殊含义)

​ 最大池化padding=1

​ 四部分输出的特征图为 32*32*128 , 32*32*192 , 32*32*96 , 32*32*256

​ 合并:将各个部分输出的特征图相加 ,最后这个 Naive Inception单元输出维度为 32*32*672

深度学习 笔记_第14张图片

Naive Inception 的两个问题:

1.所有卷积层直接和前一层输入的数据对接,卷积层中的计算量很大

2.最大池化层保留了输入数据特征图的深度,总的输出深度增加,增加了网络结构计算量

1*1 卷积层的作用

1.完成特征图的聚合或发散。

假设有一个维度 50*50*100 的特征图 ,定义卷积核1*1*100 ,若想输出深度为90的特征图 ,则通过90次卷积操作,完成了特征图通道的聚合;同理,若110次操作,完成发散。

2.间接影响了卷积参数数量,提高模型性能。

将32*32*10的特征图输入到3*3的卷积层中,要求输出特征图深度20,需要用到卷积参数3*3*10*20=1800个;

若先输入到1*1*5卷积层中,变成32*32*5,再输入到3*3卷积层中,参数减少至1*1*5*10+3*3*5*20=950个。

v1: Going Deeper with Convolutions

v2:Batch Normalization

[外链图片转存失败(img-IZCAF0V0-1564145426317)(1563873618601.png)]

1.加入了BN层,使每一层的输出都规范化到一个N(0, 1)的高斯,增加了模型的鲁棒性,可以以更大的学习速率训练,收敛更快,初始化操作更加随意,同时作为一种正则化技术,可以减少dropout层的使用。

BN层使得可以使用更大的学习效率进行训练,避免梯度弥散或者梯度爆炸现象的发生。

(x-mean)/MSE ---->均值0 方差1

2.学习VGG用2个3x3的conv替代inception模块中的5x5,既降低了参数数量,也加速计算。

3.internal covariate shift:训练过程中深度网络内部子网络的输入数据的分布变化。batch normalization方法可以减弱这些变化。

梯度爆炸

神经网络中,由于梯度反向传播到当前层时会乘以后面所有层权重的乘积,当网络层数很多时,如果后面层的权重参数大多使用幅值大于1的参数会造成梯度的爆炸现象,如果大多使用幅值小于1的参数会造成梯度弥散现象。

学习率较大,会有很大概率发生梯度爆炸。

v3:Rethinking the Inception Architecture for Computer Vision

将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1)。既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从224x224变为了299x299,更加精细设计了35x35/17x17/8x8的模块。

v4:

重点有两部分,一部分是对inception-v3进行架构的细化与改进,inception模块中嵌入inception模块,但是总的来看模型是一致的。另一部分便是结合了微软的resnet,也就是残差网络,使用了新的inception模块,也就是inception-resnet模块,相较于传统的inception-v4模型inception-resnet-v2计算量更小,能达到相差不多的效果。

深度学习 笔记_第15张图片

GoogleNet网络架构

三大块:模型的起始部分 , Inception单元堆叠部分 ,模型最后分类输出部分

若想增加或减少模型深度,只需增加或减少相应的Inception单元

为避免深层次模型中梯度消失问题,增加了两个额外的辅助Softmax函数
深度学习 笔记_第16张图片

ResNet

shortcut或者skip connections

残差模块的最终输出结果=输入数据X经过两个卷积之后的输出F(x)加上输入数据的恒等映射。

残差模块的输入数据X若和输出结果一致,直接相加;若不一致,先进行线性投影得到一致维度或维度不一致的部分用0填充。

不会给整个ResNet模型增加额外的参数和计算量,却能加快模型的训练速度。

深度学习 笔记_第17张图片

常规残差模块,瓶颈残差模块(bottleneck residual block):
深度学习 笔记_第18张图片

深度学习 笔记_第19张图片

Bottleneck

Bottleneck 三步走:先对数据进行降维,再进行常规卷积核的卷积,最后对数据进行升维。

Xception(极致的Inception)

Inception-v3的另一种改进。

通道之间的相关性 与 空间相关性 应分开处理。采用Separable Convolution 替换 inception-v3中卷积操作。

方法

早停法 early_stop

在训练中计算模型在验证集上的表现,当模型在验证集上的表现开始下降的时候,停止训练,这样就能避免继续训练导致过拟合的问题。

  1. 将原始的训练数据集划分成训练集和验证集
  2. 只在训练集上进行训练,并每个一个周期计算模型在验证集上的误差,例如,每15次epoch(mini batch训练中的一个周期)
  3. 当模型在验证集上的误差比上一次训练结果差的时候停止训练
  4. 使用上一次迭代结果中的参数作为模型的最终参数

但是模型在验证集上的表现可能在短暂的变差之后有可能继续变好。

早停法主要是训练时间和泛化错误之间的权衡。

找到适合的停止标准可以帮助找到更好的平衡。

ModelCheckpoint

语法keras.callbacks.ModelCheckpoint(filepath,monitor=‘val_loss’,verbose=0,save_best_only=False, save_weights_only=False, mode=‘auto’, period=1)

参数说明

filename:字符串,保存模型的路径

monitor:需要监视的值

verbose:信息展示模式,0或1(checkpoint的保存信息,类似Epoch 00001: saving model to …)

save_best_only:当设置为True时,监测值有改进时才会保存当前的模型( the latest best model according to the quantity monitored will not be overwritten)

mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当监测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。

save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)

period:CheckPoint之间的间隔的epoch数

关于权重

**初始化权重值不能相同,否则网络会变为对称的。**也就是说,如果权重初始化为同一值,则对于任何输入X,每个隐藏层对应的每个神经元的输出都是相同的,这样即使梯度下降训练,无论训练多少次,这些神经元都是对称的,无论隐藏层内有多少个结点,都相当于在训练同一个函数。

在这里插入图片描述

关于Maxpool

max-pooling更容易捕捉图像上的变化,梯度的变化,带来更大的局部信息差异性,更好地描述边缘、纹理等构成语义的细节信息

。。。

feature map维度的整体变化过程是:先将local(width,height)信息压缩,并分摊到channel(depth)层级

你可能感兴趣的:(DL)