3-3 超参数
什么是超参数
超参数也是一种参数,它具有参数的特性,比如未知,也就是它不是一个已知常量。是一种手工可配置的设置,需要为它根据已有或现有的经验,指定“正确”的值,也就是人为为它设定一个值,它不是通过系统学习得到的。
超参=在开始机器学习之前,就人为设置好的参数。
模型参数=通过训练得到的参数数据。
通常情况下,需要对超参数进行优化,给学习机选择-组最优超参数,以提高学习的性能和效果
超参数有哪些
什么是学习率?
在机器学习中,特别是训练神经网络时,学习率是一个非常关键的超参数。它决定了模型在每一步更新参数时,更新的幅度有多大。可以把它理解为**“步伐大小”**。
学习率的比喻
想象一下你在一个山谷中找寻最低点(这是我们的目标,类似于我们想要找到的最佳模型参数)。学习率就像是你每次走一步时的步幅大小。
- 大步伐(高学习率):你可以很快地接近山谷底部,但如果步子太大,你可能会错过最低点,甚至来回跳跃,无法稳定下来。
- 小步伐(低学习率):你会非常谨慎地一步一步走,虽然不会跳过最低点,但前进的速度会很慢,有时可能需要很长时间才能到达目标。
为什么学习率很重要?
-
收敛速度:
- 学习率决定了模型训练的收敛速度。合适的学习率可以帮助模型更快地找到最佳解。
-
稳定性:
- 如果学习率太高,模型可能会在训练过程中震荡甚至发散,无法稳定在最优点。
- 如果学习率太低,模型的训练时间会非常长,且可能会陷入局部最优解而不是全局最优解。
调整学习率
在实际训练中,找到一个合适的学习率通常需要一些尝试。以下是常见的策略:
-
逐步减少学习率:
- 开始时使用较大的学习率,以便快速接近最优解,然后逐步减小学习率,以更精细地调整参数。这种方法通常用于“学习率调度”或“学习率衰减”。
-
使用自适应学习率方法:
- 方法如 Adam、RMSprop 等,可以动态调整学习率,使其在训练过程中自动适应。
我们来写一段代码理解以下学习率
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.datasets import mnist
from tensorflow.keras.optimizers import SGD, Adam
from tensorflow.keras.callbacks import LearningRateScheduler
import matplotlib.pyplot as plt
# 1. 加载和预处理数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # 归一化数据
# 2. 构建简单的神经网络模型
def create_model():
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
return model
# 3. 定义不同的学习率策略
# (a) 固定学习率
fixed_lr = 0.01
model_fixed_lr = create_model()
model_fixed_lr.compile(optimizer=SGD(learning_rate=fixed_lr),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# (b) 学习率衰减
initial_lr = 0.1
def decay_schedule(epoch):
return initial_lr * np.exp(-0.1 * epoch)
model_decay = create_model()
model_decay.compile(optimizer=SGD(learning_rate=initial_lr),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
lr_scheduler = LearningRateScheduler(decay_schedule)
# (c) 自适应学习率(使用 Adam)
model_adaptive = create_model()
model_adaptive.compile(optimizer=Adam(),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 4. 训练模型并记录历史
# (a) 固定学习率
history_fixed_lr = model_fixed_lr.fit(x_train, y_train, epochs=10,
validation_data=(x_test, y_test),
verbose=0)
# (b) 学习率衰减
history_decay = model_decay.fit(x_train, y_train, epochs=10,
validation_data=(x_test, y_test),
callbacks=[lr_scheduler],
verbose=0)
# (c) 自适应学习率
history_adaptive = model_adaptive.fit(x_train, y_train, epochs=10,
validation_data=(x_test, y_test),
verbose=0)
# 5. 可视化训练结果
plt.figure(figsize=(12, 6))
# 绘制损失函数
plt.subplot(1, 2, 1)
plt.plot(history_fixed_lr.history['val_loss'], label='Fixed LR')
plt.plot(history_decay.history['val_loss'], label='Decay LR')
plt.plot(history_adaptive.history['val_loss'], label='Adaptive LR')
plt.xlabel('Epoch')
plt.ylabel('Validation Loss')
plt.title('Validation Loss vs. Epoch')
plt.legend()
# 绘制准确率
plt.subplot(1, 2, 2)
plt.plot(history_fixed_lr.history['val_accuracy'], label='Fixed LR')
plt.plot(history_decay.history['val_accuracy'], label='Decay LR')
plt.plot(history_adaptive.history['val_accuracy'], label='Adaptive LR')
plt.xlabel('Epoch')
plt.ylabel('Validation Accuracy')
plt.title('Validation Accuracy vs. Epoch')
plt.legend()
plt.tight_layout()
plt.show()
训练结果如下
从图表中,我们可以看到三种不同的学习率策略在模型训练和验证中的表现:
左图:验证损失 vs. 迭代次数 (Validation Loss vs. Epoch)
固定学习率(Fixed LR)
- 表现趋势: 固定学习率的验证损失逐渐下降,虽然下降较慢,但非常稳定。到第 10 个 epoch 时,验证损失仍然在持续降低。
- 特点: 固定学习率的优势在于其稳定性和可预测性。在没有明显过拟合或欠拟合的情况下,它可以提供持续的优化。然而,它的速度较慢,在某些情况下可能无法充分利用训练数据。
学习率衰减(Decay LR)
- 表现趋势: 学习率衰减策略的验证损失快速下降,并在前几个 epoch 内达到相对稳定的较低水平。在最初的几个 epoch 中,损失下降得比固定学习率更快。
- 特点: 该策略结合了高初始学习率的快速收敛和低学习率的精细调优优势。通过逐渐降低学习率,模型可以在早期快速学习到大部分重要的特征,而在后期更加专注于微调和优化。这使得它在综合性能上往往优于固定学习率。
自适应学习率(Adaptive LR)
- 表现趋势: 使用自适应学习率的 Adam 优化器在最初几个 epoch 中迅速降低了验证损失,并且在整个训练过程中保持在一个非常低的水平。
- 特点: Adam 通过自适应调整每个参数的学习率,使其能够在不同梯度尺度下进行优化。这通常使得 Adam 在处理稀疏梯度或高度变化的梯度时非常有效,因此验证损失曲线在初期迅速下降,并能较长时间保持在低位。
右图:验证准确率 vs. 迭代次数 (Validation Accuracy vs. Epoch)
固定学习率(Fixed LR)
- 表现趋势: 固定学习率的验证准确率逐步上升,尽管上升较慢,但较为稳定。到第 10 个 epoch 时,准确率仍在上升,但没有达到特别高的水平。
- 特点: 固定学习率在整个训练过程中提供了稳定但渐进的学习步伐。这种稳定性可以在某些情况下防止模型发生大的波动,但也可能导致在相同的 epoch 内,模型的提升速度较慢。
学习率衰减(Decay LR)
- 表现趋势: 学习率衰减策略在前几个 epoch 内迅速提高了验证准确率,并在随后的 epoch 中逐渐达到并保持在一个相对较高的水平。
- 特点: 高初始学习率帮助模型快速捕捉全局模式,而衰减后的低学习率帮助模型细化学习。该策略通常在较短的时间内提供高性能,是处理中短期训练的有效方法。
自适应学习率(Adaptive LR)
- 表现趋势: 自适应学习率的验证准确率在前几个 epoch 内迅速上升,并在后续 epoch 中迅速达到最高水平。与学习率衰减相比,Adam 优化器在早期和中期表现更优。
- 特点: 自适应学习率的优势在于其高效和智能的参数调整能力。这使得模型能够在短时间内获得非常高的准确率,特别适合处理具有复杂梯度分布的问题。
综合分析
-
训练效率: 从这两幅图中可以看出,自适应学习率(Adam)在前几个 epoch 内的表现最为优越,快速降低了损失并提高了准确率。这表明 Adam 优化器非常适合快速训练和复杂模型的优化。
-
长期性能: 学习率衰减策略在验证损失和准确率上的表现较为平衡,在较短的时间内也能提供良好的性能。它通过逐步减小学习率,平衡了快速收敛和精细调优的需求,是处理中长期训练的有效策略。
-
稳定性: 固定学习率尽管收敛较慢,但表现非常稳定。它适用于稳定性要求较高的任务,尤其是当模型需要在整个训练过程中保持一致的优化步伐时。
总结
- Adam 优化器:在短期内提供了最快的收敛速度和最高的验证准确率,适合快速迭代和处理复杂梯度的问题。
- 学习率衰减:在训练的早期具有快速收敛的优势,同时在中期和后期也能保持稳定的性能提升,是一种非常有效的策略。
- 固定学习率:提供了稳定的优化过程,尽管在训练速度和性能上可能稍逊于前两者,但它的可预测性和简单性使其在某些情况下仍然具有吸引力。
根据这些结论,选择适合具体任务和数据的学习率策略,可以显著提高模型训练的效率和性能。