tensorflow与深度学习之二

  1. tensorflow是什么

  2. tensorflow计算模型-计算图
    2.1计算图的概念
    2.2计算图的使用
  3. tensorflow数据模型-张量
    3.1张量的概念
    3.2张量的使用
  4. tensorflow运行模型-会话
  5. tensorflow实现神经网络
  6. 第一个CNN网络
    6.1CNN算法原理
    6.2CNN是干什么的
    6.3tensorflow实现CNN
    6.4CNN模型发展
  7. 第一个RNN网络
    7.1RNN算法原理
    7.2RNN是干什么的
    7.3tensorflow实现RNN
    7.4RNN模型发展及变体

3、优化器如何选择

目前TensorFlow支持11种不同的经典优化器(参考TensorFlow API tf.train文档)

tf.train.Optimizer
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagtadOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.RMSProOptimizer

1)如果数据是稀疏的,使用自适应学习方法。 
(2)RMSprop,Adadelta,Adam是非常相似的优化算法,Adam的bias-correction帮助其在最后优化期间梯度变稀疏的情况下略微战胜了RMSprop。整体来讲,Adam是最好的选择。 
(3)很多论文中使用vanilla SGD without momentum。SGD通常能找到最小值,但是依赖健壮的初始化,并且容易陷入鞍点。因此,如果要获得更快的收敛速度和训练更深更复杂的神经网络,需要选择自适应学习方法。

1. SGD

在这里SGD和mini-batch是同一个意思,抽取m个小批量(独立同分布)样本,通过计算他们的平均梯度均值。

缺点:

(1) leraning rate 选择太小,收敛速度会很慢,如果太大,则loss function会在极小值附近不停的震荡,甚至片偏离。

(2) 容易被困在鞍点。

搭配的学习率:

fine-tune模型初始学习率可设置为0.01,从头开始训练模型学习率可设置为0.1(仅供参考)。每隔一定数量的epoch学习率调节为之前的0.1倍(根据自己实际任务调节每个阶段迭代epoch的数量)。

2. Momentum(动量)

 

要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方式减弱。

 lr=0.01, momentum=0.9

3. AdaGrad

设置全局学习率之后,每次通过,全局学习率逐参数的除以历史梯度平方和的平方根,使得每个参数的学习率不同。

优点:学习率可以自适应的减小。

缺点:学习率过早、过量的减少。

用Adagrad需要把初始学习率设置的比较大,例如:lr=0.01,然后随着学习进行,学习率会自行调整减小,越接近最小值点,每一步越小,和SGD, 动量梯度法比较,Adagrad的效果都是非常好的

4. RMSProp

鉴于神经网络都是非凸条件下的,RMSProp在非凸条件下结果更好,改变梯度累积为指数衰减的移动平均以丢弃遥远的过去历史。

相比于AdaGrad的历史梯度: 

                                                                                                    

RMSProp增加了一个衰减系数来控制历史信息的获取多少: 

                                                                                               

5. Adam

Adam算法可以看作修正后的Momentum+ RMSProp算法, 学习率通常建议为0.001.

经验之谈

  • 对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
  • SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
  • 如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
  • Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
  • 在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果

4、调参经验大总结

『可复现性和一致性』
有的同学在打比赛的时候,从头到尾只维护若干份代码,每次载入前一次的训练参数,改一下代码再炼,俗称老丹。这样会有几个问题:某次引入一个 bug,过了很久才发现,然后不知道影响范围;得到一个好模型,但是不知道它是怎么来的;忘了自己的 baseline,不知道改动是正面还是负面。

要尽可能确保每一个模型有可复现性,实践上建议代码不应该在训练后再改动,训练新的模型时,把旧的代码复制一遍。得到的实验结果要开个文档记下来以便日后总结,避免遗忘。我经常通过阅读自己和别人的记录来得到灵感。

实验一致性上也要多做努力,理想状态是有合理的基准来测模型的性能,同一个代码不应该由于超参的微小改动而有显著结果差异。出现这种情况可能是数据太少或基准设置不当。

『资源利用』
对于新入行的同学,不要试图在玩具级别的数据集或任务上做靠谱的研究,比如 MNIST。

