前言
使用google-bert/bert-base-chinese
模型进行中文文本分类任务,使用THUCNews中文数据集进行训练,训练完成后,可以导出模型,进行预测。
项目详细介绍和数据下载
数据集下载地址
Github完整代码
现记录训练过程中的一些感悟
1、训练时遇到的两个核心参数warmup_steps
和weight_decay
代码片段如下
需要弄明白一些基础概念
epoch:指模型在训练过程中遍历完整个训练数据集一次。
step:指模型在训练过程中处理完一个batch的数据并完成一次梯度更新。
batch_size: 指在一次step中模型用于训练的数据量。
假设 训练数据集有 n 个样本,每个epoch的step计算方式
s
t
e
p
=
n
b
a
t
c
h
_
s
i
z
e
step = \frac{n}{batch\_size}
step=batch_sizen
训练过程的总步数为
s
t
e
p
s
=
s
t
e
p
×
n
u
m
_
t
r
a
i
n
_
e
p
o
c
h
s
steps = step \times num\_train\_epochs
steps=step×num_train_epochs
warmup_steps
:主要目的是为了平稳地提升学习率,让模型在训练初期不会因为太高的学习率而跳过或远离全局最优解。
常见做法是将其设置为总训练步数的5%到10%的值。
此训练过程中warmup steps下限的计算方式如下,训练数据18w
w
a
r
m
u
p
_
s
t
e
p
s
=
180000
32
×
5
×
5
%
=
1406
warmup\_steps = \frac{180000}{32} \times 5 \times 5\% = 1406
warmup_steps=32180000×5×5%=1406
减少 warmup_steps 可能会导致模型更快地达到较高的学习率,从而错过或远离全局最优解。
weight_decay
:是用于正则化模型权重的,实际上是 L2 正则化的一种形式
weight_decay的作用是在损失函数中添加一个惩罚项,该惩罚项与权重的平方成正比,这有助于抑制权重的大小,从而防止模型过拟合
weight_decay设置得过低,可能不足以防止过拟合;设置得过高,则可能导致模型欠拟合,即模型过于简单,无法很好地捕捉数据中的模式
2、通过tensorboard --logdir=./logs
可视化训练过程
训练过程截图如下:
2.1、训练阶段
可以明显的看到训练时的学习率先逐渐上升之后在下降,这是我们想要的趋势。训练的损失值逐步下降,这也是我们希望的。但是当我们在分析评估数据数据集的损失时,我们会发现此时模型应该是过拟合了。
2.2、推理阶段
随着训练过程的增加,模型在评估数据集上的损失也是逐步减少,当在step=11250时,评估数据集上的损失开始逐渐增加,而训练数据的损失还在减少,那么可以肯定模型已经过拟合了。
模型已经充分的挖掘训练数据集中的语义特征,过分的学习到数据中的一些细枝末节。从而在新数据集上的表现越来越差。这种在训练数据集上表现优秀,在评估或测试数据集上表现较差现象,即模型出现了过拟合。
3、模型混淆矩阵的分析
混淆矩阵结果如下
指标如下
Accuracy | 0.9434 |
---|---|
Precision | 0.9438 |
Recall | 0.9434 |
具体多分类任务指标和混淆矩阵分析参考这里非常详细。
4、如何解决模型过拟合的现象
【待更新】疯狂参数调节优化中…