洞明先生的博客

穷通悟理是极乐
  新随笔  :: 管理

CNN注意事项_七月算法5月深度学习班第5次课程笔记

Posted on 2016-06-01 17:16  洞明  阅读(6505)  评论(0编辑  收藏  举报
 
  desc
神经网络问题的解决
1. 网络调不了
1) init 的工作
2) 想办法找pre train 去 fine tuning
3) batch normalization 减小依赖度
4) 别用 sigmoid
 
2. 准确率上不去 或者 早停止 了,即:validate 或者 交叉验证集 上的loss 不再下降,但是 train 上可能还会下降,此时是一个瓶颈,即 还有办法做
1) 调 lr,halved the α步长
   即 准确率上不去 有哪些method
关于 tensorFlow
1. caffe model zoo 可以转化为 TF 的
2. 可视化中间的过程,然后可以实时监控
CNN 的几个层
data
conv
pooling 下采样
激励层
全连接
softmax
SGD 与 全局梯度下降的对比
SGD
优点:可以跳过局部最优点
缺点:但是loss 曲线会震荡,即不是每次都是 loss 下降的(上一个data 按照其梯度下降了,但是 next data 可能loss 还是很大,甚至比原来上升了)
 
全局GD:
优点:每次loss 都在稳定的下降
缺点:很可能收敛到局部极值 
 
因此两者 balance 就是 mini-batch
多个batch随机,可能收敛到全局最优
多个batch,每次全局 loss 降低 速度加快
单次看不一定是下降的,长期看是下降的
现在工业界的激活函数 一般都是 RELU 了
RNN 很多是全连接的
· 数据维度变更也是全连接
· LSTM 的参数是 全连接相乘
· 对于 RNN 的参数也是全连接
所以可能用到 Batch Normalizaiton
两个对神经网络工程化的理解
【important】
1. 关于初始化的重要性,但是你从没有考虑过:
    受这个伤了,重要性占 整个网络的 60%!!!
 
2. 因为有这种 layer input 成为全 0的现象 或者 ±1 震荡
所以才会有:监控可视化,作为一个模块单独引入在 TF 中
全零初始化
如果全部的w都是0,那么这里:
四个input都是一模一样的 ,下一层的两个input 也是一模一样的了
传回来的梯度也一模一样,再传入也是一模一样
即:所有的 cell 在学习同一个东西
但是希望:希望参数非对称,分化出不同的权重 ,从而学习不同的角度
结论:不可取
 
小值的正态随机初始化
 
层次不深,可行;层次深,不可行
因为传到后面,input layer X 也都成了全0 
大值的正态随机初始化
节点容易饱和
即:每次的输出 sigmiod(wx+b) 后的输出是 ±1,相当于 wx+b 这个值很大
此时的 梯度接近于 消失
理论求证
对于 非ReLU 的层
让初始化的范围与 input 与 output 的节点的个数相关
 
这样初始化,可以保证:
输入层序列的方差和输出层序列的方差是一致的
因为经过推到这个可以看出是 与 神经元个数相关的
理论求证
对于 ReLU 的层
或者
这样的初始化,其实就是在原基础上 把 根号n 变为 
batch normalization
中心极限定理:不管X 服从什么分布,只要 Xi 独立同分布
那么 这几个 Xi 的和就服从 正态分布
这里相当于 n 为1,那么 处理过的 X' 服从 N(0,1) 的标准正态分布
 
然后因为正态分布化以后,这个对原始信息的表征是有损失的
还要使用r 和 β通过线性组合来进行信息的还原,
 
