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

谢谢大佬,这是Efficient GlobalPointer么?还是之前那版的? #3

Open
BEILOP opened this issue Mar 22, 2022 · 15 comments
Open

Comments

@BEILOP
Copy link

BEILOP commented Mar 22, 2022

No description provided.

@JunnYu
Copy link
Owner

JunnYu commented Mar 22, 2022

GPLinker_pytorch/models.py

Lines 304 to 312 in a067a08

class AutoModelGPLinker(parent_cls):
def __init__(self, config, predicate2id, head_size=64, use_efficient=False):
super().__init__(config)
if exist_add_pooler_layer:
setattr(
self,
self.base_model_prefix,
base_cls(config, add_pooling_layer=False),
)

当前的实验结果都是使用的GlobalPointer
要想使用Efficient GlobalPointer,可以在命令行使用--use_efficient

accelerate launch train.py \
    --model_type bert \
    --pretrained_model_name_or_path bert-base-chinese \
    --method gplinker \
    --logging_steps 200 \
    --num_train_epochs 20 \
    --learning_rate 3e-5 \
    --num_warmup_steps_or_radios 0.1 \
    --gradient_accumulation_steps 1 \
    --per_device_train_batch_size 16 \
    --per_device_eval_batch_size 32 \
    --seed 42 \
    --save_steps 10804 \
    --output_dir ./outputs \
    --max_length 128 \
    --topk 1 \
    --num_workers 6 \
    --use_efficient

@BEILOP
Copy link
Author

BEILOP commented Mar 23, 2022

万分感谢,如果我想在自己数据上跑,除了修改train_data.json、dev_data.json、test_data.json等数据文件还需要修改哪些东西,有哪些步骤。另外,除了上述,我修改了all_50_schemas.

@BEILOP
Copy link
Author

BEILOP commented Mar 23, 2022

发现了,读的是cache的数据而不是data下的

@BEILOP
Copy link
Author

BEILOP commented Mar 24, 2022

第一次eval的时候时间比后面eval的时候长很多,但我还没debug出来是什么情况。好像大概和训练时长差不多长,情况如下:
我仅仅用了自己的16条训练数据和5条测试数据,都是短文本。给了200个epoch,第一次eval明显时间很长。

@JunnYu
Copy link
Owner

JunnYu commented Mar 24, 2022

你可以查看一下解码策略,第一次eval比较长,说明第一次预测的时候,预测出的实体数量比较多,然后又for循环进行解码,解码出符合条件的。
建议先查看losstrain loss非常大的情况下eval是没有意义的。

@BEILOP
Copy link
Author

BEILOP commented Mar 25, 2022

感谢,认真跟了一下,确实是train_loss较大的时候循环解码导致慢。因为数据量少,所以多学几个再打就不会出现这种情况。
但是我这里发现会出现loss为负的情况,p值、r值和目测效果先上升后下降,但代码没动,也没看出来有什么问题。


global_steps 400 - lr: 0.00002889  loss: 0.10419422
##--------------------- Dev
                                                                                                                                      --------------------------------------------------------------------------------                                                        
f1 = 0.3333333333388888
precision = 1.0
recall = 0.20000000000399998

global_steps 600 - lr: 0.00002667  loss: -2.53436604
##--------------------- Dev
                                                                                                                                      --------------------------------------------------------------------------------                                                        
f1 = 0.580645161293028
precision = 0.818181818183471
recall = 0.45000000000275
--------------------------------------------------------------------------------
**--------------------- Dev End


global_steps 800 - lr: 0.00002444  loss: -3.65172179
##--------------------- Dev
                                                                                                                                      --------------------------------------------------------------------------------                                                        
f1 = 0.24000000000607996
precision = 0.600000000008
recall = 0.15000000000424998

@xhw205
Copy link

xhw205 commented Apr 14, 2022

您好,我也复现了该算法https://github.com/xhw205/GPLinker_torch,
训练过程中一样出现loss为负数,但测试时输出结果一切正常,F1分数也可观。不知这是什么原因呢

@JunnYu
Copy link
Owner

JunnYu commented Apr 14, 2022

可能是损失函数的原因吧。

@BEILOP
Copy link
Author

BEILOP commented Apr 15, 2022

我看苏神说是这个原因,1、mask_zero没处理好;2、同一样本的label中标签出现重复(即目标类别必须是去重过的,不能重复出现,如果开启了mask_zero,那么只能label=0能重复出现,其他也不能重复出现)。
我看了下自己的数据,确实有如下的例子:本专利所说空调,包含空调主体和滤网组件。所说滤网组件,包含滤网、滤芯等。
去抽包含关系的时候,那么标签就出现了重复,但是torch版大佬们实现的过于深奥,我还没看出来咋修改,明天看看苏神的这部分怎么调整。
好像就是xhw205提问的苏神hh,大佬实现了说一声,我学习一下

@JunnYu
Copy link
Owner

JunnYu commented Apr 15, 2022

对于2的话,那么感觉对标签直接去重应该就可以了吧

@JunnYu
Copy link
Owner

JunnYu commented Apr 15, 2022

spo.append([sh, st, p, oh, ot])

这里判断一下应该就可以了,如果不在list里面就添加一下,如果在就不添加这个标签?

@JunnYu
Copy link
Owner

JunnYu commented Apr 15, 2022

感觉xhw205用的是苏神的数据与处理代码,那么应该不会出现问题2吧,那么可能是问题1吧

@xhw205
Copy link

xhw205 commented Apr 15, 2022

是的,我提问的。我代码复现基本按照keras版本来的,以这个CBLUE数据为例子,
{"subject_type": "流行病学", "predicate": "同义词", "object_type": "流行病学"}
{"subject_type": "疾病", "predicate": "同义词", "object_type": "疾病"},
相同的关系对应不同的实体对,这种也需要去重吗?
而且经过我的测试,LOSS出现负值也没有影响模型效果,和我之前复现的casrel上线F1分数基本一致,都有效

@BEILOP
Copy link
Author

BEILOP commented Apr 15, 2022

嗯,确实是这里,我太菜没有debug定位到。我确实是第二种问题,感觉逻辑上得判断下。因为我这实体1实体2定义的都是产品,所以其实不能让他们嵌套或者重叠。如果是不同实体类型,应当没有问题。待会我去写一下这里的逻辑。

@Hana98919
Copy link

万分感谢,如果我想在自己数据上跑,除了修改train_data.json、dev_data.json、test_data.json等数据文件还需要修改哪些东西,有哪些步骤。另外,除了上述,我修改了all_50_schemas.
你好,我也想问这个问题,请问您解决了吗

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

4 participants