bert模型裁剪及标签平滑在短文本意图识别中的效果分析

1、bert网络模型base有12层,

隐含层大小:H=768,

词向量参数矩阵:W = V*H,V大概在两万多,

12个attention head,

每个投的QKV矩阵:H * (H/12)

前馈层参数量是H * 4H = 768 * 3072

所以可以发现参数部分集中在词向量和前馈层

实际上对于部分下游任务,可能并不需要这么大的参数量,有些下游任务的特征可能比较明显,使用大网络耗时就比较严重了,而且容易fine-tuning的时候过拟合,所以可以对网络进行裁剪;

把网络比作一个长方形,宽就是它的广度,长就是它的深度,所以我们可以从这两个方面来裁剪模型,缩减长度(12层变成6层、8层等),缩减宽度(12个头变成6个亦或者768维变成512维);个人理解:长度提取的是不同形式的特征,如第一层是词向量表达,第二层是字与字之间的关系,第三层是字与句子之间的关系等等,那么宽度就是每一层的这个特征能不能全部提取出来,可能768维就是提取第一层词向量表达的最优解,512维只能提取词向量的一部分信息。

我这里首先实验了一下对层数进行裁剪:分别裁成了2、4、6层,7层还在训练中。裁剪的过程就是对ckpt这个预训练好的模型读取它的图,然后抽取出你想要的那一层的参数即可,再保存。

结果就是:

2层:89.93%
4层:89.98%
6层:91.59%
12层:92.42%

接下来会看看其他层的结果

还有一点,就是你下载的预训练模型可能只有100多M,但是你finetuning之后就有1个多G了,那是因为你里面保存了很多无用的信息,例如梯度等,这部分信息在预测的时候是没有用的,你可以选择把这一部分信息删除了,

2、意图识别类似于一个分类任务,真实标签向量其中一个位置1,其余位置全是0,那么在训练的过程中就会出现模型会尽力趋向真实标签,当前意图的结果与其他意图差别越大越好,这样就会导致模型过于相信预测的结果了,另一个方面,模型的泛化能力也会降低,容易导致过拟合。

标签平滑操作很简单,就是对真实标签进行平滑

1、原来是[1, 0, 0]

2、e = 0.1,K= 3,新的分布 = (1-e) * 原分布 + e * [1/K, 1/K, 1/K]

3、新的分布 = 0.9 * [1,0,0] + 0.1 * [1/3, 1/3, 1/3]

e的值是可以改变的,这个也会影响最后的结果:

未平滑:92.42%
e = 0.1:92.31%
e = 0.2:92.47%
e = 0.25:92.42%
e = 0.3:92.09%

平滑的结果有提升,但提升不是很明显,模型的泛化能力按道理来说是提升的,不过还要继续观察在其他样本上的表现

你可能感兴趣的:(自然语言处理,nlp,标签平滑)