【NLP 12、深度学习15条调参经验】
反正是绚烂,反正是到来
反正是背负慢慢凋残的孤独
耀眼的孤独,义无反顾的孤独
—— 24.12.9
深度学习15条调参经验
1.调参
调参是锦上添花的事,而底线取决于模型的选择和数据的清洗
2.关于model
① 尽量不要自己手写模型,找一个没有bug或者已经走通的模型自己去修改
② 当数据量少的时候,最好使用带预训练参数(如Imagenet)的模型去微调
3.关于数据
① 数据量太大的情况下,可以先用1/10,1/100的数据去估算一下训练或者推理时间,心里有个底
② 视觉问题一定要使用数据增强
③ 一定要进行数据预处理,把数据分布分散到均值0,方差为1的区间,利于训练模型
4.关于调参
有哪些参数可以调节呢?
Loss function(损失函数)
Learning rate(学习率)
Batch size(训练批次的大小)
Epoch number(训练轮数)
Optimizer(优化器)
Activation function(激活函数)
Weights initialization(权重初始化)
使用Regularization(正则化)
Validation(验证集)
使用的GPU个数
5.关于Loss function 损失函数
Loss function(损失函数)是Model(模型)和数据之外,第三重要的参数。具体使用MSE(均方差损失函数)、Cross entropy(交叉熵损失函数)、Focal(焦点损失函数)还是其他自定义,需要具体问题具体分析。
6.关于 Learning rate 学习率 和 batch size 批次大小
(1)Learning rate(学习率)和训练批次(batch size)是两个重要的参数,而且二者也是相互影响的,在反向传播时直接影响梯度。一般情况下,先调batch size,再调learning rate
(2)batch size不能太大,也不能太小,太小会浪费计算资源,太大则会浪费内存;一般设置为16的倍数
(3)如果使用微调,则learning rate(学习率)设置为0.0001较好。learning rate设置上有很多trick(技巧),包括cosine learning rate(余弦退火学习率)等。
7.关于Epoch number和early stopping
(1)Epoch number(模型训练过程中所经历的完整数据集遍历次数) 和 Early stopping(早期停止)是息息相关的,需要输出loss看一下,到底是什么epoch时效果最好,及时early stopping。
(2)Epoch(模型完整遍历一次训练数据集)越大,会浪费计算资源,epoch太小,则训练模型提取特征没到极致。
(3)此外,也要明白Epoch模型完整遍历一次训练数据集)、lteration(一次参数更新的过程)、batch size(批次大小)的关系,一个 Epoch 意味着模型对整个训练数据集完整遍历一次。假设训练数据集包含 N个样本,Batch size 设为 m,则在一个 Epoch 里的 Iteration 次数为 N / m (若N不能被m 整除则向上取整)。
8.关于Optimizer 优化器
(1)Adam和SGDM是最常用的两个,前者能快速收敛,后者收敛慢但最终精度更高。现在大家会先使用Adam快速收敛,后面再用SGDM提升精度。
(2)如果必须二选一的话,我会推荐Adam。
9.关于Activation 激活函数
(1)ReLu、Sigmoid、Softmax、Tanh是最常用的4个激活函数
(2)对于输出层,常用 sigmoid 和 softMax 激活函数,中间层常用 ReLu 激活函数,RNN(循环神经网络)常用Tanh激活函数。
10.关于Regularization 正则化
预训练参数是最好的参数切始化方式,其次是Xavir.
11.关于Weights initialization 权重初始化
Dropout虽然思想很简单,但效果出奇的好,首选0.5.
12.Batch normalization 批量归一化 很好用
13.loss的证明
如果在train(训练)模型时,loss可以降到非常低,那么模型的学习能力是够的,如果train能达到,Validation(验证集)达不到,则说明模型泛化能力不强
14.调参一定要做好笔记,每次只调节一个参数
15.如何在验证集上筛选模型参数
在Validation(验证集)筛选模型参数时,可以除loss函数外,设置某种规则引导模型向某个想要的方向去更新参数