[博学谷学习记录]超强总结,用心分享|人工智能深度学习BERT模型总结分享

1. BERT模型优缺点

1.1 BERT的优点

  • 通过预训练, 加上Fine-tunning, 在11项NLP任务上取得最优结果.

  • BERT的根基源于Transformer, 相比传统RNN更加高效, 可以并行化处理同时能捕捉长距离的语义和结构依赖.

  • BERT采用了Transformer架构中的Encoder模块, 不仅仅获得了真正意义上的bidirectional context, 而且为后续微调任务留出了足够的调整空间

1.2 BERT的缺点

  • BERT模型过于庞大, 参数太多, 不利于资源紧张的应用场景, 也不利于上线的实时处理.

  • BERT目前给出的中文模型中, 是以字为基本token单位的, 很多需要词向量的应用无法直接使用. 同时该模型无法识别很多生僻词, 只能以UNK代替.

  • BERT中第一个预训练任务MLM中, [MASK]标记只在训练阶段出现, 而在预测阶段不会出现, 这就造成了一定的信息偏差, 因此训练时不能过多的使用[MASK], 否则会影响模型的表现.

  • 按照BERT的MLM任务中的约定, 每个batch数据中只有15%的token参与了训练, 被模型学习和预测, 所以BERT收敛的速度比left-to-right模型要慢很多(left-to-right模型中每一个token都会参与训练).

2. BERT的MLM任务中为什么采用了80%, 10%, 10%的策略?

  • 首先, 如果所有参与训练的token被100%的[MASK], 那么在fine-tunning的时候所有单词都是已知的, 不存在[MASK], 那么模型就只能根据其他token的信息和语序结构来预测当前词, 而无法利用到这个词本身的信息, 因为它们从未出现在训练过程中, 等于模型从未接触

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用PyTorch实现的BERT微调分类模型的示例: ```python import torch import torch.nn as nn from transformers import BertModel class BertClassifier(nn.Module): def __init__(self, num_classes): super(BertClassifier, self).__init__() self.bert = BertModel.from_pretrained('bert-base-uncased') self.dropout = nn.Dropout(0.1) self.fc1 = nn.Linear(768, num_classes) def forward(self, input_ids, attention_mask): outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask) pooled_output = outputs.pooler_output pooled_output = self.dropout(pooled_output) logits = self.fc1(pooled_output) return logits ``` 在这个模型中,我们使用了PyTorch的nn.Module类来定义一个包含BERT预训练模型的分类器。在__init__方法中,我们首先使用transformers库中的BertModel类从预训练的BERT模型中加载权重。然后,我们定义了一个dropout层和一个全连接层,将BERT的输出转换成我们需要的类别数。 在forward方法中,我们将输入的数据传递给BERT模型,然后使用pooler_output属性来获取BERT输出的池化表示。我们应用了一层dropout,然后将池化表示传递给全连接层,得到最终的分类结果。 最后,我们可以使用这个模型来微调BERT模型,以执行特定的文本分类任务。例如,我们可以使用以下代码来微调模型并进行预测: ```python model = BertClassifier(num_classes=2) optimizer = torch.optim.Adam(model.parameters(), lr=2e-5) criterion = nn.CrossEntropyLoss() for epoch in range(num_epochs): for batch in train_data_loader: input_ids, attention_mask, labels = batch optimizer.zero_grad() outputs = model(input_ids, attention_mask) loss = criterion(outputs, labels) loss.backward() optimizer.step() # Evaluate the model model.eval() with torch.no_grad(): for batch in test_data_loader: input_ids, attention_mask, labels = batch outputs = model(input_ids, attention_mask) _, predicted = torch.max(outputs, 1) accuracy = (predicted == labels).sum().item() / len(labels) print('Test accuracy:', accuracy) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值