L2 改善深层神经网络

3 超参数调试

课程时长104min33s

3.1 调试过程

  • 需要调整的超参数较多

    • α,β,β1,β2,ξ,#layers,#hidden units,mini_batch size,learning rate declay\alpha,\beta,\beta_1,\beta_2,\xi,\#layers,\#hidden\ units,mini\_batch\ size,learning\ rate\ declayα,β,β1,β2,ξ,#layers,#hidden units,mini_batch size,learning rate declay
    • α:最重要的参数
    • β、#hidden units、mini-batch size:次重要参数
    • #layers、learning rate declay:次次重要参数
    • β1,β2ξ\xiξ:不重要参数
  • 不要使用网格选择参数,而是随机选取

    image-20220803094914130

  • 粗略搜索后,进行更小区域的选择

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

均匀随机取值

  • n[l]=50,…,100

  • #layers L=2,3,4

非均匀随机取直

  • α:0.0001,…,1
    • 使用非线性轴
    • 使用指数函数
  • β:0.9,…,0.999
    • 使用1-β后使用指数函数

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

不同领域超参数可能可以通用

  • 自然语言处理、计算机视觉、语音、广告、逻辑

超参数需要随着时间、数据变化进行调整

模型训练方法

  • 训练一个模型调整参数

    • Panda方式
    • 计算资源较少
  • 同时训练多个模型,设定不同参数

    • 鱼子酱方式
    • 计算资源较多

3.4 正则化网络的激活函数

batch normalization batch标准化

对于一个隐藏层,归一化a值

对于某层的隐藏值 z[l][1], z[l][2],…, z[l][m]
μ=1m∑iz(i)σ2=1m∑i(z(i)−μ)znorm(i)=z(i)−μσ2+ξz~(i)=γznorm(i)+βif γ=σ2+ξ,β=μ thenz~(i)=z(i) \mu = \frac 1m\sum_iz^{(i)}\\ \sigma^2=\frac 1m\sum_i(z^{(i)}-\mu)\\ z^{(i)}_{norm}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\xi}}\\ \tilde z^{(i)}=\gamma z^{(i)}_{norm}+\beta\\ if\ \gamma=\sqrt{\sigma^2+\xi},\beta=\mu\ then\\ \tilde z^{(i)}= z^{(i)} μ=m1iz(i)σ2=m1i(z(i)μ)znorm(i)=σ2+ξz(i)μz~(i)=γznorm(i)+βif γ=σ2+ξ,β=μ thenz~(i)=z(i)

  • 保证隐藏的单元进行均值和方差标准化
  • 使用γ和β可以控制均值和方差

3.5 将Batch Norm拟合进神经网络

Batch归一化发生在计算z和a之间

  • x→w[1],b[1]z[1]→β[1],γ[1]z~(1)→a[1]=g[1](z~(1))→w[2],b[2]z[2]… x \xrightarrow{w^{[1]},b^{[1]}}z^{[1]} \xrightarrow{\beta^{[1]},\gamma^{[1]}}\tilde z^{(1)}\rightarrow a^{[1]}=g^{[1]}(\tilde z^{(1)}) \xrightarrow{w^{[2]},b^{[2]}}z^{[2]} \dots xw[1],b[1]z[1]β[1],γ[1]z~(1)a[1]=g[1](z~(1))w[2],b[2]z[2]

  • Parameters:w[1],b[1],β[1],γ[1],w[2],b[2],β[2],γ[2]…β[l]=β[l]−αdβ[l] Parameters:w^{[1]},b^{[1]},\beta^{[1]},\gamma^{[1]},w^{[2]},b^{[2]},\beta^{[2]},\gamma^{[2]}\dots\\ \beta^{[l]}=\beta^{[l]}-\alpha d\beta^{[l]} Parameters:w[1],b[1],β[1],γ[1],w[2],b[2],β[2],γ[2]β[l]=β[l]αdβ[l]

