《吴恩达深度学习》02改善深层神经网络:超参数调优、正则化以及优化(第3周超参数调优、Batch正则化和程序框架)

02. 改善深层神经网络:超参数调优、正则化以及优化

第三周 超参数调优、Batch正则化和程序框架

3.1 调试处理

  1. 超参数
    (1)常见参数: α , β , β 1 , β 2 , ϵ \alpha, \beta, \beta_1, \beta_2, \epsilon α,β,β1,β2,ϵ,层数,每层单元数,学习率衰减,mini-batch规模
    (2)重要性排名:a. α \alpha α, b. β \beta β,每层单元数,mini-batch规模,c. 层数,学习率衰减
  2. 尝试随机值
  3. 由粗糙到精细策略
    在这里插入图片描述

3.2 为超参数选择合适的范围

  1. 随机选择超参数
  2. 超参数适应的规模
    使用对数数轴
    代码: r = − 4 ∗ n p . r a n d o m . r a n d ( ) r = -4*np.random.rand() r=4np.random.rand()
    α = 1 0 r \alpha=10^{r} α=10r
  3. 指数加权平均的超参
    β = 0.9 , ⋯   , 0.999 \beta = 0.9, \cdots, 0.999 β=0.9,,0.999,因此不能使用线性随机均匀取值。因此考虑 1 − β = 0.1 , ⋯   , 0.001 1-\beta = 0.1, \cdots, 0.001 1β=0.1,,0.001,然后采用对数随机均匀取值。

3.3 超参数训练的实践:Pandas VS Caviar

  1. 两种流派
    (1)Babysitting one模型
    在这里插入图片描述
    (2)并行训练多个模型

3.4 正则化网络的激活函数

  1. 归一化加速学习
  2. Batch归一化的实现
    (1)给定神经网络的隐藏值 z ( 1 ) , ⋯   , z ( m ) z^{(1)}, \cdots, z^{(m) } z(1),,z(m)
    (2)均值 μ = 1 m ∑ i z ( i ) \mu = \frac{1}{m}\sum_i z^{(i)} μ=m1iz(i)
    (3)均方差 δ 2 = 1 m ∑ i ( z ( i ) − μ ) 2 \delta^2 = \frac{1}{m}\sum_i (z^{(i)}-\mu)^2 δ2=m1i(z(i)μ)2
    (4)归一化 z n o r m ( i ) = z ( i ) − μ δ 2 + ϵ z^{(i)}_{norm}=\frac{z^{(i)}-\mu}{\sqrt{\delta^2+\epsilon}} znorm(i)=δ2+ϵ z(i)μ
    (5)归一化后的参数服从均值为0,方差为1。但实际上,所有参数服从不同的分布更具有现实的意义,因此进一步改进为 z ~ ( i ) = γ z n o r m ( i ) + β \widetilde{z}^{(i)}=\gamma z^{(i)}_{norm}+\beta z (i)=γznorm(i)+β,其中 γ , β \gamma, \beta γ,β为待学习的参数,可用梯度下降法、动量法等进行学习。 γ \gamma γ β \beta β的作用是设置均值和方差。

