利用BERT预训练模型进行分类任务代码

利用BERT预训练模型进行分类任务代码

  • What is BERT?
    BERT是一种预先训练语言表示的方法,这意味着我们在一个大型文本语料库(如Wikipedia)上训练一个通用的“语言理解”模型,然后将该模型用于我们关心的下游NLP任务(如回答问题)。BERT优于以前的方法,因为它是第一个无监督的,深度双向的预训练自然语言处理系统。

    预先训练过的表示既可以是上下文无关的,也可以是上下文相关的,而上下文相关的表示进一步可以是单向的或双向的。bert就是与上下文相关的。
    1、BERT使用了一种简单的方法:我们屏蔽掉输入中的15%的单词,通过一个深度双向变压器编码器运行整个序列,然后只预测屏蔽的单词。

    Input: the man went to the [MASK1] . he bought a [MASK2] of milk.
    Labels: [MASK1] = store; [MASK2] = gallon
    

    2、为了学习句子之间的关系,我们还训练了一个简单的任务,这个任务可以从任何单语语料库中生成:给定两个句子a和B, B是a后面的实际下一个句子,还是只是语料库中随机出现的一个句子?

    Sentence A: the man went to the store .
    Sentence B: he bought a gallon of milk .
    Label: IsNextSentence
    
    Sentence A: the man went to the store .
    Sentence B: penguins are flightless .
    Label: NotNextSentence
    

    使用BERT分为两个阶段:预训练和微调。预训练相当昂贵(4到16个云tpu的4天),但对于每种语言都是一次性的过程(目前的模型只支持英语,但多语言模型将在不久的将来发布)。我们从论文中发布了一些在谷歌上预训练的模型。大多数NLP研究人员永远不需要从头开始预训练他们自己的模型。微调是便宜的。从完全相同的预先训练过的模型出发,论文中的所有结果在单个云TPU上最多只需1小时,或在GPU上只需数小时。例如,在一个单一的云TPU上训练30分钟左右,就可以达到Dev F1的91.0%,这是单一系统中最先进的。

    BERT的另一个重要方面是,它可以很容易地适应多种类型的自然语言处理任务。在这篇论文中,我们在句子水平(如SST-2)、句子对水平(如多项)、词水平(如NER)和跨度水平(如小组)任务上展示了最先进的结果,几乎没有特定的任务修改。

  • 源码架构
    1、modeling.py
    配置类:BertConfig

    模型入口:BertModel
    词向量的后续处理函数:embedding_postprocessor
    我们知道BERT模型的输入有三部分:token embedding ,segment embedding以及position embedding。
    注意,在Transformer论文中的position embedding是由sin/cos函数生成的固定的值,而在这里代码实现中是跟普通word embedding一样随机生成的,可以训练的。作者这里这样选择的原因可能是BERT训练的数据比Transformer那篇大很多,完全可以让模型自己去学习。利用BERT预训练模型进行分类任务代码_第1张图片

    构造attention_mask:create_attention_mask_from_input_mask
    该部分代码的作用是构造attention可视域的attention_mask,因为每个样本都经过padding过程,在做self-attention的时候padding的部分不能attend到其他部分上。
    输入为形状为【batch_size, from_seq_length,…】的padding好的input_ids和形状为【batch_size, to_seq_length】的mask标记向量。

    注意力层:attention layer
    这部分代码是multi-head attention的实现,主要来自《Attention is all you need》这篇论文。考虑key-query-value形式的attention,输入的from_tensor当做是query, to_tensor当做是key和value,当两者相同的时候即为self-attention。关于attention更详细的介绍可以转到理解Attention机制原理及模型。

    2、tokenization
    BasicTokenizer:主要是进行unicode转换、标点符号分割、小写转换、中文字符分割、去除重音符号等操作,最后返回的是关于词的数组(中文是字的数组)
    WordpieceTokenizer:目的是将合成词分解成类似词根一样的词片。例如将"unwanted"分解成[“un”, “##want”, “##ed”]这么做的目的是防止因为词的过于生僻没有被收录进词典最后只能以[UNK]代替的局面,因为英语当中这样的合成词非常多,词典不可能全部收录。

你可能感兴趣的:(nlp)