Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于半指针-半标注模型中数据不平衡导致2分类器几乎全预测为0的问题 #5

Closed
Zrealshadow opened this issue Sep 24, 2020 · 6 comments

Comments

@Zrealshadow
Copy link

在模型训练若干个epoch后,在valuation过程中发现,
经过sigmoid后输出的标注开始和结束的两个指针向量中值都很小,通过threshold=0.1解码后的两个向量都是0。
这样导致Acc很高,Prec,recall,f1都为0

同样的问题也出现在复现您的另一篇关系抽取论文中 https://github.com/weizhepei/CasRel 也是半指针半标注模型
(但是开源的作者好像不太上心解答issue)

我现在还没有找到问题的原因QAQ,我是用Pytorch进行复现的

想请问一下在使用半指针-半标注模型中 有哪些值得注意的点?
还有,在解码过程中Threshold超参数要怎么选取
我注意到在CasRel中Threshold选取的0.5, 但是在这篇DGCNN中Threshold的选择是0.1

/* ----下面是我自己对半指针半标注模型的一些疑惑 -----*/
该模型最后是两个2分类器,一个Start指针的二分类器,和一个End指针的二分类器
根据您的博客,对于这个QA任务,如果一个长度为L语料里存在一个answer,那么他的结果
Start_vec ,End_vec 应该是一个长度为L的向量,其中一个Index为1,其余为0。
显然这是一个负样本远多于正样本的数据集,
而且在数据集中,还有很多语料里是没有答案的,那么Start 和 End 就直接是0向量了。
负样本会更多。这种失衡的数据集应该会把二分类器向预测0的趋势上进行训练吧。

QAQ

@bojone
Copy link
Owner

bojone commented Sep 24, 2020

你是直接用本项目的数据集复现本项目的模型吗?

在我的环境里,本项目的代码是可以成功跑起来,重复跑也可以重现这个结果。但是很奇怪,有的人在有些环境下死活跑不起来(就是你说的情况)。类似的问题也出现在 https://github.com/bojone/bert4keras/blob/master/examples/task_relation_extraction.py ,那脚本也有人成功复现了,也有人说f1一直为0,我至今都没总结出问题何在。

如果你确认实现上没有问题,那么不妨试试换几个随机种子,或者想办法搞一些其他的随机因素,多试几次。

threshold的问题其实不大,在本项目里边,虽然0.1最好,但就算你设成0.5,效果也不会降为0;尽管是类别不均衡的,但我们的实践里边,这个不均衡对训练结果影响不大(也就是说用普通的交叉熵、还是用focal loss或者手动调节权重,差别都不大)。

@Zrealshadow
Copy link
Author

关于数据集我是使用的WebQA
Raw Data 是来自您这篇blog https://kexue.fm/archives/4338, 纯净版
训练数据我在此之上只调整了结构,一个Item 对应 一个 Question , 一个Evidence , Answer
然后有的Question-Evidence 存在 no-answer的情况,我是no-answer 和 有answer item 1:1 组成最后的训练集
训练集 batch_size=32 有 8807个step。
验证集中也是一个Q,一个E,都存在Answer

关于训练细节:
Batch_size=32 epoches=20 lr=1e-4 optimizer=SGD
没有用EMA(我觉得应该影响不大)

/* ----- */
查找了 https://github.com/bojone/bert4keras/blob/master/examples/task_relation_extraction.py 中的issue
好像没找到和我类似问题的
不清楚您说的是哪个issue,emmmmm

/* ------ */
我也很奇怪,最近复现的几篇论文 使用半指针-半标注模型 好像都遇到了这个问题

@Zrealshadow
Copy link
Author

Zrealshadow commented Sep 24, 2020

在Validation中,出现的结果不止f1=0,同时 recall,precision=0
在混淆矩阵 意味这 tp=0, 也就是没有正阳例 。。。。。
就是分类器 把所有的都分成0而不是1了

@Zrealshadow
Copy link
Author

大大增大Epoch数目,解决问题。
也解决了在 https://github.com/weizhepei/CasRel 复现该篇论文中过程中出现的相似的问题。

我的理解:
在使用半指针-半标注的模型,在训练过程中,前一段时间分类器会先学习占据多数样本的 0,然后才会微调 样本数量稀少的 1.
在CasRel 的训练过程中,我设定了100个epoch,发现在第40个epoch obj_tagger 才出现召回,之前f1,recall, prec 全为0。在第80个epoch 评价指标才趋于稳定。(当然不同的训练参数设定会造成不同时间段的拟合,这里仅供参考)

@bojone
Copy link
Owner

bojone commented Sep 29, 2020

大大增大Epoch数目,解决问题。
也解决了在 https://github.com/weizhepei/CasRel 复现该篇论文中过程中出现的相似的问题。

我的理解:
在使用半指针-半标注的模型,在训练过程中,前一段时间分类器会先学习占据多数样本的 0,然后才会微调 样本数量稀少的 1.
在CasRel 的训练过程中,我设定了100个epoch,发现在第40个epoch obj_tagger 才出现召回,之前f1,recall, prec 全为0。在第80个epoch 评价指标才趋于稳定。(当然不同的训练参数设定会造成不同时间段的拟合,这里仅供参考)

你是自己的数据,还是同样的开源的数据啊?

@Zrealshadow
Copy link
Author

都是开源数据
您的这个用的是WebQA数据,我上面的Comment有细节介绍

CasRel 用的是 WebNLG数据

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants