在这一周,我们小组明确了分工,决定个人研究个人的模型。鉴于去找学长,学长给出了弱分类器的概念,所以我们决定分开试一试。现在又两种思路,一个是继续复现李东进学长论文,另外一个就是去研究弱分类器。我们小组完成了分工。陈宇轩同学选择继续思路一,不断复现和再优化。而剩下的我们三个就开始对弱分类器进行研究,互不干预,齐头并进。
我选择了先尝试简单的基于多MLP的弱分类器的研究。这是我在过程中的理解:
首先,我学习了pytorch的相关的层数设置,包括线性层,loss函数的使用,参数的保存与模型加载等基本操作。在这基础上,我就基本上拥有了搭建简单mlp的基础。现在考虑输入输出的形式。输入应该是一个考生答案,这个答案是不能直接进入mlp的,我们需要考虑为文本编码,这里,我考虑使用bert直接生成,使用在关键词基础上处理的清洗后的数据进行句向量的生成。由于bert的生成是768维的向量,这个维数过高,这里需要处理。我考虑输出按照标签映射,由于得分经过清洗后只有0,1.5,3这三个等级,所以我考虑输出是一个归一化的1*3的向量。从768到3的跨度有点大,所以我中间用了几层去过渡,设置为256,128,32 。
我们的数据集还是比较丰富的,我就按照数据集的规模和不同内容划分了五份数据集,训练了五个mlp。这里,我采用投票机制将五个集成起来,作为一个整体进行输出。投票的时候,我考虑通过测试集上得到的正确率来重新考虑单个mlp投票的有效性。由于这是个三分类问题,基础正确率应该在0.33以上,所以如果一个mlp在测试集上的正确率大于0.6,我就按照他的投票结果来。但是如果正确率在0.3一下,我就采取标签反转的方法,让他的投票0变1,1变0重新加入。正确率在两个值之间,效果怎么算都不好,所以我认为他弃权。最后票数最高的作为得分结果返回。这里是我对mlp的尝试。
import torch
from MLP import MLP
from prepare import get_vec_and_label
from rule import idea1, statistic
def votor(test1_vec):
acc1 = 0.65
acc2 = 0.602
acc3 = 0.4545
acc4 = 0.4395
acc5 = 0.6325
acc_list = []
acc_list.append(acc1)
acc_list.append(acc2)
acc_list.append(acc3)
acc_list.append(acc4)
acc_list.append(acc5)
num_i = 768
num_h1 = 512
num_h2 = 256
num_h3 = 128
num_h4 = 32
num_o = 3
# vec, label = get_vec_and_label('ql_clean.csv')
# test1_vec = vec.tolist()[-1]
# test1_label = label.tolist()[-1]
# test2_vec = vec.tolist()[-2]
# test2_label = label.tolist()[-2]
# test3_vec = vec.tolist()[-7]
# test3_label = label