记录一些炼丹的心得(都是坑啊)
以下都是经过很多实验得到的炼丹心得,希望对大家有帮助
- 模型很复杂,各种网络融合,尝试用更小的学习率和更多的epoch
- 学习率预热是个好东西,必须用上,学习率很重要,可以发掘模型的极限,但是无法改变模型的上限,模型的上限取决于其结构,学习率预热在pytorch的实现方法:
from transformers import get_linear_schedule_with_warmup
# 总步长:batch的个数*epoches
t_total = len(train_loader) * epoches
# optimizer:优化器,num_warmup_steps:达到最大学习率的步长,如果为0则一开始就是最大学习率,num_training_steps:总步长
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=t_total)
- batch_size太小模型不收敛,太大显存吃不消,一般来说batch_size会有一个最大值,32,48,64都可以试试,batch增大,学习率也要稍微增大
- 全连接层不需要太复杂,2-3层即可,第二层神经元增加(×2,3,4都可以试试),第三层减小(/2, /10, /100都可以试试),第四层就是我们的输出个数了。
- 卷积层(convs)的卷积核个数(out_channels)一般和词(字)嵌入维度差不多,2/3 ~ 3/2 都可以试试。
- LSTM的隐藏状态纬度(hidden_size)一般和词(字)嵌入差不多大, 层数(num_layers)一般为1层,两层也可以试试,太多肯定不好。
- 不管在lstm里还是全连接层,Dropout是必须的,0.1即可,激活函数用RELU系列。
- 模型效果不好,思考一下是否需要归一化,不同向量融合时数值是否差距过大,考虑用全连接层
nn.Linear
进行一次线性变换。