第2次课改善深层神经网络:超参数优化、正则化以及优化

来源:互联网 发布:mac模拟人生2中文 编辑:程序博客网 时间:2024/06/01 08:20

1. 调试处理

超参数重要性排序

  1. 学习速率(learning rate)α
  2. 动量权重β=0.9,隐藏层节点数,mini-batch size
  3. 层数,learning rate decay
  4. Adam优化算法的参数β1=0.9, β2=0.999, ϵ=108一般不改

调参方法

  1. 网格搜索,使用参数较少的情况
  2. 随机选择,该方法较优,原因是对于一个具体问题,不清楚哪个参数比较重要,而网格搜索是各个参数地位是平等的

    • 先确定一个大致的参数区间,然后再细致搜索

2. 为超参数选择合适的范围

一个例子 - 隐藏层节点数nx和层数L

  • 隐藏层节点数,随机选择50-100个
  • 层数,可以随机选择2-4,也可以网格搜索

另一个例子 - 学习速率α

  • 问题:选择一个可能下界0.0001和一个上界1,在[0.0001,1]中随机取点,由于尺寸不对称,小的数字被取到的概率小
  • 解决方法:把区间划分成4个部分,[0.0001,0.001], [0.001,0.01], [0.01,0.1], [0.1,1],然后在4个区间内随机取点,也就是对其取对数
  • 示例代码:
    python
    r = -4*np.random.rand()
    alpha = 10**r

最后一个例子 - 动量权重β

  • 问题:和学习速率一样,[0.9,0.999]之间不能均匀取值
  • 解决方法:通过1β到[0.001,0.1],然后用学习速率的方法进行对数取值
  • 原因:11β之后,0.9到0.9005不敏感,但是0.999到0.9995很敏感,对结果的影响大,所以需要在接近1的地方密集取值

3. 超参数训练实践 - Pandas vs. Caviar鱼子酱(analogy)

调整参数的方法 - 看计算能力

  1. Pandas - 计算能力不够的时候,边训练边调整参数
  2. Caviar - 同时尝试多种参数组合进行模型训练

4. 正则化网络的激活函数

  • Batch Norm,对隐藏层节点激活函数输入或者输出进行归一化

Batch Norm

归一化输入可以加快训练速度

x=xμσ

Batch Norm是对隐藏层进行归一化操作

有两个版本的Batch Norm:
1. (Default)对节点激活函数的输入z进行归一化
2. 对节点的输出a进行归一化

算法步骤

  • Given some intermediate values in NN z(1), ... ,z(m)

    • μ=1miz(i)
    • σ2=1mi(ziμ)2
    • z(i)norm=z(i)μσ2+ϵ
      • 分母加上ϵ是为了防止分母太小,保证算法稳定性
    • z~(i)=γz(i)norm+β
      • 为了不让隐藏层节点激活函数的输入都是均值为0方差为1,其中γ,β都是模型的学习参数,可以用梯度下降或者其他方法来更新这两个参数的值,也可以设置成固定值
    • Use z~(i) to be the input of activate function
  • 如果γ=σ2+ϵ,β=μ,那么z(i)=z~(i)

5. 将Batch Nrom拟合进神经网络

一个完整的网络

这里写图片描述

一个节点

  1. X通过w和b进行求和得到z
  2. z通过γ[1],β[1]参数和BatchNorm操作得到z~[1]
  3. 用激活函数计算节点的输出

一些注意点

  1. 参数β和上一节中的不是一个参数
  2. γ[l],β[l]和w,b等价,可以用梯度下降进行更新,也可以用优化方法进行优化加快学习
  3. tf.nn.batch-normalization框架实现,不需要自己手动实现,但是要理解做法
  4. 因为归一化要减去均值,所以偏置b就没有用了,删掉,β有相似的作用
  5. γ[l],β[l]的维度是(n[l], 1)

6. Batch Norm为什么奏效

通过归一化操作,把尺度不一的输入限定在相同的量纲下,从而加快学习速度

Covariate shift

  • 定义:已经学习了x到y的映射,如果x的分布改变了,需要重新训练学习算法。

对于一个多层的神经网络,把第二层的输出当作输入,有一个A[2]y^的映射,但是第二层的输出也在变化,也就是x的分布改变了,所以使用Batch Norm保证输入的均值方差,减少了输入改变的我呢体,变得更稳定,保证每层都可以独立学习,从而加速整个网络的学习。

Batch Norm和regularization正则化

使用mini-batch,在每个mini-batch上计算均值方差进行归一化。会给隐藏层的激活函数带来噪声,产生类似于dropout的效果。因为添加的噪声很小,只有轻微的正则化效果

