继续创造,加快生长!这是我参与「日新方案 10 月更文应战」的第3天,点击查看活动详情

作者:汝贤、秋兮、熊兮、临在

导读

预练习言语模型在NLP的各个运用中都有及其广泛的运用;然而,经典的预练习言语模型(例如BERT)缺乏对常识的了解,例如常识图谱中的联系三元组。常识增强预练习模型运用外部常识(常识图谱,字典和文本等)或者语句内部的言语学常识进行增强。咱们发现,常识注入的进程都伴随着很大规划的常识参数,下流使命fine-tune的时分依然需求外部数据的支撑才干到达比较好的作用,然后无法在云环境中很好的供给给用户进行运用。CKBERT(Chinese Knowledge-enhanced BERT)是EasyNLP团队自研的中文预练习模型,结合了两种常识类型(外部常识图谱,内部言语学常识)对模型进行常识注入,一起使得常识注入的方法便利模型可扩展。咱们的试验验证也表明CKBERT的模型精度逾越了多种经典中文模型。在本次的结构升级中,咱们将多种规划的CKBERT模型贡献给开源社区,并且这些CKBERT模型与HuggingFace Models彻底兼容。此外,用户也可以在阿里云机器学习途径PAI上便利地利用云资源运用CKBERT模型。

EasyNLP(github.com/alibaba/Eas…)是阿⾥云机器学习PAI 团队依据 PyTorch 开发的易⽤且丰厚的中⽂NLP算法结构,⽀持常⽤的中⽂预练习模型和⼤模型落地技能,并且供给了从练习到布置的⼀站式 NLP 开发体会。EasyNLP 供给了简洁的接⼝供⽤户开发 NLP 模型,包含NLP应⽤ AppZoo 和预练习 ModelZoo,一起供给技能协助⽤户⾼效的落地超⼤预练习模型到业务。由于跨模态了解需求的不断添加,EasyNLP也⽀持各种跨模态模型,特别是中⽂范畴的跨模态模型,推向开源社区,期望可以服务更多的 NLP 和多模态算法开发者和研 究者,也期望和社区⼀起推动 NLP /多模态技能的开展和模型落地。

本⽂简要介绍CKBERT的技能解读,以及如安在EasyNLP结构、HuggingFace Models和阿里云机器学习途径PAI上使⽤CKBERT模型。

中文预练习言语模型概览

在这一节中,咱们首要简要回忆经典的中文预练习言语模型。现在中文预练习言语模型首要包含了两种类型:

  • 通用范畴的预练习言语模型,首要包含了BERT、MacBERT和PERT等模型;
  • 常识增强的中文预练习模型,首要包含了ERNIE-baidu,Lattice-BERT,K-BERT和ERNIE-THU等模型。

通用范畴的预练习言语模型

BERT直接运用Google发布的依据中文维基文本语料进行练习的模型。MacBERT是BERT的改善版本,引入了纠错型掩码言语模型(MLM as correction,Mac)预练习使命,缓解了“预练习-下流使命”不一致的问题。在掩码言语模型(MLM)中,引入了[MASK]标记进行掩码,但[MASK]标记并不会出现在下流使命中。在MacBERT中,运用相似词来替代[MASK]标记。相似词通过Synonyms toolkit 东西获取,算法依据word2vec相似度核算。一起,MacBERT也引入了Whole Word Masking和N-gram Masking技能。当要对N-gram进行掩码时,会对N-gram里的每个词别离查找相似词;当没有相似词可替换时,将运用随机词进行替换。由于一定程度的乱序文本不影响语义了解,PBERT从乱序文本中学习语义常识。它对原始输入文本进行一定的词序互换,然后形成乱序文本(因而不会引入额定的[MASK]标记),其学习目标是预测原Token地点的方位。

常识增强的中文预练习模型

BERT在预练习进程中运用的数据仅是对单个字符进行屏蔽,例如下图所示,练习BERT时通过“哈”与“滨”的部分共现判断出“尔”字,可是模型其实并没有学习到与“哈尔滨”相关的常识,即仅仅学习到“哈尔滨”这个词,可是并不知道“哈尔滨”所代表的含义。ERNIE-Baidu在预练习时运用的数据是对整个词进行屏蔽,然后学习词与实体的表达,例如屏蔽“哈尔滨”与“冰雪”这样的词,使模型可以建模出“哈尔滨”与“黑龙江”的联系,学到“哈尔滨”是“黑龙江”的省会以及“哈尔滨”是个冰雪城市这样的含义。

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

与ERNIE-Baidu相似,Lattice-BERT利用Word-Lattice结构整合词等级信息。具体来说,Lattice-BERT设计了一个Lattice方位留意机制,来表达词等级的信息,一起提出了Masked Segment Prediction的预测使命,以推动模型学习来自丰厚但冗余的内在Lattice信息。

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

除了言语学常识,更多的工作利用常识图谱中的现实性常识丰厚中文预练习模型的表征。其中,K-BERT提出了面向常识图谱的常识增强言语模型,将三元组作为范畴常识注入到语句中。然而,过多的常识融入会导致常识噪音,使语句偏离其正确的含义。为了战胜常识噪音, K-BERT引入了Soft-position和Visibel Matrix来约束常识的影响。由于K-BERT可以从预练习的BERT中加载模型参数,因而通过装备KG,可以很容易地将范畴常识注入到模型中,而不需求对模型进行预练习。EasyNLP结构也集成了K-BERT的模型和功能(看这儿)。

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

ERNIE-THU是一种融入常识Embedding的预练习模型。它首要运用TAGME提取文本中的实体,并将这些实体链指到KG中的对应实体目标,然后取得这些实体目标对应的Embedding。实体目标的Embedding由常识表明方法(例如TransE)练习得到。此外,ERNIE-THU在BERT模型的基础上进行改善,除了MLM、NSP使命外,从头添加了一个和KG相关的预练习目标:Mask掉Token和Entity (实体) 的对齐联系,并要求模型从图谱的实体中选择适宜的Entity完结对齐。

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

自研CKBERT模型技能详解

由于当时的常识增强预练习模型大都运用外部常识(常识图谱,字典和文本等)或者语句内部的言语学常识进行增强,一起常识注入的进程都伴随着很大规划的常识参数,下流使命fine-tune的时分依然需求外部数据的支撑才干到达比较好的作用,然后无法在云环境中很好的供给给用户进行运用。CKBERT(Chinese Knowledge-enhanced BERT)是EasyNLP团队自研的中文预练习模型,结合了两种常识类型(外部常识图谱,内部言语学常识)对模型进行常识注入,一起使得常识注入的方法便利模型可扩展。针对实际的业务需求,咱们供给了三种不同规划参数量的模型,详细装备如下所示:

模型装备 alibaba-pai/pai-ckbert-base-zh alibaba-pai/pai-ckbert-large-zh alibaba-pai/pai-ckbert-huge-zh
参数量(Parameters) 151M 428M 1.3B
层数(Number of Layers) 12 24 24
留意力头数(Attention Heads) 12 16 8
隐向量维度(Hidden Size) 768 1024 2048
文本长度(Text Length) 128 128 128
FFN 层维度 3072 4096 8192

