构建用于启动微调程序的脚本文件,脚本为微调程序提供参数。
一、设置模型
1、model_type:在shell文件中修改model_type参数即可指定模型
常用的有两个:
BERT后接FC全连接层,则直接设置model_type=bert;
BERT后接CNN卷积层,则设置model_type=bert_cnn
下面是各个预训练模型支持的model_type。
bert
bert+cnn
bert+lstm
bert+gru
xlnet
xlnet+cnn
xlnet+lstm
xlnet+gru
albert
注:在中文RoBERTa、ERNIE、BERT_wwm这三种预训练语言模型中,均使用BERT的model_type进行加载。
2、summary log:日志汇总
3、model_name_or_path:用于指定进行微调的预训练模型
参数可以是模型名称,在第一次执行微调程序时,会自动下载对应的模型;
参数也可以是模型路径,此时需要提前下载对应的模型到设定的路径中。
4、config_name:预训练配置名称或路径
5、tokenizer_name:预训练模型的名称或路径
如果有的话使用tokenizer_name提前设置好的,没有的话使用指定的预训练模型model_name_or_path
二、初始化信息
6、threads:数据处理所使用的线程数
可以通过os.cpu_count()查看机器支持的线程数
7、warmup_ratio:预热学习率
属于parser中的Warmup
因为从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。
本系统采用的方法是,从最小的学习率开始,每个step增大一点点,直到达到最初设置的比较大的学习率时(0.1),采用最初设置的学习率进行训练。
详细内容可见:https://blog.csdn.net/sinat_36618660/article/details/99650804
8、logging_ratio:每一个step打印一个学习率的日志
9、save_ratio:保存学习率为0.1
10、do_lower_case:如果使用的是未加密的模型,需要设置标志
三、指定文件路径
11、overwrite_cache :覆盖缓存的训练集和评估集
12、data_dir:用于指定微调数据的存储路径
如果未指定数据目录,则需要安装tensorflow数据集。
如:datasets
13、train_file:指定训练文件
输入训练文件。如果指定了数据目录,将在那里查找文件
如果没有指定数据目录或训练/预测文件,将使用tensorflow下的数据集运行
14、predict_file:输入评测文件
输入评估文件。如果指定了数据目录,将在那里查找文件
如果未指定数据目录或训练/预测文件,将使用tensorflow下的数据集运行
15、test_file:测试文件
四、batch_size数据集相关
16、per_gpu_train_batch_size:用于训练的每个GPU/CPU的样本大小
这个比较小是4
神经网络在训练集上跑一次,就是一次迭代。深层,就是很多层,每层有很多的神经元,结构复杂,也会有很多的数据集。一次迭代需要花费的时间很长。这个源码中的思路是每次使用数据集中的部分样本,这个数量被定义为batch_size。使用这个方法就是为了降低损失函数,损失的值越小就表示神经网络拟合的越好,越大代表过拟合。
batch_size的思路可以减少训练时间提高效率。
不过一次迭代不一定跑所有样本。
后面的参数研究完才能确认有没有跑遍数据集中的所有样本。
17、per_gpu_eval_batch_size:用于评估的每个GPU样本大小
大致是用于评估的每个gpu或者cpu的样本大小。这个比较大是32.
18、learning_rate:初始学习率,优化器算法
Adam的初始学习率,是深度学习中的优化器算法。
记录了梯度的一阶矩,即过往所有梯度与当前梯度的平均,使得每一次更新时,上一次更新的梯度与当前更新的梯度不会相差太大,即梯度平滑、稳定的过渡,可以适应不稳定的目标函数。
这个大概就是微调的关键点了。
具体可见:https://blog.csdn.net/sinat_36618660/article/details/100026261
19、gradient_accumulation_steps:梯度累积
梯度累计主要是为了解决显存不足的情况。
假设原来的batch size=10,数据总量为1000,那么一共需要100train steps,同时一共进行100次梯度更新。
若是显存不够,需要减小batch size,设置gradient_accumulation_steps=2
那么新的batch size=10/2=5,需要运行两次,才能在内存中放入10条数据,梯度更新的次数不变为100次,那么train steps=200
20、num_train_epochs:遍历所有数据集
和前面的对应上了,通过per_gpu_train_batch_size可知,一次迭代不一定跑所有样本。但是设置epochs后就可以保证来了,这里就是设置执行的训练时段总数。
epoch大概就是指的类似于一个迭代数量的东西。如果说一次迭代跑了所有的数据集,那么epoch就是和迭代是一样的。
这个有点绕,来个图哈
五、数量设置
21、max_seq_length 384 \
单词标记化后的最大输入序列总长度,默认的512,脚本中设置为384。比这个长的序列将被截断,比这个短的序列将被填充.
22、doc_stride 长文档分成块,块之间的步长
23、max_query_length:问题最大长度
超过此长度的问题,将被截断到此长度
24、max_answer_length:答案最长长度
25、n_best_size:n个最佳预测的总数
要在n-best_predictions.json输出文件中生成的n个最佳预测的总数
26、output_dir:用于指定微调好的模型的存放路径
27、overwrite_output_dir:覆盖输出目录的内容
六、训练方法
28、do_fgm:对抗训练
训练模型-对抗训练-训练时去掉梯度裁剪
作用:增强神经网络鲁棒性
在对抗训练的过程中,样本会被混合一些微小的扰动(改变很小,但是很可能造成误分类),然后使神经网络适应这种改变,从而对对抗样本具有鲁棒性。
原理如下:https://zhuanlan.zhihu.com/p/104040055?utm_source=qq
29、gc:
30、do_train:执行训练操作
31、evaluate_during_training:使用日志记录在训练期间的运行的每个步骤
32、补充task_name:用于指定具体的下游任务
微调程序需要根据任务名称选择相应的processor以实现数据加载。
参考链接:
https://blog.csdn.net/qq_27590277/article/details/106263761
https://blog.csdn.net/lolgenius/article/details/107733882
https://blog.csdn.net/sinat_36618660/article/details/99650804
https://blog.csdn.net/weixin_43643246/article/details/107785089