深度学习记录(5) - 深度学习正则化

0.

在这里插入图片描述
上图是 欠拟合、好的拟合、过拟合三种情况。

在许多机器学习算法中都采用相关的策略来减小测试误差,这些策略统称为“正则化”,经常会遇到过拟合,所以需要使用不同形式的正则化策略。

目前在深度学习中使用较多的策略有:参数范数惩罚,提前终止,DropOut等

1. L1、L2正则化

这两种方法,通过在损失函数中增加一个正则项,使得权重矩阵的值减小。因为,这两种方法假定具有更小权重矩阵的神经网络就是更简单的模型。

  • L2正则化(L2范数)
    在这里插入图片描述

这里的Lambda是正则化参数,它是一个需要优化的超参数(手动设置),L2正则化又称权重衰减,因为它导致权重趋向于0(但不全是0)

  • L1正则化(L1范数)
    这里,惩罚的是权重矩阵的绝对值。其中,Lambda是正则化参数,也是超参数,不同于L2,权重值可能被减少到0。因此,L1对于压缩模型很有用(使模型变的稀疏)。其他情况下,一般优先选择L2正则化。
tf.keras.regularizers.l1(l1 = 0.01)
tf.keras.regularizers.l2(l2 = 0.01)
tf.keras.regularizers.L1L2(l1 = 0.01, l2=0.02)

实际使用在模型中,直接在层当中指明正则化类型和超参数即可:

mode.add(keras.layers.Dense(3, activation="relu", kernel_initializer='he_normal', name = "layer1", kernel_regularizer=regularizers.l1(0.01)))

2. DropOut

  • 在深度学习领域最常用的正则化方法。
  • 在训练时,在某一层的全部神经元中,随机的掐死一部分不进行更新(向前和向后的连接都删掉),以后再更新。因此,每次迭代都会有不同的节点组合,从而导致不同的输出。
  • DropOut使得神经网络模型优于正常的模型。
tf.keras.layers.Dropout(0.2) # 每个神经元有0.2的概率被失活,未被失活的将按 1 / (1-rate)放大 

实际使用中,

layer = keras.layers.Dropout(0.2, input_shape=(2, ))

# 定义输入数据
data = np.arange(1, 11).reshape(5, 2).astype(np.float32)
print(data)

# 对输入数据进行随机失活
outputs = layer(data, training = True)
print(outputs)

结果:

[[ 1.  2.]
 [ 3.  4.]
 [ 5.  6.]
 [ 7.  8.]
 [ 9. 10.]]
 
tf.Tensor(
[[ 1.25  2.5 ]
 [ 0.    5.  ]
 [ 0.    7.5 ]
 [ 8.75  0.  ]
 [11.25  0.  ]], shape=(5, 2), dtype=float32)

3 提前终止(Early Stopping)

  • 提前终止是将一部分训练集作为验证集进行“训练的监控”,当验证集的性能越来越差时 或者 性能不再提升,则立即停止对该模型的训练。
    在这里插入图片描述
keras.callbacks.EarlyStopping(monitor='var_loss', patience=5 )
# monitor 是监控量
# patience 在多少个epoch中 损失没有得到优化了(不下降或者更高的误差),就终止。

代码:

# 定义回调函数
callback = keras.callbacks.EarlyStopping(monitor="loss", patience=3)

# 定义一个网络模型
model = keras.models.Sequential()
model.add(keras.layers.Dense(10))

# 设置损失函数
model.compile(keras.optimizers.SGD(), loss = 'mse')   # L2损失

history = model.fit(np.arange(100).reshape(5,20), np.array([0,1,0,1,0]), epochs = 10, batch_size = 1, callbacks = [callback], verbose = 1)

len(history.history['loss'])

输出:

Train on 5 samples
Epoch 1/10
5/5 [==============================] - 0s 58ms/sample - loss: 21745303577607836.0000
Epoch 2/10
5/5 [==============================] - 0s 1ms/sample - loss: 5388751874075613659045795217801216.0000
Epoch 3/10
5/5 [==============================] - 0s 1ms/sample - loss: inf                                  
Epoch 4/10
5/5 [==============================] - 0s 1ms/sample - loss: inf

4

可以看到,只训练了4个epoch。

4. BN层

  • BN:批标准化,也是网络中的一层,但是统计层数的时候,不会统计它。现在的网络一般都会采用BN层。
  • BN层是针对单个神经元进行的。在每一层输入之前,先进行BN,再送入后续网络中进行学习。

利用网络训练时一个mini-batch的数据来计算该神经元xi的均值和方差,归一化后并重构。

猜你喜欢

转载自blog.csdn.net/u014117943/article/details/114444845