和dropout一起使用获得更好的正则化效果,mini-batch size越大,正则化效果越弱,Batch Norm的正则化效果只是小的副作用,不是其主要功能。

7. 测试时的Batch Norm

训练的做法

分别对每个mini-batch进行归一化处理

测试的做法

测试的时候需要对样本逐个处理样本

使用指数加权平均来估计均值和方差,也可以使用其他方法

  • X{1}>μ{1}[l]
  • X{2}>μ{2}[l]
  • X{3}>μ{3}[l]
  • μ{1}[l],μ{2}[l],μ{3}[l]>μ

对于σ也是一样的操作

8. Softmax回归

  • logistic回归的一般形式,用于多分类问题

问题描述

给定一个图像,判断是猫还是狗还是鸟还是其他,总共个有4类,C=4

网络描述

第L层有4个节点,分别代表P(cat|X), P(dog|X), P(bird|X), P(other|X),和为1

  • L层的Activation function:

    a[L]=ez[L]Cj=1ez[L]j

    • 先计算ez,然后归一化

输入一个向量,输出一个同样大小的向量

9. 训练一个Sofrmax分类器

和hard max相反,hard max是输出0,1,其中输入最大的是1,其他都是0

损失函数和成本函数

y = [0,1,0,0] y^ = [0.3,0.2,0.4,0.1]

l(y^,y)=j=14yjlogy^j

神经网络是使损失函数最小,134项都为0,也就是使y^j,即猫的概率最大,理论依据:最大似然估计

  • 成本函数
    J(w[1],b[1]...)=1mi=1ml(y^(i),y(i))

在程序中输出是水平放的矩阵

Y==[y(1),y(2), ... ,y(m)]0 0 11 0 00 1 00 0 0 ...

Softmax的反向传播

梯度dz[L]=y^y同样是一个(4,1)的向量

10. 深度学习框架

框架列表

Caffe/Caffe2, CNTK, DL4J, Keras, Lasagne, mxnet, PaddlePaddle, Tensorflow, Theano, Torch

选择依据

  1. 开发应用变成的难易程度
  2. 运行速度
  3. 是否开源以及是否有好的开源管理

11. Tensorflow

  • 优化目标:

    J(w)=w210w+25

  • 代码

    • 导包

      import numpy as npimport tensorflow as tf
      1. 一些设置

        # 把w初始化为0,w是TensorFlow变量w = tf.Variable(0, dtype=tf.float32)# 定义损失函数# cost = tf.add(tf.add(w**2, tf.multiply(-10., w)),25)cost = w**2 - 10*w + 25 # 重载了简单的运算,比如平方乘法加减# 定义train为学习算法,用梯度下降法是损失函数最小化train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01
      2. 惯用写法,初始化

        init = tf.global_varibales_initializer()session = tf.Session()session.run(init) # 初始化全局变量print(session.run()) # 让Tensorflow评估一个变量
        • 也可以用下面的写法
          with tf.session as session:    session.run(init)    print(session.run())
      3. 运行梯度下降法

        # 运行一步梯度下降seesion.run(train)print(session.run(w)) # 评估一下w的值,输出它# 运行1000次梯度下降for i in range(1000):    session.run(train)print(session.rumn(w))
    • 有数据集的情况

      coefficients = np.array([1.], [10.], [25.])# 把w初始化为0,w是TensorFlow变量w = tf.Variable(0, dtype=tf.float32)# 训练集,这个例子中只有x,定义为(3,1)的数组x = tf.placeholder(tf.float32, [3,1])# 定义损失函数cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]# 定义train为学习算法,用梯度下降法优化算法使损失函数最小化,也可以使用AdamOptimizertrain = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01init = tf.global_varibales_initializer()session = tf.Session()session.run(init) # 初始化全局变量print(session.run()) # 让Tensorflow评估一个变量# 运行一步梯度下降seesion.run(train, feed_dict={x:coefficients})print(session.run(w)) # 评估一下w的值,输出它# 运行1000次梯度下降for i in range(1000):    session.run(train, feed_dict={x:coefficients})print(session.rumn(w))
  • cost function
    python
    cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
graph LRx00-->l1((*))w1[w]-->w*ww*w-->l1x10-->l2((*))w2[w]-->l2l1-->l3((+))x20-->l3l2-->l3l3-->cost
  • 定义了前向传播,框架会自动进行反向传播

课程地址

http://mooc.study.163.com/course/deeplearning_ai-2001281003?tid=2001391036#/info

阅读全文
1 0