BERT 论文逐段精读【论文精读】
BERT: 近 3 年 NLP 最火
CV: 大数据集上的训练好的 NN 模型,提升 CV 任务的性能 —— ImageNet 的 CNN 模型
NLP: BERT 简化了 NLP 任务的训练,提升了 NLP 任务的性能
BERT 如何站在巨人的肩膀上的?使用了哪些 NLP 已有的技术和思想?哪些是 BERT 的创新?
1标题 + 作者
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
pre-training: 在一个大的数据集上训练好一个模型 pre-training,模型的主要任务是用在其它任务 training 上。
deep bidirectional transformers: 深的双向 transformers
language understanding: 更广义,transformer 主要用在机器翻译 MT
BERT: 用深的、双向的、transformer 来做预训练,用来做语言理解的任务。
作者:Google AI Language,写作时间短(几个月),大佬大佬
2摘要
新的语言表征模型 BERT: Bidirectional Encoder Representations from Transformers,基于 ELMo
Transformers 模型的双向编码表示
与 ELMo 和 GPT 不同,BERT 从无标注的文本中(jointly conditioning 联合左右的上下文信息)预训练得到 无标注文本的 deep bidirectional representations
pre-trained BERT 可以通过加一个输出层来 fine-tune,在很多任务(问答、推理)有 SOTA 效果,而不需要对特定任务的做架构上的修改。
GPT unidirectional,使用左边的上下文信息 预测未来
BERT bidirectional,使用左右侧的上下文信息
ELMo based on RNNs, down-stream 任务需要调整一点点架构
BERT based on Transformers, down-stream 任务只需要调整最上层。
GPT, down-stream 任务 只需要改最上层。
摘要第一段:和哪两篇工作相关,区别是什么?
BERT 是在 GPT 和 ELMo 的基础上的改动。
摘要第二段:BERT 的好处
simple and empirically powerful, 11 NLP 任务的SOTA, 绝对精度 + 相对精度(比别人好多少)
摘要写法:
第一段:我和另外 2 篇相关工作的区别,改进在哪里?
第二段:我的结果特别好,好在什么地方?
Note: BERT 论文写作好 --> 经典
工作质量:创新性、效果好 --> 经典
3导言
导言第一段:本篇论文关注的研究方向的一些上下文关系
Language model pre-training 可以提升 NLP 任务的性能
NLP任务分两类:sentence-level tasks 句子情绪识别、两个句子的关系; token-level tasks NER (人名、街道名) 需要 fine-grained output
NLP 预训练很早之前存在,BERT 使 NLP 预训练 出圈了。
导言第二段:摘要第一段的扩充
pre-trained language representations 两类策略:
基于特征的 ELMo (构建和每一个下游任务相关的RNN 架构;训练好的特征(作为额外的特征) 和 输入 一起放进模型)
基于微调参数的 GPT
所有的权重参数根据新的数据集进行微调。
介绍别人工作的目的:铺垫自己方法的好
ELMo 和 GPT 预训练时 使用 unidirectional langugage model,使用相同的目标函数
语言模型是单向的、预测未来。不是给第 一句、第三句,预测第二句
导言第三段:
当前技术的局限性:标准语言模型是 unidirectional 单向的,限制了模型架构的选择。
GPT 从左到右的架构,只能将输入的一个句子从左看到右。句子情感分类任务:从左看到右、从右看到左 都应该是合法的。
token-level tasks:问答 qa 看完整个句子选答案,不是从左往右一步一步看。
如果能 incorporate context from both directions 看两方向的信息,能提升 任务性能。
相关工作的局限性,+ 解决局限性的想法 -- > 导言第四段: 如何解决?
BERT 通过 MLM 带掩码的语言模型 作为预训练的目标,来减轻 语言模型的单向约束。inspired by the Close task 1953
MLM 带掩码的语言模型做什么呢?
每次随机选输入的词源 tokens, 然后 mask 它们,目标函数是预测被 masked 的词;类似挖空填词、完形填空。
MLM 和 standard language model (只看左边的信息)有什么区别?
MLM 可以看 左右的上下文信息, pre-train deep bidirectional transformer 的基础。
BERT 除了 MLM 还有什么?
NSP: next sentence prediction
判断两个句子是随机采样的 or 原文相邻,学习 sentence-level 的信息。
文章 3点 贡献:
1 bidirectional 双向信息的重要性
GPT 只用了 unidirectional 信息;另外 Peter 2018 把从左看到右 和 从右看到左的模型独立训练 + shallow concatenation 拼在一起;BERT 在 bidirectional pre-training 的应用更好
2 BERT 首个 微调模型,在 sentence-level and token-level task效果好
好的预训练模型,不用对特定任务做一些模型架构的改动
3 BERT 开源,随便用。
4结论
近期实验表明,非监督的预训练模型很好,low-resource 任务也能享受 benefit from 深的神经网络。
本文贡献:拓展前任的结果到 deep bidirectional architectures,使同样的预训练模型能够处理大量的 NLP 任务
本文故事:
2个相关工作:ELMo 用了 bidirectional 信息,但架构 RNN 老;GPT 架构 Transformer 新,但只用了 unidirectional 信息。
BERT = ELMo 的 bidirectional 信息 + GPT 的新架构 transformer
How?
Language model 任务:不是预测未来,而是完形填空。
写作:两个算法的结合,主要工作 -- 证明 双向有用
A + B 缝合工作 or C 技术解决 D 领域的问题,不要觉得想法小、不值得写出来;简单朴实的写出来。简单好用 说不定会出圈 😄
5相关工作
2.1 Unsupervised Feature-based approaches
非监督的基于特征表示的工作:词嵌入、ELMo等
2.2 Unsupervised Fine-tuning approaches
非监督的基于微调的工作:GPT等
2.3 Transfer Learning from Supervised Data
在有标号的数据上做迁移学习。
NLP 有标号 的大数据集:natural language inference and machine translation
CV做的还不错,ImageNet 训练好、再做迁移。
NLP 表现不那么好:CV 和 NLP 任务的区别,NLP 数据的不足。
BERT 的作用:
NLP 中,在无标号的大量数据集上训练的模型效果 > 有标号、但数据量少一些的数据集上训练效果
CV 采用 BERT 的想法嘛?
Yes,在大量无标号的图片上训练的模型,可能比 有标号的 ImageNet 百万图片 效果更好。
6 BERT 模型
BERT 有哪两步?预训练 + 微调
pre-training: 使用 unlabeled data 训练
fine-tuning: 微调的 BERT 使用 预训练的参数 初始化,所有的权重参数通过 下游任务的 labeled data 进行微调。
每一个下游任务会创建一个 新的 BERT 模型,(由预训练参数初始化),但每一个下游任务会根据自己任务的 labeled data 来微调自己的 BERT 模型。
预训练和微调不是 BERT 的创新,CV里用的比较多。
作者关于预训练和微调的介绍 好吗?
好!如果假设读者都知道论文的技术,而只一笔带过(给Ref),不太好。论文写作要自洽,简单的说明就好,避免读者不知道预训练和微调,增加理解文章的障碍。
图 1 预训练 + 微调
预训练的输入:unlabelled sentence pair
训练 BERT 的权重
下游任务:创建同样的 BERT 的模型,权重的初始化值来自于 预训练好 的权重。
MNLI, NER, SQuAD 下游任务有 自己的 labeled data, 对 BERT 继续训练,得到各个下游任务自己的的 BERT 版本。
Model Architecture
multi-layer bidirectional Transformer encoder
一个多层双向 Transformer 的解码器,基于 transfomer 的论文和代码。
写作:第三章这里不讲可以;在第二章相关工作做一定的介绍, i.e., L H
模型调了哪 3 个参数?
L: transform blocks的个数
H: hidden size 隐藏层大小
A: 自注意力机制 multi-head 中 head 头的个数
调了 BERT_BASE (1亿参数)和 BERT_LARGE
(3.4亿参数)
Large 模型 层数 L 翻倍 12 -- 24;宽度 H 768 -- 1024
BERT 模型复杂度和层数 L 是 linear, 和宽度 H 是 平方关系。
因为 深度 变成了 以前的两倍,在宽度上面也选择一个值,使得这个增加的平方大概是之前的两倍。
H = 16,因为每个 head 的维度都固定在了64。因为你的宽度增加了,所以 head 数也增加了。
BERT_base 的参数选取 和 GPT 差不多,比较模型;BERT_large 刷榜。
超参数换算成可学习参数的大小,transformer架构的回顾
可学习参数的来源:嵌入层 30k * H、transformer块 L * H^2 * 12
嵌入层: 输入是词的字典大小 30k,输出是 H
参数:30k (字典大小) * H (hidden size)
嵌入层的输出会进入 transformer 块。
transformer blocks(H^2 * 12): self-attention mechanism (H^2 * 4)+ MLP(H^2 * 8)
self-attention mechanism 本身无可学习参数; multi-head self-attention mechanism 要对 q, k, v 做投影,每一次投影维度=64 --> A * 64 = H。
每一个 q, k, v 都有自己的投影矩阵,合并每个 head 的投影矩阵 --> q, k, v 分别的 H * H 矩阵。
得到输出后还会有一次 H * H 的投影。
Transformer block 里的 self-attention 可学习参数 = H^ 2 * 4
MLP 的 2个全连接层:
第一个全连接层输入是 H,输出是 4 * H;
第二个全连接层输入是 4 * H,输出是 H。
每一个参数矩阵大小 H * 4H,MLP 中的可学习参数 H^2 * 8
一个 transformer block 的参数量 H^2 * 12,L 个 blocks,L * H^2 * 12
Input/Output Representations
下游任务有处理一个句子 or 处理 2 个句子,BERT 能处理不同句子数量的下游任务,使输入可以是 a single sentence and a pair of sentences (Question answer)
a single sentence: 一段连续的文字,不一定是真正上的语义上的一段句子,它是我的输入叫做一个序列 sequence。
A "sequence" 序列可以是一个句子,也可以是两个句子。
BERT 的输入和 transformer 区别?
transformer 预训练时候的输入是一个序列对。编码器和解码器分别会输入一个序列。
BERT 只有一个编码器,为了使 BERT 能处理两个句子的情况,需要把两个句子并成一个序列。
BERT 如何切词?
WordPiece, 把一个出现概率低的词切开,只保留一个词出现频率高的子序列,30k token 经常出现的词(子序列)的字典。
否则,空格切词 --> 一个词是一个 token。数据量打的时候,词典会特别大,到百万级别。可学习的参数基本都在嵌入层了。
BERT 的输入序列如何构成? [ CLS ] + [ SEP ]
序列开始: [ CLS ] 输出的是句子层面的信息 sequence representation
BERT 使用的是 transformer 的 encoder,self-attention layer 会看输入的每个词和其它所有词的关系。
就算 [ CLS ] 这个词放在我的第一个的位置,他也是有办法能看到之后所有的词。所以他放在第一个是没关系的,不一定要放在最后。
区分 两个合在一起的句子 的方法:
-
每个句子后 + [ SEP ] 表示 seperate
-
学一个嵌入层 来表示 整个句子是第一句还是第二句
[ CLS ] [Token1] …… [Token n] [SEP] [Token1'] …… [Token m]
每一个 token 进入 BERT 得到 这个 token 的embedding 表示。
对于 BERT,输入一个序列,输出一个序列。
最后一个 transformer 块的输出,表示 这个词源 token 的 BERT 的表示。在后面再添加额外的输出层,来得到想要的结果。
For a given token, 进入 BERT 的表示 = token 本身的表示 + segment 句子的表示 + position embedding 位置表示
图 2 BERT 嵌入层
一个词源的序列 --> 一个向量的序列 --> 进入 transformer 块
Token embeddings: 词源的embedding层,整成的embedding层, 每一个 token 有对应的词向量。
Segement embeddings: 这个 token 属于第一句话 A还是第二句话 B。
Position embeddings: 输入的大小 = 这个序列最长有多长? i.e., 1024
Position embedding 的输入是 token 词源在这个序列 sequence 中的位置信息。从0开始 1 2 3 4 --> 1024
BERT input representation = token embeddings + segment embeddings + position embeddings
BERT 的 segment embedding (属于哪个句子)和 position embedding (位置在哪里)是学习得来的,transformer 的 position embedding 是给定的。
BERT 关于 pre-train 和 fine-tune 同样的部分
3.1 Pre-training BERT
预训练的 key factors: 目标函数,预训练的数据
Task 1 MLM
为什么 bidirectional 好? MLM 是什么?完形填空
由 WordPiece 生成的词源序列中的词源,它有 15% 的概率会随机替换成一个掩码。但是对于特殊的词源不做替换,i.e., 第一个词源 [ CLS ] 和中间的分割词源 [SEP]。
如果输入序列长度是 1000 的话,要预测 150 个词。
MLM 带来的问题:预训练和微调看到的数据不一样。预训练的输入序列有 15% [MASK],微调时的数据没有 [MASK].15% 计划被 masked 的词: 80% 的概率被替换为 [MASK], 10% 换成 random token,10% 不改变原 token。但 T_i 还是被用来做预测。
80%, 10%, 10% 的选择,有 ablation study in appendix
unchanged 和 微调中的数据应该是一样的。
Task 2 NSP Next Sentence Prediction
在问答和自然语言推理里都是句子对。
如果 BERT 能学习到 sentence-level 信息,很棒。
输入序列有 2 个句子 A 和 B,50% 正例,50%反例
50% B 在 A 之后,50% 是 a random sentence 随机采样的。
正例:这个人要去一个商店,然后他买了一加仑的牛奶。IsNext
反例:这个人去了商店,然后企鹅是一种不能飞的鸟。NotNext
flight ## less, flightless 出现概率不高,WordPiece 分成了 2 个出现频率高的子序列,## 表示 less 是 flightless 的一部分。
Pre-training data
2 个数据集:BooksCorpus (800 M) + English Wikipedia (2500 M)
使用一篇一篇文章,而不是随机打断的句子。 a document-level corpus rather than a shuffled sentence-level corpus
transformer 可以处理较长的序列,一整个文本的输入,效果会好一些。
3.2 Fine-tuning BERT
用 BERT 做微调的一般化的介绍。
BERT 和一些基于encoder-decoder的架构为什么不一样?transformer 是encoder-decoder。
整个句子对被放在一起输入 BERT,self-attention 能够在两个句子之间相互看。BERT 更好,但代价是 不能像 transformer 做机器翻译。
在encoder-decoder的架构,编码器看不到解码器的东西。
BERT 做 下游任务
根据下游任务,设计我们任务相关的输入和输出。
好处:模型不怎么变,加一个输出层 softmax 得到 标号 label
怎么样把输入改成想要的句子对?
-
有两个句子的话,当然就是句子 A 和 B。
-
只有一个句子的话,要做句子分类的话, B 没有。根据下游任务的要求,要么是 [CLS] representation is fed into an output layer for classification 拿到第一个词源 [CLS] 对应的输出做分类 such as entailment or sentiment analysis,或者是 the token representations are fed into an output layer for token-level tasks 拿到对应那些词源的输出做 sequence tagging or question answering 输出。
微调比预训练便宜。TPU 1 hour, GPU a few hours.
Section 4 具体对每一个下游任务是怎么样构造输入输出
7实验
4.1 GLUE General Language Understanding Evaluation
-
多个数据集
-
sentence-level tasks
[CLS] 的 BERT 输出表示 + 一个输出层 W,softmax 分类得到 label
log(softmax(CW^T)
表1 是 BERT 在 分类任务的表现
4.2 SQuAD v1.1
Standford Question Answering Dataset
QA 问答:给一段文字,问一个问题,摘录答案。--> 判断答案的开始和结尾。
对每个词源 token,判断是不是答案的开始or结尾
学 2 个向量 S 和 E,分别对应这个词源 token 是答案开始词的概率 和 是答案结尾词的概率。
具体计算 每个 token 是答案开始的概率,结尾词类似 E。
S 和 第二句话的每个词源 token 相乘 + softmax,得到归一化的概率。
P_i = e ^ ( S * T_i ) / \sigma_j ( e ^ ( S * T_j ) )
本文微调时,数据扫三遍,epochs = 3, lr = 5e-5, batch_size = 32
大家实验发现:用 BERT 做微调的时候,结果非常不稳定。同样的参数,同样的数据集,训练 10 遍,variance 方差特别大。
其实很简单,epochs 不够,3 太小了,可能要多学习几遍会好一点。
adam 的不完全版 在长时间训练的 BERT 没问题,训练时间不够,需要 adam 的完全版。
4.3 SQuAD v2.0 表现也很不错
4.4 SWAG
Situations With Adversarial Generations 判断两个句子之间的关系,BERT 和之前的训练没多大区别,效果好。
总结:BERT 在不一样的数据集上,用起来很方便,效果很好。
输入表示成“一对句子的形式”,最后拿到 BERT 对应的输出,然后加一个输出层 softmax,完事了。
BERT 对 NLP 整个领域的贡献非常大,有大量的任务用一个相对简单、只改数据输入形式和最后加一个输出层,就可以效果很不错。
5 Ablation studies
看 BERT 每一个组成部分的贡献。
没有 NSP
LTR 从左看到右(无 MLM ) & 没有 NSP
LTR 从左看到右(无 MLM ) & 没有 NSP + BiLSTM (从ELMo来的想法)
去掉任何一个组成部分,BERT的效果都会有打折,特别是 MRPC。
5.2 Effect of Model Size
BERT_base 110 M 可学习参数
BERT_large 340 M 可学习参数
NLP界认为 模型越大,效果越好。BERT 首先证明了大力出奇迹,引发了模型“大”战
现在:GPT-3 1000 亿可学习参数
5.3 Feature-based Approach with BERT
没有微调的 BERT,将pre-trained 得到的 BERT 特征作为一个静态的特征输入,效果没有 + 微调好
卖点:用 BERT 需要微调。
8评论
写作:
-
先写 BERT 和 ELMo (bidirectional + RNN)、GPT (unidirectional + transformer) 的区别
-
介绍 BERT 模型
-
BERT 实验设置、效果好
-
结论突出 'bidirectional' 贡献
文章 1个卖点,容易记。
但 BERT 是否要选择 'bidirectional' 双向性呢?
可以写,但也要写 双向性带来的不足是什么?
选择有得有失。
GPT 用的是 decoder
BERT 用的是 encoder,不好做generative tasks:机器翻译、文本摘要。
分类问题在 NLP 更常见。
NLP 研究者喜欢 BERT,较容易的应用在 NLP 中自己想解决的问题。
BERT,完整的解决问题的思路 ---- 大家对 DL 的期望
训练一个很深、很宽的模型,在一个很大的数据集上预训练好;训练好的模型参数可以解决很多小的问题,通过微调提升小数据集上的性能。
这个模型拿出来之后可以用在很多小的问题上,能够通过微调来全面提升这些小数据上的性能。这个在计算机视觉里面我们用了很多了。
BERT 把 CV 的套路搬到了 NLP,1个3亿参数的模型,展示:模型越大、效果越好。大力出奇迹。
为什么 BERT 被记住?
BERT 用了 ELMo, GPT 更大的训练数据集,效果更好;BERE 也被更大的训练数据集和更大的模型超越。
BERT 的引用率是 GPT 的 10 倍,影响力 ✔
Abstract
NLP在Bert之前一直没有一个深度神经网络训练好之后,可以解决大部分任务。用一句话来概括Bert,就是Bert是一个深的双向的Transformer,针对的是一般的语言理解任务。这里特别注意的点是“语言理解任务”和“Transformer”,因为“Transformer”的提出是针对于机器翻译的。
BERT的名字来自于"Bidirectional Encoder Representations for Transformer"。GPT考虑左边的信息预测未来,BERT是双向的;ELMO是基于RNN的架构,而BERT是Transformer,所以对于下游任务不需要做那么多的调整。
当讲一个东西好的时候,不仅要讲绝对精度是多少,还要说和其他的模型比,相对的优势是多少。
一种摘要的写法是:模型的定义+与其他模型的区别+你的模型的优势
Introduction
使用预训练模型做特征表示一般有两类方法:基于特征的,比如ELMO;另外一种是基于微调的,比如GPT,把预训练的模型放到下游的时候根据新的数据集微调。这两个途径都是使用相同的目标函数,都是用一个单向的语言模型(说一句话,预测下一句话)。
现在的技术的问题是语言模型是单向的,如果要做句子层面的分析的话,如果从左看到右外,还可以从右看到左,是可以提升性能的。
带掩码的语言模型随机挖去一些字元,然后允许看左右信息,并进去填空,也就是完形填空。另一个是下一句预测,随机采样两个句子,判断这两个句子是否是相邻的。这两个任务解决了“双向”的问题。
Related Work
词嵌入、ELMO、GPT、有标号数据上的迁移学习
BERT
Bert有两个步骤:预训练和微调。
-
预训练:模型在没有标号的数据上训练
-
微调:权重初始化为预训练中得到的权重,所有权重在微调的时候都会被参与训练,用的是有标号的数据,所有的下游任务都会创建一个新的Bert模型
写论文的时候,对于引用的方法需要做一些简短的说明,以防止给大家的阅读造成困难。
BERT模型的Transformer的层是L,隐藏层大小是H,自注意力头是A。
BERT_{BASE}(L=12,H=768,A=12) 。模型的可学习参数主要来自嵌入层和Transformer块 。嵌入层就是一个矩阵,嵌入层的输入是字典的大小(这里是30K),输出是隐层单元的大小,隐层单元是Transformer的输入。头的个数A乘以64等于H。在Transformer中,首先K、Q、V都是HH的矩阵,然后输出矩阵的大小也是HH,后面的MLP层是两个H^2*8的矩阵,一共有L层的Transformer,所以一共有30K\times H+L\times H^2\times 12 = 110M大小的参数。
Bert的输入可以是一个句子,也可以是一个句子对。Transformer训练的时候输入是一个序列对,编码器和解码器分别会输入一个序列;而Bert只有编码器,所以如果是两个句子,需要合并成一个序列。使用WordPiece词嵌入的想法是如果一个词在整个里面出现概率不大的话,应该切开看子序列,这个子序列可能是词根,出现次数很大。序列的第一个词永远是[CLS],表示classification,代表Bert最后的输出代表整个序列的信息。两个句子的合并用[SEP]区分。词嵌入的输入=词元的向量(token embeddings) +segement embedding(在哪个句子)+ 位置的嵌入(position embedding)。
Pre-training BERT
Masked LM
对于一个输入的语言序列,15%的词元会被替换成掩码。但是问题在于在预训练的时候会有15%的词用[MASK]替换,但是微调的时候是没有[MASK]的,所以两个阶段看到的数据不一样。解决方案是:对于这15%的被[MASK]替换的词,80%真的替换成[MASK],10%替换成随机词元,还有10%什么都不干。
第一点中的替换,是 Masked LM 中的主要部分,可以在不泄露 label 的情况下融合真双向语义信息;
第二点的随机替换,因为需要在最后一层随机替换的这个 token 位去预测它真实的词,而模型并不知道这个 token 位是被随机替换的,就迫使模型尽量在每一个词上都学习到一个 全局语境下的表征,因而也能够让 BERT 获得更好的语境相关的词向量(这正是解决一词多义的最重要特性);
第三点的保持不变,也就是真的有 10% 的情况下是 泄密的(占所有词的比例为15% * 10% = 1.5%),这样能够给模型一定的 bias ,相当于是额外的奖励,将模型对于词的表征能够拉向词的真实表征(此时输入层是待预测词的真实 embedding,在输出层中的该词位置得到的embedding,是经过层层 Self-attention 后得到的,这部分 embedding 里多少依然保留有部分输入 embedding 的信息,而这部分就是通过输入一定比例的真实词所带来的额外奖励,最终会使得模型的输出向量朝输入层的真实 embedding 有一个偏移)。
而如果全用 mask 的话,模型只需要保证输出层的分类准确,对于输出层的向量表征并不关心,因此 可能会导致最终的向量输出效果并不好。
Next Sentence Prediction(NSP)
50%是正例,50%是负例。
Pre-training data
用文本级别的数据会比较好
Fine-tunning BERT
BERT和encoder-decoder架构相比,由于把两个句子结合在一起,所以self-attention可以看到全部的东西,而encoder-decoder架构中,encoder通常看不到decoder的东西。
Experiment
本部分讲述BERT如何应用于各种下游任务。
GLUE
把[CLS]词元最后的向量拿出来,学习输出层W,用softmax(CW^T)得到标号,即为多分类问题。
SQuAD
对于每个词元判断是否是答案的开头或者结尾,具体而言,学习两个向量S和E,分别代表词元是答案开始和结尾的概率。
提问环节
Bert 采用哪种Normalization结构,LayerNorm和BatchNorm区别,LayerNorm结构有参数吗,参数的作用?
采用LayerNorm结构,和BatchNorm的区别主要是做规范化的维度不同,BatchNorm针对一个batch里面的数据进行规范化,针对单个神经元进行,比如batch里面有64个样本,那么规范化输入的这64个样本各自经过这个神经元后的值(64维),LayerNorm则是针对单个样本,不依赖于其他数据,常被用于小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域,就bert来说就是对每层输出的隐层向量(768维)做规范化,图像领域用BN比较多的原因是因为每一个卷积核的参数在不同位置的神经元当中是共享的,因此也应该被一起规范化。
这里补充BN与LN的区别:
如何优化BERT效果?
1 感觉最有效的方式还是数据。
2 把现有的大模型ERNIE_2.0_large, Roberta,roberta_wwm_ext_large、roberta-pair-large等进行ensemble,然后蒸馏原始的bert模型,这是能有效提高的,只是操作代价比较大。
3 BERT上面加一些网络结构,比如attention,rcnn等,个人得到的结果感觉和直接在上面加一层transformer layer的效果差不多,模型更加复杂,效果略好,计算时间略增加。
4 改进预训练,在特定的大规模数据上预训练,相比于开源的用百科,知道等数据训练的更适合你的任务(经过多方验证是一种比较有效的提升方案)。以及在预训练的时候去mask低频词或者实体词(听说过有人这么做有收益,但没具体验证)。
5 文本对抗
如果是中文,还有做wordpiece的必要吗?
使用jieba分词。
参考文献
[1]transformer、bert、ViT常见面试题总结 - 简书
[2]https://zhuanlan.zhihu.com/p/151412524
[3]BERT 论文逐段精读【论文精读】_哔哩哔哩_bilibili
相关文章:

BERT 论文逐段精读【论文精读】
BERT: 近 3 年 NLP 最火 CV: 大数据集上的训练好的 NN 模型,提升 CV 任务的性能 —— ImageNet 的 CNN 模型 NLP: BERT 简化了 NLP 任务的训练,提升了 NLP 任务的性能 BERT 如何站在巨人的肩膀上的?使用了哪些 NLP 已有的技术和思想ÿ…...
在Flask中实现跨域请求(CORS)
在Flask中实现跨域请求(CORS,Cross-Origin Resource Sharing)主要涉及到对Flask应用的配置,以允许来自不同源的请求访问服务器上的资源。以下是在Flask中实现CORS的详细步骤和方法: 一、理解CORS CORS是一种机制&…...

在桌面商业分析应用程序中启用高级 Web UI
挑战 Mercur Business Control 应用程序在企业界,尤其是金融领域,拥有悠久的应用历史。它帮助企业处理、可视化和分析海量数据,从而做出明智的商业决策。 随着产品的不断演进和现代化,Mercur Solutions AB 为该应用创建了 Web 客…...

CentOS Stream 8 通过 Packstack 安装开源 OpenStack(V版)
1、环境规划以及网卡配置 controller IP:192.168.235.101 compute IP:192.168.235.102 控制节点 [rootluck ~]# cd /etc/sysconfig/network-scripts/ [rootluck network-scripts]# vi ifcfg-ens160 [rootluck network-scripts]# cat ifcfg-ens160 TYP…...
OpenSSL工具验证RSA证书
openssl x509 是一个用于处理 X.509 证书的命令行工具。常用的 openssl x509 命令: -in <file>:指定输入文件。-out <file>:指定输出文件。-noout:不输出证书信息。-text:以文本格式输出证书信息。-pubke…...

架构师白话分布式系统
对于分布式系统的定义,大致可以理解为如下的两个点 分布式系统从整体的体量来说,它内部是由很多的服务器、服务实例组成。所提供的用户服务是由一组相互独立运行的服务器来提供。对于用户来说,这个多服务器的系统就跟一个服务器一样,感觉不到每个单独的服务器实例的存在。从…...
C++ 中 vector 的常用功能介绍
在 C 中,vector 是一种常用的动态数组容器,提供了方便的自动扩展、内存管理以及各种便捷的操作方法。它是 C 标准模板库(STL)的一部分,适用于需要动态存储和管理大量元素的场景。 在本文中,我们将简要介绍…...

[QT] QT事件与事件重写
一.事件 事件(event)是由系统或者 Qt本身在不同的场景下发出的。当用户按下鼠标、敲下键盘,或者是窗口关闭等都会发出一个相应的事件。 一些事件在用户操作时发出(如鼠标/键盘事件); 另一些事件则是由系统自动发出(如计时器事件)。 Qt窗口中对于产生的一系列事件都…...

c# 视觉识别图片文字 二维码
1.二维码识别 插件 ZXing.Net using System; using System.Drawing; // 如果你使用的是System.Drawing.Common using ZXing;class Program {static void Main(){string imagePath "path_to_your_qr_code_image.png";var barcodeBitmap (Bitmap)Image.FromFile(im…...

UEFI——访问PCI/PCIE设备(二)
一、支持访问PCI/PCIE设备的Protocol UEFI中提供了两个主要的模块来支持PCI总线,一是PCI Host Bridge(PCI主桥)控制器驱动,另一个是PCI总线驱动。这两个模块是和特定的平台硬件绑定的,在这种机制下,屏蔽了…...

决策树算法的介绍与应用
目录 引言 决策树算法的基本原理 表格总结:决策树的构建步骤 决策树算法的 MATLAB 实现 示例:使用决策树进行分类预测 决策树的应用场景 表格总结:决策树的主要应用领域 决策树的优势与局限 结论 引言 决策树是一种广泛应用于数据挖掘…...

杰发科技Bootloader(3)—— 基于7801的APP切到Boot
为了方便在APP中跳转到Boot重新进行升级,有两种办法,7840同样可以使用。 1. 调用reset接口进行复位,复位后会先进Boot,再自动跳转到App。 NVIC_SystemReset(); 2. 直接使用跳转指令,参考Boot跳转到App代码࿰…...

Leetcode面试经典150题-138.随机链表的复制
题目比较简单,重点是理解思想,random不管,copy一定要放在next 而且里面的遍历过程不能省略 解法都在代码里,不懂就留言或者私信 /* // Definition for a Node. class Node {int val;Node next;Node random;public Node(int val…...
freemarker模板学习笔记
文章目录 freemarker常用指令if-elseif-else指令switch, case, default, break指令list, else, items, sep, break 指令<#list>指令语法<#else> 指令<#items> 指令<#sep> 指令<#break> 指令 include 指令<#include> 基础知识<#include&…...
高亚科技与广东海悟携手,打造全流程电子竞标管理平台!
近日,中国企业管理软件资深服务商高亚科技与广东海悟科技有限公司(以下简称“海悟”)正式签署合作协议,双方将基于高亚科技的8Manage SRM系统,推进海悟采购管理的数字化升级,实现全流程在线电子竞标管理&am…...

240908-结合DBGPT与Ollama实现RAG本地知识检索增强
A. 最终效果 B. 背景说明 DBGPT在0.5.6版本中开始支持Ollama:v0.5.6 版本更新 网友对其Web端及界面端的设置进行了分享: feat(model): support ollama as an optional llm & embedding proxy by GITHUBear Pull Request #1475 eosphoros-ai/DB-G…...
AMD ThinkSystem服务器上的 Linux 和 C 状态设置 - Lenovo ThinkSystem
受影响的配置 该系统可以是以下任何Lenovo服务器: ThinkSystem 、SR645( ThinkSystem )ThinkSystem ,SR645 V3( ThinkSystem )ThinkSystem ,SR635 V3( ThinkSystem )Th…...
Redis过期删除和缓存淘汰
1. 过期删除 在 Redis 中,键的过期删除机制主要包括惰性删除(Lazy Deletion)和定期删除(Periodic Deletion)。这两种策略有各自的优缺点,Redis 最终会结合这两种方法来管理过期键。 1.1 惰性删除…...

Golang | Leetcode Golang题解之第401题二进制手表
题目: 题解: func readBinaryWatch(turnedOn int) (ans []string) {for i : 0; i < 1024; i {h, m : i>>6, i&63 // 用位运算取出高 4 位和低 6 位if h < 12 && m < 60 && bits.OnesCount(uint(i)) turnedOn {ans …...
TON智能合约stdlib_ext库:扩展功能一览
TON(TheOpenNetwork)作为一个去中心化的区块链平台,其智能合约功能强大而灵活。在TON智能合约的开发过程中,stdlib.fc库提供了基础的功能支持。然而,对于一些高级或特定的需求,stdlib.fc可能无法满足。为此…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...