Regularisation 正则化

winterSky 2024-03-16 PM 670℃ 0条

2024-03-16T12:20:03.png

正则化:约束连接权重

  • 约束连接权重:

    • L2正则化:添加一个与连接权重的L2范数相对应的损失项
    • L1正则化:添加一个与连接权重的L1范数相对应的损失项

      • => 倾向于稀疏连接权重(即更多接近0的连接权重)
  • 正则化因子:控制添加多少正则化
  • Keras示例:

    • (l2可以改为l1,0.01是正则化因子)
    model.add(keras.layers.Dense(300, activation="relu", kernel_regularizer=keras.regularizers.l2(0.01)))

正则化是一种用于防止机器学习模型过拟合的技术。过拟合发生在模型对训练数据学得“太好”,以至于它开始捕捉训练数据中的噪声和异常值,而不是潜在的数据分布。这导致模型在训练数据上表现出色,但在未见过的数据上泛化能力差。

正则化通过添加一个与模型复杂度相关的惩罚项到损失函数中来工作。这个惩罚项通常与模型权重的范数有关:

  • L1正则化(也叫Lasso正则化)添加的是权重的绝对值之和。它可以导致一个稀疏的权重矩阵,有助于特征选择,因为某些权重可以变成零。
  • L2正则化(也叫Ridge正则化或权重衰减)添加的是权重的平方和。它倾向于让权重值均匀地较小,而不是让部分权重完全为零,这通常可以提高模型的泛化能力。

为什么需要正则化:

  1. 防止过拟合:减少模型在训练集上的复杂度,帮助模型更好地泛化到新数据上。
  2. 提高泛化能力:简化的模型通常在未见数据上表现更好,因为它们能够捕捉到数据的一般趋势而非训练数据中的细节。
  3. 处理共线性:在特征之间高度相关的情况下,正则化可以帮助减少冗余,稳定模型的预测。
  4. 特征选择:通过L1正则化,模型可以将不重要的特征权重推到零,从而自动进行特征选择。

2024-03-16T12:23:30.png


正则化:提前停止

  • 更多的训练周期并不总是导致更好的模型

    • 学到的模型可能会过拟合训练数据
    • 通过在验证集上监控性能可以进行检测
  • 可以被看作是一种强大的正则化方法

训练误差和验证误差随训练迭代次数的变化。随着训练次数的增加,训练集上的误差通常会持续下降。然而,验证集上的误差在一定次数的迭代后通常会开始上升,这是过拟合的标志。提前停止的方法是在验证误差开始增加时停止训练,这样可以防止模型在训练数据上过于专业化,从而保留其在未见数据上的泛化能力。


Keras实现:保存和加载模型 Saving and Loading Models

  • 要保存训练好的模型,请使用:

    model.save("my_keras_model.h5")
    • my_keras_model => 可以更改为所选择的名称
    • .h5 => 标准HDF5(Hierarchical Data Format)格式
  • 要加载模型回来,请使用:

    model = keras.models.load_model("my_keras_model.h5")
    • 更改文件名以匹配模型文件

HDF5是一种组织和存储复杂数据的文件格式,常用于大规模存储如模型权重这样的数据集。在保存模型时,.h5文件将包括模型的结构,权重值,训练配置(如果有的话),优化器及其状态(这使得你可以从中断的地方继续训练模型)。使用load_model函数,你可以加载这个.h5文件来重建原始模型。

Keras实现:检查点 Checkpoint

  • 训练可能会耗费很长时间
  • 定期保存模型是一个好习惯
# 构建并编译模型
checkpoint_cb = keras.callbacks.ModelCheckpoint("my_keras_model.h5")
history = model.fit(X_train, y_train, epochs=10, callbacks=[checkpoint_cb])
  • 这将在每个训练周期后保存模型
  • 之后可以重新加载模型以继续训练

使用Keras中的ModelCheckpoint回调来在每个epoch后保存模型的状态。这样做的好处是,如果训练过程中断,可以从最后保存的状态重新开始,而不是从头开始训练。此外,如果模型在训练过程中出现过拟合,还可以回退到之前的某个epoch的模型状态。在这个例子中,"my_keras_model.h5"是模型保存的文件名,这个文件名可以按照需要更改。


Keras实现:保存最佳模型 saving the best model

  • 为了避免过拟合,可以保存在验证集上表现最好的模型,并在之后加载回来(设置save_best_onlyTrue):
checkpoint_cb = keras.callbacks.ModelCheckpoint("my_keras_model.h5", save_best_only=True)
history = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid, y_valid), callbacks=[checkpoint_cb])
model = keras.models.load_model("my_keras_model.h5")
# 回滚到最佳模型

此方法利用了ModelCheckpoint回调的save_best_only参数,只有当模型在验证集上的表现超过之前所有epoch时,模型才会被保存。这样可以确保加载的模型是在验证集上性能最佳的模型,有助于减轻过拟合的问题。在模型训练过程中,这是确保性能的一种有效手段。

Keras实现:早停 early stopping

  • 另一种方法是,如果几个周期后没有进展(由耐心参数定义),则提前停止训练:
early_stopping_cb = keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)
history = model.fit(X_train, y_train, epochs=100, validation_data=(X_valid, y_valid), callbacks=[early_stopping_cb])

早停机制是一种正则化方法,用于防止神经网络过拟合。它通过监控模型在验证集上的性能来工作。如果在设定的patience数的连续训练周期内没有观察到性能改善,则自动停止训练。在这个例子中,patience设置为10,意味着如果连续10个epoch验证集上的性能没有改善,训练将停止。此外,设置restore_best_weights=True将使模型在训练结束后回滚到验证性能最好的权重。这确保即使训练早期停止,模型的状态也是在验证数据上表现最好的状态。


# Early stopping
# Try with ReLU activation for hidden layers
early_stopping_cb = keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax"))
model.compile(loss = "sparse_categorical_crossentropy", optimizer="sgd", metrics = ["accuracy"])
ReLU_history = model.fit(x_train, y_train, epochs = 60, validation_split=0.1, callbacks=[early_stopping_cb])
model.evaluate(x_test, y_test)
#[0.3343144655227661, 0.8788999915122986]
标签: none

非特殊说明,本博所有文章均为博主原创。

评论啦~