不是每一个实验都要出一个好模型,实验是为了验证结论的。如果每个实验都要 8 张卡跑两个星期,人力物力都耗不起。尽力把实验控制在单卡一天以内,理想状态是半天得一次结论。理论上来说,水多加面面多加水(加数据加计算量)的做法无限涨点。建议先设一个目标,比如说就是在一天的训练时间下做对比实验。

当你的模型有 Batch Normalization,初始化通常不需要操心,激活函数默认 Relu 即可(某引用数万的大佬说的)。一般顺序是 Conv - BN - Relu。如果没有 BN(很多任务上,BN降低训练难度,但是可能影响最终性能 ),试着要做一些数据归一化。

虽然有至少十种激活函数,但初期用 Relu 或者和某个 paper 统一即可。优化器只推荐 Momentum 和 Adam。在这些方面做尝试意义不大,如果性能提升反倒可能说明模型不成熟。不推荐做人肉模型设计,比如把某层卷积改大一点,或者微调一下通道数。除非有特别 insight,不要自己乱设计玄学组件,以吸收别人经验为主。

超参上,learning rate 最重要,推荐了解 cosine learning rate,其次是 batchsize 和 weight decay。当你的模型还不错的时候,可以试着做数据增广和改损失函数锦上添花了。

5、如何防止过拟合

1. 数据集扩增(Data Augmentation)

2. 改进模型

2.1 Early Stopping

2.2 正则化(regularization)

2.3 Dropout

2.4合适的网络结构

2.5限制权重

2.6在权值上增加噪声

2.7结合多种模型bagging,boosting

2.8 多任务学习

深度学习中两种多任务学习模式:隐层参数的硬共享和软共享

  • 硬共享机制是指在所有任务中共享隐藏层,同时保留几个特定任务的输出层来实现。硬共享机制降低了过拟合的风险。多个任务同时学习,模型就越能捕捉到多个任务的同一表示,从而导致模型在原始任务上的过拟合风险越小。
  • 软共享机制是指每个任务有自己的模型,自己的参数。模型参数之间的距离是正则化的,以便保障参数相似性。

 

6、如何解决梯度消失现象

一、为什么会产生梯度消失和梯度爆炸?

目前优化神经网络的方法都是基于BP,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助,因此反向传播算法可以说是梯度下降在链式法则中的应用。

而链式法则是一个连乘的形式,所以当层数越深的时候,梯度将以指数形式传播。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。在根据损失函数计算的误差通过梯度反向传播的方式对深度网络权值进行更新时,得到的梯度值接近0特别大,也就是梯度消失爆炸。梯度消失或梯度爆炸在本质原理上其实是一样的。

二、分析产生梯度消失和梯度爆炸的原因

【梯度消失】经常出现,产生的原因有:一是在深层网络中,二是采用了不合适的激活函数,比如sigmoid。当梯度消失发生时,接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常,但是当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。

【梯度爆炸】一般出现在深层网络权值初始化值太大的情况下。在深层神经网络或循环神经网络中,误差的梯度可在更新中累积相乘。如果网络层之间的梯度值大于 1.0,那么重复相乘会导致梯度呈指数级增长,梯度变的非常大,然后导致网络权重的大幅更新,并因此使网络变得不稳定。

梯度爆炸会伴随一些细微的信号,如:①模型不稳定,导致更新过程中的损失出现显著变化;②训练过程中,在极端情况下,权重的值变得非常大,以至于溢出,导致模型损失变成 NaN等等。

梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。

三、解决方法

梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。解决梯度消失、爆炸主要有以下几种方法:

(1) pre-training+fine-tunning

此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。

(2) 梯度剪切:对梯度设定阈值

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。

(3) 权重正则化

另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization),正则化主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生。比较常见的是 L1 正则和 L2 正则,在各个深度框架中都有相应的API可以使用正则化。

关于 L1 和 L2 正则化的详细内容——欠拟合、过拟合及如何防止过拟合

(4) 选择relu等梯度大部分落在常数上的激活函数

relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。

关于relu等激活函数的详细内容——温故知新——激活函数及其各自的优缺点

(5) batch normalization

BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。

关于Batch Normalization(BN)的详细内容——常用的 Normalization 方法:BN、LN、IN、GN

(6) 残差网络的捷径(shortcut)