3.5 将Batch Norm拟合进神经网络

  1. 将Batch归一化加入到神经网络中
    (1)神经网络示意图
    在这里插入图片描述
    (2)计算路径
    在这里插入图片描述
    (3)代码tf.nn.batch_normalization
  2. mini-batches中的应用
    在这里插入图片描述
    说明:因为后期需要用 β \beta β γ \gamma γ z ( i ) z^{(i)} z(i)进行重新缩放,所以不需再学习 b [ l ] b^{[l]} b[l]
  3. 梯度下降法的实现
    对于 t = 1 , ⋯   , n u m t=1, \cdots, num t=1,,num mini-batches
    在每个mini-batch X { i } X^{\{i\}} X{i}中计算正向传播(用 z ~ [ l ] \widetilde{z}^{[l]} z [l]代替 z [ l ] z^{[l]} z[l]
    计算反向传播 d w [ l ] , d β [ l ] , d γ [ l ] dw^{[l]}, d\beta^{[l]}, d\gamma^{[l]} dw[l],dβ[l],dγ[l]
    更新参数(梯度下降法、动量法等)

3.6 Batch Norm为什么奏效?

  1. 类比于输入的归一化
  2. 对于分布偏差输入的学习
  3. 为什么这是神经网络的问题?
    batch norm减少了隐藏量变化范围,即减弱了前面层参数对后面层的影响。确保不论每层的值如何改变,均值和方差都是一定的。
  4. Batch Norm也有正则化的作用。
  5. Batch norm每次只能处理一个mini-batch

3.7 测试时的Batch Norm

  1. 测试时的Batch norm
    在这里插入图片描述
  2. 测试时,每次只有一个样本,因此平均值和方差没有意义。故需要在全部mini-batch上使用指数加权平均(也称为流动平均)的方法进行估计。该方法较为鲁棒的。

3.8 Softmax回归

  1. softmax是一种多分类器。
  2. 设全部类别为 C C C,则softmax的输出层为 C C C维的向量。
  3. 设最终输出层为第 l l l层,则该层的计算为:
    z [ l ] = w [ l ] a [ l − 1 ] + b [ l ] z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]} z[l]=w[l]a[l1]+b[l] ( C , 1 ) (C, 1) (C,1)向量
    激活函数:
    t = e ( z [ l ] ) t=e^{(z^{[l]})} t=e(z[l]) ( C , 1 ) (C, 1) (C,1)向量
    a [ l ] = t ∑ i = 1 C t i a^{[l]}=\frac{t}{\sum_{i=1}^C t_i} a[l]=i=1Ctit ( C , 1 ) (C, 1) (C,1)向量,包含了归一化在内。
  4. Softmax举例(可视为逻辑回归的一般形式)

3.9 训练一个Softmax分类器

  1. 理解Softmax(回顾上一节内容)
    hard max是指输出的是具体地某个类别标签。
    C = 2 C=2 C=2时,softmax退化为逻辑回归。
  2. 损失函数(最大似然估计法)
    L ( y ^ , y ) = − ∑ j = 1 C y j l o g y ^ j L(\hat{y}, y)=-\sum_{j=1}^Cy_jlog\hat{y}_j L(y^,y)=j=1Cyjlogy^j
    代价函数
    J ( w [ 1 ] , b [ 1 ] , ⋯   ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) J(w^{[1]}, b^{[1]}, \cdots)=\frac{1}{m}\sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)}) J(w[1],b[1],)=m1i=1mL(y^(i),y(i))
  3. 向量化表示
  4. softmax上的梯度下降法(反向传播)
    d z [ l ] = y ^ − y dz^{[l]}=\hat{y}-y dz[l]=y^y

3.10 深度学习框架

  1. 深度学习框架
    (1)Caffe
    (2)CNTK
    (3)DL4J
    (4)Keras
    (5)Lasagne
    (6)mxnet
    (7)PaddlePaddle
    (8)TensorGlow
    (9)Theano
    (10)Torch
  2. 选择深度学习框架的标准
    (1)易于编程
    (2)运行速度
    (3)开源,良好的管理

3.11 TensorFlow

  1. 启发性问题
    (1)代价函数: J ( w ) = w 2 − 10 w + 25 J(w)=w^2-10w+25 J(w)=w210w+25
    (2)代码块
import numpy as np
import tensorflow as tf
w = tf.Variable(0, dtype=tf.float32) # 定义变量
cost = tf.add(tf.add(w**2, tf.multiply(-10, w)), 25) # 定义代价函数
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # 优化算法
init = tf.global_variable_initializer()
session = tf.Session()
session.run(init)
session.run(w) #此时输出值w为0
seesion.run(train) #训练一次
for i in range(1000):#训练1000次
	session.run(train)
(3)tensorflow中数据读取
import numpy as np
import tensorflow as tf
coefficients = np.array([[1], [-20], [25]]) #模拟要读取的数据
w = tf.Variable([0], dtype=tf.float32)
x=tf.placeholder(tf.float32, [3, 1]) #为要读取的数据预留位置
cost = x[0][0]*w**2 + x[1][0]*w+x[2][0] #代价函数
train = tf.train.GradientDescentOptimizer(0.01).minimizer(cost)
init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)
for i in range(1000);
	session.run(train, feed_dict=(x:coefficients))#其中coefficients为提前读取的数据变量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值