1 Matching Annotations
  1. Sep 2018
    1. 简单记忆训练 DNN 的技巧:

      对于坏习惯, 早弃则自活

      前三个针对训练误差小测试误差大的情况;

      后两个针对训练误差就很大的情况;

      tips for good training but bad testing

      1. (早)Early Stopping
      2. (弃)Dropout
      3. (则)Regularization

      tips for bad training

      1. (自)Adaptive learning rate(optimizer)
      2. (活)New activation function

      dropout

      • 训练的时候

      每一次更新参数之前(我们一般一个 mini-batch 更新一次参数,也就是每个 mini-batch 都对神经元做一次随机丢弃),对每一个神经元(包括input layer,这点要注意)做丢弃

      1 mini-batch -> 1 dorpout -> 1 thin-network

      每一个神经元都有 p% 几率被丢弃,所有与被丢弃的神经元相连的权重 w 也都会被丢弃,这样整个网络的结构就变了,深度不变宽度变窄。

      dropout 毫无疑问会让训练结果变差,因为整体模型复杂度降低了。

      • 测试的时候

      需要注意两点:

      1. 测试的时候不对神经元做丢弃
      2. 测试的时候每个权重都乘以 (1-p%): w * (1-p%)

      为什么 dropout 测试机权重需要乘以 (1-p%)

      假设 dropout rate 设为 50%, 在训练的时候我们得到的某个神经元的输出 \(z\) ,是丢弃了输入层一半的神经元及权重得到的:

      \(z=f([x1,x2,x3,x4])\) --> \(z=f([x1,x4])\)

      在测试的时候这个由于不做任何丢弃:

      \(z=f([x1,x2,x3,x4])\))

      该神经元的输出大约会是原来的两倍:

      \(f(\vec{x}) = w * x + b\)

      \(f([x1,x2,x3,x4]) \approx 2 * f([x1,x4])\)

      \(w_{new} = 0.5 * w_{old}\) ,这样:

      \(f([x1,x2,x3,x4]) \approx f([x1,x4])\)