SWIFT 训练过程日志
flyfish
{"loss": 1.96979866,"token_acc": 0.53333333,"grad_norm": 4.62160921,"learning_rate": 9.997e-05,"memory(GiB)": 45.21,"train_speed(iter/s)": 0.177779,"epoch": 0.04,"global_step/max_steps": "710/59760","percentage": "1.19%","elapsed_time": "1h 6m 30s","remaining_time": "3d 20h 10m 53s",
}
1. 损失相关指标
loss
: 其值为1.96979866
。损失函数用于衡量模型预测结果与真实标签之间的差异程度。在训练过程中,模型的目标通常是最小化这个损失值。损失值越小,说明模型的预测结果与真实标签越接近,模型的性能也就越好。这个值是当前训练步骤中损失函数的计算结果。
2. 准确率指标
token_acc
: 取值为0.53333333
,即 53.33%。这是标记准确率(token accuracy),用于衡量模型在每个标记(token)上的预测准确率。在自然语言处理等领域,标记通常是指单词、子词等基本语言单元。该指标表示模型正确预测标记的比例。
3. 梯度相关指标
grad_norm
: 为4.62160921
。梯度范数(gradient norm)是衡量梯度大小的一个指标。在神经网络训练中,梯度用于更新模型的参数。梯度范数过大可能导致训练不稳定,例如出现梯度爆炸的问题;梯度范数过小则可能导致训练缓慢。
4. 学习率指标
learning_rate
: 为9.997e-05
。学习率是深度学习优化算法中的一个重要超参数,它控制着模型参数更新的步长。在训练过程中,学习率会影响模型的收敛速度和最终性能。较小的学习率可能使训练更加稳定,但收敛速度较慢;较大的学习率可能会使模型快速收敛,但容易跳过最优解。
5. 内存使用指标
memory(GiB)
: 显示为45.21
。这表示当前训练过程中所使用的内存大小,单位是吉字节(GiB)。监控内存使用情况有助于确保训练过程不会因为内存不足而中断,同时也可以帮助优化资源分配。
6. 训练速度指标
train_speed(iter/s)
: 为0.177779
。这是训练速度的指标,单位是迭代次数每秒(iterations per second),表示每秒可以完成的训练迭代次数。该指标反映了训练的效率,数值越高说明训练速度越快。
7. 训练进度指标
epoch
: 为0.04
。一个 epoch 表示将整个训练数据集完整地过一遍。这里的0.04
表示当前训练还处于第 1 个 epoch 的早期阶段,大约完成了 4%。global_step/max_steps
: 显示为710/59760
。全局步数(global step)是指从训练开始到当前时刻总共进行的训练迭代次数,而最大步数(max steps)是预先设定的训练总迭代次数。这里表示已经完成了 710 次迭代,总共需要进行 59760 次迭代。percentage
: 为1.19%
。这是训练的完成百分比,根据全局步数和最大步数计算得出,表示当前训练已经完成了 1.19%。
8. 时间指标
elapsed_time
: 为1h 6m 30s
。这表示从训练开始到当前时刻所经过的时间,即已经花费了 1 小时 6 分钟 30 秒。remaining_time
: 为3d 20h 10m 53s
。这是根据当前的训练进度和训练速度估算出的完成剩余训练所需的时间,即还需要 3 天 20 小时 10 分钟 53 秒才能完成整个训练过程。
梯度范数是对梯度向量求范数的结果,而范数有多种不同的定义
常见的梯度范数类型
1. L2 范数
L2 范数也称为欧几里得范数,对于一个梯度向量 g = [ g 1 , g 2 , ⋯ , g n ] \mathbf{g} = [g_1, g_2, \cdots, g_n] g=[g1,g2,⋯,gn],其计算公式为:
∣ ∣ g ∣ ∣ 2 = ∑ i = 1 n g i 2 ||\mathbf{g}||_2 = \sqrt{\sum_{i=1}^{n}g_i^2} ∣∣g∣∣2=i=1∑ngi2
L2 范数在深度学习中应用非常广泛,因为它具有良好的数学性质,能较好地衡量梯度向量的整体大小。例如在许多深度学习框架(如 PyTorch、TensorFlow)中,默认使用的梯度裁剪方法往往基于 L2 范数。
2. L1 范数
L1 范数是梯度向量各个元素绝对值之和,计算公式为:
∣ ∣ g ∣ ∣ 1 = ∑ i = 1 n ∣ g i ∣ ||\mathbf{g}||_1 = \sum_{i=1}^{n}|g_i| ∣∣g∣∣1=i=1∑n∣gi∣
L1 范数更注重梯度向量中各个元素的绝对值大小,相比于 L2 范数,它会使梯度向量中的一些元素更容易变为 0,因此在一些需要特征选择的场景中可能会用到。
3. 无穷范数( L ∞ L_{\infty} L∞ 范数)
无穷范数定义为梯度向量中元素绝对值的最大值,计算公式为:
∣ ∣ g ∣ ∣ ∞ = max i ∣ g i ∣ ||\mathbf{g}||_{\infty} = \max_{i}|g_i| ∣∣g∣∣∞=imax∣gi∣
无穷范数主要关注梯度向量中最大元素的绝对值,在某些情况下可以用来快速判断梯度的最大变化幅度。
选择不同范数的依据
在实际应用中,选择使用哪种梯度范数取决于具体的任务和需求:
- L2 范数:由于其平滑性和良好的数学性质,在大多数深度学习任务中是默认的选择,常用于梯度裁剪以防止梯度爆炸,保证训练的稳定性。
- L1 范数:当需要对模型进行稀疏化处理,或者希望某些梯度元素变为 0 以实现特征选择时,L1 范数可能更为合适。
- 无穷范数:当更关心梯度向量中最大元素的影响,或者需要快速估计梯度的最大变化范围时,可以考虑使用无穷范数。
在PyTorch中计算一个简单线性模型参数梯度的L2范数
方法1
import torch
# 设置随机种子,确保结果可复现
torch.manual_seed(42)
if torch.cuda.is_available():torch.cuda.manual_seed_all(42)
# 定义一个简单的模型
model = torch.nn.Linear(10, 1)
# 定义输入数据
input_data = torch.randn(1, 10)
# 定义目标数据
target = torch.randn(1, 1)# 定义损失函数
criterion = torch.nn.MSELoss()
# 前向传播
output = model(input_data)
# 计算损失
loss = criterion(output, target)# 反向传播计算梯度
loss.backward()# 计算梯度的 L2 范数
total_norm = 0
for p in model.parameters():param_norm = p.grad.data.norm(2)total_norm += param_norm.item() ** 2
total_norm = total_norm ** 0.5print(f"梯度的 L2 范数: {total_norm}")
方法2
import torch
# 设置随机种子,确保结果可复现
torch.manual_seed(42)
if torch.cuda.is_available():torch.cuda.manual_seed_all(42)
# 定义一个简单的模型
model = torch.nn.Linear(10, 1)# 定义输入数据
input_data = torch.randn(1, 10)# 定义目标数据
target = torch.randn(1, 1)# 定义损失函数
criterion = torch.nn.MSELoss()# 前向传播
output = model(input_data)# 计算损失
loss = criterion(output, target)# 反向传播计算梯度
loss.backward()# 使用 torch.norm 更简洁地计算梯度的 L2 范数
total_norm = torch.norm(torch.stack([p.grad.norm(2) for p in model.parameters()]))print(f"梯度的 L2 范数: {total_norm}")