一、跑通baseline
1.过拟合,预测的结果都一样
训练了三次,发现结果都一样,提交上去测评结果也是负数。我改的有epoch、num_layers,但是都不起作用。
图1:错误示例
后来尝试了多次调参,无功而返,后来和群内网友交流发现,DROPOUT修改一下会有效果,由于默认值是0.2,过小了。后面调大这个值之后,发现结果正常了,不再是负值了。
2.DROPOUT的含义
DROPOUT
是一种正则化技术,用于防止神经网络的过拟合。它的主要思想是在每个训练阶段随机地忽略(丢弃)一些神经元,并且在每次前向传播中以一定概率将其设为零。这有助于网络学习到更鲁棒的特征,因为它不能依赖于某些特定的神经元或路径。
简而言之,防止过拟合。
因此,在调大之后,评测结果就好很多了。
二、我的参数
N = 10 #int / int(len(dataset) * 1)
NUM_EMBED = 293 # nn.Embedding()
INPUT_SIZE = 300 # src length
HIDDEN_SIZE = 256
OUTPUT_SIZE = 128
NUM_LAYERS = 3
DROPOUT = 0.5
CLIP = 1 # CLIP value
N_EPOCHS = 100
LR = 0.001
代码中做了以下修改来减少过拟合:
模型复杂度
- 降低隐藏层维度:将隐藏层的维度从 512 减少到 256。
- 降低输出维度:将输出维度从 512 减少到 128。
- 减少 RNN 层数:将 RNN 层数从 10 减少到 3。
正则化
- 增加 Dropout 概率:将 Dropout 概率从 0.2 增加到 0.5。
好处是提高了模型的训练速度,100轮也才8分钟左右。
!!!另外,默认代码似乎有一个错误,就是NUM_EMBED
NUM_EMBED
是词嵌入矩阵的大小,即词汇表中不重复词的总数。它的值应该等于词汇表的长度,即所有可能的符号数量。
根据vocab_full.txt的内容长度,NUM_EMBED=293才对。
三、后续改进方案
由于提交次数有限,还有很多调参方案没有验证,比如进一步探索RNN层数,期望在训练时长和效果上取得一个平衡。
最后,感谢Datawhale提供这个学习交流机会,以及群友的帮助!!!😊😊😊