1.史上最细节的自然语言处理NLP/Transformer/BERT/Attention面试问题与答案
2.剑指TensorFlow,PyTorch Hub官方模型库一行代码复现主流模型
3.记录自己基于pytorch增量训练(继续预训练)BERT的过程
4.PyTorch显存分配原理——以BERT,GPT为例
5.BERT:一切过往, 皆为序章BERT预训练模型 | 10分钟理解Bert | Pytorch代码讲解 | 代码可运行
6.BERT源码逐行解析
史上最细节的自然语言处理NLP/Transformer/BERT/Attention面试问题与答案
经过精心整理,以下内容包含了史上最详尽的NLP面试问题,关注Transformer、短线抄作业源码BERT以及Self Attention,还包括Norm相关问题,旨在深入理解这些技术的细节。 问题精选自论文与实践,如Transformer的“Attention Is All You Need”和BERT的“Pre-training of Deep Bidirectional Transformers for Language Understanding”。深入学习,需要对这些基础模型有基本认知,包括Transformer的Pytorch源码、BERT的实现以及HuggingFace Transformers库。为何BERT首句加[CLS]标记?
BERT的Embedding相加对语义的影响如何?
BERT词掩码策略分别针对哪些情况?
为何选择%词进行mask,可否调整比例?
如何针对不同任务调整BERT的Fine-tuning方法?
限制BERT输入长度的原因是什么?
BERT中的非线性来源,multi-head attention是否线性?
BERT如何处理一词多义问题?
BERT输入细节,position id、type_id和attention_mask的作用是什么?
学习率warm-up策略的原理和目的?
BERT使用的Normalization结构及其区别?
ELMO与BERT的双向性差异何在?
BERT与Transformer Encoder的区别及其目的?
BERT的损失函数是什么?
Masked LM与Next Sentence Prediction任务的训练顺序?
Transformer的权重共享机制及其好处。
Transformer的点积模型缩放原因及multi-head attention的实现。
Transformer Encoder-Decoder交互及与seq2seq的区别。
multi-head attention降维的原因及好处。
XLNet如何利用上下文信息,双流注意力的作用和设计。
ALBERT的优化策略和与BERT的对比。
Attention与全连接层的区别,以及self-attention的细节。
Norm的基础操作及其在NLP中的应用。
面试中,面试官会关注你的实际应用和理解能力,因此理解Transformer/BERT在项目中的应用至关重要。本文旨在加深你对这些技术的理解,提升你的面试准备。 对于未解答的问题,鼓励思考和探索,我会在有空时补充答案。如需NLP相关咨询,欢迎提问。 参考资源链接省略。剑指TensorFlow,PyTorch Hub官方模型库一行代码复现主流模型
PyTorch团队推出了一款强大的时间选择js源码下载模型调用工具——PyTorch Hub,只需一行代码,用户就能轻松接入BERT、GPT、PGAN等主流模型,极大地简化了模型的调用和复现过程。
在机器学习领域,模型的可复现性是关键,但以往的研究成果往往难以复制。PyTorch Hub作为基础构建单元,提供了一个简单的API和工作流,旨在提升研究的可复现性。它集成了Colab支持,整合了Papers With Code资源,并内置了丰富多样的预训练模型,包括分类器、分割器、生成器和Transformer等,为研究和新项目提供了便利。
研究者可以方便地在GitHub上发布自己的预训练模型,只需添加hubconf.py文件来定义模型结构和权重。例如,使用HuggingFace的BERT模型,只需定义一个bertForMaskedLM入口并指定预训练权重。模型发布后,用户可以通过torch.hub.load()来加载,这个过程极其简单,无需额外安装,且能轻松获取模型的最新更新。
PyTorch Hub简化了用户的操作流程,包括探索可用模型、加载模型、理解参数等。通过torch.hub.list(),用户可以查看所有可用模型,而torch.hub.load()则提供了预训练模型的一站式加载服务。同时,模型的稳定性也得到了保障,通过特定分支或Tag提供支持,确保代码的稳定性。
尽管TensorFlow也有类似的TensorFlow Hub,但PyTorch凭借其用户友好性和社区支持,从源码编译安装geth依然受到开发者青睐。未来,无论选择哪个框架,关键都将集中在模型设计和优化上,框架的易用性将更加重要,用户不再需要过多关注底层实现问题。
记录自己基于pytorch增量训练(继续预训练)BERT的过程
基于pytorch进行增量训练(继续预训练)BERT的过程旨在利用已训练好的BERT模型,结合领域特定语料,实现模型能力的进一步提升。原本使用google bert的增量预训练方法受限于CPU计算,速度缓慢,因此探索了基于pytorch和多GPU的解决方案。
实验环境包括torch 1.7.0+cu,transformers 3.5.1,且确保transformers版本为3.0以上,避免因版本差异导致的错误。如遇到`AttributeError: 'BertTokenizerFast' object has no attribute 'max_len'`问题,直接通过pip重装transformers可以快速解决。
实验步骤主要包括在本地环境运行`run_language_modeling.py`文件,同时准备增量训练和评估文件。这些文件以每行一句话的形式存储,每8行作为训练集,每2行作为评估集。注意训练文件不能隔行存储,因此在训练参数中需要特别指定`line_by_line`。
使用指定的BERT模型(例如siku_bert,为内部训练的简体版四库全书BERT)作为预训练基础,并在bash中执行命令进行训练。关键参数包括训练使用的所有GPU,通过`CUDA_VISIBLE_DEVICES`设置来避免占用其他用户资源。训练目录由`output_dir`参数定义,用于保存训练成果,模型最终文件为`pytorch_model.bin`。
训练过程中,通过`nohup.out`文件监控评估损失,发现损失值逐渐减小,表明模型性能提升。训练结果自动保存在指定目录中,包括最终模型文件及每隔一定checkpoint保存的模型文件,虽占用一定内存,但有助于模型迭代过程的html分类查询的源码记录。
值得注意的是,在增量训练过程中,词汇表保持一致,不增加新的词汇,仅更新现有词汇的权重。若需扩展词汇表,相关讨论和指导可以参阅其他资源。此外,基于transformers3.0版本的增量预训练方法已实现,而对于4.0及以上版本的transformers,虽然已有现成的源码支持,但未直接尝试使用,留待未来进一步探索和应用。
PyTorch显存分配原理——以BERT,GPT为例
这篇文章将会解决这些问题。
PyTorch 显存分配机制涉及两个部分:CUDA 上下文和PyTorch缓存管理。
CUDA 上下文在第一次cuda操作时创建,占用大小与CUDA版本和硬件设备相关。例如,在V,CUDA.1上,CUDA上下文共占用MB。
PyTorch缓存管理中,只在需要释放缓存以便其他用户也可使用当前显卡时,才调用torch.cuda.empty_cache()方法。通过定义4MB的Tensor并执行后,缓存区大小增至MB,其中包含Tensor占用的4MB。在删除临时变量后,缓存区保持MB,nvidia-smi显示的占用为MB。清空缓存后,占用降至MB。
在模型训练和推理过程中,显存使用情况如下:训练阶段,前向传播占用模型参数、输入、输出和中间变量的总和。测试阶段,占用模型参数、输入向量和输出向量。华为畅享5源码反向传播时,模型参数占用额外空间来存储梯度。
反向传播需要保存中间变量,构建计算图,Python的垃圾回收机制基于引用计数,中间变量的保留与图的引用相关。如果版本更新(如1.以上),可以使用特定函数找到保存的中间变量。
RNN的显存占用与输入长度有关,可通过进程角度和框架角度分析显存占用,其中方法包括使用nvidia-smi或gpustat检查,以及通过PyTorch API如torch.cuda.memory_allocated()、torch.cuda.memory_reserved()和torch.cuda.memory_summary()获取详细信息。
使用torchinfo可以查看模型参数数量和输出大小,以BERT为例,可以看到总参数量为M,输入指定后,可以得到每一层输出的大小和总显存占用。BERT训练阶段的显存占用包括模型参数、输入、输出和激活值,测试阶段则包括模型参数、输入向量和输出向量。BERT输入长度对显存占用有显著影响,显存占用为O(n^2)关系,导致难以训练超长文本。
BERT的Batch Size和显存占用之间存在O(n)关系,FP混合精度可以在不牺牲性能的情况下减少显存使用,提高训练速度。混合精度下,BERT的显存占用和时间均得到显著降低。总结而言,理解显存分配机制、合理使用缓存、优化模型结构和使用混合精度策略是降低BERT等模型训练显存占用的关键。
BERT:一切过往, 皆为序章BERT预训练模型 | 分钟理解Bert | Pytorch代码讲解 | 代码可运行
前言:
BERT(Bidirectional Encoder Representations from Transformers)是Google AI团队于年推出的一项重大工作,短短几个月内就在文本蕴含识别、语义文本相似度、命名实体识别、自然语言推理等多个领域取得了领先地位。BERT对于深度学习来说,具有划时代的意义。至今,该论文已被引用,次。
1 BERT的结构图
BERT的结构基于Transformer的Encoder部分,对于Transformer的了解可以参考相关文章或原论文。该模型由层Encoder组成,每层结构相似。
2 BERT预训练数据预处理
BERT通过两个自监督任务进行预训练。任务一:判断一对句子是否连续。预处理时,将句子“你好,我是jack”变为“CLS,你,好,SEP,我,是,jack,SEP”,标签为1,表示连续;再从文本中随机选择一句话作为下一句,如“CLS,你,好,SEP,阿,富,汗,独,立,SEP”,标签为0,表示不连续。连续与不连续的句子各占%。任务二:判断被mask掉的词是什么。从句子中随机选择%的词进行mask,其余操作与任务一类似。这两个任务有助于BERT理解语句意思。
预处理后,每个训练数据统一长度,不足部分用“pad”填充,过长数据截断。每个词转化为字典索引表示。
3 BERT的Encoder
3.1 Encoder的输入
输入包含位置、句子信息的词向量,通过三个nn.Embedding()映射到相同维度的高维空间,然后求和作为输入。
3.2 Encoder的encoder
由个encoder组成,以下解释一个encoder。
3.2.1 Self Attention Mechanism
该机制通过计算第一个词与其他每个词的注意力分数,再将分数与对应词信息加权求和,得到与句子中所有词加权和的信息。依次更新每个词的注意力信息。
3.2.2 矩阵思想计算Self Attention Mechanism
通过字向量矩阵与三个矩阵相乘得到注意力值矩阵,经过Softmax计算注意力分数矩阵,并与对应词信息相乘,得到注意力机制输出。
3.2.3 多头注意力机制(Multi-Head Attention)
使用多头注意力机制,将注意力矩阵拆分成多个小矩阵,计算多个注意力信息,最后拼接为输出。
3.2.4 Add & Layer normalization
使用残差网络思想与归一化加速训练。
3.2.5 Feed Forward前馈神经网络
通过两个全连接层实现,与Add & Layer normalization组合。
3.2.6 encoder 输入
前馈神经网络输出作为encoder输入。
4 预训练BERT Pytorch代码
4.1 头文件
4.2 参数设置
4.3 数据预处理
采用动态Mask和动态下句随机匹配,每次迭代数据不同。
4.4 激活函数和归一化
4.5 BertEmbeddings
映射词向量到高维空间。
4.6 Bert Encoder
4.6.1 Encoder的Self-Attention Mechanism
计算注意力分数,加权求和。
4.6.2 Encoder的Add & Layer normalization
使用残差网络和归一化加速训练。
4.6.3 Encoder
组合层Encoder。
4.9 BertPooler(处理CLS信息)
提取Encoder输出的“CLS”特征。
4. 预训练模型加载、保存
4. BertModel
组合所有类。
4. 预训练BertPreTrainingHeads(下游任务)
为预训练做准备。
4. 预训练模型定义
定义模型,计算损失。
4. 训练
展示训练过程中的损失值。
如果有疑问、建议或错误,欢迎留言指正。
BERT源码逐行解析
解析BERT源码,关键在于理解Tensor的形状,这些我在注释中都做了标注,以来自huggingface的PyTorch版本为例。首先,BertConfig中的参数,如bert-base-uncased,包含了word_embedding、position_embedding和token_type_embedding三部分,它们合成为BertEmbedding,形状为[batch_size, seq_len, hidden_size],如( x x )。
Bert的基石是Multi-head-self-attention,这部分是理解BERT的核心。代码中对相对距离编码有详细注释,通过计算左右端点位置,形成一个[seq_len, seq_len]的相对位置矩阵。接着是BertSelfOutput,执行add和norm操作。
BertAttention则将Self-Attention和Self-Output结合起来。BertIntermediate部分,对应BERT模型中的一个FFN(前馈神经网络)部分,而BertOutput则相当直接。最后,BertLayer就是将这些组件组装成一个完整的层,BERT模型就是由多个这样的层叠加而成的。
保姆级教程,用PyTorch和BERT进行文本分类
在PyTorch中,BERT(Bidirectional Encoder Representations from Transformers)已成为文本分类任务的强大工具。年,谷歌推出的BERT模型因其Transformer架构在NLP领域的卓越性能而备受瞩目,它能有效融合上下文信息,提升文本表示的准确性。本文将指导你如何使用Hugging Face提供的预训练BERT模型进行文本分类,以BBC新闻数据集为例,对体育、政治、商业、娱乐和科技类新闻进行区分。
首先,你需要了解BERT的基本结构,它由堆叠的Transformer编码器组成,每个编码器包含自注意力层和前馈层。BERT输入为一系列标记的tokens,其中特殊的[CLS]和[SEP]用于整合文本信息。BERT输出是一个维向量,通常关注[CLS]位置的表示,用于分类任务。
在实际操作中,预处理数据涉及将文本转换为BERT期望的格式,包括添加[CLS]和[SEP]标记。下载预训练模型可以从Hugging Face的模型库选择,如bert-base-cased或bert-base-uncased,根据数据集语言选择合适的版本。对于中文数据,需使用bert-base-chinese。
构建模型时,使用BERT基础模型的层Transformer,对预处理后的数据进行训练,包括选择优化器、设置学习率,以及选择适当的损失函数。训练完成后,模型在测试集上的表现评估通常用准确率衡量。
关于BERT输入长度限制,每个输入序列最大为个tokens,这是由于BERT配置中的设计。要扩大输入长度,可能需要自己重新训练模型。BERT的Embedding加和实际上是一个融合过程,有助于捕捉语义信息。
总的来说,通过本文提供的保姆级教程,你将学会如何使用BERT进行文本分类,无论是进行单标签或多标签分类,都能通过预训练模型和适当的模型配置来实现。开始你的NLP旅程吧!
bert4torch(参考bert4keras的pytorch实现)
为了适应主要使用pytorch进行开发的需求,我基于对苏神在科学空间网站上的深度学习实践和理解,着手开发了bert4torch项目。该项目旨在为使用pytorch的开发者提供一个与bert4keras相媲美的框架,实现BERT系列模型的预训练权重加载和微调功能,同时提供了一流的模型灵活性、简洁高效的调用方式以及多种辅助工具,以提高开发效率。
bert4torch主要提供了以下功能:
1. **预训练模型加载与微调**:支持BERT、RoBERTa、ALBERT、NeZha、BART、RoFormer、ELECTRA、GPT、GPT2、T5等多种预训练模型的加载,开发者可以根据具体任务需求灵活选择合适的模型并进行微调。
2. **自定义模型构建**:在BERT的隐含层向量之上,开发者可以自由设计自己所需的模型结构,以满足特定任务的特定需求。
3. **高效调用与打印参数量**:bert4torch简化了调用流程,使其与BERT4Keras保持高度一致性。同时,通过集成torchinfo和log工具,方便了模型参数量的查看和模型训练过程的监控。
4. **进度展示与日志记录**:实现了基于keras的训练进度条动态展示功能,并支持在训练开始/结束,batch开始/结束,epoch的开始/结束等关键阶段记录日志和写入tensorboard文件,方便跟踪训练过程和结果分析。
5. **集成了示例与框架**:为了帮助开发者快速上手并探索更多可能性,bert4torch内置了多个示例,使得开发者能够在同一数据集上尝试和比较不同的解决方案。
对于未来规划,bert4torch团队将着重于提升模型的灵活性和优化训练效率,以更好地满足多样化的深度学习应用需求。计划探索更先进的预训练模型和自适应技术,同时加强与社区的互动和交流,推动BERT系列模型在科研与工业领域的应用。