当前位置: 首页 > news >正文

百面Bert

百面Bert

Q1. Bert与Transformer有什么关系

Bert是基于Transformer架构中的Encoder进行搭建的。
具体来说,Bert的核心组件是几个Encoder layer的堆叠。Encoder layer中,也是两个子层,分别是注意力层和intermediate层(Bert中的叫法,实际就是前馈层)。

注意力层中,有一点不同的是,当Q和K计算了相似度之后,要和一个可训练的position embedding相加。Transformer中的Position embedding是不可训练的。这也导致Bert处理的序列长度是有限的,不能超过训练时的最大长度。
在intermediate层中,是一个线性层+激活函数+输出层。这里的激活函数是GELU激活函数,⾼斯误差线性单元激活函数。

Q2. Bert采用了什么预训练+微调的范式

从2018年的ELMo开始,预训练+微调的范式开始走入NLP领域。ELMo是基于双向的LSTM,在训练数据进行预训练,在下游任务进行微调。
Bert也采用了该范式,一是将模型结构换为了Transformer,二是采用了新的预训练任务。 因为传统的LM预训练,是在无监督数据上进行,即对一段无标注的文本,采用上文预测下文的方式,这是单向建模。虽然有Position embedding,但是模型仍然不能拟合双向的语义关系。

  1. MLM(Masked Language Modeling): 随机对句子中15%的token进行遮蔽,在训练时预测这些被遮蔽的token,即“完形填空”,这样模型就可以学习到双向的语义。
    但是这里有一个问题,Bert在微调时,并没有Mask过程,因此预训练和微调的不一致会影响模型的表现。因此15%的token中,每个token有80%进行遮蔽,10%被随机替换为其他token,10%保持不变。这里保持不变就意味和下游微调任务对齐,随机替换则是希望模型不只关注被预测的token,也要关注其他token,进而对整个句子进行建模。
  2. NSP(Next Sentence Prediction):下一个句子预测,希望模型在句子级别进行建模,完成问答匹配、自然语言推理等任务。核心任务是判断一个句子对是否是连续的上下文。这样的训练语料可以从文本中摘取,并通过随机替换的方式获取负样本。

Input: “I love you”
“Because you are beauty”
Output:“1”

Q3. 下游任务微调

所谓微调,其实和训练时更新模型参数的策略⼀致,只不过在特定的任务、更少的训练数据、更⼩。
的 batch_size 上进⾏训练,更新参数的幅度更⼩。

BERT 设计了更通⽤的输⼊和输出层来适配多任务下的迁移学习。对每⼀个输⼊的⽂本序列,BERT 会
在其⾸部加⼊⼀个特殊 token 。在后续编码中,该 token 代表的即是整句的状态,也就是句级的语义表
征。在进⾏ NSP 预训练时,就使⽤了该 token 对应的特征向量来作为最后分类器的输⼊。

Q4. 预训练任务都有效吗

Bert的变体, 由Facebook开发的RoBERTa,对此进行实验,发现NSP任务并不一定有效,因为其太简单。甚至会影响模型的性能。因此后续去掉了该任务。
Bert的变体,ALBERT,也认为NSP过于简单,不过并没有直接去掉该任务,而是对其进行优化。正样本为连续的两个句子,组成一个句子对。负样本是将正样本中的两个句子先后顺序颠倒。

输⼊:
Sentence A:I love you.
Sentence B: Because you are wonderful.
输出:
1(正样本)
输⼊:
Sentence A:Because you are wonderful.
Sentence B: I love you.
输出:
0(负样本)

Q5. Mask具体是怎么做的

Bert中,是在数据预处理阶段进行Mask,也就是在训练时,Masked的位置已经确定,因为Bert训练了40epoch,其每10个epoch使用一组masked的结果,这样可以使训练数据更丰富。
在后续的变体中,广泛采用了训练时Mask的做法,实验表明,这样做会带来微弱的提升,但是因为这样的工程实验更简洁。

Q6. Tokenizer编码策略

RoBERTa、BERT 和 Transformer ⼀样,都使⽤了 BPE 作为 Tokenizer 的编码策略。BPE,即 Byte Pair
Encoding,字节对编码,是指以⼦词对作为分词的单位。例如,对“Hello World”这句话,可能会切分为“Hel,lo,
Wor,ld”四个⼦词对。⽽对于以字为基本单位的中⽂,⼀般会按照 字节编码进⾏切分。例如,在 UTF-8 编码中,
“我”会被编码为“E68891”,那么在 BPE 中可能就会切分成“E68”,“891”两个字词对。

一般来说,词表越大,性能越好,但是这也会带来embedding参数的增加,因为embedding表的shape为(vocab_size,hidden_size)

http://www.lqws.cn/news/533683.html

相关文章:

  • Ubuntu 搭建Kubernetes 1.28版本集群
  • 代码随想录day16二叉树4
  • 参展回顾 | AI应用创新场景:数据分析助手ChatBI、璞公英教学平台亮相2025四川国际职教大会暨产教融合博览会
  • 装修选木地板还是瓷砖,都有哪些优势?
  • 第一章-人工智能概述-深度学习与AI发展(2/36)
  • MySQL备份和恢复
  • 亚矩阵云手机多开赋能Snapchat矩阵运营:技术原理与场景化破局
  • 解锁企业效率革命:Microsoft 365 Copilot 重塑办公新范式
  • 力扣第14题-最长公共前缀
  • UDP 缓冲区
  • 用Dockerfile点亮你的容器化世界:从零到精通
  • Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)
  • aws(学习笔记第四十七课) codepipeline-docker-build
  • LINUX 626 DNS报错
  • WebRTC(十):RTP和SRTP
  • 新手向:Anaconda3的安装与使用方法
  • 【电力物联网】云–边协同介绍
  • C# 项目使用obfuscar混淆
  • ubuntu 下cursor的安装
  • 数据分享:汽车行业-汽车属性数据集
  • 儿童机器人玩具未来的市场空间有多大?
  • kafka命令行操作
  • Maven安装和重要知识点概括
  • 数据结构-第三节-树与二叉树
  • GtkSharp跨平台WinForm实现
  • 七天学会SpringCloud分布式微服务——03——Nacos远程调用
  • 01【C++ 入门基础】命名空间/域
  • vue 开启 source-map 后构建速度会很慢
  • LaTeX之中文支持和设置字体的几种方法
  • Docker 入门教程(一):从概念到第一个容器