[转]bert模型分析

BERT模型学习与分析 原文地址 https://www.jianshu.com/p/160c4800b9b5

BERT模型详解 http://fancyerii.github.io/2019/03/09/bert-theory/

其他参考   NLP必读:十分钟读懂谷歌BERT模型 https://zhuanlan.zhihu.com/p/51413773

 

前段时间Google推出了重磅的模型BERT(Bidirectional Encoder Representations from Transformers),刷新的多项记录,因为前面分析了一下Transformer模型,构建了基础,然后现在总结学习一下Bert模型。

1、什么是BERT模型?

BERT=基于Transformer 的双向编码器表征,顾名思义,BERT模型的根基就是Transformer,来源于attention is all you need。其中双向的意思表示它在处理一个词的时候,能考虑到该词前面和后面单词的信息,从而获取上下文的语义。

BERT、GPT、ELMo三者的对比


它们三者与Word2Vec、单向LSTM之间的对比

 

Model获取长距离语义信息程度能否左右上下文语义是否可以并行
Word2Vec1
单向LSTM2不能不能
ELMo2不能
GPT3不能
BERT3

ELMo采用的是双向的LSTM的架构,所以能够抓取到左右上下文的语义
由于GPT和BERT都采用了Transformer,所有它们都是能够完成并行计算,但是由于GPT采用的是单向的,导致了每个token只能关注左侧的语境,在文献中被称为了“Transformer解码器”,而BERT采用了双向的双向的自注意机制,所以被称为了“Transformer编码器”。

 

预训练语言表征

2、BERT模型核心点

1、BERT的架构

BERT的模型架构基于了Transformer,实现了多层双向的Transformer编码器。文中有两个模型,一个是1.1亿参数的base模型,一个是3.4亿参数的large模型。里面所设置的参数如下:

ModelTransformer层数(L)Hidden units(H)self-attention heads(A)总参数
BERT(base)12768121.1亿
BERT(large)241024163.4亿

其中base模型的参数和OpenAI的GPT的参数一致。目的就是为了同GPT的效果进行一个比较。

 

2、BERT的输入表征

下图表示了BERT的输入表征

 

 

下面的思维导图说明了各个部分的作用是什么:

3、BERT中最核心的部分

(1)Masked Language Model(MLM)
为了实现深度的双向表示,使得双向的作用让每个单词能够在多层上下文中间接的看到自己。文中就采用了一种简单的策略,也就是MLM。
MLM:随机屏蔽掉部分输入token,然后再去预测这些被屏蔽掉的token。
这里实现的时候有两个缺点
缺点1:预训练与微调之间的不匹配,因为微调期间是没有看到[Mask]token。

  • Solution:不是总用实际的[Mask]token替换被“masked”的词汇,而是采用训练数据生成器随机去选择15%的token。
  •  

     

    例子:句子= my dog is hairy, 选择的token是hairy。执行的流程为:

Transformer不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入词块的分布式语境表征。此外,因为随机替换只发生在所有词块的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。
缺点2:每个batch只预测了15%的token,这说明了模型可能需要更多的预训练步骤才能收敛。
(2)Next Sentence Prediction
现在从句子的角度来考虑问题,预训练了一个二值化下一句预测任务,该任务可以从任何单语语料库中轻松生成。具体来说,选择句子A和B作为预训练样本:A的下一句有50%的可能是B,另外50%的可能是来自语料库的。
例子:

  • 输入=[CLS]男子去[MASK]商店[SEP]他买了一加仑[MASK]牛奶[SEP]
    Label= IsNext
  • 输入=[CLS]男人[面具]到商店[SEP]企鹅[面具]是飞行##少鸟[SEP]
    Label= NotNext

4、预训练过程

训练批量大小为256个序列(256个序列*512个词块=128,000个词块/批次),持续1,000,000个步骤,这比33亿个单词语料库大约40个周期

Item值或名称
学习率{10}^{-4}
Adam β10.9
Adam β20.999
L2权重衰减0.01
dropout0.1
激活函数gelu
ModelTPU个数TPU芯片个数每次预训练天数
BERT(Base)4164
BERT(Large)16644

5、微调过程

微调过程中,大多数模型超参数与预训练相同。批量大小、学习率和训练周期数量会有区别。最佳超参数值是特定于任务的,但我们发现以下范围的可能值可以在所有任务中很好地工作:

参数
Batch16,32
学习率Adam5e-5,3e-5,2e-5
周期3,4