CKBERT的模型架构如下图所示:

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

为了便利模型进行扩展参数,模型只在数据输入层面和预练习使命层面进行了改动,没有对模型架构进行改动。因而,CKBERT的模型结构与社区版的BERT模型对齐。在数据输入层,一共要处理两部分的常识,外部图谱三元组和语句级内部的言语学常识。针对言语学常识,咱们运用了哈工大LTP途径进行语句数据的处理,进行语义人物标示和依存句法分析等,然后依据规则,将辨认成果中重要的成分进行标示。针对外部三元组常识是依据语句中出现的实体结构实体的正负三元组样本,正样本是依据图谱中1-hop 实体进行的采样,负样本是依据图谱中multi-hop进行的采样,但负样本的采样进程只能在规定的多跳范围内,而不能在图谱中间隔太远。

CKBERT选用两种预练习使命进行模型的预练习,言语学感知的掩码言语模型和多跳常识比照学习:

  • 言语学感知的掩码言语模型(Linguistic-aware MLM):在语义依存联系中的主体人物(施事者AGT和当事者EXP )部分用[MASK]进行遮掩,一起在词的前后都加上[SDP][/SDP],附加上词汇的边界信息。在依存句法联系中,将主谓冰联系,定中联系,并排联系等依照上述mask机制进行处理为[DEP][/DEP]。全体进行预练习的token数量是整句话的15%,其中40%进行随机MASK,30%和30%分配到语义依存联系和依存句法联系词汇上来。丢失函数如下:

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

  • 多跳常识比照学习:将上述结构的正负样本数据针对该注入的实体进行处理,每一个句中实体结构1个正样本,4个负样本,通过规范的infoNCE丢失使命进行外部常识的学习。丢失函数如下:

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

其中,heth_{et}是预练习模型产生的上下文实体表明,htph_{tp}表明正样本的三元组表明成果,htnh_{tn}表明负样本的三元组表明成果。

CKBERT模型的完结

在EasyNLP结构中,咱们的模型完结分为三个部分:数据预处理,模型结构微谐和丢失函数的设计。首要,在数据预处理环节,首要由以下两个步骤组成:1.NER实体及语义联系的提取;2.常识图谱的信息注入。关于NER实体及语义信息的提取,首要选用LTP(Language Technology Platform)对原始语句进行分词和句法分析,该部分的中心代码如下所示:

def ltp_process(ltp: LTP,
                data: List[Dict[str, Union[str, List[Union[int, str]]]]]):
    """use ltp to process the data
    Args:
        Dict ([str, str]): data
        example:
            {'text':['我叫汤姆去拿伞。'],...}
    Returns:
        Dict[str, str]: result
    """
    new_data = list(map(lambda x:x['text'][0].replace(" ", ""), data))
    seg, hiddens = ltp.seg(new_data)
    result = {}
    result['seg'] = seg
    result['ner'] = ltp.ner(hiddens)
    result['dep'] = ltp.dep(hiddens)
    result['sdp'] = ltp.sdp(hiddens)
    for index in range(len(data)):
        data[index]['text'][0] = data[index]['text'][0].replace(" ", "")
        data[index]['seg'] = result['seg'][index]
        data[index]['ner'] = result['ner'][index]
        data[index]['dep'] = result['dep'][index]
        data[index]['sdp'] = result['sdp'][index]

该部分完结之后需求依据原始语句中的语义依存联系对相应的词进行全体的mask,该部分的mask战略参阅BERT的mask战略的设计,给不同类型的联系分配特定的概率,并依据该概率对不同类型联系进行mask,该部分的中心代码如下:

def dep_sdp_mask(left_numbers: List[int],
                     data_new: List[List[Union[int, str]]], 
                     markers_: List[List[int]], 
                     selected_numbers_: set, 
                     number_: int,
                     marker_attrs: Dict[str, List[int]]) -> int:
        """ mask the `mask_labels` for sdp and dep and record the maskers for each mask item
        Args:
            left_numbers (List[int]): the options that have not been used
            data_new (List[List[Union[int, str]]]): preprocessed data for original dep and sdp
            markers_ (List[List[int]]): a list that is uesd to save the maskers for each mask item
            selected_numbers_ (set): a set that is used to save the selected options
            number_ (int): the number of mask labels
            marker_attrs Dict[str, List[int]]: marker attributes
        Returns:
            int: 0 mean no mask, the others mean the number of masked ids
        """
        np.random.shuffle(left_numbers)
        for item_ in left_numbers:
            target_item = data_new[item_]
            seg_ids = np.array(target_item[:2]) - 1
            delete_ids = np.where(seg_ids < 1)[0]
            seg_ids = np.delete(seg_ids, delete_ids)
            temp_ids = seg2id(seg_ids)
            ids = []
            for item in temp_ids:
                ids += item.copy()
            if check_ids(ids):
                length_ = len(ids)
                if number_ > length_:
                    for id_ in ids:
                        mask_labels[id_] = 1
                    if target_item[2] in marker_attrs:
                        detail_info.append([
                            target_item,
                            [seg_data[target_item[0] - 1],seg_data[target_item[1] - 1]],
                        ])
                        if len(temp_ids) == 1:
                            markers_.append([temp_ids[0][0], temp_ids[0][-1]])
                        elif len(temp_ids) == 2:
                            for i in marker_attrs[target_item[2]]:
                                markers_.append([temp_ids[i][0], temp_ids[i][-1]])
                    selected_numbers_.add(item_)
                    return length_
                else:
                    return 0
        return 0

在完结对原始语句的预处理之后,在模型的dataloader里需求对数据进行常识注入,由于模型中引入了比照学习,因而该部分需求在数据转化阶段一起生成positive和negative的样本数据。完结这一进程的中心代码如下:

