一、为什么需要正则化
当神经网络的层数和参数量增加时,模型容易出现过拟合的情况,即在训练集上的准确率高于在测试集上的准确率,导致模型泛化性能不佳。因此,需要使用正则化方法来缓解过拟合问题。
常见的正则化方法包括L1正则化和L2正则化。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
# 添加一层L1正则化,指定正则化强度为0.01
layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l1(0.01)),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
二、L1正则化
L1正则化通过在损失函数中添加权重的绝对值之和来惩罚模型的复杂度,可以使得一部分权重变为0,从而实现特征选择的效果。
L1正则化的数学公式为:
Loss = 原始损失函数 + λ * ∥w∥1
其中λ为正则化强度,w为权重参数,∥w∥1为权重的L1范数。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
# 添加一层L1正则化,指定正则化强度为0.01
layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l1(0.01)),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
三、L2正则化
L2正则化通过在损失函数中添加权重的平方和来惩罚模型的复杂度,可以使得所有权重都趋向于较小的值。
L2正则化的数学公式为:
Loss = 原始损失函数 + λ/2 * ∥w∥22
其中λ为正则化强度,w为权重参数,∥w∥2为权重的L2范数。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
# 添加一层L2正则化,指定正则化强度为0.01
layers.Dense(64, activation='relu', kernel_regularizer=tf.keras.regularizers.l2(0.01)),
layers.Dense(64, activation='relu'),
layers.Dense(10, activation='softmax')
])
四、Dropout正则化
Dropout正则化是一种随机失活的方法,通过在训练过程中随机丢弃一部分神经元的输出来降低复杂度,从而缓解过拟合问题。
Dropout正则化的数学公式为:
Output = Dropout(Input, keep_prob)
其中Input为输入张量,keep_prob为保留概率,即留下的神经元输出的概率。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
layers.Dense(64, activation='relu'),
# 添加一层Dropout正则化,指定保留概率为0.5
layers.Dropout(0.5),
layers.Dense(64, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax')
])
五、BatchNormalization正则化
BatchNormalization正则化是通过对每一批样本的输出进行归一化来缓解过拟合问题,可以使得模型对输入数据的变化更加鲁棒,缩短训练时间。
BatchNormalization正则化的数学公式为:
Output = γ * (Input - μ) / σ + β
其中Input为输入张量,μ和σ为当前批次所有样本的均值和标准差,γ和β为可训练的缩放系数和平移系数。
import tensorflow as tf
from tensorflow.keras import layers
model = tf.keras.Sequential([
layers.Dense(64, activation='relu'),
# 添加一层BatchNormalization正则化
layers.BatchNormalization(),
layers.Dense(64, activation='relu'),
layers.BatchNormalization(),
layers.Dense(10, activation='softmax')
])