引言
书接上文,上文在计算loss时一共分为两个。
- mlm loss(即macbert预测的loss)
- 二分类loss(即hidden states降维到1后与原始数据集的loss,即原始文本和正确文本相比,不同为1,相同为0)。
例如:
训练数据集 | 样本 |
---|---|
original_text | 我和你在一其 |
correct_text | 我和你在一起 |
det_labels | 0 0 0 0 0 1 |
- 将original_text输入到bert后,获得mlm_result,即
我和你在一器
。此为mlm loss。 - 在获得mlm_result同时,也可以获取hidden_states,将hidden_states输入到linear,再与det_labels做二分类。此为二分类loss。
- 分配两个loss不同的weight,作为最终loss,此为上篇文章的实现思路。
那这篇文章改动了什么?
实现思路
det_labels的获取方式更改了,怎么更改的?以mlm_result和correct_text进行对比进行获取。
如上例:即mlm_result输出我和你在一器
,和correct_text我和你在一起
进行对比。
即用GAN的思想来进行corrector!
实验结果
此处我将mlm预测称为generator
(G
),二分类判别称为discriminator
(D
)。
分配G
和D
两者loss不同的weight。
1. 当weight分配是1
和50
可以看到一个现象,不管dev_metric还是train_metric,在epoch2和epoch3的时候,它的准确度很突然下降,对应的loss也会比刚开始的大的许多。随后效果才会慢慢的提升。
2. 当weight分配是0.9
和0.1
如果我把上图dev_metric展开下再和train_metric放到一起对比:
可以看到效果:
- 在epoch1出来时,效果基本就已经非常不错了。
- 在随后的epochs里,准确度的提升非常缓慢。
3. 当weight分配是0.1
和0.9
4. 当weight分配是0.1
和0.9
,并且判别器添加GELU
分析
上面这些实验例子都有一个共同的现象:
- epoch1时准确率就已经不错了,相比上文。
- 都有抖动现象,就是在某个epoch时不管dev还是train都有抖动,随后再回到正常。
1. 当weight分配是1
和50
首先解释为什么选择1和50,这个地方来自electra地方的思想,可看上文。
2. 当weight分配是0.9
和0.1
整体很平滑,仿佛判别器没有起到作用似的或者作用很小。
3. 当weight分配是0.1
和0.9
没什么大的意外。
但是让我意外的是下面4情况。
4. 当weight分配是0.1
和0.9
,并且判别器添加GELU
我在看《机器学习实战:基于Scikit-Learn和TensorFlow》第二版 时里面讲到训练GAN有些小trick,比如可以给判别器添加一个激活函数。
但是当添加后,发现其抖动的更为严重。。。
5. 为什么我选择0.1和0.9
这个是个实验值,没有具体理论依据哈,本身就是超参。看下图:
d_loss和g_loss分别是判别器和生成器各自的loss。
从上图可以看出,d_loss比g_loss小大概9~10倍,所以依据来源在此。
总结
当然还有一些其他的小技巧,就不做实验了,gan本来就难搞。。。
比如:
- 生成器的网络空间大小相比判别器调到1/4 ~ 1/2(来自electra)。具体做法就是减少层数或者降低每层的空间大小。
- 使用不一样的优化器。
- 改变训练技巧。生成器和判别器分别训练,当训练一个时,另外一个trainable=False。使其达到一个均衡。。
啥是模式崩溃?
就是当生成器学会苹果后,那判别器就会判别苹果。当生成器转头学会橘子后,那判别器会对橘子判别更准。
而对苹果和橘子共同存在的情况下效果不好。而达到一个纳什均衡。