def get_positive_and_negative_examples(
    self,
    ner_data: str,
    negative_level: int = 3) -> Union[bool, Dict[str, List[str]]]:
    """get the positive examples and negative examples for the ner data
    Args:
        ner_data (str): the ner entity
        negative_level (int, optional): the deepth of the relationship. Defaults to 3.
    Returns:
        Union[bool, Dict[str, List[str]]]: if the `ner_data` not in `konwledge`, return False, otherwise, return the positive and negative examples
    """
    knowledge: Dict[str, Dict[str, str]] = self.Knowledge_G
    common_used = set()
    def get_data(key: str, 
                data: Dict[str, str], 
                results: List[str], 
                deep: int, 
                insert_flag: bool = False):
        """get the negative examples recursively
        Args:
            key (str): the ner
            data (Dict[str, str]): the related data about `key`
            results (List[str]): a list used to save the negative examples
            deep (int): the recursive number
            insert_flag (bool, optional): whether insert data to `results`. Defaults to False.
        """
        nonlocal knowledge
        common_used.add(key)
        if deep == 0:
            return
        else:
            for key_item in data:
                if data[key_item] not in common_used and insert_flag == True:
                    results.append(data[key_item])
                if data[key_item] in knowledge and data[key_item] not in common_used:
                    get_data(data[key_item], knowledge[data[key_item]], results, deep - 1, True)
    all_examples = {
        'ner': ner_data,
        'positive_examples': [],
        'negative_examples': []
    }
    if ner_data in knowledge:
        tp_data = knowledge[ner_data]
        negative_examples = []
        if '描绘' in tp_data:
            positive_example = tp_data['描绘']
        else:
            keys = list(tp_data.keys())
            choice = np.random.choice([_ for _ in range(len(keys))], 1)[0]
            positive_example = tp_data[keys[choice]]
        # # the description usually contains the ner entity, if not, concate the `ner_data` and the positive example
        if ner_data in positive_example:
            all_examples['positive_examples'].append(positive_example)
        else:
            all_examples['positive_examples'].append(ner_data + positive_example)
        get_data(ner_data, tp_data, negative_examples, negative_level)
        # concate the ner entity and each negative example
        negative_examples = list(map(lambda x: ner_data + x if ner_data not in x else x, negative_examples))
        all_examples['negative_examples'] = negative_examples
        return all_examples
    return False

在完结常识注入之后,模型的数据预处理环节就完结了。紧接着,由于常识注入需求额定添加特殊的Token,因而,在模型的Embedding层需求从头调整巨细,该部分的完结代码如下:

model.backbone.resize_token_embeddings(len(train_dataset.tokenizer))
model.config.vocab_size = len(train_dataset.tokenizer)

在对模型结构进行微调之后,最终便是修改原始的loss函数,由于引入了比照学习,这儿需求在本来loss的基础之上新加一个比照学习的loss(CKBert选用SimCLS作为比照学习的loss函数),该部分的中心代码完结如下:

def compute_simcse(self, original_outputs: torch.Tensor,
                   forward_outputs: torch.Tensor) -> float:
        original_hidden_states = original_outputs['hidden_states'].unsqueeze(-2)
        loss = nn.CrossEntropyLoss()
        forward_outputs = torch.mean(forward_outputs, dim=-2)
        cos_result = self.CosSim(original_hidden_states, forward_outputs)
        cos_result_size = cos_result.size()
        cos_result = cos_result.view(-1, cos_result_size[-1])
        labels = torch.zeros(cos_result.size(0), device=original_outputs['hidden_states'].device).long()
        loss_ = loss(cos_result, labels)
        return loss_

CKBERT加快预练习

由于CKBERT的预练习需求消耗大量时刻和核算资源,咱们有有必要对CKBERT的预练习进行加快。由于CKBERT选用PyTorch结构完结,与Tensorflow 1.x Graph Execution方法比较,PyTorch选用Eager Execution的方法运行,具有很好的易用性、容易开发调试等特色。可是,Pytorch短少模型的Graph IR(Intermediate Representation)表达,因而无法进行更深度的优化。遭到LazyTensor 和Pytorch/XLA(github.com/pytorch/xla)的启发,PAI团队在PyTorch结构中开发了TorchAccelerator,旨在处理PyTorch上的练习优化问题,在确保用户易用性和可调试行的基础上,提高用户练习速度。

由于LazyTensor在Eager Execution到Graph Execution转化进程中还存在许多缺点。通过将Custom Operation封装进XLA CustomCall、对Python代码进行AST解析等手法,TorchAccelerator提高了Eager Execution到Graph Execution的齐备性和转化功能,通过多Stream优化、Tensor异步传输等手法提高编译优化作用。

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

从试验成果来看,将TorchAccelerator和AMP(Automatic Mixed Precision,混合精度练习)结合起来运用,练习速度将会有40%以上的提高,阐明在AMP和TorchAccelerator进行相互作用下有比较好的加快作用。

CKBERT试验作用评测

为了验证CKBERT模型在各种使命上的精度,咱们在多个揭露数据集上验证了语句分类和NER使命的作用,如下所示:

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

NER数据集试验作用

模型 MSRA Weibo Onto. Resu.
BERT 95.20 54.65 81.61 94.86
MacBERT 95.07 54.93 81.96 95.22
PERT 94.99 53.74 81.44 95.10
ERNIE-Baidu 95.39 55.14 81.17 95.13
Lattice-BERT 95.28 54.99 82.01 95.31
K-BERT 94.97 55.21 81.98 94.92
ERNIE-THU 95.25 53.85 82.03 94.89
CKBERT-base 95.35 55.97 82.19 95.68
CKBERT-large 95.58 57.09 82.43 96.08
CKBERT-huge 96.79 58.66 83.87 97.19

上述成果阐明,首要在CLUE数据集上:(1)常识增强预练习模型的功能相较于BERT均有较大提高,在一定程度阐明晰常识的注入能协助模型进行更好的语义推理;(2)跟先前的较好的baseline模型比较,CKBERT的功能进一步得到了提高,这也阐明晰异构常识的注入有利于模型功能的提高;(3)模型参数量越大,异构常识的的注入所带来的提高越明显,这在咱们的huge模型和base模型之间的比照上可以看出。其次,在NER数据集上:(1)常识增强预练习模型的功能相较于BERT也有一定的提高;(2)CKBERT模型相较于其他baseline模型的提高较大,这进一步阐明晰异构常识的注入关于模型功能的提高是有协助的。

CKBERT模型使⽤教程

以下咱们简要介绍如安在EasyNLP结构使⽤CKBERT模型。

装置EasyNLP

⽤户可以直接参阅GitHub(github.com/alibaba/Eas…)上的阐明装置EasyNLP算法结构。

模型预练习

以下介绍CKBERT模型的预练习调用进程,假如用户没有自行预练习的需求可以跳过此部分。

数据预备

CKBERT是一个常识嵌入的预练习模型,需求用户自己预备相应的原始练习数据(xxx.json)和常识图谱(xxx.spo),其中数据分隔均运用\t分隔符。练习数据的格式为{‘text’:[‘xxx’], ‘title’:’xxx’},样例如下:

{'text': ['我想,假如我没有去做大学生村官,恐怕我这个在昆明长大的孩子永久都不能切身感遭到云南这次60年一遇的特大旱情的严峻性,恐怕我仅仅每天看着新闻上那些缺水的镜头,嘴上说要节水,但现实举动坚持不了三天。 我任职的当地在昆明市禄劝县的一个村委会,说实话这儿间隔禄劝县城不远,自然环境不算很差。现在,只要一个自然村确保不了饮用水。一个自然村根本能确保有饮用水到5月。这儿所说的饮用水,是指从山肚子里出来的水,积在小塘坝或是水塘里又通过管道运送到村子里的水,和咱们城市里真实含义上消过毒的、能安全饮用的饮用水不同。在整个运送的进程中,或许现已产生了有害物质。我觉得是。 没有饮用水的那个自然村叫大海子村,50户,近200多人。地处山头,交通很不便利,走路大概要1个半小时到两个小时,而且斜度比较大,是一个苗族寨子。地舆条件约束,根本没有什么经济作物,算是靠天吃饭的那种。本年遇到60年一遇的干旱,村里的两个水窖都根本干了,之前几天,他们村长来反映,几个白叟现已是抬个小板凳坐到窖底用碗舀水了。 面对这么严峻的旱情,村委会的领导和各小组长都在想方法。可是上山的路路面状况差,大车重车上不去;周边水源地少。最可行的方法便是从武定那儿绕路上去。但每天运水上去也不是方法,长远来看还是要建筑一个小塘坝。村委会的领导主动捐款,乡民也自行筹资,开端自救。 最近每个周末都回家,增加防晒品,由于根本每天都上山下村去了解状况,有必要把握辖区内13个村小组水资源的状况。我每次回家见到朋友们,榜首句便是,要节约用水啊~~ 朋友们,你们现在看到的仅仅简略了解的"缺水"。你们所不知道的是,没水小春作物面对绝收、4月份插秧没有水泡秧田、5月份种烤烟也没有水。。。那么对农人就意味着本年一年就没有了收入。咱们现在能尽力做好的,仅仅确保人的饮用水。 上周就在想能不能通过什么途径帮乡民们做点事。叔叔叫我弄个抗旱的基金,他发起周围的朋友来捐献,期望能口口相传带动多一点朋友。我正在准备阶段,看怎样才干做到最大的揭露通明,让捐献的人彻底定心。 周一接到一个朋友的电话,说他们公司想为旱灾献点爱心,想买点水送去咱们那儿。昨天见了负责人,很谦和的一个姐姐,她说咱们都想做点什么,觉得捐钱没什么含义,想亲身送水到最需求的当地。 其实人家仅仅家私营的小公司,但我真的很感谢他们。姐姐还特别告知我,咱们只需求找拖拉机下来协助把水运上山去,其他的什么都不必管,他们会安排好的。这个周末,将有 400件矿泉水会送到乡民家里。我想,应该可以暂时缓解旱情。再次代乡民感谢他们! 下半年,旱情给农人的出产、日子带来的问题还许多。可是我个人的力气很有限,期望可以看到这些帖子的朋友们,假如有才能,有这份心意的话,请给予旱灾区域的农人更多的协助。 我想咱们都知道,昆明80%以上的用水都来自禄劝的云龙水库,云龙的搭档们也在"抗旱",他们的工作使命是要确保严格的节约用水,要寻求其他水源用水,然后确保昆明的用水。所以,请每一个昆明人都节水吧,禄劝的许多当地都在缺水,咱们那里不算严峻的,请爱惜你们现在在用的每一滴水~ 或许,要经历过这样一次触目惊心的大旱才真实知道水的宝贵。期望咱们都举动起来,不要再让这样的旱灾侵袭咱们的家园。'], 'title': '旱情记要-----昆明人,请爱惜你们现在在用的每一滴水~'}

常识图谱数据格式为三列数据,从左到右别离是实体联系的描绘,样例如下:

红色食物	标签	日子

数据预处理

可以运用供给的数据预处理脚本(preprocess/run_local_preprocess.sh)来对原始数据进行一键处理,在通过LTP处理之后,数据样例如下:

{"text": ["我想,假如我没有去做大学生村官,恐怕我这个在昆明长大的孩子永久都不能切身感遭到云南这次60年一遇的特大旱情的严峻性,恐怕我仅仅每天看着新闻上那些缺水的镜头,嘴上说要节水,但现实举动坚持不了三天。我任职的当地在昆明市禄劝县的一个村委会,说实话这儿间隔禄劝县城不远,自然环境不算很差。现在,只要一个自然村确保不了饮用水。一个自然村根本能确保有饮用水到5月。这儿所说的饮用水,是指从山肚子里出来的水,积在小塘坝或是水塘里又通过管道运送到村子里的水,和咱们城市里真实含义上消过毒的、能安全饮用的饮用水不同。在整个运送的进程中,或许现已产生了有害物质。我觉得是。没有饮用水的那个自然村叫大海子村,50户,近200多人。地处山头,交通很不便利,走路大概要1个半小时到两个小时,而且斜度比较大,是一个苗族寨子。地舆条件约束,根本没有什么经济作物,算是靠天吃饭的那种。本年遇到60年一遇的干旱,村里的两个水窖都根本干了,之前几天,他们村长来反映,几个白叟现已是抬个小板凳坐到窖底用碗舀水了。面对这么严峻的旱情,村委会的领导和各小组长都在想方法。可是上山的路路面状况差,大车重车上不去;周边水源地少。最可行的方法便是从武定那儿绕路上去。但每天运水上去也不是方法,长远来看还是要建筑一个小塘坝。村委会的领导主动捐款,乡民也自行筹资,开端自救。最近每个周末都回家,增加防晒品,由于根本每天都上山下村去了解状况,有必要把握辖区内13个村小组水资源的状况。我每次回家见到朋友们,榜首句便是,要节约用水啊~~朋友们,你们现在看到的仅仅简略了解的"缺水"。你们所不知道的是,没水小春作物面对绝收、4月份插秧没有水泡秧田、5月份种烤烟也没有水。。。那么对农人就意味着本年一年就没有了收入。咱们现在能尽力做好的,仅仅确保人的饮用水。上周就在想能不能通过什么途径帮乡民们做点事。叔叔叫我弄个抗旱的基金,他发起周围的朋友来捐献,期望能口口相传带动多一点朋友。我正在准备阶段,看怎样才干做到最大的揭露通明,让捐献的人彻底定心。周一接到一个朋友的电话,说他们公司想为旱灾献点爱心,想买点水送去咱们那儿。昨天见了负责人,很谦和的一个姐姐,她说咱们都想做点什么,觉得捐钱没什么含义,想亲身送水到最需求的当地。其实人家仅仅家私营的小公司,但我真的很感谢他们。姐姐还特别告知我,咱们只需求找拖拉机下来协助把水运上山去,其他的什么都不必管,他们会安排好的。这个周末,将有400件矿泉水会送到乡民家里。我想,应该可以暂时缓解旱情。再次代乡民感谢他们!下半年,旱情给农人的出产、日子带来的问题还许多。可是我个人的力气很有限,期望可以看到这些帖子的朋友们,假如有才能,有这份心意的话,请给予旱灾区域的农人更多的协助。我想咱们都知道,昆明80%以上的用水都来自禄劝的云龙水库,云龙的搭档们也在"抗旱",他们的工作使命是要确保严格的节约用水,要寻求其他水源用水,然后确保昆明的用水。所以,请每一个昆明人都节水吧,禄劝的许多当地都在缺水,咱们那里不算严峻的,请爱惜你们现在在用的每一滴水~或许,要经历过这样一次触目惊心的大旱才真实知道水的宝贵。期望咱们都举动起来,不要再让这样的旱灾侵袭咱们的家园。"], "title": "旱情记要-----昆明人,请爱惜你们现在在用的每一滴水~", "seg": ["我", "想", ",", "假如", "我", "没有", "去", "做", "大学生村官", ",", "恐怕", "我", "这个", "在", "昆明长大", "的", "孩子", "永久", "都", "不能切身感遭到", "云南", "这次", "60年", "一遇的", "特大旱情", "的", "严峻性", ",", "恐怕", "我", "仅仅", "每天", "看", "着", "新闻上", "那些", "缺水", "的", "镜头", ",", "嘴上说要节水", ",", "但现实举动", "坚持不了", "三天", "。", "我", "任职", "的", "当地", "在", "昆明市禄劝县", "的", "一个", "村委会", ",", "说实话", "这儿", "间隔禄", "劝县城不远", ",", "自然环境", "不算", "很差", "。", "现在", ",", "只要", "一个", "自然村", "确保不了", "饮用水", "。", "一个", "自然村", "根本", "能", "确保", "有", "饮用水", "到", "5月", "。", "这儿所说", "的", "饮用水", ",", "是指", "从", "山肚子里", "出来", "的", "水", ",积在", "小塘坝", "或是", "水塘里", "又", "通过", "管道", "运送到", "村子里", "的水", ",", "和", "咱们", "城市里", "真实含义上", "消过毒的", "、能安全", "饮用", "的", "饮用水不同", "。", "在", "整个", "运送", "的", "进程", "中", ",", "或许", "现已", "产生", "了", "有害物质", "。", "我", "觉得", "是", "。", "没有", "饮用水", "的", "那", "个", "自然村叫大海子村", ",", "50户", ",近", "200多人", "。地处山头", ",", "交通", "很不便利", ",", "走路", "大概要", "1个半小时到", "两个", "小时", ",", "而且斜度", "比较大", ",", "是", "一个", "苗族寨子", "。地舆条件", "约束", ",", "根本", "没有什么经济作物", ",", "算是", "靠天", "吃饭", "的", "那种", "。", "本年", "遇到", "60年一遇", "的", "干旱", ",村里", "的", "两个水窖", "都", "根本", "干", "了", ",之前几天", ",", "他们", "村长来反映", ",", "几个白叟", "现已", "是", "抬个小板凳坐到窖底用碗舀水", "了", "。面对", "这么", "严峻的", "旱情", ",", "村委会", "的领导", "和", "各小组长", "都", "在", "想", "方法", "。", "可是上山的", "路路面状况", "差", ",", "大车重车上不去", ";", "周边水源地少", "。", "最", "可行", "的", "方法", "便是", "从武定", "那儿", "绕路上去", "。", "但", "每天运水上"], "ner": [["Ns", 14, 14], ["Ns", 20, 20], ["Ns", 51, 51]], "dep": [[1, 2, "SBV"], [2, 0, "HED"], [3, 2, "WP"], [4, 6, "ADV"], [5, 6, "SBV"], [6, 2, "VOB"], [7, 6, "COO"], [8, 7, "COO"], [9, 8, "VOB"], [10, 8, "WP"], [11, 7, "COO"], [12, 172, "SBV"], [13, 172, "ADV"], [14, 172, "ADV"], [15, 14, "POB"], [16, 172, "RAD"], [17, 172, "SBV"], [18, 172, "ADV"], [19, 172, "ADV"], [20, 172, "ADV"], [21, 172, "SBV"], [22, 172, "ADV"], [23, 172, "ADV"], [24, 172, "ADV"], [25, 172, "ADV"], [26, 172, "RAD"], [27, 172, "VOB"], [28, 156, "WP"], [29, 33, "ADV"], [30, 33, "SBV"], [31, 33, "ADV"], [32, 33, "ADV"], [33, 156, "COO"], [34, 33, "RAD"], [35, 39, "ATT"], [36, 39, "ATT"], [37, 39, "ATT"], [38, 37, "RAD"], [39, 33, "VOB"], [40, 33, "WP"], [41, 44, "ADV"], [42, 44, "WP"], [43, 44, "ADV"], [44, 33, "COO"], [45, 44, "CMP"], [46, 44, "WP"], [47, 48, "SBV"], [48, 55, "ATT"], [49, 48, "RAD"], [50, 51, "POB"], [51, 48, "ADV"], [52, 51, "POB"], [53, 48, "RAD"], [54, 55, "ATT"], [55, 44, "SBV"], [56, 44, "WP"], [57, 44, "ADV"], [58, 59, "SBV"], [59, 44, "ADV"], [60, 44, "COO"], [61, 44, "WP"], [62, 63, "SBV"], [63, 71, "CMP"], [64, 71, "CMP"], [65, 71, "WP"], [66, 71, "ADV"], [67, 71, "WP"], [68, 71, "ADV"], [69, 70, "ATT"], [70, 71, "SBV"], [71, 44, "COO"], [72, 71, "COO"], [73, 71, "WP"], [74, 75, "ATT"], [75, 71, "SBV"], [76, 78, "ADV"], [77, 78, "ADV"], [78, 44, "COO"], [79, 78, "VOB"], [80, 78, "VOB"], [81, 80, "CMP"], [82, 81, "POB"], [83, 78, "WP"], [84, 86, "ATT"], [85, 84, "RAD"], [86, 78, "COO"], [87, 78, "WP"], [88, 44, "COO"], [89, 91, "ADV"], [90, 89, "POB"], [91, 93, "ATT"], [92, 91, "RAD"], [93, 101, "VOB"], [94, 101, "WP"], [95, 101, "CMP"], [96, 97, "LAD"], [97, 101, "VOB"], [98, 101, "ADV"], [99, 101, "ADV"], [100, 99, "POB"], [101, 156, "COO"], [102, 101, "SBV"], [103, 101, "RAD"], [104, 101, "WP"], [105, 109, "ADV"], [106, 107, "ATT"], [107, 105, "POB"], [108, 109, "ADV"], [109, 156, "COO"], [110, 111, "WP"], [111, 109, "COO"], [112, 109, "RAD"], [113, 109, "COO"], [114, 129, "WP"], [115, 129, "ADV"], [116, 119, "ATT"], [117, 119, "ATT"], [118, 117, "RAD"], [119, 120, "ATT"], [120, 115, "POB"], [121, 129, "WP"], [122, 124, "ADV"], [123, 124, "ADV"], [124, 129, "COO"], [125, 124, "RAD"], [126, 129, "COO"], [127, 129, "WP"], [128, 129, "SBV"], [129, 109, "COO"], [130, 129, "VOB"], [131, 129, "WP"], [132, 133, "COO"], [133, 109, "COO"], [134, 109, "RAD"], [135, 109, "ADV"], [136, 137, "ATT"], [137, 109, "SBV"], [138, 109, "WP"], [139, 109, "ADV"], [140, 109, "WP"], [141, 109, "ADV"], [142, 109, "WP"], [143, 109, "WP"], [144, 109, "COO"], [145, 109, "ADV"], [146, 156, "WP"], [147, 156, "SBV"], [148, 156, "ADV"], [149, 151, "ATT"], [150, 151, "ATT"], [151, 156, "VOB"], [152, 156, "WP"], [153, 156, "ADV"], [154, 156, "ADV"], [155, 156, "WP"], [156, 167, "COO"], [157, 158, "ATT"], [158, 167, "VOB"], [159, 160, "WP"], [160, 167, "COO"], [161, 160, "WP"], [162, 163, "ADV"], [163, 167, "COO"], [164, 165, "WP"], [165, 163, "COO"], [166, 163, "ADV"], [167, 27, "ATT"], [168, 167, "RAD"], [169, 172, "ADV"], [170, 172, "WP"], [171, 172, "ADV"], [172, 7, "COO"], [173, 175, "ATT"], [174, 175, "RAD"], [175, 172, "VOB"], [176, 175, "WP"], [177, 175, "RAD"], [178, 175, "ATT"], [179, 181, "ADV"], [180, 181, "ADV"], [181, 6, "COO"], [182, 181, "RAD"], [183, 181, "WP"], [184, 181, "WP"], [185, 190, "SBV"], [186, 190, "SBV"], [187, 190, "WP"], [188, 190, "SBV"], [189, 190, "ADV"], [190, 181, "COO"], [191, 190, "VOB"], [192, 191, "RAD"], [193, 191, "WP"], [194, 195, "ADV"], [195, 204, "CMP"], [196, 204, "VOB"], [197, 204, "WP"], [198, 204, "SBV"], [199, 198, "RAD"], [200, 204, "LAD"], [201, 204, "SBV"], [202, 204, "ADV"], [203, 204, "ADV"], [204, 191, "COO"], [205, 204, "VOB"], [206, 204, "WP"], [207, 204, "ADV"], [208, 209, "SBV"], [209, 191, "ADV"], [210, 209, "WP"], [211, 209, "SBV"], [212, 209, "WP"], [213, 209, "SBV"], [214, 209, "WP"], [215, 216, "ADV"], [216, 218, "ATT"], [217, 216, "RAD"], [218, 209, "SBV"], [219, 209, "ADV"], [220, 191, "ADV"], [221, 191, "ADV"], [222, 181, "COO"], [223, 181, "WP"], [224, 181, "ADV"], [225, 181, "ADV"]], "sdp": [[1, 2, "AGT"], [1, 129, "AGT"], [2, 0, "Root"], [3, 2, "mPUNC"], [4, 7, "mRELA"], [5, 7, "AGT"], [5, 8, "AGT"], [6, 7, "mNEG"], [6, 8, "mNEG"], [7, 2, "dCONT"], [8, 7, "eSUCC"], [9, 8, "LINK"], [10, 8, "mPUNC"], [11, 8, "eSUCC"], [12, 172, "EXP"], [13, 172, "SCO"], [14, 15, "mRELA"], [15, 167, "LOC"], [15, 172, "LOC"], [16, 172, "mDEPD"], [17, 172, "EXP"], [18, 172, "mDEPD"], [19, 172, "mDEPD"], [20, 172, "mNEG"], [21, 172, "AGT"], [22, 172, "SCO"], [23, 172, "EXP"], [24, 172, "EXP"], [25, 172, "MANN"], [26, 172, "mDEPD"], [27, 172, "CONT"], [28, 172, "mPUNC"], [29, 33, "mDEPD"], [30, 33, "AGT"], [31, 33, "mDEPD"], [32, 33, "mDEPD"], [33, 172, "eSUCC"], [34, 33, "mDEPD"], [35, 39, "FEAT"], [36, 39, "SCO"], [37, 39, "rEXP"], [38, 37, "mDEPD"], [39, 33, "CONT"], [40, 33, "mPUNC"], [41, 44, "LOC"], [42, 44, "mPUNC"], [43, 44, "mRELA"], [44, 33, "eSUCC"], [45, 44, "TIME"], [46, 44, "mPUNC"], [47, 48, "AGT"], [47, 60, "PAT"], [47, 204, "AGT"], [48, 55, "rDATV"], [49, 48, "mDEPD"], [50, 48, "LOC"], [51, 50, "mRELA"], [52, 50, "FEAT"], [53, 48, "mDEPD"], [54, 55, "MEAS"], [55, 44, "EXP"], [56, 44, "mPUNC"], [57, 44, "eCOO"], [58, 59, "EXP"], [59, 44, "eSUCC"], [60, 44, "eSUCC"], [61, 60, "mPUNC"], [62, 60, "PAT"], [63, 60, "eSUCC"], [64, 63, "mDEPD"], [65, 71, "mPUNC"], [66, 71, "TIME"], [67, 66, "mPUNC"], [68, 71, "mDEPD"], [69, 70, "MEAS"], [70, 71, "AGT"], [71, 60, "eCOO"], [72, 71, "dCONT"], [73, 72, "mPUNC"], [74, 75, "MEAS"], [75, 72, "AGT"], [76, 78, "mDEPD"], [77, 78, "mDEPD"], [78, 44, "eSUCC"], [79, 78, "dCONT"], [80, 79, "LINK"], [81, 79, "eCOO"], [82, 81, "TIME"], [83, 91, "mPUNC"], [84, 91, "LOC"], [85, 91, "mDEPD"], [86, 88, "EXP"], [87, 88, "mPUNC"], [88, 91, "mDEPD"], [89, 90, "mRELA"], [90, 91, "LOC"], [91, 79, "eSUCC"], [92, 91, "mDEPD"], [93, 79, "EXP"], [94, 93, "mPUNC"], [95, 93, "FEAT"], [96, 97, "mRELA"], [97, 93, "eCOO"], [98, 78, "mDEPD"], [99, 100, "mRELA"], [100, 101, "MANN"], [101, 78, "dCONT"], [102, 107, "FEAT"], [102, 109, "SCO"], [103, 109, "mDEPD"], [104, 109, "mPUNC"], [105, 107, "mRELA"], [106, 107, "FEAT"], [107, 109, "SCO"], [108, 109, "mDEPD"], [109, 101, "ePREC"], [110, 109, "mPUNC"], [111, 109, "eSUCC"], [112, 109, "mDEPD"], [113, 109, "eSUCC"], [114, 129, "mPUNC"], [115, 119, "mRELA"], [116, 119, "SCO"], [117, 119, "FEAT"], [118, 117, "mDEPD"], [119, 124, "STAT"], [120, 119, "mDEPD"], [121, 119, "mPUNC"], [122, 124, "mDEPD"], [123, 124, "mDEPD"], [124, 129, "dCONT"], [125, 124, "mDEPD"], [126, 129, "dCONT"], [127, 129, "mPUNC"], [128, 129, "AGT"], [129, 109, "eSUCC"], [130, 129, "dCONT"], [131, 129, "mPUNC"], [132, 109, "ePREC"], [133, 109, "eSUCC"], [134, 109, "mDEPD"], [135, 109, "SCO"], [136, 137, "MEAS"], [137, 109, "FEAT"], [138, 109, "mPUNC"], [139, 109, "FEAT"], [140, 109, "mPUNC"], [141, 109, "FEAT"], [142, 109, "mPUNC"], [143, 8, "mPUNC"], [143, 109, "mPUNC"], [144, 109, "eSUCC"], [145, 160, "mDEPD"], [146, 160, "mPUNC"], [147, 160, "eSUCC"], [148, 147, "mDEPD"], [149, 147, "MEAS"], [150, 151, "MEAS"], [151, 147, "TIME"], [152, 147, "mPUNC"], [153, 156, "mRELA"], [154, 156, "mRELA"], [155, 156, "mPUNC"], [156, 160, "mDEPD"], [157, 158, "MEAS"], [158, 156, "LINK"], [159, 156, "mPUNC"], [160, 109, "eSUCC"], [161, 160, "mPUNC"], [162, 163, "mDEPD"], [163, 160, "dEXP"], [164, 165, "mPUNC"], [165, 160, "eCOO"], [166, 167, "mRELA"], [167, 165, "dEXP"], [168, 167, "mDEPD"], [169, 167, "SCO"], [170, 160, "mPUNC"], [171, 172, "TIME"], [172, 11, "dCONT"], [173, 8, "MEAS"], [174, 175, "mDEPD"], [175, 8, "eSUCC"], [176, 175, "mPUNC"], [177, 181, "mDEPD"], [178, 181, "EXP"], [179, 181, "mDEPD"], [180, 181, "mDEPD"], [181, 2, "dCONT"], [182, 44, "mDEPD"], [182, 209, "mDEPD"], [183, 209, "mPUNC"], [184, 209, "mPUNC"], [185, 44, "AGT"], [185, 209, "EXP"], [186, 185, "eCOO"], [187, 209, "mPUNC"], [188, 191, "MEAS"], [189, 191, "mDEPD"], [190, 191, "eSUCC"], [191, 209, "dEXP"], [192, 204, "mDEPD"], [193, 204, "mPUNC"], [194, 195, "SCO"], [195, 204, "FEAT"], [196, 204, "CONT"], [197, 204, "mPUNC"], [198, 204, "AGT"], [199, 48, "mDEPD"], [199, 198, "mDEPD"], [200, 204, "mRELA"], [201, 204, "AGT"], [202, 204, "mDEPD"], [203, 204, "eCOO"], [204, 209, "ePREC"], [205, 204, "CONT"], [206, 204, "mPUNC"], [207, 204, "mDEPD"], [208, 204, "LOC"], [209, 181, "eSUCC"], [210, 209, "mPUNC"], [211, 209, "EXP"], [212, 209, "mPUNC"], [213, 209, "EXP"], [214, 209, "mPUNC"], [215, 216, "mDEPD"], [216, 218, "FEAT"], [217, 37, "mDEPD"], [217, 216, "mDEPD"], [218, 209, "EXP"], [219, 209, "mDEPD"], [220, 221, "mRELA"], [221, 209, "LOC"], [222, 181, "eSUCC"], [223, 181, "mPUNC"], [224, 181, "mRELA"], [225, 181, "SCO"]]}