用这个 Y 作为新的next layer 的输入【important】
BN 层的位置
一般 BN 接在FC 后面的 ,是因为FC 的输出的波动状况会更大
conv 层 后面其实还是没那么大波动
现在的CNN 已经开始有多个FC层
这是有可能的,只要计算力够,然后再需要BN
batch normalization的好处
1. 降低对init 的敏感度,因为降低了 全0 或者 ±1饱和的情况,因此传导计算也流畅
2. 属于一种正则化,即 input 被约束在一定范围内
FC 的学习能力是强的,在尽可能记录原始信息, 所以在一个幅度大的范围内进行信息表征,所以输出的vector 的波动大,目的是:能记录所有的信息
现在的约束是 在一定的空间范围内进行学习,只能在这个范围内将信息表示出来,所以可以视为一种正则化
batch normalization 解决的问题不是 梯度相关的,而是 input 相关的
所以其实最大的问题就是  input 全都成了0,那么输出也都是 0 了
这可能使得网络训练不下去,此时的梯度很大
而 batch normalization 就是解决这个 input layer X 分布不均与的问题
 
如果 input 很大——> 梯度消失
如果 input 全0 ——> 梯度很大
Alex 的地位
就是给后面的网络一个很好的初始化
其它的往往使得网络训练不下去,你不知道考虑这个init,即太脆弱了
三大网络:
Alex net,GoogleLeNet,VGG,resNet
都是给后面提供了 fine tuning 的借鉴
而 VGG 都是在 Alex 的基础上训练出来的
去均值的两种情况
1. 按:像素点:
32 * 32 个像素点,按照 element wise 的求均值,
即一共有:32*32*3 个均值
 
2. 按通道:
只有三个均值,即便是同一张图片内的所有像素点,同一个通道的都要相加,
这个方法比较粗暴
如何理解加入 noise 加一些noise,使得学习这些 noise,从而更健壮
对牛顿法的观点 可以理解为2阶的SGD,会更快,但是对内存要求大
对深度学习的认识 深度学习极强,如果技巧得当 讲一个 task 做好,其实不是 理论上多么强,而是 工程能力好,而 普通的 model,是没有这么强的灵活性的 
对 dropout 的认识 
神经网络中 倾向于 不使用 L2 norm
因为神经网络的参数量太大,而 L2 norm 这个量级的计算太大
所以使用的是 dropout
预测过程的dropout 
预测的时候怎么做?
1. 所有的 x  乘以 概率值p, 而不是再0-1化的开关损失了,此时是连续化的
2. 训练的时候所有有dropout 的layer 都 x'=x/p
    那么预测的时候什么都不用做,即学的时候就是 x/p的参数
为什么dropout 能防止过拟合
1. 别开启所有的学习单元,遗忘一定的细节
2. 每次训练过程中都随机关掉一部分感知器,每次得到一个新模型
   那么调参的方向将会是 多个模型的综合,不至于听一家所言
多类别分类
损失函数使用:互熵损失最好
对于多类别,其实是 两个序列,尤其是看做两个 概率分布
caffe 的使用步骤
· 图像转数据库
· 定义层次结构
· 定义solver # 训练时候的参数 
使用 caffe 可以规范化 你的很多 tech
即:如果你搞懂每个参数的含义的化
 
使用caffe 的时候,可以将前面的学习率为指定为 0,即不调整前面,只训练后面的一个分类器
对于超参数的一个角度
不是静止的而是触发式调整
即:learning rate 和 weight decay 都是超参数,
是可以动态调整出来的
一开始肯定 欠拟合,所以不必weight decay ,然后再去 decay
这个就是精细化 过程
 
其实:欠拟合 与 过拟合 是时间轴上的关系
一个跑前的技巧
首先是小数据集(100张图片等) ,准确率应该收敛到100%
如果到不了 100%,那么网络是有问题的
# 注:这个是没有的正则化 和 dropout 的情况,因为正则化是其到不了100%的
tensor flow
比 caffe 强在:即 多机器上的GPU 它也可以用, 即分布式训练
而这个 caffe 是不能用到多服务器上的GPU的 ,它可以用一台机器上的多个GPU
关于中间过程可视化
1. 对于隐层的可视化
 
2. 对于 每一个 epoch 的可视化