正则化,学习率指数衰减和滑动均值模型

浏览学长博客有感,稍微记一点:

1.正则化损失函数L2

2.学习率的指数衰减

3.滑动平均模型

ps:看到类似的
博客
也不错


正则化损失函数L2

概念简述

由于数据存在很多干扰或者噪声,容易产生过拟合现象。在相同网络结构下,决策面越复杂,参数w的值往往更大,而w较小时候,得到的决策面相对平缓。
L2正则化是一种减少过拟合的方法,让w尽量小,在损失函数中加入刻画模型复杂程度的指标。假设损失函数是J(θ),则优化的是J(θ)+λR(w),R(w)=∑ni=0|w2i|。


公式推导

正则化函数理解(比较好)

代码实现

training.py中:
#正则化损失函数L2
REGULARATION_RATE = 0.0001
regularizer =tf.contrib.layers.l2_regularizer(REGULARATION_RATE)

model.py中
 # fc1密集全连层中,将权重的正则化结果加入损失集合“loss”
 with tf.variable_scope("fc1") as scope:
        W_fc1 = weight_variable([6 * 96, 256])  # 输入维度为1*6*96,输出维度为256
        if regularizer != None:
            tf.add_to_collection('loss', regularizer(W_fc1))
        b_fc1 = bias_variable([256])
        fc1 = tf.nn.relu(tf.matmul(h_pool5_flat, W_fc1) + b_fc1, name="fc1")
 #fc2可以同理

然后再在training.py中
loss1 = cross_entropy_mean + tf.add_n(tf.get_collection('loss'))
即用交叉熵损失和权重损失之和,代替原来的交叉熵损失

学习率的指数衰减

概念简述

使用固定的 α,不能精确的收敛,算法最后在附近摆动,所以采用指数衰减
这里使用退化学习率,公式为:

decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)


对应函数为

tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)

退化学习率

摘自博客,不理解建议看原博

代码实现

在training.py里
LEARNING_RATE_BASE = 0.8
LEARNING_RATE_DECAY = 0.99
BATCH_SIZE = 128
global_step = tf.Variable(0, trainable=False)
#设置指数衰减的学习率
    learning_rate = tf.train.exponential_decay(
        LEARNING_RATE_BASE,
        global_step,
        100000 / BATCH_SIZE,
        LEARNING_RATE_DECAY
    )

在model.py中
#往梯度下降优化器里传入参数学习率(我封装在函数里了)
def trainning(loss,learning_rate):
    # 梯度下降
    train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
    return train_step

training.py中调用
train_step = model.trainning(loss1,learning_rate)
### 滑动平均模型 **概念简述**:
tf.train.ExponentialMovingAverage实现滑动平均模型,提高模型在测试数据上的健壮性。 > 说白了就是在更新参数的时候不太过了也不太小,更新参数跟你之前的参数有联系,不会发生突变。健壮性就是对突变的抵抗能力,健壮性越好,这个模型对恶性参数的提抗能力就越强。你训练的时候万一遇到个“疯狂”的参数,有了这个算法疯狂的参数就会被抑制下来,回到正常的队伍里 ExponentialMovingAverage对每一个待更新的变量(variable)都会维护一个影子变量(shadow variable)。影子变量的初始值就是这个变量的初始值, > shadow_variable=decay×shadow_variable+(1−decay)×variable ExponentialMovingAverage 还提供了 num_updates 参数来动态设置 decay 的大小: > decay=min{decay,1+num_updates10+num_updates} [实例](https://blog.csdn.net/IAMoldpan/article/details/78208897?locationNum=11&fps=1)
ps:一开始0.99和计算后的0.1相比取0.1,之后计算结果0.99较小取0.99 **代码实现**
#tf.trainable_variables返回的是需要训练的变量列表
在training.py中
 # 定义损失函数、学习率、滑动平均操作以及训练过程
    variable_averages = tf.train.ExponentialMovingAverage(
        MOVING_AVERAGE_DECAY, global_step)
    variable_averages_op = variable_averages.apply(
        tf.trainable_variables())

 #训练与更新参数的滑动平均值
    #将2大步操作打包在train_op中,第1大步操作是使用正则化和指数衰减更新参数值
    #第2大步操作是使用滑动平均再次更新参数值。
    #每次训练都完成这2大步操作。
    with tf.control_dependencies([train_step, variable_averages_op]):
        train_op = tf.no_op(name='train')

#然后在训练的时候调用train_op就完事拉

总结:

  • 正则化:防止过拟合
  • 学习率衰减: 最优值收敛
  • 滑动均值模型: 抵御突变数据,增强模型健壮性
  • 最后完整代码见序中两篇博客···


    =====================================================2018.8.31