第2次课改善深层神经网络:超参数优化、正则化以及优化 - week3 超参数调试、Batch正则化和程序框架

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 np
      import 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为学习算法,用梯度下降法优化算法使损失函数最小化,也可以使用AdamOptimizer
      
      train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01
      
      init = 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 LR
x00-->l1((*))
w1[w]-->w*w
w*w-->l1
x10-->l2((*))
w2[w]-->l2
l1-->l3((+))
x20-->l3
l2-->l3
l3-->cost
  • 定义了前向传播,框架会自动进行反向传播

课程地址

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值