《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux... 。

文章目录
- 一、本文面试题目录
-
-
- [51. BERT与原始Transformer相比,在结构上有哪些调整?它的预训练任务是什么?](#51. BERT与原始Transformer相比,在结构上有哪些调整?它的预训练任务是什么?)
- [52. GPT系列模型(如GPT-3)与原始Transformer的区别是什么?为什么它适合生成任务?](#52. GPT系列模型(如GPT-3)与原始Transformer的区别是什么?为什么它适合生成任务?)
- [53. T5模型的核心思想是什么?它如何统一不同的NLP任务?](#53. T5模型的核心思想是什么?它如何统一不同的NLP任务?)
- [54. 什么是"稀疏注意力"?哪些模型使用了这一机制(如Longformer、Performer)?](#54. 什么是“稀疏注意力”?哪些模型使用了这一机制(如Longformer、Performer)?)
- [55. 针对长序列处理,Transformer有哪些改进方法(如降低时间复杂度)?](#55. 针对长序列处理,Transformer有哪些改进方法(如降低时间复杂度)?)
- [56. ALBERT在BERT的基础上做了哪些优化?目的是什么?](#56. ALBERT在BERT的基础上做了哪些优化?目的是什么?)
- [57. RoBERTa与BERT相比,主要改进了哪些训练细节?](#57. RoBERTa与BERT相比,主要改进了哪些训练细节?)
- [58. ViT(Vision Transformer)如何将Transformer应用于图像任务?与CNN相比有何优势?](#58. ViT(Vision Transformer)如何将Transformer应用于图像任务?与CNN相比有何优势?)
- [59. 多模态Transformer(如CLIP、DALL·E)是如何融合文本和图像信息的?](#59. 多模态Transformer(如CLIP、DALL·E)是如何融合文本和图像信息的?)
- [60. 轻量级Transformer模型(如DistilBERT、MobileBERT)的设计思路是什么?](#60. 轻量级Transformer模型(如DistilBERT、MobileBERT)的设计思路是什么?)
-
- 二、120道Transformer面试题目录列表
一、本文面试题目录
51. BERT与原始Transformer相比,在结构上有哪些调整?它的预训练任务是什么?
- 结构调整 :
- BERT仅使用Transformer的Encoder部分(原始Transformer包含Encoder和Decoder)。
- 输入处理:引入
[CLS]
标签作为分类任务的聚合向量,以及[SEP]
标签分隔句子对(如问答、句子匹配任务)。 - 采用双向自注意力:Encoder对整个序列进行双向编码,而原始Transformer的Decoder是单向的。
- 层数和隐藏维度:基础版(BERT-Base)为12层Encoder、隐藏维度768;大型版(BERT-Large)为24层、隐藏维度1024。
- 预训练任务 :
- 掩码语言模型(MLM):随机掩码15%的输入token,让模型预测被掩码的token(鼓励双向语境理解)。
- 下一句预测(NSP):判断两个句子是否为连续的上下文(增强句子级语义理解)。
- 示例代码(BERT输入处理):
python
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
text1 = "Hello, world!"
text2 = "This is a test."
inputs = tokenizer(text1, text2, return_tensors='pt', padding=True, truncation=True)
print(inputs['input_ids']) # 包含[CLS], [SEP], 分词id
# 输出示例:[[101, 7592, 1010, 2088, 999, 102, 2023, 2003, 1037, 3231, 999, 102]]
52. GPT系列模型(如GPT-3)与原始Transformer的区别是什么?为什么它适合生成任务?
- 与原始Transformer的区别 :
- GPT仅使用Transformer的Decoder部分(原始Transformer为Encoder-Decoder结构)。
- 采用单向自注意力:Decoder层使用掩码自注意力(仅允许关注前文token),确保生成时不泄露未来信息。
- 预训练任务:仅采用因果语言模型(CLM),即根据前文预测下一个token(原始Transformer无特定预训练任务)。
- 适合生成任务的原因 :
- 单向自注意力机制天然符合序列生成的逻辑(如文本生成需按顺序依赖前文)。
- autoregressive(自回归)生成模式:每次预测依赖前序所有生成结果,保证输出连贯性。
- 大模型(如GPT-3 1750亿参数)通过海量数据训练,可捕捉复杂语义和长程依赖。
- 示例代码(GPT生成文本):
python
from transformers import GPT2LMHeadModel, GPT2Tokenizer
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
input_text = "Artificial intelligence is"
inputs = tokenizer(input_text, return_tensors='pt')
outputs = model.generate(**inputs, max_length=50, num_return_sequences=1)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# 输出示例:"Artificial intelligence is transforming industries from healthcare to finance..."
53. T5模型的核心思想是什么?它如何统一不同的NLP任务?
-** 核心思想 :将所有NLP任务统一为"文本到文本(Text-to-Text)"框架,即输入和输出均为文本序列,简化模型设计和迁移流程。
- 任务统一方式 **:
- 通过"任务前缀"区分任务类型,例如:
- 翻译:输入"translate English to French: Hello world",输出"Bonjour le monde"。
- 情感分析:输入"sst2 sentence: This movie is great",输出"positive"。
- 摘要:输入"summarize: [长文本]",输出"[摘要]"。
- 模型结构:采用Encoder-Decoder架构(类似原始Transformer),所有任务共享同一模型和训练目标(预测输出文本的下一个token)。
-** 优势 **: - 避免为特定任务设计专用输出层,提升跨任务迁移能力。
- 可通过统一的预训练(C4数据集)和微调流程优化所有任务。
-** 示例代码(T5任务统一示例)**:
python
from transformers import T5Tokenizer, T5ForConditionalGeneration
model = T5ForConditionalGeneration.from_pretrained('t5-small')
tokenizer = T5Tokenizer.from_pretrained('t5-small')
# 翻译任务
input_text = "translate English to German: The cat sits on the mat."
inputs = tokenizer(input_text, return_tensors='pt')
outputs = model.generate(** inputs, max_length=30)
print(tokenizer.decode(outputs[0], skip_special_tokens=True)) # 输出:"Die Katze sitzt auf der Matte."
54. 什么是"稀疏注意力"?哪些模型使用了这一机制(如Longformer、Performer)?
- 稀疏注意力(Sparse Attention):对自注意力机制的优化,仅计算序列中部分token对的注意力(而非全连接),降低时间复杂度(从O(n²)降至O(n)或O(n log n)),适合长序列(如文档、基因组序列)。
- 常见模型及机制 :
- Longformer :
- 采用滑动窗口注意力(局部窗口内全连接)+ 全局注意力(指定关键token与所有token连接,如
[CLS]
)。 - 支持最长4096token的序列(远超BERT的512)。
- 采用滑动窗口注意力(局部窗口内全连接)+ 全局注意力(指定关键token与所有token连接,如
- Performer :
- 使用"随机特征映射"近似注意力计算,将注意力矩阵分解为低秩矩阵,复杂度降至O(n d)(d为隐藏维度)。
- Reformer :
- 采用"局部敏感哈希(LSH)"将相似token分组,仅在组内计算注意力,复杂度O(n log n)。
- Longformer :
- 示例代码(Longformer长序列处理):
python
from transformers import LongformerTokenizer, LongformerModel
tokenizer = LongformerTokenizer.from_pretrained('allenai/longformer-base-4096')
model = LongformerModel.from_pretrained('allenai/longformer-base-4096')
long_text = " ".join(["This is a long sequence."] * 500) # 超512token的长文本
inputs = tokenizer(long_text, return_tensors='pt', padding=True, truncation=True, max_length=4096)
outputs = model(** inputs) # 无OOM错误,高效处理长序列
55. 针对长序列处理,Transformer有哪些改进方法(如降低时间复杂度)?
-
改进方法 :
- 稀疏注意力:如Longformer(窗口+全局注意力)、Reformer(LSH哈希分组),仅计算部分token对的注意力。
- 低秩近似:如Performer(随机特征映射)、Linformer(用低秩矩阵近似Key/Value的序列维度),将O(n²)降至O(n)或O(n d)。
- 分块处理:如CogView(图像分块)、Transformer-XL(引入记忆机制缓存前序块信息),避免重复计算。
- 模型结构优化 :
- 缩减注意力头数或隐藏维度(如MobileBERT)。
- 替换自注意力为卷积(如ConvBERT用卷积捕捉局部依赖)。
- 硬件/工程优化 :
- 混合精度训练(减少内存占用)。
- 模型并行(将注意力计算拆分到多个GPU)。
-
时间复杂度对比 :
方法 时间复杂度 适用场景 原始Transformer O(n² d) 短序列(如句子级任务) 稀疏注意力 O(n d) 长文档、基因组序列 低秩近似 O(n d) 通用长序列场景
56. ALBERT在BERT的基础上做了哪些优化?目的是什么?
- 核心优化 :
- 嵌入参数因式分解:将输入嵌入维度(E)与隐藏层维度(H)解耦(如E=128,H=768),通过矩阵投影将E映射到H,减少嵌入层参数(原始BERT:E=H=768,参数为V×H;ALBERT:V×E + E×H,V为词表大小)。
- 跨层参数共享:所有Encoder层共享同一套参数(原始BERT每层参数独立),大幅减少总参数(如12层ALBERT参数仅为BERT的1/12)。
- 移除NSP任务 :改用句子顺序预测(SOP) 任务(判断两个句子是否交换顺序),更聚焦于句子级语义理解。
- 目的 :
- 降低模型参数量和内存占用,使训练更大模型(如ALBERT-xlarge)成为可能。
- 在保持性能接近BERT的同时,提升训练和推理效率。
- 效果:ALBERT-large参数量(18M)仅为BERT-large(336M)的5%,但在GLUE基准上性能相当。
57. RoBERTa与BERT相比,主要改进了哪些训练细节?
- 训练细节改进 :
- 更大的训练数据:使用160GB文本(BERT为16GB),包括BookCorpus+Wiki、CC-News、WebText等。
- 更长的训练时间:训练步数从1M增至300K(但batch size更大,总token量更多)。
- 移除NSP任务:仅保留MLM任务,发现NSP对性能无显著提升甚至有害。
- 动态掩码:BERT使用静态掩码(训练中掩码不变),RoBERTa每次输入时随机生成掩码,增强泛化性。
- 更大的batch size:从16K增至8K-32K,并通过梯度累积实现。
- 使用字节级BPE(Byte-level BPE):支持所有Unicode字符,减少UNK token比例。
- 效果:RoBERTa在多数NLP任务(如GLUE、SQuAD)上超越BERT,成为更强的预训练模型。
58. ViT(Vision Transformer)如何将Transformer应用于图像任务?与CNN相比有何优势?
- 应用方法 :
- 图像分块:将图像(如224×224)分割为非重叠的固定大小补丁(如16×16),每个补丁展平为向量(16×16×3=768维,3为RGB通道)。
- 补丁嵌入:通过线性投影将补丁向量映射到模型隐藏维度(如768),类似NLP中的token嵌入。
- 添加类别标签 :引入
[CLS]
向量作为图像分类的聚合特征。 - 位置编码:加入补丁的空间位置编码(可学习或固定)。
- Transformer Encoder :使用标准Encoder处理补丁序列,最终通过
[CLS]
向量预测图像类别。
- 与CNN相比的优势 :
- 长程依赖建模:CNN通过卷积核的局部感受野捕捉信息,ViT通过自注意力直接建模全局像素依赖。
- 数据效率:在大规模数据集(如JFT-300M)上训练时,性能远超CNN(如ResNet),且随数据量增加提升更显著。
- 架构简洁:无需手动设计卷积核、池化层等组件,通用性更强。
- 示例代码(ViT图像分类):
python
from transformers import ViTImageProcessor, ViTForImageClassification
from PIL import Image
processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')
model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')
image = Image.open("cat.jpg")
inputs = processor(images=image, return_tensors='pt')
outputs = model(**inputs)
predicted_class_idx = outputs.logits.argmax(-1).item()
print(model.config.id2label[predicted_class_idx]) # 输出:"tabby cat"
59. 多模态Transformer(如CLIP、DALL·E)是如何融合文本和图像信息的?
-
CLIP(Contrastive Language-Image Pretraining):
- 结构:包含文本Encoder(Transformer)和图像Encoder(ViT或CNN)。
- 融合方式:通过对比学习对齐文本和图像嵌入。具体来说,将文本和图像分别编码为同维度向量,训练目标是最大化匹配文本-图像对的相似度,最小化非匹配对的相似度。
- 应用:零样本分类(用文本描述类别,与图像嵌入比对)。
-
DALL·E:
- 结构:文本Encoder(Transformer)+ 图像Decoder(自回归Transformer)。
- 融合方式:文本Encoder将文本编码为潜在向量,图像Decoder以该向量为条件,自回归生成图像的像素序列(或VQ-VAE的潜在码)。
- 应用:文本到图像生成(如"a cat wearing a hat"生成对应图像)。
-
核心融合机制:
- 共享嵌入空间:文本和图像映射到同一向量空间,通过相似度计算或条件生成实现跨模态关联。
- 跨注意力:部分模型(如FLAVA)在Encoder中加入文本-图像交叉注意力,直接建模模态间依赖。
60. 轻量级Transformer模型(如DistilBERT、MobileBERT)的设计思路是什么?
-
设计思路:在保持性能接近原始模型的前提下,通过压缩参数和优化结构降低计算成本,适合移动端或资源受限场景。
-
具体方法(以DistilBERT和MobileBERT为例):
-
DistilBERT:
- 知识蒸馏:用BERT作为教师模型,训练小模型(6层Encoder,原始BERT为12层)模仿其输出分布。
- 移除Token Type Embedding和NSP任务,保留MLM任务。
- 参数量减少40%,速度提升60%,性能保留95%。
-
MobileBERT:
- 瓶颈结构:将Transformer层拆分为"扩展层"(高维度,捕捉复杂特征)和"压缩层"(低维度,减少计算),类似MobileNet的深度可分离卷积。
- 注意力优化:用低秩矩阵近似注意力权重,减少计算量。
- 预训练优化:使用更大batch size和蒸馏策略,确保小模型性能。
-
-
通用策略:
- 减少层数、隐藏维度或注意力头数。
- 知识蒸馏(利用大模型指导小模型训练)。
- 结构重参数化(如低秩分解、共享参数)。
- 移除冗余组件(如特定任务的嵌入或层)。