紧接着,调用相应的mask战略对数据进行处理,处理后的数据样例如下:

[['[CLS]', '我', '想', ',', '如', '果', '我', '没', '有', '去', '做', '大', '学', '生', '村', '官', ',', '恐', '怕', '我', '这', '个', '在', '昆', '明', '长', '大', '的', '孩', '子', '永', '远', '都', '不', '能', '切', '身', '感', '受', '到', '云', '南', '这', '次', '6', '0', '年', '一', '遇', '的', '特', '大', '旱', '情', '的', '严', '重', '性', ',', '恐', '怕', '[sdp]', '我', '[sdp]', '只', '是', '每', '天', '[sdp]', '看', '[sdp]', '着', '新', '闻', '上', '那', '些', '缺', '水', '的', '镜', '头', ',', '嘴', '上', '说', '要', '节', '水', ',', '但', '事', '实', '行', '动', '保', '持', '不', '了', '三', '天', '。', '我', '任', '职', '的', '地', '方', '在', '昆', '明', '市', '禄', '劝', '县', '的', '一', '个', '村', '委', '会', ',', '说', '实', '话', '这', '里', '[SEP]'], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], ['昆明长大', '云南', '昆明市禄劝县']]

预练习脚本

数据处理完毕之后,就可以调用预练习脚本进行模型的预练习,脚本如下:

