12.30更新,所有模型的实验数据放在此,每个模型的数据概括在description.md中,可用于完成报告
已经完成于,见此处,Vocab类将语料中出现的单词映射为一个唯一的编码。
数据可视化于此
对于Dataset对象,用索引方式得到一个tuple(input,label)
已经实现于此 使用方法见DatasetDemo
每个句子的长度不一样,编码后要填充为一样的长度,统计发现大部分句子长度在200到600之间,所以在600处截断。
防止填充的部分影响模型训练,故采用掩蔽(masking)
- rnn等循环神经网络的掩蔽策略
- transformer的掩蔽
完全没有效果,但可以阅读这一篇了解训练的流程
纯粹的lstm也几乎没有效果 增加了以下策略:
- 双向
- dropout
- 最大池化
- 隐藏状态用0初始化
准确率达到82%
还不知道是哪一个策略起了效果,需要对比文件中的两个自定义lstm控制变量研究一下
12.15已经新增任务于lstm文件,见文档的最后一个cell
2024.12.22 新增准备文件
2024.12.26 仅仅使用transformer编码器的堆叠,实现类似BERT的结构,参数和BERT类似:
编码器层数:10
隐藏神经元:768
注意力头数:12
训练轮数:50
参数大小:约800M
训练环境:nvidia L20 48G
学习率:2e-5
训练结果:
最低损失epoch50,batch200,loss = 0.11672550439834595好于前面所有的模型
准确率约85%
改进建议:引入early stop,在模型性能变差时中止训练
GPT2(small)尝试,取最后一个logits再连接一个一个二分头
需要hugging face 库 pip3 install transformer
GPT2(large)
BERT(base)
可阅读这一篇
对每个句子,其每个单词被编码为数字,每个数字被拓展为一个向量(通过nn.embedding实现),每个输入的形状是(batch_size,num_steps,embedding_size),输出则是(batch_size,2),以交叉熵作为损失函数进行训练。