4、实验部分

BERT应用到了11项NLP的任务上面
(1)GLUE数据集

 

 

 

上图中,(a)和(b)是序列级任务,(c)和(d)是词块级任务。图中E代表其输入嵌入,Ti代表词块i的语境表征,[CLS]是分类输出的特殊符号,[SEP]是分割非连续词块序列的特殊符号。

结果:


(2)斯坦福问答数据集SQuAD v1.1
斯坦福问答数据集SQuAD v1.1:一种100k众包问答对的集合
任务:给出一个问题和包含答案的来自维基百科的一个段落,任务是预测该段落中的其答案文本的跨度
(3)命名实体识别(NER)

数据集:CoNLL 2003命名实体识别(NER)数据集,由200k个训练单词组成,这些单词已注释为人员、组织、位置、杂项或其他(非命名实体)。

5、实践部分

尝试用github上面的bert-ner中文的项目,跑了一下ner,具体操作如下:

git clone https://github.com/ProHiryu/bert-chinese-ner

然后需要将Google写的bert的源码给放到当前的文件夹下,可以采用git clone的方式

git clone https://github.com/google-research/bert

同时需要下载Google遇训练好了模型,然后放到了checkpoint文件夹里面。下载地址是:https://github.com/ProHiryu/bert-chinese-ner
最后的文件目录树是


准好了之后,就可以进行训练了:

 

python BERT_NER.py --data_dir=data/ --bert_config_file=checkpoint/bert_config.json --init_checkpoint=checkpoint/bert_model.ckpt --vocab_file=vocab.txt --output_dir=./output/result_dir/

最后写在output文件下面,可以找到eval_results.txt文件,然后我们可以看到本次训练的结果如下:

 

image.png



 

### 关于BERT模型分析方法 #### 输入与输出 BERT(Bidirectional Encoder Representations from Transformers)是一种双向编码器表示模型,其核心目标在于通过大规模无监督学习获取高质量的语言表征。模型的输入由三部分组成:Token Embeddings、Segment Embeddings 和 Positional Embeddings[^1]。具体而言,输入序列会被分割成一系列 Token,并附加特殊的标记(如 `[CLS]` 和 `[SEP]`),用于区分句子边界并提供额外的信息支持。 对于输出部分BERT 的每一层都会返回对应位置上的隐藏状态向量。这些向量可以进一步应用于下游任务,例如文本分类、命名实体识别等。特别地,在某些任务中会利用 `[CLS]` 对应的位置作为整个句子的固定长度表征[^1]。 #### 预训练任务 为了使 BERT 能够更好地捕捉语言中的复杂模式,它采用了两种主要的预训练任务: 1. **Masked Language Model (MLM)**:随机遮蔽掉输入序列的一部分词元(通常占总词数的 15%),让模型预测被遮蔽的部分。这种方式使得 BERT 可以同时关注上下文信息。 2. **Next Sentence Prediction (NSP)**:判断两个给定句子是否连续出现。这一设计有助于提升模型对语义连贯性的理解能力[^1]。 #### 内部结构剖析 从架构上看,BERT 基于 Transformer 编码器构建而成。Transformer 结构摒弃了传统 RNN/CNN 中固有的顺序计算方式,而采用自注意力机制(Self-Attention Mechanism)。这种机制允许网络在同一时间步内充分挖掘全局范围内的特征关联性,从而显著提高了建模效率和表达力[^2]。 在实际操作过程中,当一条原始文本进入 BERT 后,经过嵌入处理形成初始向量矩阵;随后依次传递至多层堆叠的 Transformer 层进行逐级变换;最终得到富含深层语义含义的结果向量集合[^1]。 #### 性能评估与局限性探讨 实验表明,在多种自然语言处理场景下,相较于其他经典方案(如 NNLM 或 ELMo),BERT 显示出了更为优越的表现水平。然而值得注意的是,尽管该框架擅长解决诸如问答系统、机器翻译等问题,但由于缺乏明确的方向性约束条件限制等因素影响,使其难以直接胜任生成类任务需求[^3]。 ```python import torch from transformers import BertTokenizer, BertModel tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') text = "Replace me by any text you'd like." encoded_input = tokenizer(text, return_tensors='pt') output = model(**encoded_input) print(output.last_hidden_state.shape) ``` 以上代码片段展示了如何加载预训练好的 BERT 模型并对一段文字进行编码运算的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值