gpu_number=1
negative_e_number=4
negative_e_length=16
base_dir=$PWD
checkpoint_dir=$base_dir/checkpoints
resources=$base_dir/resources
local_kg=$resources/ownthink_triples_small.txt
local_train_file=$resources/train_small.txt
remote_kg=https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/ckbert/ownthink_triples_small.txt
remote_train_file=https://atp-modelzoo-sh.oss-cn-shanghai.aliyuncs.com/release/tutorials/ckbert/train_small.txt
if [ ! -d $checkpoint_dir ];then
mkdir $checkpoint_dir
fi
if [ ! -d $resources ];then
mkdir $resources
fi
if [ ! -f $local_kg ];then
wget -P $resources $remote_kg
fi
if [ ! -f $local_train_file ];then
wget -P $resources $remote_train_file
fi
python -m torch.distributed.launch --nproc_per_node=$gpu_number \
--master_port=52349 \
$base_dir/main.py \
--mode=train \
--worker_gpu=$gpu_number \
--tables=$local_train_file, \
--learning_rate=5e-5  \
--epoch_num=5  \
--logging_steps=10 \
--save_checkpoint_steps=2150 \
--sequence_length=256 \
--train_batch_size=20 \
--checkpoint_dir=$checkpoint_dir \
--app_name=language_modeling \
--use_amp \
--save_all_checkpoints \
--user_defined_parameters="pretrain_model_name_or_path=hfl/macbert-base-zh external_mask_flag=True contrast_learning_flag=True negative_e_number=${negative_e_number} negative_e_length=${negative_e_length} kg_path=${local_kg}"

模型Finetune

CKBERT模型与BERT是相同的架构,只需求运用通用的EasyNLP结构指令就可以进行调用。以下指令别离为Train和Predict状态的比如,运用的模型为ckbert-base。

当时在EasyNLP结构中也可以调用large和huge模型进行测试,只需求替换指令中的参数即可

  • pretrain_model_name_or_path=alibaba-pai/pai-ckbert-large-zh
  • pretrain_model_name_or_path=alibaba-pai/pai-ckbert-huge-zh