说起残差结构的话,不得不提这篇论文了:Deep Residual Learning for Image Recognition。论文链接:http://openaccess.thecvf.com/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf

相比较于以前直来直去的网络结构,残差中有很多这样(如上图所示)的跨层连接结构,这样的结构在反向传播中具有很大的好处,可以避免梯度消失。

(7) LSTM的“门(gate)”结构

LSTM全称是长短期记忆网络(long-short term memory networks),LSTM的结构设计可以改善RNN中的梯度消失的问题。主要原因在于LSTM内部复杂的“门”(gates),如下图所示。

LSTM 通过它内部的“门”可以在接下来更新的时候“记住”前几次训练的”残留记忆“。

 

6.4CNN模型发展史

https://www.zhihu.com/search?type=content&q=CNN%E6%A8%A1%E5%9E%8B%E5%8F%91%E5%B1%95%E5%8F%B2

详细不再介绍了,只说几个比较主要及常见的模型

ResNet

随着算力的不断更新,越来越深的网络能够得到计算,但研究者发现随着网络的加深,模型变得越来越不能够训练,遇到了梯度消失或爆炸问题。在ResNet出现之前,人们通过BN,Relu等方式去缓解此问题,但仍然不能把网络做到足够深。

15年何恺明提出了ResNet网络,该思路启发于LSTM的控制门的思想。

y = H(x,WH)•T(x,WT) + X•(1- T(x,WT)) 

可以看出,当T(x,WT) = 0,y=x,当T(x,WT) = 1,y= H(x,WH) 

图5.1 ResNet中的block示意图

从图5.1可以看出:相比传统网络:y=f(x),ResNet Block公式为:y=f(x) + x,可以称之为skip connect。

图5.2 ResNet网络中使用的两种Block

图5.3 不同层数的ResNet设计方式图5.4 34层ResNet与其他网络的比较

题外话:

Orhan等发表的论文《Skip connections eliminate singularities》提出神经网络的退化才是难以训练深层网络根本原因所在,而不是梯度消散。虽然梯度范数大,但是如果网络的可用自由度对这些范数的贡献非常不均衡,也就是每个层中只有少量的隐藏单元对不同的输入改变它们的激活值,而大部分隐藏单元对不同的输入都是相同的反应,此时整个权重矩阵的秩不高。并且随着网络层数的增加,连乘后使得整个秩变的更低。这也是我们常说的网络退化问题,虽然是一个很高维的矩阵,但是大部分维度却没有信息,表达能力没有看起来那么强大。残差连接正是强制打破了网络的对称性。总的来说一句话,打破了网络的对称性,提升了网络的表征能力。也可查看文献《Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units》。

6 DenseNet

从图6.1中可以看出,DenseNet是借鉴了ResNet,是ResNet的升级版,从上述ResNet可以看到,一般每个Block会有一个skip connect,而DenseNet会在每层conv间有一个skip connect。

图6.1 ResNet Block与DenseNetBlock区别图6.2DenseNet Block示意图图6.3 DenseNet 各网络结构图图6.4 DenseNet 网络

神经网络越深,网络的能力越强,就越有可能过度学习数据集,导致过拟合。大家应该还记得,作为第一个深层网络Alexnet网络,它提出了重要的策略dropout,对于提高模型的泛化能力非常有效。alexnet网络至今仍然可以用于很多的任务,这足以说明其鲁棒性。后来BN和数据增强等正则化策略替代dropout也在一定程度上缓解了过拟合的问题。文《Deep networks with stochastic depth》(Huang G, Sun Y, Liu Z, et al. )是DenseNet作者们早期的研究,它们通过训练时随机丢掉一些网络层,提高了ResNet的泛化性能。
从这里可以看出来一个重要特性,这也是神经网络中大家比较关心的问题, 网络的冗余性绝对是存在的,而且不小,通过探索dropout值的比例对性能的影响可以去估算这个冗余。
既然丢掉某些层间连接或者整个层不影响性能,就说明这一层学习到的非线性转变很小,既然转变很小,那么每一层学习几百个通道,还有必要吗?这几百个通道,正是万恶的计算量所在。
考虑到这一点,densenet就同时做了两件事情,一是将网络中的每一层都直接与其前面层相连,提高特征的利用率;二是把网络的每一层设计得很窄,也就是卷积的输出通道数通常很小,只有几十,该层学习非常少的特征图并与输入concat使用。
这实现了资源的最大化利用和计算量的压缩。ImageNet分类数据集上达到同样的准确率,DenseNet 所需的参数量不到ResNet的一半,所需的计算量也只有ResNet的一半左右。
引用自 【模型解读】“全连接”的卷积网络,有什么好?

 Deformable Convolutional Networks