和Mini-batch一起应用

  • X{1}→w[1],b[1]z[1]→β[1],γ[1]z~(1)→a[1]=g[1](z~(1))→w[2],b[2]z[2]…X{2}→w[1],b[1]z[1]…⋮ X^{\{1\}} \xrightarrow{w^{[1]},b^{[1]}}z^{[1]} \xrightarrow{\beta^{[1]},\gamma^{[1]}}\tilde z^{(1)}\rightarrow a^{[1]}=g^{[1]}(\tilde z^{(1)}) \xrightarrow{w^{[2]},b^{[2]}}z^{[2]} \dots\\ X^{\{2\}} \xrightarrow{w^{[1]},b^{[1]}}z^{[1]} \dots\\ \vdots X{1}w[1],b[1]z[1]β[1],γ[1]z~(1)a[1]=g[1](z~(1))w[2],b[2]z[2]X{2}w[1],b[1]z[1]

  • 使用batch norm时候,由于β[l]可以控制平均值的偏差,因此偏移值b[l]实际不起作用

  • 实现过程

  • for t = 1 to mini-batch num:

    • compute forward pop on X{t}compute\ forward\ pop\ on\ X^{\{t\}}compute forward pop on X{t}
      • 在每层隐藏层中,使用batch norm,将z[l]z^{[l]}z[l]替换为z~(l)\tilde z^{(l)}z~(l)
    • use back pop to compute dw[l],db[l],dβ[l],dγ[l]use\ back\ pop\ to\ compute\ dw^{[l]},db^{[l]},d\beta^{[l]},d\gamma^{[l]}use back pop to compute dw[l],db[l],dβ[l],dγ[l]
    • 更新参数

同样可以使用momentum、Adam、RMSprop

3.6 Batch Norm的解释

Batch标准化的作用

  • 加速训练
    • 类似将数据集从1-1000处理到0-1范围
  • 使得权重相比网络网络更滞后或者更深层
    • covariate shift
    • 减少隐藏值分布变化的数量,使得每层输入更加稳定
  • 一定的正则化作用
    • 向隐藏单元添加了噪音

batch归一化一次智能处理一个mini-batch数据

3.7 测试时的Batch Norm

batch标准化公式:
μ=1m∑iz(i)σ2=1m∑i(z(i)−μ)znorm(i)=z(i)−μσ2+ξz~(i)=γznorm(i)+β \mu = \frac 1m\sum_iz^{(i)}\\ \sigma^2=\frac 1m\sum_i(z^{(i)}-\mu)\\ z^{(i)}_{norm}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^2+\xi}}\\ \tilde z^{(i)}=\gamma z^{(i)}_{norm}+\beta\\ μ=m1iz(i)σ2=m1i(z(i)μ)znorm(i)=σ2+ξz(i)μz~(i)=γznorm(i)+β

  • 对μ和σ2使用指数加权平均进行计算

3.8 Softmax回归

多分类而非单分类

  • C:分类的类别数目
    • n[L]=C,输出层单元数目为C,每个输出代表概率

Softmax层使用不同的激活函数

  • 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]

  • 激活函数

    • t=e(z[L])a[L]=ez[L]∑i=1Cti,ai[L]=ti∑i=1Cti t = e^{(z^{[L]})}\\ a^{[L]}=\frac{e^{z^{[L]}}}{\sum_{i=1}^{C}t_i},a_i^{[L]}=\frac{t_i}{\sum_{i=1}^{C}t_i} t=e(z[L])a[L]=i=1Ctiez[L],ai[L]=i=1Ctiti
  • 输出归一化,输出一个向量

3.9 训练一个Softmax分类器

Softmax <=> Hard max:只在最大值设为1
z[L]=[52−13]t=[e5e2e−1e3]a[L]=g[L](z[L])=[0.8430.0430.0020.114]hard_max=[1000] z^{[L]}=\left[\begin{matrix}5\\2\\-1\\3\\ \end{matrix}\right]\qquad t = \left[\begin{matrix}e^5\\e^2\\e^{-1}\\e^3 \end{matrix}\right] \qquad \\ a^{[L]}=g^{[L]}(z^{[L]}) = \left[\begin{matrix}0.843\\0.043\\0.002\\0.114\\ \end{matrix}\right]\\ hard\_max=\left[\begin{matrix}1\\0\\0\\0\\ \end{matrix}\right] z[L]=5213t=e5e2e1e3a[L]=g[L](z[L])=0.8430.0430.0020.114hard_max=1000

  • C=2,则退化成logistic回归