$ easynlp \
   --mode=train \
   --worker_gpu=1 \
   --tables=train.tsv,dev.tsv \
   --input_schema=label:str:1,sid1:str:1,sid2:str:1,sent1:str:1,sent2:str:1 \
   --first_sequence=sent1 \
   --label_name=label \
   --label_enumerate_values=0,1 \
   --checkpoint_dir=./classification_model \
   --epoch_num=1  \
   --sequence_length=128 \
   --app_name=text_classify \
   --user_defined_parameters='pretrain_model_name_or_path=alibaba-pai/pai-ckbert-base-zh'
$ easynlp \
  --mode=predict \
  --tables=dev.tsv \
  --outputs=dev.pred.tsv \
  --input_schema=label:str:1,sid1:str:1,sid2:str:1,sent1:str:1,sent2:str:1 \
  --output_schema=predictions,probabilities,logits,output \
  --append_cols=label \
  --first_sequence=sent1 \
  --checkpoint_path=./classification_model \
  --app_name=text_classify

在HuggingFace上运用CKBERT模型

为了便利开源用户运用CKBERT,咱们也将三个CKBERT模型在HuggingFace Models上架,其Model Card如下所示:

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

用户也可以直接运用HuggingFace供给的pipeline进行模型推理,样例如下:

from transformers import AutoTokenizer, AutoModelForMaskedLM, FillMaskPipeline
tokenizer = AutoTokenizer.from_pretrained("alibaba-pai/pai-ckbert-base-zh", use_auth_token=True)
model = AutoModelForMaskedLM.from_pretrained("alibaba-pai/pai-ckbert-base-zh", use_auth_token=True)
unmasker = FillMaskPipeline(model, tokenizer)   
unmasker("巴黎是[MASK]国的首都。",top_k=5)
[
    {'score': 0.8580496311187744, 
     'token': 3791, 
     'token_str': '法', 
     'sequence': '巴 黎 是 法 国 的 首 都 。'}, 
    {'score': 0.08550138026475906, 
     'token': 2548, 
     'token_str': '德', 
     'sequence': '巴 黎 是 德 国 的 首 都 。'}, 
    {'score': 0.023137662559747696, 
     'token': 5401, 
     'token_str': '美', 
     'sequence': '巴 黎 是 美 国 的 首 都 。'}, 
    {'score': 0.012281022034585476, 
     'token': 5739, 'token_str': '英', 
     'sequence': '巴 黎 是 英 国 的 首 都 。'}, 
    {'score': 0.005729076452553272, 
     'token': 704, 'token_str': '中', 
     'sequence': '巴 黎 是 中 国 的 首 都 。'}
]

或者也可以运用Pytorch加载模型,样例如下:

from transformers import AutoTokenizer, AutoModelForMaskedLM
tokenizer = AutoTokenizer.from_pretrained("alibaba-pai/pai-ckbert-base-zh", use_auth_token=True)
model = AutoModelForMaskedLM.from_pretrained("alibaba-pai/pai-ckbert-base-zh", use_auth_token=True)
text = "巴黎是[MASK]国的首都。"
encoded_input = tokenizer(text, return_tensors='pt')
output = model(**encoded_input)

在阿里云机器学习途径PAI上运用CKBERT模型

PAI-DSW(Data Science Workshop)是阿里云机器学习途径PAI开发的云上IDE,面向不同水平的开发者,供给了交互式的编程环境(文档)。在DSW Gallery中,供给了各种Notebook示例,便利用户轻松上手DSW,搭建各种机器学习运用。咱们也在DSW Gallery中上架了运用CKBERT进行中文命名实体辨认的Sample Notebook(见下图),欢迎咱们体会!

EasyNLP发布融合语言学和事实知识的中文预训练模型CKBERT

未来展望

在未来,咱们方案在EasyNLP结构中集成更多中⽂常识模型,掩盖各个常⻅中⽂范畴,敬请期待。咱们也将在EasyNLP结构中集成更多SOTA模型(特别是中⽂模型),来⽀持各种NLP和多模态使命。此外, 阿⾥云机器学习PAI团队也在继续推动中⽂多模态模型的⾃研⼯作,欢迎⽤户继续关注咱们,也欢迎加⼊ 咱们的开源社区,共建中⽂NLP和多模态算法库!

Github地址:github.com/alibaba/Eas…

Reference

  1. Chengyu Wang, Minghui Qiu, Taolin Zhang, Tingting Liu, Lei Li, Jianing Wang, Ming Wang, Jun Huang, Wei Lin. EasyNLP: A Comprehensive and Easy-to-use Toolkit for Natural Language Processing. EMNLP 2022
  2. Taolin Zhang, Junwei Dong, Jianing Wang, Chengyu Wang, Ang Wang, Yinghui Liu, Jun Huang, Yong Li, Xiaofeng He. Revisiting and Advancing Chinese Natural Language Understanding with Accelerated Heterogeneous Knowledge Pre-training. EMNLP 2022
  3. Yiming Cui, Wanxiang Che, Ting Liu, Bing Qin, Shijin Wang, Guoping Hu. Revisiting Pre-Trained Models for Chinese Natural Language Processing. EMNLP (Findings) 2020
  4. Yiming Cui, Ziqing Yang, Ting Liu. PERT: Pre-training BERT with Permuted Language Model. arXiv
  5. Yu Sun, Shuohuan Wang, Yukun Li, Shikun Feng, Xuyi Chen, Han Zhang, Xin Tian, Danxiang Zhu, Hao Tian, Hua Wu. ERNIE: Enhanced Representation through Knowledge Integration. arXiv
  6. Yuxuan Lai, Yijia Liu, Yansong Feng, Songfang Huang, and Dongyan Zhao. Lattice-BERT: Leveraging Multi-Granularity Representations in Chinese Pre-trained Language Models. NAACL 2021
  7. Weijie Liu, Peng Zhou, Zhe Zhao, Zhiruo Wang, Qi Ju, Haotang Deng, Ping Wang. K-BERT: Enabling Language Representation with Knowledge Graph. AAAI 2020
  8. Zhengyan Zhang, Xu Han, Zhiyuan Liu, Xin Jiang, Maosong Sun, Qun Liu. ERNIE: Enhanced Language Representation with Informative Entities. ACL 2019

阿里灵杰回忆

  • 阿里灵杰:阿里云机器学习PAI开源中文NLP算法结构EasyNLP,助力NLP大模型落地
  • 阿里灵杰:预练习常识度量竞赛夺冠!阿里云PAI发布常识预练习东西
  • 阿里灵杰:EasyNLP带你玩转CLIP图文检索
  • 阿里灵杰:EasyNLP中文文图生成模型带你秒变艺术家
  • 阿里灵杰:EasyNLP集成K-BERT算法,借助常识图谱完结更优Finetune
  • 阿里灵杰:中文稀少GPT大模型落地 — 通往低成本&高功能多使命通用自然言语了解的要害里程碑
  • 阿里灵杰:EasyNLP玩转文本摘要(新闻标题)生成
  • 阿里灵杰:跨模态学习才能再升级,EasyNLP电商文图检索作用刷新SOTA
  • 阿里灵杰:EasyNLP带你完结中英文机器阅览了解
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。