BERT 预训练模型学习记录(四)

参考文献:Pytorch——BERT 预训练模型及文本分类(情感分类)_bert金融文本情感分类-CSDN博客

【深度学习】预训练语言模型-BERT_bert预训练模型-CSDN博客

BERT是一种预训练语言模型。

一、语言模型

语言模型是一种计算文本序列概率的模型,其分为统计式语言模型和神经网络语言模型。

1.1统计式语言模型

根据概率分布,计算字词所组成字符串概率的模型。

统计式语言模型就是计算一句话符不符合语言规律。例如,用统计式语言模型计算出的【今天我吃了一个苹果】的概率一定比【今天我吃了一】的概率大,所以前者出现的可能性比后者大。

1.2神经网络语言模型

1.2.1模型结构

最下层是输入模型中的语句所对应的词表中的编号,通过编号在查找表(Look-Up Table)中找到对应的词向量。接下来输入全连接层,激活函数为tanh,然后将这一层的输出和原词向量结合输入到最后的全连接层中。最后使用 Softmax 计算在前文语境中下一个词的预测结果。

神经网络语言模型用全连接层和激活函数替代了统计式语言模型的概率计算。神经网络语言模型存在一个副产品:第二个全连接层参数,即我们说的词向量。

1.2.2词向量

研究者们起初发现了分布式表示词向量的方法,即通过该词的上下文语境来表示这个词的含义。该方法存在弊端,无法准确表示多义词,词语的含义大部分由语料中该词的含义决定。

此种情况下,出现了基于上下文表示生成词向量的语言模型,这类模型在对句子进行编码时会结合每个词所在语句的前后文语境。BERT便是这样的语言模型。

二、BERT结构详解

BERT是以 Transformer 为基础构建的,使用 WordPiece 的方法进行数据预处理,最后通过 MLM 任务和下个句子预测任务进行预训练的语言表示模型。

BERT是基于Transformer模型的,只是其中的编码器。输入一个句子,Transformer的编码器会输出句子中每个词的向量表示,双向是因为Transformer编码器是双向的。它的输入是完整的句子,在指定某个Token时,BERT已经读入了它两个方向上的所有单词。

2.1Transformer

Transformer模型结构在之前的博客中有写过:Attention +Transformer学习记录(二)-CSDN博客其中,Multi-Head Attention 通过多层的 Self-Attention 可以将输入语句映射到不同的子空间中,于是能够更好地理解到语句所包含的信息。

以下是BERT模型对Self-Attention的代码实现:

# 取自 hugging face 团队实现的基于 pytorch 的 BERT 模型
class BERTSelfAttention(nn.Module):
    # BERT 的 Self-Attention 类
    def __init__(self, config):
        # 初始化函数
        super(BERTSelfAttention, self).__init__()
        if config.hidden_size % config.num_attention_heads != 0:
            raise ValueError(
                "The hidden size (%d) is not a multiple of the number of attention "
                "heads (%d)" % (config.hidden_size, config.num_attention_heads))
        self.num_attention_heads = config.num_attention_heads
        self.attention_head_size = int(config.hidden_size / config.num_attention_heads)
        self.all_head_size = self.num_attention_heads * self.attention_head_size
 
        self.query = nn.Linear(config.hidden_size, self.all_head_size)
        self.key = nn.Linear(config.hidden_size, self.all_head_size)
        self.value = nn.Linear(config.hidden_size, self.all_head_size)
 
    def transpose_for_scores(self, x):
        # 调整维度,转换为 (batch_size, num_attention_heads, hidden_size, attention_head_size)
        new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size)
        x = x.view(*new_x_shape)
        return x.permute(0, 2, 1, 3)
 
    def forward(self, hidden_states):
        # 前向传播函数
        mixed_query_layer = self.query(hidden_states)
        mixed_key_layer = self.key(hidden_states)
        mixed_value_layer = self.value(hidden_states)
 
        query_layer = self.transpose_for_scores(mixed_query_layer) 
        key_layer = self.transpose_for_scores(mixed_key_layer)
        value_layer = self.transpose_for_scores(mixed_value_layer)
 
        # 将"query"和"key"点乘,得到未经处理注意力值
        attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2))
        attention_scores = attention_scores / math.sqrt(self.attention_head_size)
 
        # 使用 softmax 函数将注意力值标准化成概率值
        attention_probs = nn.Softmax(dim=-1)(attention_scores)
 
        context_layer = torch.matmul(attention_probs, value_layer)
        context_layer = context_layer.permute(0, 2, 1, 3).contiguous()
        new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,)
        context_layer = context_layer.view(*new_context_layer_shape)
        return context_layer