损失函数对于单个训练样本


  • y=[0100]a[L]=y^=[0.30.20.10.4] y=\left[\begin{matrix}0\\1\\0\\0\\ \end{matrix}\right]\qquad \\ a^{[L]}= \hat y=\left[\begin{matrix}0.3\\0.2\\0.1\\0.4\\ \end{matrix}\right]\\ y=0100a[L]=y^=0.30.20.10.4

  • 则损失函数
    l(y^,y)=−∑j=14yjlog y^j l(\hat y,y)=-\sum_{j=1}^4 y_jlog\ \hat y_j l(y^,y)=j=14yjlog y^j

  • 也就为−y2log y^2=−log y^2-y_2log\ \hat y_2=-log\ \hat y_2y2log y^2=log y^2

    • 若要损失减小,也就是使得y2增大
  • 对于多个训练样本
    J(w[1],b[1],… )=1m∑i=1ml(y^(i),y(i)) J(w^{[1]},b^{[1]},\dots)=\frac 1m\sum_{i=1}^ml(\hat y^{(i)},y^{(i)}) J(w[1],b[1],)=m1i=1ml(y^(i),y(i))

    • 使用梯度下降法
      Y=[y(1),y(2),…,y(m)]=[0 1 0 …1 0 0 …0 0 1 …0 0 0 …],Y:(4,m)Y^=[y^(1),y^(2),…,y^(m)]=[0.3…0.2…0.1…0.4 …],Y^:(4,m) Y =[y^{(1)}, y^{(2)},\dots,y^{(m)}] = \left[\begin{matrix}0\ 1\ 0\ \dots\\1\ 0\ 0\ \dots\\0\ 0\ 1\ \dots\\0\ 0\ 0\ \dots\\ \end{matrix}\right],Y:(4,m)\\ \hat Y=[\hat y^{(1)}, \hat y^{(2)},\dots,\hat y^{(m)}] = \left[\begin{matrix}0.3\dots\\0.2\dots\\0.1\dots\\0.4\ \dots\\ \end{matrix}\right],\hat Y:(4,m) Y=[y(1),y(2),,y(m)]=0 1 0 1 0 0 0 0 1 0 0 0 ,Y:(4,m)Y^=[y^(1),y^(2),,y^(m)]=0.30.20.10.4 ,Y^:(4,m)

使用Softmax的梯度下降法

  • 反向传播公式
    dz[L]=∂J∂z[L]=y^−y dz^{[L]} = \frac{\partial J}{\partial z^{[L]}}=\hat y-y dz[L]=z[L]J=y^y

使用深度学习框架,能够自动实现反向传播

3.10 深度学习框架

深度学习框架

  • Caffe/Caffe2
  • CNTK
  • DL4J
  • Keras
  • Lasagne
  • mxnet
  • PaddlePaddle
  • TensorFlow
  • Theano
  • Torch

选择框架的标准

  • 易于编程,使用人数较多
  • 运算速度较快
  • 框架是否开源

3.11 TensorFlow

  • 使用tf.Variable定义参数

    import numpy as np
    import tensorflow as tf
    # w是想要优化的参数,cost是损失函数
    # cost也可以写作:
    # cost = w**2 - 10*w + 25
    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_variables_initializer()
    session = tf.Session()
    session.run(init)
    
    for i in range(1000):
        session.run(train)
    print(session.run(w))
    
  • 如何把数据集加入训练中

    import numpy as np
    import tensorflow as tf
    # w是想要优化的参数,cost是损失函数
    coefficients = np.array([[1.],[-10.],[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).minimize(cost)
    
    init = tf.global_variables_initializer()
    session = tf.Session()
    session.run(init)
    
    for i in range(1000):
        session.run(train, feed_dict={x:coefficients})
    print(session.run(w))
    
    • tf.placeholder是一个之后会赋值的变量,方便把数据加入到损失方程中

更多推荐