当前位置: 首页 > 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.lryc.cn/news/575327.html

相关文章:

  • 《网络攻防技术》《数据分析与挖掘》《网络体系结构与安全防护》这三个研究领域就业如何?
  • ASP.NET Core Web API 实现 JWT 身份验证
  • list类的详细讲解
  • 基于 Python 的批量文件重命名软件设计与实现
  • 二叉树理论基础
  • 【偏微分方程】基本概念
  • 逆向入门(8)汇编篇-rol指令的学习
  • 【kubernetes】--Service
  • 深入理解提示词工程:原理、分类与实战应用
  • 基于 opencv+yolov8+easyocr的车牌追踪识别
  • linux-修改文件命令(补充)
  • Windows 安装 Redis8.0.2
  • 多传感器标定简介
  • day042-负载均衡与web集群搭建
  • python3虚拟机线程切换过程
  • 定位坐标系深度研究报告
  • LangGraph--基础学习(Human-in-the-loop 人工参与深入学习2)
  • 达梦数据库安装
  • 深入理解Redis
  • 【深度学习新浪潮】什么是上下文工程?
  • Introduction to Software Engineering(TE)
  • Linux 怎么恢复sshd.service
  • 【C++】std::function是什么
  • 【网络实验】-配置用户登录
  • 《高等数学》(同济大学·第7版)第九章 多元函数微分法及其应用第一节多元函数的基本概念
  • ARM内核之CMSIS
  • 《从0到1:C/C++音视频开发自学完全指南》
  • 超级好用的小软件:geek,卸载软件,2m大小
  • HarmonyOS 5分布式数据库有哪些性能指标?
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | BackgroundSlider(背景滑块)