文本分类,特征过大的模型排错过程

模型表现

发现模型有Loss,但是预测的分类完全一致(采取top K的方法),因此回去追溯问题
发现问题出在一些地方:

  1. 文本经过GAT之后,数量级上升了10^3左右;变成一个巨大的特征向量;而且随着训练的进行越来越大
  2. 文本出GAT之后,与标签向量做点乘之后,每个位置基本预测的都是负数(很大的负数),经过softmax之后为0,因此极大的影响了分类

做过的尝试

在对GAT进行分析之后,发现其中的注意力系数爆炸了,从0.7左右的平均水平上升到300左右平均水平,查看是否是原始数据出现的问题。
a. 对原始数据进行layer norm,因为每一个Batch有bz个数据,每个数据有10个表征,对这些表征进行layer norm -> 效果接近于0,前述问题仍然存在
b. 对GAT表征层之间加激活函数,比如ReLu,sigmoid等,很遗憾也没有解决前述问题,因为很大的正数值经过这些激活函数,要么就是还是很大,要么就是归1,导致特征完全消失
c. 在GAT表征之后加layer norm,确实可以限制GAT的输出维持在一个范围内,但是此时出现了新的问题,与标签向量点乘之后,每个位置还是基本预测的负值。
d. 尝试换一个方法进行分类,比如MLP,或者干脆不训练 label,这个时候GAT就是正常的。
e. 对GAT等模型进行了reset_parameter()或者其他初始化的方法,仍然出现以上问题。
f. 检查输入的图的边,发现连接无错误,而且为每个节点都添加了自环。

模型分析

通过追溯,发现问题出现在GAT的前向传播中(参见文章GATConv源码
在这里插入图片描述
这一步的操作是计算注意力系数并且相加,在这一步发现乘法之后的结果特别大,导致获得了特别大的el和er;而且主要是因为feat_src变的很大,而feat_src变大的原因则是由于以上的计算
在这里插入图片描述
在输入的h_src已经维持在一个比较稳定的情况下,只能说明self.fc_src学到了错误的信息,导致后续操作全部失误。
继续追溯,开一个新的学习尝试一下(首先把其他模块的梯度计算都置为0)

第一次

这是训练前的self.fc的参数矩阵
在这里插入图片描述
这是feat_src
在这里插入图片描述
在未训练的时候,el/er都较为正常
在这里插入图片描述

但是到了第二层GATConv,el/er较大,但是输出的x量级目测比较一致
在这里插入图片描述

此时和标签点乘之后,值还算比较正常*【这个位置是否需要再加入fc层+sigmoid呢】*
在这里插入图片描述
查看一下梯度,发现都存在微小的梯度【但是不知道相对数据来说是否会造成很大的变化】
gat.conv1.attn_l : tensor([[[ 1.1810e-05, -9.9539e-06, -5.5504e-06, …, -7.0059e-06,\n 1.2131e-06, -1.3258e-06]]], device=‘cuda:2’)
“gat.conv1.attn_r : tensor([[[-4.7315e-09, 1.6476e-08, -4.5399e-08, …, 1.6060e-08,\n 1.5856e-08, 2.1194e-08]]], device=‘cuda:2’)”, “gat.conv1.bias : tensor([ 1.0475e-06, 2.8372e-05, -1.3814e-05, …, -1.0140e-05,\n 6.3367e-06, 2.8826e-06], device=‘cuda:2’)”, “gat.conv1.fc.weight : tensor([[ 1.4645e-06, -1.0940e-06, -1.6446e-06, …, -4.4323e-07,\n -1.8194e-06, -2.4805e-06],\n [-2.2080e-06, -2.4721e-05, 1.3197e-05, …, 2.0022e-06,\n -8.0242e-06, -2.0421e-05],\n [-3.3861e-07, 1.3514e-05, -5.5590e-06, …, -1.3269e-06,\n 3.9482e-06, 1.0983e-05],\n …,\n [ 1.4423e-06, 8.8434e-06, -8.7957e-06, …, -3.3223e-06,\n -3.5134e-07, 3.9707e-06],\n [ 2.7301e-06, -6.5220e-06, -2.1646e-06, …, -1.1113e-06,\n -4.6996e-06, -9.7258e-06],\n [ 2.2848e-07, -3.4555e-06, 2.1012e-06, …, 1.5772e-06,\n 4.9992e-08, -1.3654e-06]], device=‘cuda:2’)”,

“gat.conv2.attn_l : tensor([[[-6.1288e-06, 7.8969e-06, -9.1810e-06, …, -1.9398e-05,\n -6.7049e-06, -1.2443e-06]]], device=‘cuda:2’)”,
“gat.conv2.attn_r : tensor([[[-6.8388e-07, 1.6973e-06, 1.1907e-09, …, -8.2935e-06,\n 1.1358e-06, -1.9698e-06]]], device=‘cuda:2’)”,
“gat.conv2.bias : tensor([-1.3040e-05, -1.4133e-05, 1.1412e-05, …, -2.0005e-05,\n -1.2085e-05, -1.8212e-05], device=‘cuda:2’)”,
“gat.conv2.fc.weight : tensor([[-6.9463e-06, -1.4937e-05, -1.4765e-05, …, -1.4249e-05,\n -1.8331e-06, 7.6408e-07],\n [-1.2885e-05, -1.8688e-05, -1.4666e-05, …, -1.3014e-05,\n -4.0834e-06, 1.4039e-06],\n [ 6.8030e-06, 1.4125e-05, 1.1860e-05, …, 1.0729e-05,\n 1.9194e-06, -6.8064e-07],\n …,\n [-1.5179e-05, -2.5207e-05, -2.1281e-05, …, -1.9382e-05,\n -4.6959e-06, 1.6531e-06],\n [-8.1474e-06, -1.3140e-05, -1.3341e-05, …, -1.3123e-05,\n -2.2787e-06, 8.4802e-07],\n [-1.1576e-05, -1.9824e-05, -2.0305e-05, …, -1.9619e-05,\n -3.4991e-06, 1.2012e-06]], device=‘cuda:2’)”

第二次

fc层的参数矩阵,看起来还是很正常的
在这里插入图片描述
el/er变的非常大
在这里插入图片描述
attn_l的参数
在这里插入图片描述
attention数值【相对来说也比较正常】
在这里插入图片描述
经过attention之后
在这里插入图片描述
GATConv2更是出现了一个大问题:e变成负数了,计算注意力权重的时候边的权重全是负数在这里插入图片描述
在这里插入图片描述
是负数就会导致一个问题,就是softmax之后的值非常非常小
在这里插入图片描述
这个部分就是导致问题的罪魁祸首

目前来说可能是自己手上的文本,不同样本的文本结构差距很大,所以不适合动态学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值