过拟合与欠拟合的探究2,高偏差与高方差
- 高偏差和高方差
- 过拟合与欠拟合的解决策略
- 带有L2正则化的神经网络
- 带有早停法的神经网络的完整案例 MINST
高偏差和高方差
高偏差和高方差是机器学习中常见的两个问题,会影响模型的性能。
高偏差(High Bias)指的是模型对真实数据的预测结果与真实结果之间存在较大的偏差,即预测结果偏离真实结果的程度较大。这种偏差可能是由于模型过于简单,无法拟合数据中的复杂模式或者因为特征提取不够充分等原因造成的。因此,这种偏差被称为高偏差。
高偏差带来的是模型的欠拟合(不仅是训练集而且是测试集)。这可能会导致训练数据和测试数据上的准确率都很低。
高方差(High Variance)则是指模型过于复杂,过拟合了训练数据,学习到的是数据中的噪声而不是基本模式。这可能会导致训练数据上的准确率很高,但在验证数据上、测试数据上表现不佳;如上图所示。
机器学习的目标是在偏差和方差之间找到平衡点,使模型能够很好地适应新数据。这可以通过选择适当的模型、优化超参数、使用正则化技术以及增加训练数据量来实现。所以说,并不是训练的准确度越高越好;而通常我们防止欠拟合(高偏差)和过拟合(高方差)的做法是在训练迭代中,持续监测训练集与验证集的准确度;
❓
怎样的程度才会称为“高”偏差与“高”方差?
提出的其中一种办法是与人类的判断相对比,比如,人类判断相同数据集的准确率为0.92,但是训练集的准确率为 0.8,那么可以称为发生了欠拟合,即高偏差;而如果经过多次迭代,训练集的准确度已经达到 0.91,但是验证集缺很低,0.8,那么极有可能发生了过拟合,即高方差。
过拟合与欠拟合的解决策略
我们当然不希望发生过拟合或者欠拟合现象,那我们该怎么办去避免,或者怎样去解决我们的神经网络模型过拟合欠拟合问题?
-
增加数据量: 增加更多的数据有助于减少过拟合的风险,同时可以更好地训练模型,减少欠拟合的风险。
-
数据扩充: 通过对已有数据进行旋转、缩放、平移等操作,生成新的数据样本,从而增加数据量,降低模型的过拟合风险。处理图片的神经网络中应用比较多。
-
模型复杂度控制: 通过减少模型的层数、节点数等来控制模型的复杂度,减少过拟合的风险;同时,如果模型太简单,也会导致欠拟合的问题,需要适当增加模型复杂度。
-
正则化技术: 通过在损失函数中加入正则化项,常见正则化方法如L1正则化、L2正则化、弹性网络正则化、Dropout、早停法等技术,来限制模型的复杂度,减少过拟合的风险。
见博文:【机器学习】P21 正则化 Regularization(L1正则化 Lasso、L2正则化 Ridge、弹性网络正则化、Dropout正则化、早停法) -
交叉验证: 通过将数据集分成训练集和验证集,来评估模型的性能和泛化能力,并根据验证集的表现调整模型的参数,减少过拟合的风险。
见博文:【机器学习】P20 模型的诊断 - 验证集 -
提前终止训练: 当模型在验证集上的表现停止改善时,提前终止训练,以避免过拟合的发生。提前终止训练也算为正则化技术之一,即早停法。
同样见博文:【机器学习】P21 正则化 Regularization(L1正则化 Lasso、L2正则化 Ridge、弹性网络正则化、Dropout正则化、早停法) -
集成学习: 通过将多个模型集成起来,如Bagging、Boosting等方法,来提高模型的泛化能力,减少过拟合的风险。这点后期再说。
我们通过综合采用上述方法,可以有效地防止神经网络的欠拟合和过拟合问题,提高模型的泛化能力和性能。
带有L2正则化的神经网络
L2正则化方法通过对模型的权重参数进行L2范数惩罚,使得权重参数变得更加平滑,避免出现过于极端的权重值,从而实现对过拟合问题的缓解;
有关于L2正则化的详情,见博文:【机器学习】P21 正则化 Regularization(L1正则化 Lasso、L2正则化 Ridge、弹性网络正则化、Dropout正则化、早停法)
其中带有L2惩戒的损失函数为:
J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 + λ 2 m ∑ j = 0 n − 1 w j 2 J(w,b)=\frac 1 {2m} \sum _{i=0} ^{m-1} (f_{w,b}(x^{(i)})-y^{(i)})^2+\frac {\lambda} {2m} \sum _{j=0} ^{n-1}w_j^2 J(w,b)=2m1i=0∑m−1(fw,b(x(i))−y(i))2+2mλj=0∑n−1wj2
代码实现方法为:
layer_1 = Dense(units=25, activation="relu", kernel_regularizer=L2(0.01))
layer_2 = Dense(units=15, activation="relu", kernel_regularizer=L2(0.01))
layer_3 = Dense(units=1, activation="sigmoid", kernel_regularizer=L2(0.01))
model = Sequential([layer_1, layer_2, layer_3])
上述代码中,kernel_regularizer=L2(0.01)
的含义为采用 L2
正则化方法,其中
λ
\lambda
λ 的值为 0.01
带有早停法的神经网络的完整案例 MINST
早停法是一种正则化方法。其基本思想是:在模型训练过程中,每次训练我们计算模型在验证集上的误差,如果验证误差开始增加,则停止训练,否则继续训练。
但是需要注意的是,一般来说,并不是验证误差开始上升,就立即停止训练。反而,如果验证误差的上升非常缓慢,并且当前的验证误差仍然比之前的最小值小很多,那么我们通常会允许模型继续训练一段时间,以便模型进一步优化,而不是立即停止训练。
具体详情见博文:见博文:【机器学习】P21 正则化 Regularization(L1正则化 Lasso、L2正则化 Ridge、弹性网络正则化、Dropout正则化、早停法)
带有早停法实现手写识别的代码:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import mnist
# 加载数据集并进行预处理
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 定义模型
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
# 定义损失函数和优化器
loss_fn = keras.losses.SparseCategoricalCrossentropy()
optimizer = keras.optimizers.Adam()
# 定义早停法
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
# 训练模型
model.compile(optimizer=optimizer, loss=loss_fn, metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=50, validation_data=(x_test, y_test), callbacks=[early_stop])
from sklearn.metrics import accuracy_score
import numpy as np
# 测试集数据
pred_y = model.predict(x_test)
pred_labels = np.argmax(pred_y, axis=1)
acc = accuracy_score(y_test, pred_labels)
print('Test accuracy:', acc)
更多比如通过Dropout正则化方法防止过拟合欠拟合,见博文:【机器学习】P21 正则化 Regularization(L1正则化 Lasso、L2正则化 Ridge、弹性网络正则化、Dropout正则化、早停法)