作用 权重衰减 L2正则化 可以避免模型过拟合问题。
思考 L2正则化项有让w变小的效果 但是为什么w变小可以防止过拟合呢
原理 1 从模型的复杂度上解释 更小的权值w 从某种意义上说 表示网络的复杂度更低 对数据的拟合更好 这个法则也叫做奥卡姆剃刀 而在实际应用中 也验证了这一点 L2正则化的效果往往好于未经正则化的效果。 2 从数学方面的解释 过拟合的时候 拟合函数的系数往往非常大 为什么 如下图所示 过拟合 就是拟合函数需要顾忌每一个点 最终形成的拟合函数波动很大。在某些很小的区间里 函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值 绝对值 非常大 由于自变量值可大可小 所以只有系数足够大 才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大 所以可以在一定程度上减少过拟合情况。
公式推导 见参考链接 1 2
核心思路 1.创建一个正则化方法 2.将这个正则化方法应用到变量上
见参考链接 2
https://blog.csdn.net/program_developer/article/details/80867468
https://zhuanlan.zhihu.com/p/95883569
思路 取出可训练的参数 之后计算其参数的l2 loss 加入到原来的loss中
# 原本的loss loss tf.losses.mean_squared_error(y, out) # l2 loss loss_regularization [] for p in net.trainable_variables: # net 为按照 keras 自定义layer定义的模型 loss_regularization.append(tf.nn.l2_loss(p)) # 加入l2_loss loss_regularization tf.reduce_sum(tf.stack(loss_regularization)) loss loss 1e-4 * loss_regularization # 1e-4 为scaleLearning Rate 衰减 原理
在训练模型的时候 通常会遇到这种情况 我们平衡模型的训练速度和损失 loss 后选择了相对合适的学习率 learning rate 但是训练集的损失下降到一定的程度后就不在下降了 比如training loss一直在0.7和0.9之间来回震荡 不能进一步下降。如下图所示
学习率衰减 learning rate decay 就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是 学习率随着训练的进行逐渐衰减。
学习率衰减基本有两种实现方法
线性衰减。例如 每过5个epochs学习率减半。
指数衰减。例如 随着迭代轮数的增加学习率自动发生衰减 每过5个epochs将学习率乘以0.9998。具体算法如下
decayed_learning_rate learning_rate*decay_rate^(global_step/decay_steps)
其中decayed_learning_rate为每一轮优化时使用的学习率 learning_rate为事先设定的初始学习率 decay_rate为衰减系数 decay_steps为衰减速度。
https://www.cnblogs.com/baby-lily/p/10962574.html关键参数
tf.train.exponential_decay() learning_rate, 初始的学习率的值 global_step, 迭代步数变量 decay_steps, 带迭代多少次进行衰减 decay_rate, 迭代decay_steps次衰减的值 staircase False, 默认为False 为True则不衰减
tf.train.exponential_decay(initial_learning_rate, global_step global_step, decay_steps 1000, decay_rate 0.9)表示没经过1000次的迭代 学习率变为原来的0.9。
增大批次处理样本的数量也可以起到退化学习率的作用。
演示代码思路
引入 learning_rate tf.train.exponential_decay(...)
以控制optimizer 的learning_rate具体数值opt tf.train.GradientDescentOptimizer(learning_rate)
以 global_step作为计数器 add_global以在训练过程中作为计数器增加operator
最终实现 过程中learning rate decay的效果。
import tensorflow as tf import numpy as np global_step tf.Variable(tf.constant(0)) initial_learning_rate 0.1 learning_rate tf.train.exponential_decay(initial_learning_rate, global_step global_step, decay_steps 10, decay_rate 0.5) opt tf.train.GradientDescentOptimizer(learning_rate) add_global global_step.assign_add(1) with tf.Session() as sess: tf.global_variables_initializer().run() print(sess.run(learning_rate)) for i in range(50): g, rate sess.run([add_global, learning_rate]) print(g, rate)
结果
1 0.0933033 2 0.08705506 3 0.08122524 4 0.07578582 5 0.070710674 46 0.004123463 47 0.0038473257 48 0.003589682 49 0.0033492916 50 0.003125结合训练代码
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics
import os, sys
#os.chdir( ../ )
#----------constants ---------------
R1, R2 0.6, 0.4 # loss for lm and llc
LR 1e-4
ILR 1e-3
NTrain 5*int(1e4)
format_print_sub_real lambda x: {:^10} .format( %0.2f %(x))
format_print_sub_str lambda x: {:^10} .format(x)
format_print lambda x, ifReal: .join(list(map(format_print_sub_real, x))) if ifReal else .join(list(map(format_print_sub_str, x)))
#-------------------------
from db import train_batch, test_batch
from fcnet import CNNSplit
myNetwork CNNSplit()