同样的物体在图像中可能呈现出不同的大小、姿态、视角变化甚至非刚体形变,如何适应这些复杂的几何形变是物体识别的主要难点。而Deformable Conv模型尝试着解决这类问题。

首次在卷积神经网络(convolutional neutral networks,CNN)中引入了学习空间几何形变的能力,得到可变形卷积网络(deformable convolutional networks),从而更好地解决了具有空间形变的图像识别任务。研究员们通过大量的实验结果验证了该方法在复杂的计算机视觉任务(如目标检测和语义分割)上的有效性,首次表明在深度卷积神经网络(deep CNN)中学习空间上密集的几何形变是可行的。
作者:微软亚洲研究院
链接: https://www.zhihu.com/question/57493889/answer/184578752

当前深度模型对物体的几何形变适应能力几乎还是来自于数据本身的多样性,模型内部并不具有适应几何形变的机制。作者认为造成这样的问题是卷积操作本身就是固定的几何结构。

 

图7.5 展示了卷积核大小为 3x3 的正常卷积和可变形卷积的采样方式,(a) 所示的正常卷积规律的采样 9 个点(绿点),(b)(c)(d) 为可变形卷积,在正常的采样坐标上加上一个位移量(蓝色箭头),其中(c)(d) 作为 (b) 的特殊情况,展示了可变形卷积可以作为尺度变换,比例变换和旋转变换的特殊情况

图7.6 示例图

 

 

Dilated Convolutional Networks

Dilated Convolution 被中文翻译为“空洞卷积”或“膨胀卷积”,我更倾向于称之为“膨胀卷积”。该模型最早由Fisher Yu在2016年ICLR上发表的论文《Multi-Scale Context Aggregation by Dilation Convolutions》中提出。该模型最早应用于图像分割,因为传统CNN模型需要通过pooling层来缩小图像尺寸,并扩大下一层的感受野,即进行下采样(down sampling);这一过程肯定会有信息丢失。因为图像分割是pixel-wise的,且在图像预测时还需要进行上采样(up sampling)操作,丢失的信息在上采样过程中也很难再找回。

为了解决上述问题,Fisher Yu提出了Dilated Convolution方法,通过Dilated Convolution来替代pooling层进行下采样操作,不仅扩大了感受野,也不会丢失信息。

下面看一下dilated conv原始论文中的示意图:

(a)图对应3x3的1-dilated conv,和普通的卷积操作一样,(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv),(c)图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。

SENET

SENET在ImageNet 2017中的Image Classification夺得冠军。并在CVPR 2017中发表论文《Squeeze-and-excitation networks》。

作者大概总结了前人对CNN模型的改进:卷积核作为卷积神经网络的核心,通常被看做是在局部感受野上,将空间上(spatial)的信息和特征维度上(channel-wise)的信息进行聚合的信息聚合体。卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。

近很多工作被提出来从空间维度层面来提升网络的性能,如Inception结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;还如Non-local,deformable conv,dilated conv等都是在空间层面进行改进。

本文提到的SENet另辟蹊径,尝试着从channel特征中寻找优化点。作者认为在每层卷积中输出的每个channel,其信息重要性是不同的,我们需要为每个channel的feature map设置一个权重,来重新量化每个channel的特征信息。作者的设计如下图所示:

图中Fsq为Squeeze操作,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。

图中Fex为Excitation操作,它是一个类似于循环神经网络中门的机制。通过参数 来为每个特征通道生成权重,其中参数 被学习用来显式地建模特征通道间的相关性。

图中Fscale是一个Reweight操作。完成了每个channel的特征图权重计算。

SE作为一个模块,可以跟其他CNN模型进行组合使用,下图是分别于Inception和ResNet进行组合

 

参考文献:图片上的水印,链接我忘了写了。。。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值