训练器
概述¶
配置中的 trainer
部分允许您指定参数来配置训练过程,例如训练轮次或学习率。默认情况下,使用 ECD 训练器。
trainer:
early_stop: 5
learning_rate: 0.001
epochs: 100
batch_size: auto
optimizer:
type: adam
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
regularization_type: l2
use_mixed_precision: false
compile: false
checkpoints_per_epoch: 0
eval_steps: null
effective_batch_size: auto
gradient_accumulation_steps: auto
regularization_lambda: 0.0
enable_gradient_checkpointing: false
validation_field: null
validation_metric: null
train_steps: null
steps_per_checkpoint: 0
max_batch_size: 1099511627776
eval_batch_size: null
evaluate_training_set: false
should_shuffle: true
increase_batch_size_on_plateau: 0
increase_batch_size_on_plateau_patience: 5
increase_batch_size_on_plateau_rate: 2.0
increase_batch_size_eval_metric: loss
increase_batch_size_eval_split: training
gradient_clipping:
clipglobalnorm: 0.5
clipnorm: null
clipvalue: null
learning_rate_scaling: linear
bucketing_field: null
skip_all_evaluation: false
enable_profiling: false
profiler:
wait: 1
warmup: 1
active: 3
repeat: 5
skip_first: 0
learning_rate_scheduler:
decay: null
decay_rate: 0.96
decay_steps: 10000
staircase: false
reduce_on_plateau: 0
reduce_on_plateau_patience: 10
reduce_on_plateau_rate: 0.1
warmup_evaluations: 0
warmup_fraction: 0.0
reduce_eval_metric: loss
reduce_eval_split: training
t_0: null
t_mult: 1
eta_min: 0
trainer:
type: finetune
early_stop: 5
learning_rate: 0.001
epochs: 100
optimizer:
type: adam
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
regularization_type: l2
use_mixed_precision: false
compile: false
checkpoints_per_epoch: 0
eval_steps: null
effective_batch_size: auto
gradient_accumulation_steps: auto
regularization_lambda: 0.0
enable_gradient_checkpointing: false
validation_field: null
validation_metric: null
train_steps: null
steps_per_checkpoint: 0
max_batch_size: 1099511627776
evaluate_training_set: false
should_shuffle: true
increase_batch_size_on_plateau: 0
increase_batch_size_on_plateau_patience: 5
increase_batch_size_on_plateau_rate: 2.0
increase_batch_size_eval_metric: loss
increase_batch_size_eval_split: training
gradient_clipping:
clipglobalnorm: 0.5
clipnorm: null
clipvalue: null
learning_rate_scaling: linear
bucketing_field: null
skip_all_evaluation: false
enable_profiling: false
profiler:
wait: 1
warmup: 1
active: 3
repeat: 5
skip_first: 0
learning_rate_scheduler:
decay: null
decay_rate: 0.96
decay_steps: 10000
staircase: false
reduce_on_plateau: 0
reduce_on_plateau_patience: 10
reduce_on_plateau_rate: 0.1
warmup_evaluations: 0
warmup_fraction: 0.0
reduce_eval_metric: loss
reduce_eval_split: training
t_0: null
t_mult: 1
eta_min: 0
batch_size: 1
eval_batch_size: 2
base_learning_rate: 0.0
trainer:
early_stop: 5
learning_rate: 0.03
max_depth: 18
boosting_type: gbdt
bagging_fraction: 0.8
feature_fraction: 0.75
extra_trees: false
lambda_l1: 0.25
lambda_l2: 0.2
drop_rate: 0.1
tree_learner: serial
boosting_rounds_per_checkpoint: 50
num_boost_round: 1000
num_leaves: 82
min_data_in_leaf: 20
pos_bagging_fraction: 1.0
neg_bagging_fraction: 1.0
bagging_freq: 1
bagging_seed: 3
feature_fraction_bynode: 1.0
feature_fraction_seed: 2
extra_seed: 6
linear_lambda: 0.0
max_drop: 50
skip_drop: 0.5
uniform_drop: false
drop_seed: 4
validation_field: null
validation_metric: null
eval_batch_size: 1048576
evaluate_training_set: false
min_sum_hessian_in_leaf: 0.001
max_delta_step: 0.0
min_gain_to_split: 0.03
xgboost_dart_mode: false
top_rate: 0.2
other_rate: 0.1
min_data_per_group: 100
max_cat_threshold: 32
cat_l2: 10.0
cat_smooth: 10.0
max_cat_to_onehot: 4
cegb_tradeoff: 1.0
cegb_penalty_split: 0.0
path_smooth: 0.0
verbose: -1
max_bin: 255
feature_pre_filter: true
skip_all_evaluation: false
enable_profiling: false
profiler:
wait: 1
warmup: 1
active: 3
repeat: 5
skip_first: 0
训练器参数¶
early_stop
(默认值:5
) : 在validation_metric
上没有改善的连续评估轮次数量,达到此数量时触发训练停止。可以设置为 -1,这将完全禁用早停。learning_rate
(默认值:0.001
) : 控制每次更新模型权重时,模型对估计误差的改变程度。如果设置为 'auto',则通过选择产生最小非发散梯度更新的学习率来估计最佳学习率。epochs
(默认值:100
) : 算法预期运行的训练轮次数量。如果设置了train_steps
则此参数会被覆盖。batch_size
(默认值:auto
) : 模型在一个训练步中使用的训练样本数量。如果设置为 'auto',将使用最大化训练吞吐量(样本/秒)的批次大小。对于 CPU 训练,调整后的批次大小上限为 128,因为在没有 GPU 的情况下,大批次大小对吞吐量的益处不太明显。optimizer
(默认值:{"type": "adam"}
) : 优化器类型及其参数。优化器负责在反向传播期间应用从损失计算出的梯度,作为对模型权重的更新。详情请参阅优化器参数。regularization_type
(默认值:l2
) : 正则化类型。选项:l1
,l2
,l1_l2
,null
。use_mixed_precision
(默认值:false
) : 在训练期间启用自动混合精度 (AMP)。选项:true
,false
。compile
(默认值:false
) : 是否在训练前编译模型。选项:true
,false
。checkpoints_per_epoch
(默认值:0
): 每训练轮次的检查点数量。例如,2 -> 每半个训练轮次写入检查点。请注意,同时指定非零的steps_per_checkpoint
和非零的checkpoints_per_epoch
是无效的。eval_steps
(默认值:null
): 用于评估的步数。如果为 None,将使用整个评估集。effective_batch_size
(默认值:auto
): 有效批次大小是用于计算模型权重单个梯度更新的样本总数。它与batch_size
的区别在于考虑了gradient_accumulation_steps
和训练工作进程的数量。实际上,有效批次大小 = batch_size * gradient_accumulation_steps * num_workers
。如果为 'auto',则有效批次大小从batch_size
隐式推导;如果明确设置,则batch_size
或gradient_accumulation_steps
中的一个必须设置为 'auto' 以外的值,然后将按照上述公式进行设置。gradient_accumulation_steps
(默认值:auto
): 在执行权重更新之前累积梯度的步数。regularization_lambda
(默认值:0.0
): 正则化强度。enable_gradient_checkpointing
(默认值:false
): 是否启用梯度检查点(gradient checkpointing),这是一种用计算换取内存的技术。这对于训练内存受限的非常深的模型非常有用。选项:true
,false
。validation_field
(默认值:null
):validation_metric
用于验证相关机制的字段,例如早停、参数变化平台,以及超参数优化用于确定最佳试验的字段。如果未设置(默认),则使用第一个输出特征。如果明确指定,则validation_field
和validation_metric
都不会被覆盖。validation_metric
(默认值:null
): 使用的来自validation_field
的指标。如果未明确指定 validation_field,此参数将被覆盖为第一个输出特征类型的default_validation_metric
,与 validation_field 保持一致。如果指定了 validation_metric,则我们将使用产生此指标的第一个输出特征作为validation_field
。train_steps
(默认值:null
): 算法预期运行的最大训练步数。默认未设置。如果设置,将覆盖epochs
;如果未设置,则使用epochs
来确定训练时长。steps_per_checkpoint
(默认值:0
): 模型检查点的频率。也决定了最大评估频率。如果为 0,则模型在每个训练轮次后检查点。max_batch_size
(默认值:1099511627776
): 自动批次大小调整和平台期增加批次大小将以此值为上限。默认值为 2^40。eval_batch_size
(默认值:null
): 传递给模型进行评估的批次大小。如果为0
或None
,则使用与batch_size
相同的值。如果内存足够,使用比训练批次大小大得多的批次大小来加速评估会很有用。如果为 'auto',将使用内存中能容纳的最大批次大小(2的幂)。evaluate_training_set
(默认值:false
): 在评估期间是否评估整个训练集。默认情况下,训练指标在每个训练步结束时计算,并累积到评估阶段。实际上,在训练期间计算训练集指标比对训练集进行单独评估要快 30%,但会导致训练指标更不稳定,尤其是在早期训练轮次。建议仅在您需要非常精确的训练集指标并愿意为此付出显著性能代价时才将其设置为 True。选项:true
,false
。should_shuffle
(默认值:true
): 如果为 true,是否在训练期间打乱批次。选项:true
,false
。increase_batch_size_on_plateau
(默认值:0
): 在平台期增加批次大小的次数。increase_batch_size_on_plateau_patience
(默认值:5
): 在增加批次大小之前等待的训练轮次数。increase_batch_size_on_plateau_rate
(默认值:2.0
): 批次大小增加的速率。increase_batch_size_eval_metric
(default:loss
): 监听哪个指标来增加批次大小。increase_batch_size_eval_split
(default:training
): 监听哪个数据集划分来增加批次大小。gradient_clipping
: 梯度裁剪的参数值。gradient_clipping.clipglobalnorm
(默认值:0.5
): 允许的最大梯度范数。gradient_clipping.clipnorm
(默认值:null
): 允许的最大梯度范数。gradient_clipping.clipvalue
(默认值:null
): 允许的最大梯度值。learning_rate_scaling
(默认值:linear
): 随着分布式工作进程数量增加而提高学习率的缩放比例。传统上,学习率与工作进程数量线性缩放,以反映有效批次大小增加的比例。对于非常大的批次大小,使用更柔和的平方根缩放有时可以带来更好的模型性能。如果学习率是针对给定数量的工作进程手动调整的,则将此值设置为 constant 可以禁用缩放。选项:constant
,sqrt
,linear
。bucketing_field
(默认值:null
): 用于对数据点进行分桶(bucketing)的特征。skip_all_evaluation
(默认值:false
): 是否完全跳过评估。如果您正在使用已知配置在已知数据集上训练模型,并且对预期结果有信心,您可以跳过所有评估。此外,评估模型,尤其是在大型验证集或测试集上,可能非常耗时。选项:true
,false
。enable_profiling
(默认值:false
): 是否使用 torch.profiler.profile 启用训练过程的性能分析(profiling)。选项:true
,false
。profiler
: 性能分析配置的参数值。profiler.wait
(默认值:1
): 等待性能分析的步数。profiler.warmup
(默认值:1
): 等待结束后进行性能分析热身的步数。profiler.active
(默认值:3
): 主动记录的步数。值大于 10 会显著减慢 tensorboard 加载速度。profiler.repeat
(默认值:5
): 可选的性能分析循环次数。使用 0 对整个训练运行进行性能分析。profiler.skip_first
(默认值:0
): 训练开始时跳过的步数。learning_rate_scheduler
: 学习率调度器的参数值。learning_rate_scheduler.decay
(默认值:null
) : 开启学习率衰减。选项:linear
,exponential
,cosine
,null
。learning_rate_scheduler.decay_rate
(默认值:0.96
): 每训练轮次的衰减(%):降低学习率的因子。learning_rate_scheduler.decay_steps
(默认值:10000
): 在指数学习率衰减中采取的步数。learning_rate_scheduler.staircase
(默认值:false
): 在离散间隔衰减学习率。选项:true
,false
。learning_rate_scheduler.reduce_on_plateau
(默认值:0
) : 当算法达到平台期(即训练集上的性能没有改善)时,降低学习率的次数。learning_rate_scheduler.reduce_on_plateau_patience
(默认值:10
): 当reduce_on_plateau > 0
时,在学习率降低之前需要经过多少评估步数。learning_rate_scheduler.reduce_on_plateau_rate
(默认值:0.1
): 当reduce_on_plateau > 0
时,我们降低学习率的速率。learning_rate_scheduler.warmup_evaluations
(默认值:0
): 用于学习率热身的评估步数。learning_rate_scheduler.warmup_fraction
(默认值:0.0
): 用于学习率热身的总训练步数比例。learning_rate_scheduler.reduce_eval_metric
(default:loss
): 当reduce_on_plateau > 0
时,用于触发降低学习率的指标平台期。learning_rate_scheduler.reduce_eval_split
(default:training
): 当reduce_on_plateau > 0
时,监听哪个数据集划分来降低学习率。learning_rate_scheduler.t_0
(默认值:null
): 余弦退火衰减首次重启前的步数。如果未指定,将设置为steps_per_checkpoint
。learning_rate_scheduler.t_mult
(默认值:1
): 余弦退火衰减每次重启后的周期乘数。默认为 1,即每t_0
步重启一次。如果设置为更大的值,重启之间的周期将按该乘数增加。例如,如果 t_mult 为 2,则周期将为:t_0, 2*t_0, 2^2*t_0, 2^3*t_0 等。learning_rate_scheduler.eta_min
(默认值:0
): 余弦退火衰减允许的最小学习率。默认值: 0。
type
(默认值:finetune
): 选项:finetune
。early_stop
(默认值:5
) : 在validation_metric
上没有改善的连续评估轮次数量,达到此数量时触发训练停止。可以设置为 -1,这将完全禁用早停。learning_rate
(默认值:0.001
) : 控制每次更新模型权重时,模型对估计误差的改变程度。如果设置为 'auto',则通过选择产生最小非发散梯度更新的学习率来估计最佳学习率。epochs
(默认值:100
) : 算法预期运行的训练轮次数量。如果设置了train_steps
则此参数会被覆盖。optimizer
(默认值:{"type": "adam"}
) : 优化器类型及其参数。优化器负责在反向传播期间应用从损失计算出的梯度,作为对模型权重的更新。详情请参阅优化器参数。regularization_type
(默认值:l2
) : 正则化类型。选项:l1
,l2
,l1_l2
,null
。use_mixed_precision
(默认值:false
) : 在训练期间启用自动混合精度 (AMP)。选项:true
,false
。compile
(默认值:false
) : 是否在训练前编译模型。选项:true
,false
。checkpoints_per_epoch
(默认值:0
): 每训练轮次的检查点数量。例如,2 -> 每半个训练轮次写入检查点。请注意,同时指定非零的steps_per_checkpoint
和非零的checkpoints_per_epoch
是无效的。eval_steps
(默认值:null
): 用于评估的步数。如果为 None,将使用整个评估集。effective_batch_size
(默认值:auto
): 有效批次大小是用于计算模型权重单个梯度更新的样本总数。它与batch_size
的区别在于考虑了gradient_accumulation_steps
和训练工作进程的数量。实际上,有效批次大小 = batch_size * gradient_accumulation_steps * num_workers
。如果为 'auto',则有效批次大小从batch_size
隐式推导;如果明确设置,则batch_size
或gradient_accumulation_steps
中的一个必须设置为 'auto' 以外的值,然后将按照上述公式进行设置。gradient_accumulation_steps
(默认值:auto
): 在执行权重更新之前累积梯度的步数。regularization_lambda
(默认值:0.0
): 正则化强度。enable_gradient_checkpointing
(默认值:false
): 是否启用梯度检查点(gradient checkpointing),这是一种用计算换取内存的技术。这对于训练内存受限的非常深的模型非常有用。选项:true
,false
。validation_field
(默认值:null
):validation_metric
用于验证相关机制的字段,例如早停、参数变化平台,以及超参数优化用于确定最佳试验的字段。如果未设置(默认),则使用第一个输出特征。如果明确指定,则validation_field
和validation_metric
都不会被覆盖。validation_metric
(默认值:null
): 使用的来自validation_field
的指标。如果未明确指定 validation_field,此参数将被覆盖为第一个输出特征类型的default_validation_metric
,与 validation_field 保持一致。如果指定了 validation_metric,则我们将使用产生此指标的第一个输出特征作为validation_field
。train_steps
(默认值:null
): 算法预期运行的最大训练步数。默认未设置。如果设置,将覆盖epochs
;如果未设置,则使用epochs
来确定训练时长。steps_per_checkpoint
(默认值:0
): 模型检查点的频率。也决定了最大评估频率。如果为 0,则模型在每个训练轮次后检查点。max_batch_size
(默认值:1099511627776
): 自动批次大小调整和平台期增加批次大小将以此值为上限。默认值为 2^40。evaluate_training_set
(默认值:false
): 在评估期间是否评估整个训练集。默认情况下,训练指标在每个训练步结束时计算,并累积到评估阶段。实际上,在训练期间计算训练集指标比对训练集进行单独评估要快 30%,但会导致训练指标更不稳定,尤其是在早期训练轮次。建议仅在您需要非常精确的训练集指标并愿意为此付出显著性能代价时才将其设置为 True。选项:true
,false
。should_shuffle
(默认值:true
): 如果为 true,是否在训练期间打乱批次。选项:true
,false
。increase_batch_size_on_plateau
(默认值:0
): 在平台期增加批次大小的次数。increase_batch_size_on_plateau_patience
(默认值:5
): 在增加批次大小之前等待的训练轮次数。increase_batch_size_on_plateau_rate
(默认值:2.0
): 批次大小增加的速率。increase_batch_size_eval_metric
(default:loss
): 监听哪个指标来增加批次大小。increase_batch_size_eval_split
(default:training
): 监听哪个数据集划分来增加批次大小。gradient_clipping
: 梯度裁剪的参数值。gradient_clipping.clipglobalnorm
(默认值:0.5
): 允许的最大梯度范数。gradient_clipping.clipnorm
(默认值:null
): 允许的最大梯度范数。gradient_clipping.clipvalue
(默认值:null
): 允许的最大梯度值。learning_rate_scaling
(默认值:linear
): 随着分布式工作进程数量增加而提高学习率的缩放比例。传统上,学习率与工作进程数量线性缩放,以反映有效批次大小增加的比例。对于非常大的批次大小,使用更柔和的平方根缩放有时可以带来更好的模型性能。如果学习率是针对给定数量的工作进程手动调整的,则将此值设置为 constant 可以禁用缩放。选项:constant
,sqrt
,linear
。bucketing_field
(默认值:null
): 用于对数据点进行分桶(bucketing)的特征。skip_all_evaluation
(默认值:false
): 是否完全跳过评估。如果您正在使用已知配置在已知数据集上训练模型,并且对预期结果有信心,您可以跳过所有评估。此外,评估模型,尤其是在大型验证集或测试集上,可能非常耗时。选项:true
,false
。enable_profiling
(默认值:false
): 是否使用 torch.profiler.profile 启用训练过程的性能分析(profiling)。选项:true
,false
。profiler
: 性能分析配置的参数值。profiler.wait
(默认值:1
): 等待性能分析的步数。profiler.warmup
(默认值:1
): 等待结束后进行性能分析热身的步数。profiler.active
(默认值:3
): 主动记录的步数。值大于 10 会显著减慢 tensorboard 加载速度。profiler.repeat
(默认值:5
): 可选的性能分析循环次数。使用 0 对整个训练运行进行性能分析。profiler.skip_first
(默认值:0
): 训练开始时跳过的步数。learning_rate_scheduler
: 学习率调度器的参数值。learning_rate_scheduler.decay
(默认值:null
) : 开启学习率衰减。选项:linear
,exponential
,cosine
,null
。learning_rate_scheduler.decay_rate
(默认值:0.96
): 每训练轮次的衰减(%):降低学习率的因子。learning_rate_scheduler.decay_steps
(默认值:10000
): 在指数学习率衰减中采取的步数。learning_rate_scheduler.staircase
(默认值:false
): 在离散间隔衰减学习率。选项:true
,false
。learning_rate_scheduler.reduce_on_plateau
(默认值:0
) : 当算法达到平台期(即训练集上的性能没有改善)时,降低学习率的次数。learning_rate_scheduler.reduce_on_plateau_patience
(默认值:10
): 当reduce_on_plateau > 0
时,在学习率降低之前需要经过多少评估步数。learning_rate_scheduler.reduce_on_plateau_rate
(默认值:0.1
): 当reduce_on_plateau > 0
时,我们降低学习率的速率。learning_rate_scheduler.warmup_evaluations
(默认值:0
): 用于学习率热身的评估步数。learning_rate_scheduler.warmup_fraction
(默认值:0.0
): 用于学习率热身的总训练步数比例。learning_rate_scheduler.reduce_eval_metric
(default:loss
): 当reduce_on_plateau > 0
时,用于触发降低学习率的指标平台期。learning_rate_scheduler.reduce_eval_split
(default:training
): 当reduce_on_plateau > 0
时,监听哪个数据集划分来降低学习率。learning_rate_scheduler.t_0
(默认值:null
): 余弦退火衰减首次重启前的步数。如果未指定,将设置为steps_per_checkpoint
。learning_rate_scheduler.t_mult
(默认值:1
): 余弦退火衰减每次重启后的周期乘数。默认为 1,即每t_0
步重启一次。如果设置为更大的值,重启之间的周期将按该乘数增加。例如,如果 t_mult 为 2,则周期将为:t_0, 2*t_0, 2^2*t_0, 2^3*t_0 等。learning_rate_scheduler.eta_min
(默认值:0
): 余弦退火衰减允许的最小学习率。默认值: 0。batch_size
(默认值:1
): 模型在一个训练步中使用的训练样本数量。如果为auto
,将使用最大化训练吞吐量(样本/秒)的批次大小。eval_batch_size
(默认值:2
): 传递给模型进行评估的批次大小。如果为0
或None
,则使用与batch_size
相同的值。如果内存足够,使用比训练批次大小大得多的批次大小来加速评估会很有用。如果为auto
,将使用内存中能容纳的最大批次大小(2的幂)。base_learning_rate
(默认值:0.0
): LLM 训练器中用于训练的基础学习率。
有关可用参数的更多详情,请参阅 LightGBM 文档。
early_stop
(默认值:5
) : 在validation_metric
上没有改善的连续评估轮次数量,达到此数量时触发训练停止。可以设置为 -1,这将完全禁用早停。learning_rate
(默认值:0.03
) : 控制每次更新模型权重时,模型对估计误差的改变程度。max_depth
(默认值:18
) : GBM 训练器中树的最大深度。负值表示没有限制。boosting_type
(默认值:gbdt
) : 与 GBM 训练器一起使用的提升算法类型。选项:gbdt
,dart
。bagging_fraction
(默认值:0.8
) : 在 GBM 训练器中用于 bagging 的数据比例。feature_fraction
(默认值:0.75
) : 在 GBM 训练器中使用的特征比例。extra_trees
(默认值:false
) : 是否在 GBM 训练器中使用极致随机树(extremely randomized trees)。选项:true
,false
。lambda_l1
(默认值:0.25
) : GBM 训练器的 L1 正则化因子。lambda_l2
(默认值:0.2
) : GBM 训练器的 L2 正则化因子。drop_rate
(默认值:0.1
): GBM 训练器的 Dropout 比率。仅与 boosting_type 'dart' 一起使用。tree_learner
(默认值:serial
): 与 GBM 训练器一起使用的树学习器类型。选项:serial
,feature
,data
,voting
。boosting_rounds_per_checkpoint
(默认值:50
): 每检查点 / 评估轮次的提升轮次数量。num_boost_round
(默认值:1000
): GBM 训练器执行的提升轮次数量。num_leaves
(默认值:82
): 在 GBM 训练器中树使用的叶子数量。min_data_in_leaf
(默认值:20
): 在 GBM 训练器中叶子的最小数据点数量。pos_bagging_fraction
(默认值:1.0
): 在 GBM 训练器中用于 bagging 的正样本数据比例。neg_bagging_fraction
(默认值:1.0
): 在 GBM 训练器中用于 bagging 的负样本数据比例。bagging_freq
(默认值:1
): GBM 训练器的 bagging 频率。bagging_seed
(默认值:3
): GBM 训练器 bagging 的随机种子。feature_fraction_bynode
(默认值:1.0
): 在 GBM 训练器中每个树节点使用的特征比例。feature_fraction_seed
(默认值:2
): GBM 训练器特征比例的随机种子。extra_seed
(默认值:6
): GBM 训练器极致随机树的随机种子。linear_lambda
(默认值:0.0
): GBM 训练器中的线性树正则化。max_drop
(默认值:50
): 一次提升迭代中丢弃的最大树数量。仅与 boosting_type 'dart' 一起使用。负值表示没有限制。skip_drop
(default:0.5
): 一次提升迭代中跳过 dropout 的概率。仅与 boosting_type 'dart' 一起使用。uniform_drop
(默认值:false
): 是否在 GBM 训练器中使用均匀 dropout。仅与 boosting_type 'dart' 一起使用。选项:true
,false
。drop_seed
(默认值:4
): GBM 训练器中选择丢弃模型的随机种子。仅与 boosting_type 'dart' 一起使用。validation_field
(默认值:null
): 第一个输出特征,默认情况下与第一个输出特征的字段相同。validation_metric
(默认值:null
): 在validation_field
上使用的指标,默认设置为输出特征类型的default_validation_metric
。eval_batch_size
(默认值:1048576
): 传递给模型进行评估的批次大小。evaluate_training_set
(默认值:false
): 在评估期间是否评估整个训练集。默认情况下,训练指标在每个训练步结束时计算,并累积到评估阶段。实际上,在训练期间计算训练集指标比对训练集进行单独评估要快 30%,但会导致训练指标更不稳定,尤其是在早期训练轮次。建议仅在您需要非常精确的训练集指标并愿意为此付出显著性能代价时才将其设置为 True。选项:true
,false
。min_sum_hessian_in_leaf
(默认值:0.001
): 在 GBM 训练器中叶子的最小海塞(hessians)之和。max_delta_step
(默认值:0.0
): 用于限制 GBM 训练器中树叶子最大输出值。负值表示没有约束。min_gain_to_split
(默认值:0.03
): 在 GBM 训练器中分割叶子的最小增益。xgboost_dart_mode
(默认值:false
): 是否在 GBM 训练器中使用 xgboost dart 模式。仅与 boosting_type 'dart' 一起使用。选项:true
,false
。top_rate
(默认值:0.2
): 在 GBM 训练器中保留大梯度数据的比例。仅与 boosting_type 'goss' 一起使用。other_rate
(default:0.1
): 在 GBM 训练器中保留小梯度数据的比例。仅与 boosting_type 'goss' 一起使用。min_data_per_group
(默认值:100
): GBM 训练器中每个类别分组的最小数据点数量。max_cat_threshold
(默认值:32
): GBM 训练器中分类特征考虑的分割点数量。cat_l2
(默认值:10.0
): GBM 训练器中分类分割的 L2 正则化因子。cat_smooth
(默认值:10.0
): GBM 训练器中分类分割的平滑因子。max_cat_to_onehot
(默认值:4
): 在 GBM 训练器中进行独热编码前所需的分类最大基数。cegb_tradeoff
(默认值:1.0
): GBM 训练器中所有惩罚项的成本效益梯度提升乘数。cegb_penalty_split
(默认值:0.0
): GBM 训练器中分割节点的成本效益梯度提升惩罚项。path_smooth
(默认值:0.0
): 应用于 GBM 训练器中树节点的平滑因子。verbose
(默认值:-1
): GBM 训练器的详细程度级别。选项:-1
,0
,1
,2
。max_bin
(默认值:255
): 与 GBM 训练器一起用于特征离散化的最大 bin 数量。feature_pre_filter
(默认值:true
): 在 GBM 训练器中,是否忽略基于 min_data_in_leaf 不可分割的特征。选项:true
,false
。skip_all_evaluation
(默认值:false
): 是否完全跳过评估。如果您正在使用已知配置在已知数据集上训练模型,并且对预期结果有信心,您可以跳过所有评估。此外,评估模型,尤其是在大型验证集或测试集上,可能非常耗时。选项:true
,false
。enable_profiling
(默认值:false
): 是否使用 torch.profiler.profile 启用训练过程的性能分析(profiling)。选项:true
,false
。profiler
: 性能分析配置的参数值。profiler.wait
(默认值:1
): 等待性能分析的步数。profiler.warmup
(默认值:1
): 等待结束后进行性能分析热身的步数。profiler.active
(默认值:3
): 主动记录的步数。值大于 10 会显著减慢 tensorboard 加载速度。profiler.repeat
(默认值:5
): 可选的性能分析循环次数。使用 0 对整个训练运行进行性能分析。profiler.skip_first
(默认值:0
): 训练开始时跳过的步数。
优化器参数¶
可用的优化器封装了 PyTorch 中提供的优化器。有关可用于配置不同优化器的参数的详情,请参阅 PyTorch 文档。
优化器使用的 learning_rate
参数来自 trainer
部分。其他特定于优化器的参数及其 Ludwig 默认设置如下所示:
sgd¶
optimizer:
type: sgd
momentum: 0.0
weight_decay: 0.0
dampening: 0.0
nesterov: false
momentum
(默认值:0.0
): 动量因子。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。dampening
(默认值:0.0
): 动量阻尼。nesterov
(默认值:false
): 启用 Nesterov 动量。选项:true
,false
。
sgd_8bit¶
optimizer:
type: sgd_8bit
momentum: 0.0
weight_decay: 0.0
dampening: 0.0
nesterov: false
block_wise: false
percentile_clipping: 100
momentum
(默认值:0.0
): 动量因子。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。dampening
(默认值:0.0
): 动量阻尼。nesterov
(默认值:false
): 启用 Nesterov 动量。选项:true
,false
。block_wise
(默认值:false
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
lbfgs¶
optimizer:
type: lbfgs
max_iter: 20
max_eval: null
tolerance_grad: 1.0e-07
tolerance_change: 1.0e-09
history_size: 100
line_search_fn: null
max_iter
(默认值:20
): 每个优化步的最大迭代次数。max_eval
(默认值:null
): 每个优化步的最大函数评估次数。默认值:max_iter
* 1.25。tolerance_grad
(默认值:1e-07
): 一阶最优性的终止容差。tolerance_change
(默认值:1e-09
): 函数值/参数变化的终止容差。history_size
(默认值:100
): 更新历史大小。line_search_fn
(默认值:null
): 要使用的线搜索函数。选项:strong_wolfe
,null
。
adam¶
optimizer:
type: adam
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。
adam_8bit¶
optimizer:
type: adam_8bit
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
block_wise: true
percentile_clipping: 100
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
paged_adam¶
optimizer:
type: paged_adam
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
block_wise: true
percentile_clipping: 100
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
paged_adam_8bit¶
optimizer:
type: paged_adam_8bit
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
block_wise: true
percentile_clipping: 100
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
adamw¶
optimizer:
type: adamw
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。
adamw_8bit¶
optimizer:
type: adamw_8bit
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
block_wise: true
percentile_clipping: 100
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
paged_adamw¶
optimizer:
type: paged_adamw
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
block_wise: true
percentile_clipping: 100
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
paged_adamw_8bit¶
optimizer:
type: paged_adamw_8bit
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
block_wise: true
percentile_clipping: 100
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
adadelta¶
optimizer:
type: adadelta
rho: 0.9
eps: 1.0e-06
weight_decay: 0.0
rho
(默认值:0.9
): 用于计算梯度平方滑动平均值的系数。eps
(默认值:1e-06
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。
adagrad¶
optimizer:
type: adagrad
initial_accumulator_value: 0
lr_decay: 0
weight_decay: 0
eps: 1.0e-10
initial_accumulator_value
(默认值:0
): 累加器的初始值。lr_decay
(默认值:0
): 学习率衰减。weight_decay
(默认值:0
): 权重衰减 ($L2$ 惩罚)。eps
(默认值:1e-10
): 添加到分母中的项,以提高数值稳定性。
adagrad_8bit¶
optimizer:
type: adagrad_8bit
initial_accumulator_value: 0
lr_decay: 0
weight_decay: 0
eps: 1.0e-10
block_wise: true
percentile_clipping: 100
initial_accumulator_value
(默认值:0
): 累加器的初始值。lr_decay
(默认值:0
): 学习率衰减。weight_decay
(默认值:0
): 权重衰减 ($L2$ 惩罚)。eps
(默认值:1e-10
): 添加到分母中的项,以提高数值稳定性。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
adamax¶
optimizer:
type: adamax
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。
nadam¶
optimizer:
type: nadam
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
momentum_decay: 0.004
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。momentum_decay
(默认值:0.004
): 动量衰减。
rmsprop¶
optimizer:
type: rmsprop
momentum: 0.0
alpha: 0.99
eps: 1.0e-08
centered: false
weight_decay: 0.0
momentum
(默认值:0.0
): 动量因子。alpha
(默认值:0.99
): 平滑常数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。centered
(默认值:false
): 如果为 True,计算中心化的 RMSProp,并且梯度通过其方差的估计值进行归一化。选项:true
,false
。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。
rmsprop_8bit¶
optimizer:
type: rmsprop_8bit
momentum: 0.0
alpha: 0.99
eps: 1.0e-08
centered: false
weight_decay: 0.0
block_wise: true
percentile_clipping: 100
momentum
(默认值:0.0
): 动量因子。alpha
(默认值:0.99
): 平滑常数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。centered
(默认值:false
): 如果为 True,计算中心化的 RMSProp,并且梯度通过其方差的估计值进行归一化。选项:true
,false
。weight_decay
(默认值:0.0
): 权重衰减 ($L2$ 惩罚)。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。
lamb¶
optimizer:
type: lamb
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
bias_correction: true
adam_w_mode: true
percentile_clipping: 100
block_wise: false
max_unorm: 1.0
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。bias_correction
(默认值:true
): 偏置校正。选项:true
,false
。adam_w_mode
(默认值:true
): 是否使用论文 'Decoupled Weight Decay Regularization' 中提出的该算法的 AdamW 模式。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。block_wise
(默认值:false
): 是否使用分块更新。选项:true
,false
。max_unorm
(默认值:1.0
): 最大参数范数。
lamb_8bit¶
optimizer:
type: lamb_8bit
betas:
- 0.9
- 0.999
eps: 1.0e-08
weight_decay: 0.0
amsgrad: false
bias_correction: true
adam_w_mode: true
percentile_clipping: 100
block_wise: false
max_unorm: 1.0
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。eps
(默认值:1e-08
): 添加到分母中的项,以提高数值稳定性。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。amsgrad
(默认值:false
): 是否使用论文 'On the Convergence of Adam and Beyond' 中提出的该算法的 AMSGrad 变体。选项:true
,false
。bias_correction
(默认值:true
): 偏置校正。选项:true
,false
。adam_w_mode
(默认值:true
): 是否使用论文 'Decoupled Weight Decay Regularization' 中提出的该算法的 AdamW 模式。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。block_wise
(默认值:false
): 是否使用分块更新。选项:true
,false
。max_unorm
(默认值:1.0
): 最大参数范数。
lars¶
optimizer:
type: lars
momentum: 0.9
dampening: 0.0
weight_decay: 0.0
nesterov: false
percentile_clipping: 100
max_unorm: 1.0
momentum
(默认值:0.9
): 动量因子。dampening
(默认值:0.0
): 动量阻尼。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。nesterov
(默认值:false
): 启用 Nesterov 动量。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。max_unorm
(默认值:1.0
): 最大参数范数。
lars_8bit¶
optimizer:
type: lars_8bit
momentum: 0.9
dampening: 0.0
weight_decay: 0.0
nesterov: false
percentile_clipping: 100
max_unorm: 1.0
momentum
(默认值:0.9
): 动量因子。dampening
(默认值:0.0
): 动量阻尼。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。nesterov
(默认值:false
): 启用 Nesterov 动量。选项:true
,false
。percentile_clipping
(默认值:100
): 百分位数裁剪。max_unorm
(默认值:1.0
): 最大参数范数。
lion¶
optimizer:
type: lion
betas:
- 0.9
- 0.999
weight_decay: 0.0
percentile_clipping: 100
block_wise: true
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。percentile_clipping
(默认值:100
): 百分位数裁剪。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。
lion_8bit¶
optimizer:
type: lion_8bit
betas:
- 0.9
- 0.999
weight_decay: 0.0
percentile_clipping: 100
block_wise: true
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。percentile_clipping
(默认值:100
): 百分位数裁剪。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。
paged_lion¶
optimizer:
type: paged_lion
betas:
- 0.9
- 0.999
weight_decay: 0.0
percentile_clipping: 100
block_wise: true
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。percentile_clipping
(默认值:100
): 百分位数裁剪。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。
paged_lion_8bit¶
optimizer:
type: paged_lion_8bit
betas:
- 0.9
- 0.999
weight_decay: 0.0
percentile_clipping: 100
block_wise: true
betas
(默认值:[0.9, 0.999]
): 用于计算梯度及其平方的滑动平均值的系数。weight_decay
(默认值:0.0
): 权重衰减 (L2 惩罚)。percentile_clipping
(默认值:100
): 百分位数裁剪。block_wise
(默认值:true
): 是否使用分块更新。选项:true
,false
。
注意
梯度裁剪也可以通过优化器进行配置,使用以下参数:
clip_global_norm: 0.5
clipnorm: null
clip_value: null
LightGBM 训练器没有可用的优化器参数。
训练时长¶
训练过程的时长由以下参数配置:
epochs
(默认值: 100): 一个训练轮次是遍历整个数据集一次。默认情况下,epochs
为 100,这意味着训练过程最多运行 100 个训练轮次后终止。train_steps
(默认值:None
): 最大训练步数,每个步使用一个 mini-batch。默认情况下未设置此参数,此时将使用epochs
来确定训练时长。
num_boost_round
(默认值: 100): 提升迭代次数。默认情况下,num_boost_round
为 100,这意味着训练过程最多运行 100 个提升迭代后终止。
提示
一般来说,最好设置较长的训练“跑道”,依赖早停标准(early_stop
)在长时间没有任何改善时停止训练。
早停¶
机器学习模型训练时间过长时,通常容易过拟合。设置一些早停标准通常是个好策略,因为模型在达到学习上限后继续训练没有用处,这也有助于保留模型对新数据的泛化能力。
早停在 Ludwig 中如何工作¶
默认情况下,Ludwig 将 trainer.early_stop
设置为 5
,这意味着如果在 验证 子集上连续 5
轮评估没有改善,则训练将终止。
Ludwig 每检查点运行一次评估,默认情况下是每训练轮次一次。检查点频率可以使用 checkpoints_per_epoch
(默认值: 1
) 或 steps_per_checkpoint
(默认值: 0
,禁用) 进行配置。更多详情请参阅此部分。
修改早停指标¶
决定早停的指标是 trainer.validation_field
和 trainer.validation_metric
。默认情况下,早停使用验证子集上的组合损失。
trainer:
validation_field: combined
validation_metric: loss
然而,这可以配置为使用其他指标。例如,如果我们有一个名为 recommended
的输出特征,那么我们可以像这样配置基于该输出特征准确率的早停:
trainer:
validation_field: recommended
validation_metric: accuracy
禁用早停¶
trainer.early_stop
可以设置为 -1
,这将完全禁用早停。
检查点-评估频率¶
每次模型检查点时都会运行评估。
默认情况下,检查点-评估会每训练轮次发生一次。
检查点-评估的频率可以使用以下参数配置:
steps_per_checkpoint
(默认值: 0): 每n
个训练步checkpoints_per_epoch
(默认值: 0): 每训练轮次n
次
注意
同时指定非零的 steps_per_checkpoint
和非零的 checkpoints_per_epoch
是无效的。
提示
每训练轮次运行一次评估适合于能载入内存并快速训练的小数据集。然而,这对于非结构化数据集来说可能不太合适,非结构化数据集往往大得多,且由于模型较大而训练更慢。
评估频率过高可能会造成浪费,而评估频率过低则可能提供的信息不足。在大规模训练中,通常会将评估配置为在低于训练轮次的时间尺度上运行,或者每隔几千步运行一次。
我们建议配置评估,以便至少每小时获得几次新的评估结果。一般来说,模型无需在整个数据集上训练,也无需在整个测试集上评估,即可产生有用的监控指标和信号来指示模型性能。
提高 GPU 上的吞吐量¶
增加批次大小¶
trainer:
batch_size: auto
在 GPU 上训练的用户通常可以通过增加 batch_size
来提高训练吞吐量,以便在每个训练步中计算更多样本。将 batch_size
设置为 auto
将使用内存中能容纳的最大批次大小。
使用混合精度¶
trainer:
use_mixed_precision: true
通过在合适的地方使用 float16 参数来加速训练。在 GPU 上进行混合精度训练可以显著加速训练,但对模型收敛存在一定风险。实际上,在微调预训练模型(如 HuggingFace Transformer)时效果特别好。更多详情请参阅此处的博客。