bojone / bert4keras

keras implement of transformers for humans
https://kexue.fm/archives/6915
Apache License 2.0
5.37k stars 929 forks source link

bert 微调 coNLL2003 f1始终停留在40%左右,但在人民日报上f1能达到96% #173

Open TransformersWsz opened 4 years ago

TransformersWsz commented 4 years ago

在做NER的时候,bert_base 微调人民日报f1能达到96%, 但在coNLL2003数据集上却停留在40%,所用的英文模型是 cased_L-12_H-768_A-12 image 不知道作者是否在英文语料上微调过?

bojone commented 4 years ago

还没实验过英文的,晚点我实验一下看看。

TransformersWsz commented 4 years ago

还没实验过英文的,晚点我实验一下看看。

苏神,有结果了吗

bojone commented 4 years ago

还没实验过英文的,晚点我实验一下看看。

苏神,有结果了吗

没。对英文任务没什么兴趣,拖着还没弄~倒不如你说说你改动了什么?英文和中文不一样,task_sequence_labeling_ner_crf.py肯定是不能直接套的,你列举一下你改动之处,咱们对比一下?

TransformersWsz commented 4 years ago

还没实验过英文的,晚点我实验一下看看。

苏神,有结果了吗

没。对英文任务没什么兴趣,拖着还没弄~倒不如你说说你改动了什么?英文和中文不一样,task_sequence_labeling_ner_crf.py肯定是不能直接套的,你列举一下你改动之处,咱们对比一下?

我是直接套的。。。,顶多就是把labels改改

bojone commented 4 years ago

还没实验过英文的,晚点我实验一下看看。

苏神,有结果了吗

没。对英文任务没什么兴趣,拖着还没弄~倒不如你说说你改动了什么?英文和中文不一样,task_sequence_labeling_ner_crf.py肯定是不能直接套的,你列举一下你改动之处,咱们对比一下?

我是直接套的。。。,顶多就是把labels改改

这应该不行吧。。。你好歹得观察一下data_generator的样本输出是不是正常吧,中文的脚本直接处理英文说不准会出现什么异常的呀。

TransformersWsz commented 4 years ago

还没实验过英文的,晚点我实验一下看看。

苏神,有结果了吗

没。对英文任务没什么兴趣,拖着还没弄~倒不如你说说你改动了什么?英文和中文不一样,task_sequence_labeling_ner_crf.py肯定是不能直接套的,你列举一下你改动之处,咱们对比一下?

我是直接套的。。。,顶多就是把labels改改

这应该不行吧。。。你好歹得观察一下data_generator的样本输出是不是正常吧,中文的脚本直接处理英文说不准会出现什么异常的呀。

你的代码我看过了,因为没有区分中英文,所以直接套了。data_generator输出的token_id, seg_id, labels是正常的

eryueniaobp commented 4 years ago

在做NER的时候,bert_base 微调人民日报f1能达到96%, 但在coNLL2003数据集上却停留在40%,所用的英文模型是 cased_L-12_H-768_A-12 image 不知道作者是否在英文语料上微调过?

人民日报数据, 第几个epoch F1能上来?? 我看刚开始的epoch, F1非常低

Uncle-Yuanl commented 2 years ago

我尝试修改了load_data函数,使得conll03的每个单词之间存在一个空格,原先的中文是没有空格分割的。并且在tokenizer.py中修改了`def _tokenize(self, text, pre_tokenize=True): """基本分词函数 """ if self._do_lower_case: text = lowercase_and_normalize(text)

    if pre_tokenize and self._pre_tokenize is not None:
        tokens = []
        for token in self._pre_tokenize(text):
            if token in self._token_dict:
                tokens.append(token)
            else:
                tokens.extend(self._tokenize(token, False))
        return tokens

    spaced = ''
    if self._language == 'en':
        text = text.split(' ')
    for ch in text:
        try:
            if self._is_punctuation(ch) or self._is_cjk_character(ch):
                spaced += ' ' + ch + ' '
            elif self._is_space(ch):
                spaced += ' '
            elif ord(ch) == 0 or ord(ch) == 0xfffd or self._is_control(ch):
                continue
            else:
                spaced += ch
        except:
            # ch是英文单词
            ch += ' '
            spaced += ch
    tokens = []
    for word in spaced.strip().split():
        tokens.extend(self._word_piece_tokenize(word))

    return tokens`

目的是将标签和索引与单词对齐,而不是字符。最后得到了正常的结果,10个epoch得到f1:0.82 image

环境为: tensorflow-gpu == 2.6.0 bert4keras == 0.9.9