从零构建属于自己的GPT系列4:模型训练3(训练过程解读、序列填充函数、损失计算函数、评价函数、代码逐行解读)

Hugging Face 实战系列 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在PyCharm中进行
本篇文章配套的代码资源已经上传

从零构建属于自己的GPT系列1:数据预处理
从零构建属于自己的GPT系列2:模型训练1
从零构建属于自己的GPT系列3:模型训练2
从零构建属于自己的GPT系列4:模型训练3
从零构建属于自己的GPT系列5:模型部署1
从零构建属于自己的GPT系列6:模型部署2

6 序列填充函数

def collate_fn(batch):
    input_ids = rnn_utils.pad_sequence(batch, batch_first=True, padding_value=5)
    labels = rnn_utils.pad_sequence(batch, batch_first=True, padding_value=-100)
    return input_ids, labels

专门用来做序列填充的函数,一个batch中有4个数据,有的数据长有的短,这是不可以的,保证每个句子长度也就是单词或者汉字的个数一致,就要进行padding填充类似于卷积中加上一圈0一样的意思。

  1. 序列填充函数
  2. padding_value=5的意思是,填充的词的索引为5,这行代码是对数据进行padding
  3. 对标签进行padding
  4. 返回处理后的数据与标签

7 评价函数

def calculate_acc(logit, labels, ignore_index=-100):
    logit = logit[..., :-1, :].contiguous().view(-1, logit.size(-1))
    labels = labels[..., 1:].contiguous().view(-1)
    _, logit = logit.max(dim=-1)
    non_pad_mask = labels.ne(ignore_index)
    n_correct = logit.eq(labels).masked_select(non_pad_mask).sum().item()
    n_word = non_pad_mask.sum().item()
    return n_correct, n_word
  1. 评估函数
  2. logit 是预测值,将所有预测结果全部展开
  3. 标签也全部展开(实际上这里的标签和数据错开了一个单位,因为标签是预测数据中当前句子的下一个词,所以标签会从1开始)
  4. 取出分类预测结果中预测权重最大的一个结果
  5. 找出标签数据中应该被忽略的索引,比如填充值、特殊字符等
  6. 将预测结果logit与标签labels对比是否预测是一样的,并且要忽略掉应该要忽略的索引,n_correct 就是预测对的索引数量
  7. 计算在标签中非填充词(non-padding words)的总数
  8. 返回预测对的词数量和非填充词的总数

8 训练解读

开启训练后:

2023-12-11 01:03:25,231 - INFO - batch 100 of epoch 1, loss 12.36994457244873, batch_acc 0.01348314606741573, lr [6e-07]
2023-12-11 01:03:30,964 - INFO - batch 200 of epoch 1, loss 11.884823083877563, batch_acc 0.015410958904109588, lr [1.2375e-06]
2023-12-11 01:03:36,631 - INFO - batch 300 of epoch 1, loss 11.337600231170654, batch_acc 0.028312570781426953, lr [1.874999999998e-06]
2023-12-11 01:03:42,524 - INFO - batch 400 of epoch 1, loss 10.705965042114258, batch_acc 0.027131782945736434, lr [2.475e-06]
2023-12-11 01:03:48,414 - INFO - batch 500 of epoch 1, loss 9.881455421447754, batch_acc 0.022690437601296597, lr [3.1125e-06]
2023-12-11 01:03:54,404 - INFO - batch 600 of epoch 1, loss 8.230867624282837, batch_acc 0.038109756097560975, lr [3.749999999997e-06]
2023-12-11 01:04:00,344 - INFO - batch 700 of epoch 1, loss 7.731964588165283, batch_acc 0.07916666666666666, lr [4.35e-06]
2023-12-11 01:04:06,364 - INFO - batch 800 of epoch 1, loss 7.087151527404785, batch_acc 0.08751229105211406, lr [4.9875e-06]
2023-12-11 01:04:12,245 - INFO - batch 900 of epoch 1, loss 6.311254978179932, batch_acc 0.16279069767441862, lr [5.6249999999999995e-06]
2023-12-11 01:04:18,222 - INFO - batch 1000 of epoch 1, loss 6.076582431793213, batch_acc 0.17541613316261204, lr [6.225e-06]
2023-12-11 01:04:23,979 - INFO - batch 1100 of epoch 1, loss 5.394809246063232, batch_acc 0.18795888399412627, lr [6.862499999999999e-06]
2023-12-11 01:04:29,749 - INFO - batch 1200 of epoch 1, loss 5.653847336769104, batch_acc 0.19206939281288724, lr [7.499999999999999e-06]
2023-12-11 01:04:35,539 - INFO - batch 1300 of epoch 1, loss 5.932612895965576, batch_acc 0.1772406847935549, lr [8.099999999999999e-06]

从零构建属于自己的GPT系列4:模型训练3(训练过程解读、序列填充函数、损失计算函数、评价函数、代码逐行解读)_第1张图片
一开始学习率比较低,损失也比较大,然后学习率会增大,最后学习率又会进行衰减

前面的代码中我们知道,在最后训练完成后会保存训练最好的一个模型
从零构建属于自己的GPT系列4:模型训练3(训练过程解读、序列填充函数、损失计算函数、评价函数、代码逐行解读)_第2张图片

我的运行环境是:

  1. CPU:i7-1300KF
  2. GPU:RTX 4080
  3. 32G运行内存
  4. Win10
  5. 显卡显存使用率:7051MiB / 16376MiB = 43%
  6. GPU使用率:84%

batch_size 我指定的是8,gpu0_bsz指定的是6, 我训练了5个epoch,大约48分钟

从零构建属于自己的GPT系列1:数据预处理
从零构建属于自己的GPT系列2:模型训练1
从零构建属于自己的GPT系列3:模型训练2
从零构建属于自己的GPT系列4:模型训练3
从零构建属于自己的GPT系列5:模型部署1
从零构建属于自己的GPT系列6:模型部署2

你可能感兴趣的:(Hugging,Face实战,构建自己的GPT,gpt,pytorch,语言模型,nlp,chatgpt,深度学习,Hugging,Face)