礼品兑换网站怎么做,seo优化网站教程,怎么做像表白墙的网站,注册1千万的公司需要多少钱节前#xff0c;我们星球组织了一场算法岗技术面试讨论会#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学.
针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。
汇总合集我们星球组织了一场算法岗技术面试讨论会邀请了一些互联网大厂朋友、参加社招和校招面试的同学.
针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。
汇总合集《大模型面试宝典》(2024版) 发布 《Attention is All You Need》发表于 2017 年2018 年 Google AI Language 团队发表了论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》提出了 BertBidirectional Encoder Representations from Transformers架构。
BERT 实际基于 Transformer 的编码器部分如若大家理解了前述 Transformer 系列文章那么再学习 BERT 会很容易理解。
这次依然尝试使用图解的方式介绍 BERT。文章一部分及配图参考了 Rahul Agarwal 在 Medium 上的文章及原始论文建议收藏、关注、点赞无论实战还是面试都是常考热点。
一、BERT 概览
简单来说BERT 是一种可用于问题解答、分类、NER 等大量 NLP 下游任务的架构。可将预训练后的 BERT 视为一个黑盒。
BERT 有两个主要版本 BERT Base12层 Transformer 编码器隐藏层大小为76812个自注意头总参数量约为1.1亿。 BERT Large24层 Transformer 编码器隐藏层大小为102416个自注意头总参数量约为3.4亿。
以 BERT Base 版本的 BERT 为例它能将输入中的每个 Token 转化为一个 H 768 的向量。与 Transformer 相同BERT 的输入序列可以是一个单独的句子也可以是一对由分隔符 [SEP] 标记分隔以开始符 [CLS] 标记开始的句子。 二、BERT 解决什么问题
如果各位小伙伴对 Imagenet 有所了解那么也会很容易理解 BERT 的预训练过程。 ImageNet 是一个大型图像数据库包含了数百万个带标签的图像。CV 模型在这个数据集上进行预训练以学习图像特征预训练完成后对于具体图像任务可以通过在较小的数据集上微调模型最后几层来适应特定任务。前几年流行的 ResNet 和 VGG 等深度学习模型最初都是在 ImageNet 数据集上进行预训练的。
BERT 模型工作原理与使用 Imagenet 进行训练的大多数 CV 模型类似。首先在大型语料库上训练 BERT 模型然后通过在最后添加一些额外的层针对具体的 NLP 任务如分类、问题解答、NER 等对模型进行微调。
例如先在维基百科这样的语料库上训练 BERT屏蔽 LM 任务然后再用特定的数据对模型进行微调以完成分类任务诸如通过添加一些额外的层将评论分为负面、正面或中性等方式。实际上我们只是使用 [CLS] 标记的输出来完成分类任务。
如下图所示的微调过程通过添加线性层和 Softmax 层对 [cls] Token 进行分类输出。 具体来说 对 BERT 输出的 [cls] Token 使用矩阵乘法作变换。假设我们的分类数是 3那么 [cls] Token 向量的维度是(1×768)引入的 W 矩阵的形状为 H × num_classes 768 × 3 [cls] Token 代表的矩阵与 W 矩阵相乘得到一个(1×3)的矩阵这个矩阵再通过 Softmax 得到每个类别的概率然后计算交叉熵损失。
当然也可以通过在最后一层获取句子特征然后再输出到 Softmax或者可以取所有输出的平均值然后再通过 Softmax。方式有多种哪种最有效取决于任务的数据。
三、从嵌入的角度看 BERT
从嵌入的角度来看BERT 的预训练为我们提供了上下文双向嵌入。
1. 上下文 Contextual:
词的嵌入不是固定的它们依赖于周围的词语。在前序《图解 Transformer》序列文章就详细介绍过这个概念。比如在“one bird was flying below another bird”这句话中“bird”这个词的两个嵌入会有所不同。
2. 双向 Bi-Directional: LSTM 按顺序读取文本输入从左到右或从右到左而 Transformer 的编码器则是一次性读取整个单词序列因此被认为是双向的注意Transformer 模型的解码器部分通常是单向的。因此对于“BERT model is awesome.”这样的句子“model”这个词的嵌入会包含“BERT”、“awesome”和“is”所有词的上下文。
四、BERT 工作的具体流程
接下来从“架构-Architecture 、输入-Input、训练-Training”三个部分介绍 BERT 的具体工作流程。
1. Architecture
如果你对 Transformers 已经有所了解那么 BERT 的架构非常容易理解。BERT 基本上是由我们非常熟悉的Transformers 中的编码器堆栈Encoder Stacks组成的。 原始论文中作者实验了两种模型即我们在开头也提到过的 BERT Base 与 BERT Large 两种架构。
2. Training Input
我们使用下图中的输入结构向 BERT 提供输入。输入由两个句子两个特殊的 Token构成。两个特殊的 token是 [CLS]和[SEP] token。 例如对于两个句子“my dog is cute”和“he likes playing”BERT 首先使用 WordPiece 分词将序列转换为Token并在开头添加[CLS] Token在第二个句子的开头和结尾添加[SEP] Token因此输入是 在 BERT 中使用的 WordPiece 分词方法会将单词如 playing 分解成“play”和“##ing”。对于为什么使用 WordPiece 这种方式我们后面再详细介绍。
BERT 的每个 token 的嵌入由 Token Embeddings、Position Embeddings、Segment Embeddings 三种嵌入向量进行表示:
Token Embedding词嵌入 通过在一个大小为 30000x768(H) 的词表矩阵中查找来获取 Token 嵌入。这里30000 是WordPiece 分词后的词汇表长度。这个矩阵所代表的权重将在训练过程中学习。 Segment Embedding段落嵌入 对于知识问答等任务我们需要指定这个句子是来自哪个段落。如果嵌入来自第一个句子这些嵌入是长度为H的全0向量如果嵌入来自第二个句子则为全1向量。 位置嵌入位置嵌入这些嵌入用于指定单词在序列中的位置和 Transformer 中所做的一样。位置矩阵的列数为768矩阵的第一行是[CLS] Token的嵌入第二行是单词“my”的嵌入第三行是单词“dog”的嵌入以此类推。 给BERT的最终输入是 Token Embeddings、Segment Embeddings、Position Embeddings的叠加Token Embeddings Segment Embeddings Position Embeddings。
3. 训练遮蔽语言模型Masked LM
这部分是 BERT 最有趣的地方。我们将通过各种架构尝试并发现每种尝试的缺陷以此来解释这些概念并形成 BERT的最终架构。
尝试1例如如果我们按如下方法设置 BERT 训练即预测输入序列的每个单词。 这种方法的问题在于学习任务过于简单。网络提前就知道它要预测什么因此可以轻松地学习权重以达到100%的分类准确率。
注意这里的“预测-Predict”与 Transformer 解码器中基于已经生成的单词预测下一个单词的“预测”的含义略微不同。这里的“预测-Predict”是“生成-Generation”的意思。这里使用“Predict”这个词是表达在 Masked LM 模型中模型根据上下文信息推断被掩蔽 token 的过程。虽然“生成”也可以理解为一种预测但在NLP术语中“生成”通常指的是更广泛的内容创建而不是特定位置 token 的推断。下面几种方法中提到的“预测”一词也是这样的含义。
尝试2遮蔽语言模型Masked LM。原论文中尝试使用此方法克服上述问题。在每个训练输入序列中随机遮蔽15%的单词并仅预测这些单词的输出。 此种方式计算损失时只针对屏蔽的单词。模型学会了预测它未见过的单词同时还能看到这些单词周围的上下文。注意图中屏蔽了 3 个单词实际上应该只屏蔽 1 个单词因为这个示例中8 个单词的 15% 就是 1 个单词。
但这种方式的造成了模型在“预训练-微调”两个过程的不匹配问题。
具体来说在预训练阶段模型需要根据上下文预测被遮蔽的 token因此模型会更多地依赖上下文信息来填补空白。但在微调阶段模型直接处理完整的句子输入方式不同可能会导致模型的预测行为与预训练阶段存在偏差。另外在预训练时模型通过预测被掩蔽的token来学习语言的结构和语义但在微调阶段模型的目标通常是根据完整输入直接进行分类或预测这种目标上的差异可能导致模型在微调时需要重新调整。
尝试3使用随机单词的遮蔽语言模型
在这个尝试中仍然会遮蔽15%的位置。但会用随机单词替换那些被遮蔽标记中的20%。这样做是为了让模型知道即使单词不是[MASK]标记我们仍然需要输出一些结果。因此如果我们有一个长度为500的序列我们将遮蔽75个标记500的15%在这75个标记中有15个标记75的20%将被随机单词替换。示意图如下 这种方式的优点在于网络仍然可以处理任何单词。
但其问题在于模型会学到一种错误模式即看到随机替换的单词时这些单词永远不会是正确的输出。比如对于我们的例子将“likes”随机替换为“eats”而我们在这个位置需要的输出为“likes”模型会学习到“eats”的输出永远不会是“eats”。而在不同的上下文中比如输入“he eats bread”需要的输出中包含“eats”。
尝试4使用随机单词和未遮蔽单词的遮蔽语言模型
为了解决这个问题作者提出了以下训练设置。
在训练数据中随机选择 15% 的 token 位置进行预测。这些随机选择的 token 中80%替换为[MASK]标记10%随机替换为词汇表中的其他 token10% 保持不变。
如果我们有一个长度为 500 的序列我们将遮蔽75个 token500的15%在这75个 token中7个 token75的10%将被随机 token 替换7个 token75的10%保持不变。示意如下 这样就有了最佳设置模型不会学习到不良模式。
4. 训练附加的下一句预测任务NSP
BERT 模型在训练过程中还有另一个并行的于 Masked LM 的训练任务这个任务称为下一句预测Next Sentence Prediction, NSP。在创建训练数据时我们为每个训练样本选择句子A和B其中50%的情况下B是实际紧跟在A后的句子标记为IsNext而另外50%的情况下B是语料库中的一个随机句子标记为NotNext。然后我们使用[CLS]标记的输出来计算损失这个损失也会通过网络反向传播来调整权重。
摘自 BERT 论文原文许多重要的下游任务如问答QA和自然语言推理NLI都基于两个句子之间的关系而这种关系不是通过语言模型直接捕捉到的。为了训练一个能够理解句子关系的模型我们进行了一种二元化的下一句预测任务binarized next sentence prediction task的预训练这个任务可以从任何单语语料库中轻松生成。 现在我们有了预训练的BERT模型它可以为我们提供上下文嵌入。那么如何将它用于各种任务呢
五、针对具体任务进行微调
如前所述我们可以在 [CLS] 输出上添加几层并微调权重然后使用BERT进行分类任务。 以下是论文中介绍的 BERT 用于其他任务的方法 让我们逐一浏览这些任务
1. 句子对分类任务这与分类任务非常相似。即在大小为768的[CLS]输出上添加一个线性层和一个Softmax层Linear Softmax。
2. 单句分类任务与句子对分类任务相同。
4. 单句标注任务与训练 BERT 时的设置非常相似只是我们需要为单句中的每个 Token 进行标注。如对于词性标注任务如预测名词、动词或形容词我们只需添加一个大小为768 x n_outputs的线性层并在上面添加一个Softmax层进行预测。
3. 问答任务——这个任务中我们给出一个问题和一个包含答案的段落目标是确定答案在段落中的起始和结束位置。
六、问答任务详细工作流程
BERT 执行问答任务的原理与 GPT 等以自回归生成答案的模型不同。以下是关于 BERT 在执行问答任务时的详细流程
1. 输入序列
输入序列由问题和段落拼接而成并添加特殊标记
[CLS] 问题 [SEP] 段落 [SEP]2. BERT模型输出
输入序列通过 BERT 模型处理生成每个 token 的上下文表示。假设输入序列长度为 隐藏层维度为 则BERT 的输出表示为一个矩阵 其形状为 ×。
3. 定义向量 和
向量 和 是在微调过程中学习的参数用于分别预测起始位置和结束位置的分数。若隐藏层维度 768则 和 的形状均为 1×768。
4. 计算分数
对于每个 token 的表示向量 ℎBERT的输出计算其作为答案起始位置和结束位置的分数。具体计算方式向量每个 ℎ 分别与 和 向量的装置进行点积内积其结果为一个标量 5. 将分数通过 Softmax 函数转换为概率分布 6. 选择最可能的起始和结束位置
确定起始和结束位置根据计算出的起始位置概率分布 和结束位置概率分布 选择概率最高的token 作为答案的起始和结束位置。具体做法是找到使 和 最大的索引位置 确定答案范围确保起始位置 在结束位置 之前即 ≤。如果需要可以在推理过程中应用额外的逻辑来处理不合逻辑的预测结果例如设置一个最大答案长度。
7. 提取答案
根据确定的起始和结束位置从输入序列中的段落部分提取对应的token序列拼接成最终答案。
8. 训练时的损失计算
问答任务训练的目标是最大化正确起始位置和结束位置的对数似然之和。假设真实的起始位置和结束位置分别为 和 则损失函数负对数似然为 总损失函数为 对比 BERTGPT 在处理问答型任务时使用自回归方式生成答案即逐步预测每个 token基于前面的token生成下一个token直到生成结束标记或达到预设的最大长度。
七、WordPiece 技术与词嵌入方法的差异
前边我们遗留了一个问题即 WordPiece 和词嵌入技术方面的差异。以下是二者差异的详细介绍
1. 原始 Transformer 模型的词嵌入
词汇表原始的 Transformer 模型通常使用一个固定的词汇表词汇表中的每个单词都被映射到一个固定长度的向量词嵌入。
词嵌入矩阵在 Transformer 模型中有一个词嵌入矩阵用于将输入单词转换为对应的向量表示。
完整单词表示原始 Transformer 模型中的词嵌入通常是基于完整单词的也就是说每个单词在词汇表中都有一个对应的向量。
2. BERT 的 tokenization 技术
词片WordPiece嵌入BERT使用的是一种称为 WordPiece 的子词级别的 tokenization方法。这种方法将单词拆分成更小的子词单元词片这些子词单元构成了模型的词汇表。
更小的词汇表由于使用了子词级别的 tokenizationBERT 的词汇表比基于完整单词的词汇表要小得多。这种方法可以有效处理词汇量大的问题减少OOVout-of-vocabulary词表外词的情况。
处理未知单词对于不在词汇表中的单词BERT 可以通过拆分成已知的子词单元来表示从而更好地处理未知单词和新词。
词嵌入矩阵与原始 Transformer 类似BERT 也有一个词嵌入矩阵但它是基于子词单元的。每个子词单元都有一个对应的向量表示这些向量组合在一起构成单词的表示。
3. 示例对比
输入句子“Playing football is enjoyable.”
原始 Transformer 模型
Tokenization结果
[“Playing”, “football”, “is”, “enjoyable”]
词嵌入向量
embedding(“Playing”),embedding(“football”),embedding(“is”),embedding(“enjoyable”)每个单词直接作为一个token处理模型依赖于词汇表中存在的完整单词。
BERT 模型
Tokenization结果
[“Play”, “##ing”, “foot”, “##ball”, “is”, “enjoy”, “##able”]
词嵌入向****量
embedding(“Play”),embedding(“##ing”)embedding(“foot”)embedding(“##ball”),embedding(“is”),embedding(“enjoy”),embedding(“##able”)
八、总结
用最简单的话语概括 BERT 的重要思想
自己总结的
1.BERT 模型架构利用 Transformer 编码器堆栈结构是一种能进行文本双向嵌入的语言模型。
2.BERT的 tokenization 采用的是 WordPiece 的方式Embedding 是 Token Embeddings、Segment Embeddings、Position Embeddings 三者的叠加。
3.BERT 使用“预训练微调”的方式用于分类、问答、NER 等 NLP 下游任务预训练采用的是 “MLMNSP”双任务并行的方式使用 MLM、NSP 损失的加权和作为总损失进行反向传播微调时仅需在预训练后的 BERT 模型上增加一个输出层对此输出层进行微调。
chatgpt-4o总结的
1. 模型架构 Transformer编码器BERT使用多层的 Transformer 编码器堆栈每层包含多头自注意力机制和前馈神经网络。这个架构使得 BERT 能够有效地捕捉输入序列中的复杂依赖关系。 双向性BERT是双向的Bidirectional这意味着它在训练时能够同时从左到右和从右到左看待上下文。与传统的单向语言模型不同这种双向性使得BERT能够更好地理解句子的上下文。
2. Tokenization 和 Embeddings WordPiece TokenizationBERT 使用 WordPiece 分词方法将单词拆分为更小的子词或字符片段以处理未见过的词和稀有词。这样可以更好地覆盖语言中的各种词汇。 三种嵌入Token Embeddings将每个 token 映射到一个固定维度的向量Position Embeddings添加位置嵌入以表示每个token在序列中的位置从而保留顺序信息Segment Embeddings用于区分不同的句子特别是在句子对任务中通过添加句子A和句子B的嵌入来区分它们。
3. 预训练任务 掩蔽语言模型Masked Language Model, MLM在输入序列中随机掩蔽15%的token然后让模型预测这些被掩蔽的token。这种方法使模型能够在双向上下文中学习每个token的表示。 下一句预测Next Sentence Prediction, NSP训练模型判断两个句子是否在原始文本中是连续的句子。输入由两个句子组成50%的情况下它们是连续的50%的情况下它们是随机选择的不连续句子。这有助于模型理解句子间的关系。
4. 预训练和微调策略 预训练在大规模无标签文本数据上进行预训练使用 MLM 和 NSP 任务进行训练。预训练使模型学习到通用的语言表示包括词汇、语法和句子间的关系。 微调在特定的下游任务数据集上进行微调。通过在预训练的BERT模型顶部添加一个任务特定的输出层例如分类层或序列标注层对整个模型进行微调。这使得 BERT 可以适应各种特定任务如文本分类、问答、命名实体识别等。
5. 应用场景 文本分类使用[CLS] token的表示通过一个线性分类层进行分类任务。适用于情感分析、主题分类等任务。 问答系统输入包括问题和段落通过预测答案在段落中的起始和结束位置来回答问题。适用于SQuAD等问答数据集。 命名实体识别NER在每个token的表示上添加一个标注层预测每个token的实体类别。适用于识别文本中的人名、地名、组织名等。 句子对任务判断两个句子之间的关系如自然语言推理NLI任务通过在[CLS] token的表示上添加分类层进行预测。适用于MNLI、SNLI等数据集。
综上 BERTBidirectional Encoder Representations from Transformers是一种基于双向Transformer编码器的预训练语言模型通过双向的上下文嵌入和大规模预训练提供了强大的语言表示能力。其核心包括WordPiece tokenization、Token/Position/Segment Embeddings、MLM和NSP预训练任务以及预训练微调的应用方式。BERT在文本分类、问答系统、命名实体识别等NLP任务中表现优异广泛应用于各种自然语言处理场景。
用通俗易懂方式讲解系列 《大模型面试宝典》(2024版) 正式发布 《大模型实战宝典》2024版正式发布 用通俗易懂的方式讲解自然语言处理初学者指南附1000页的PPT讲解 用通俗易懂的方式讲解1.6万字全面掌握 BERT 用通俗易懂的方式讲解NLP 这样学习才是正确路线 用通俗易懂的方式讲解28张图全解深度学习知识 用通俗易懂的方式讲解不用再找了这就是 NLP 方向最全面试题库 用通俗易懂的方式讲解实体关系抽取入门教程 用通俗易懂的方式讲解灵魂 20 问帮你彻底搞定Transformer 用通俗易懂的方式讲解图解 Transformer 架构 用通俗易懂的方式讲解大模型算法面经指南附答案 用通俗易懂的方式讲解十分钟部署清华 ChatGLM-6B实测效果超预期 用通俗易懂的方式讲解内容讲解代码案例轻松掌握大模型应用框架 LangChain 用通俗易懂的方式讲解如何用大语言模型构建一个知识问答系统 用通俗易懂的方式讲解最全的大模型 RAG 技术概览 用通俗易懂的方式讲解利用 LangChain 和 Neo4j 向量索引构建一个RAG应用程序 用通俗易懂的方式讲解使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA 用通俗易懂的方式讲解面了 5 家知名企业的NLP算法岗(大模型方向)被考倒了。。。。。 用通俗易懂的方式讲解NLP 算法实习岗对我后续找工作太重要了。 用通俗易懂的方式讲解理想汽车大模型算法工程师面试被问的瑟瑟发抖。。。。 用通俗易懂的方式讲解基于 Langchain-Chatchat我搭建了一个本地知识库问答系统 用通俗易懂的方式讲解面试字节大模型算法岗(实习) 用通俗易懂的方式讲解大模型算法岗(含实习)最走心的总结 用通俗易懂的方式讲解大模型微调方法汇总
参考
1-Rahul Agarwa 博客链接https://thealgorithmicminds.com/explaining-bert-simply-using-sketches-ba30f6f0c8cb
2-BERT 论文https://arxiv.org/abs/1810.04805