2.2WordPiece

数据预处理关系到模型的训练效率和准确率的提升,BERT使用的数据预处理方法是WordPiece,按照字面意思就是把字词拆成一片一片的。

举个例子来说明吧,比如说look,looked,looking 这三个词,它们其实有同样的意思,但按照词来分类,他们其实是不同的词。WordPiece 会把这三个词拆分成 look,look 和 ##ed,look 和 ##ing,这个方法把词本身和时态表示拆分开,不但能够有效减少词表的大小,提高效率,还能够提升词的区分度。

三、BERT预训练模型

Bert是Transformer的encoder部分,使用大量的未标记文本数据进行预训练,从而学习并掌握某种语言的表达形式。结构上使用了基于多头注意力机制的transformer,训练中采取两种不同的训练方式:(Masked Language Model)隐蔽语言模型(Next Sentence Prediction)下一结构预测。其中双向主要体现在bert的训练任务一中:隐蔽语言模型。

3.1隐蔽语言模型

隐蔽语言模型类似于完形填空,具体是把输入的句子中的字词随即用【Mask】标签覆盖,然后训练模型结合被覆盖的词的左侧和右侧上下文进行预测。与从左向右语言模型只通过左侧单词预测下一单词的做法相比,隐蔽语言模型同时融合了左右上下文的语言表示,这种做法能够使 BERT 学到字词更完整的语义表示。

在下游的NLP任务fine-tuning阶段中不存在被Mask的词,为了和后续任务保持一致,作者按一定比例在需要预测的词的位置上输入了原词或输入了某个随机的词。

[MASK]通过attention均结合了左右上下文的信息,这体现了双向。以下是MASK策略:

1.有80%的概率用“[mask]”标记来替换——my dog is [MASK]
2.有10%的概率用随机采样的一个单词来替换——my dog is apple
3.有10%的概率不做替换——my dog is hairy
 

在任何一个词都有可能被替换掉的前提下,迫使模型在编码当前时刻不能过度依赖当前的词,要根据上下文,甚至要根据上下文来纠错。所以训练的语料中必须有正确的信息(10%)、未知的信息(80%Mask,使模型具有预测能力)、错误的信息(加入噪声10%,使模型具有纠错能力),模型才能获取全局全量信息。

3.2Next sentence prediction

很多下游任务(QA和natural language inference)都是基于两个句子之间关系的理解,所以为了增强模型对句子之间关系的理解,所以预测句子关系。

在训练过程中,BERT会抽取50%有关联的句子(这里的句子是指有联系的Token序列),50%的概率随机抽选两无关的句子,然后让BERT模型判断这两个句子是否相关。其输入形式是,开头是一个特殊符号[CLS],然后两个句子之间用[SEP]隔断:

Input = [CLS] the man went to [MASK] store [SEP]he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP]penguin [MASK] are flight ##less birds[SEP]
Label = NotNext

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[3\]中提到,随着ELMo、BERT等模型的发布,NLP领域进入了“大力出奇迹”的时代。采用大规模语料上进行无监督预训练的深层模型,在下游任务数据上微调一下,即可达到很好的效果。因此,调参方法可以通过以下步骤进行: 1. 选择合适的预训练模型:根据任务需求选择适合的预训练模型,如BERT、GPT等。 2. 调整模型参数:可以尝试调整模型的层数、隐藏单元数、注意力头数等超参数,以获得更好的性能。 3. 调整学习率:学习率是训练过程中一个重要的超参数,可以通过网格搜索或学习率衰减等方法来选择合适的学习率。 4. 数据增强:通过数据增强技术,如随机遮挡、词汇替换等,可以增加训练数据的多样性,提高模型的泛化能力。 5. 选择合适的优化器:不同的优化器对模型的训练效果有影响,可以尝试不同的优化器,如Adam、SGD等。 6. 提前停止训练:通过监控验证集上的性能指标,当模型在验证集上的性能不再提升时,可以提前停止训练,以避免过拟合。 总之,调参方法可以根据具体任务和数据集的特点进行灵活调整,通过不断尝试和优化,找到最佳的参数组合,以获得更好的预训练模型性能。 #### 引用[.reference_title] - *1* [新预训练模型CodeBERT出世,编程语言和自然语言都不在话下](https://blog.csdn.net/weixin_42137700/article/details/104518840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [论文阅读笔记:《自然语言处理中的预训练模型》](https://blog.csdn.net/weixin_41089007/article/details/105397788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值