BERT 算法和优化
2025-01-15 16:05:29 0 举报
AI智能生成
BERT(Bidirectional Encoder Representations from Transformers)是一种先进的自然语言处理模型,采用Transformer架构,能够理解和生成文本。BERT 在训练过程中使用双向编码器,使模型能够同时考虑文本的上下文信息,从而提高理解能力。 BERT 还引入了Masked Language Modeling和Next Sentence Prediction两个预训练任务,进一步提升模型的泛化能力。 BERT模型的算法,优化
作者其他创作
大纲/内容
BERT 算法基础
BERT 算法背景
自然语言处理的发展
传统NLP方法的局限性
词向量的意义单一
字句的上下文对句子的影响需要考虑
深度学习在NLP中的应用
BERT 算法原理
Transformer模型介绍
自注意力机制
多头注意力机制
位置编码
BERT 任务
掩码语言模型(Masked Language Model, MLM):
下一句预测(Next Sentence Prediction, NSP):
BERT 算法特点
双向编码能力
与ELMo等单向模型的对比
将输入的序列(如一句话或段落)进行上下文理解,为每个输入 token 生成一个上下文相关的向量表示。
强大的泛化能力
在多种NLP任务中的表现
可解释性探索
注意力权重可视化
BERT 算法核心结构
1. Tokenization的设计核心
2. BERT Tokenizer的工作原理
3. BERT 双向编码
4. BERT 输入表示
(embeddings): BertEmbeddings(
(word_embeddings): Embedding(105879, 768, padding_idx=0) # 词嵌入
(position_embeddings): Embedding(512, 768) # 位置嵌入
(token_type_embeddings): Embedding(2, 768) # 句子类型嵌入
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True) # 层归一化
(dropout): Dropout(p=0.1, inplace=False) # Dropout层
)
(word_embeddings): Embedding(105879, 768, padding_idx=0) # 词嵌入
(position_embeddings): Embedding(512, 768) # 位置嵌入
(token_type_embeddings): Embedding(2, 768) # 句子类型嵌入
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True) # 层归一化
(dropout): Dropout(p=0.1, inplace=False) # Dropout层
)
Word Embeddings:
将输入序列中的每个token映射为一个向量表示,嵌入维度为768。
词表大小:105879,表示模型支持的词汇数量。
padding_idx=0:将索引为0的token(padding token)对应的向量固定为0。
Position Embeddings:
为解决Transformer没有自然顺序的问题,BERT添加了位置编码,支持最大序列长度512。
Token Type Embeddings:
用于区分两个句子(如在下一句预测任务中),Embedding(2, 768)表示两种类型:句子A和句子B。
LayerNorm和Dropout:
对嵌入向量进行层归一化和Dropout,增加训练的稳定性和模型的泛化能力。
将输入序列中的每个token映射为一个向量表示,嵌入维度为768。
词表大小:105879,表示模型支持的词汇数量。
padding_idx=0:将索引为0的token(padding token)对应的向量固定为0。
Position Embeddings:
为解决Transformer没有自然顺序的问题,BERT添加了位置编码,支持最大序列长度512。
Token Type Embeddings:
用于区分两个句子(如在下一句预测任务中),Embedding(2, 768)表示两种类型:句子A和句子B。
LayerNorm和Dropout:
对嵌入向量进行层归一化和Dropout,增加训练的稳定性和模型的泛化能力。
5. Encode层
(encoder): BertEncoder(
(layer): ModuleList(
(0-11): 12 x BertLayer( # 共12层BertLayer
(attention): BertAttention(
(self): BertSelfAttention(
(query): Linear(in_features=768, out_features=768, bias=True)
(key): Linear(in_features=768, out_features=768, bias=True)
(value): Linear(in_features=768, out_features=768, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(output): BertSelfOutput(
(dense): Linear(in_features=768, out_features=768, bias=True)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
(intermediate): BertIntermediate(
(dense): Linear(in_features=768, out_features=3072, bias=True)
(intermediate_act_fn): GELUActivation()
)
(output): BertOutput(
(dense): Linear(in_features=3072, out_features=768, bias=True)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
)
)
(layer): ModuleList(
(0-11): 12 x BertLayer( # 共12层BertLayer
(attention): BertAttention(
(self): BertSelfAttention(
(query): Linear(in_features=768, out_features=768, bias=True)
(key): Linear(in_features=768, out_features=768, bias=True)
(value): Linear(in_features=768, out_features=768, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(output): BertSelfOutput(
(dense): Linear(in_features=768, out_features=768, bias=True)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
(intermediate): BertIntermediate(
(dense): Linear(in_features=768, out_features=3072, bias=True)
(intermediate_act_fn): GELUActivation()
)
(output): BertOutput(
(dense): Linear(in_features=3072, out_features=768, bias=True)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
)
)
Encoder层:多层Transformer编码器
BERT的Encoder由12个BertLayer堆叠而成,每个BertLayer包含三个核心部分:
Self-Attention层:捕获序列中token之间的关系。
Intermediate层:前馈全连接层(Feed-Forward Network)。
Output层:对结果进行层归一化和残差连接。
BERT的Encoder由12个BertLayer堆叠而成,每个BertLayer包含三个核心部分:
Self-Attention层:捕获序列中token之间的关系。
Intermediate层:前馈全连接层(Feed-Forward Network)。
Output层:对结果进行层归一化和残差连接。
6. Pooler层
(pooler): BertPooler(
(dense): Linear(in_features=768, out_features=768, bias=True)
(activation): Tanh()
)
(dense): Linear(in_features=768, out_features=768, bias=True)
(activation): Tanh()
)
Pooler层:句子表示层
[CLS] token的输出向量经过一个全连接层和Tanh激活函数,得到整个句子的表示(pooled_output)。
[CLS] token的输出向量经过一个全连接层和Tanh激活函数,得到整个句子的表示(pooled_output)。
BERT 算法核心
训练的核心代码:
BERT 算法应用
文本分类
情感分析
电影评论情感分类
社交媒体情绪监测
新闻分类
体育新闻分类
科技新闻分类
命名实体识别
人名识别
中文人名识别
英文人名识别
抽象人
具体人
地名识别
中国地名识别
国际地名识别
机构,地点
问答系统不擅长
可基于BERT的问答匹配Match
问题-答案对匹配
多轮对话问答
可以做知识图谱Rela
基于BERT的实体链接
基于BERT的关系推理
评估与调优
模型评估指标
精确率
精确率(Precision):预测为正类的样本中,真正为正类的比例。
[ \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} ]
召回率
召回率(Recall):所有实际为正类的样本中,被正确预测为正类的比例。
[ \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} ]
F1分数
它是精确率(Precision)和召回率(Recall)的调和平均数,能够同时衡量模型的准确性和全面性。
F1 Score = 2 * (Precision * Recall) / (Precision + Recall)
调和平均值的特点是,当精确率或召回率中的任何一个接近0时,F1分数也会接近0。
这是因为调和平均对极低的数值更为敏感,能够更好地反映模型在极端情况下的表现。相比之下,算术平均可能会掩盖掉这种不平衡。
这是因为调和平均对极低的数值更为敏感,能够更好地反映模型在极端情况下的表现。相比之下,算术平均可能会掩盖掉这种不平衡。
优势
1. 不平衡数据集
当正负类样本数量极不均衡时,使用准确率(Accuracy)可能会产生误导。例如,在医疗诊断或欺诈检测中,正类(如患病或欺诈行为)可能只占总样本的一小部分。此时,准确率可能很高,但模型的实际性能并不好。F1评分通过结合精确率和召回率,可以更好地反映模型在这类问题上的表现。
2. 误判成本不对称
在某些应用中,不同类型的误判带来的后果不同。例如,在癌症筛查中,漏诊(FN)的危害远大于误诊(FP)。F1评分可以帮助我们平衡这两种误判的风险,找到一个更合理的模型。
3. 多类别分类问题
虽然F1评分最初是为二分类设计的,但在多类别分类问题中,可以通过计算每个类别的F1评分并取平均值(如宏平均或微平均)来评估整体性能。
当正负类样本数量极不均衡时,使用准确率(Accuracy)可能会产生误导。例如,在医疗诊断或欺诈检测中,正类(如患病或欺诈行为)可能只占总样本的一小部分。此时,准确率可能很高,但模型的实际性能并不好。F1评分通过结合精确率和召回率,可以更好地反映模型在这类问题上的表现。
2. 误判成本不对称
在某些应用中,不同类型的误判带来的后果不同。例如,在癌症筛查中,漏诊(FN)的危害远大于误诊(FP)。F1评分可以帮助我们平衡这两种误判的风险,找到一个更合理的模型。
3. 多类别分类问题
虽然F1评分最初是为二分类设计的,但在多类别分类问题中,可以通过计算每个类别的F1评分并取平均值(如宏平均或微平均)来评估整体性能。
缺点
忽略负类:F1分数只关注正类的预测情况,忽略了负类的表现。对于多类别问题,需要计算每个类别的F1分数并取平均。
对于多标签分类问题,F1分数的计算方式有所不同,通常使用宏平均(Macro Average)或微平均(Micro Average)。
宏平均F1分数
微平均F1分数
模型调优方法
超参数调优
网格搜索
随机搜索
模型集成
Bagging
Boosting
错误分析与纠正
常见错误类型
语义错误
语法错误
纠正策略
基于规则的纠正
基于模型的纠正
原生BERT和BART,GPT的区别?
BART(Bidirectional and Auto-Regressive Transformers)
架构特点:
双向编码器和自回归解码器结合:编码器类似BERT,捕获上下文信息;
解码器类似GPT,擅长生成连贯的文本。
通过噪声添加(如文本删除或遮蔽)进行预训练,使其对复杂输入具有鲁棒性。
架构特点:
双向编码器和自回归解码器结合:编码器类似BERT,捕获上下文信息;
解码器类似GPT,擅长生成连贯的文本。
通过噪声添加(如文本删除或遮蔽)进行预训练,使其对复杂输入具有鲁棒性。
适用场景:
上下文丰富的生成任务:比如生成更具背景理解的问题。
摘要式问题生成:能够在复杂文本中提取关键信息并生成问题。适合需要处理较长文本的任务。
上下文丰富的生成任务:比如生成更具背景理解的问题。
摘要式问题生成:能够在复杂文本中提取关键信息并生成问题。适合需要处理较长文本的任务。
GPT(Generative Pretrained Transformer)
架构特点:
单向自回归模型:基于Transformer解码器架构,擅长生成流畅的自然语言。
GPT-3及以上版本对海量预训练数据的捕获,使其生成能力极为强大。
架构特点:
单向自回归模型:基于Transformer解码器架构,擅长生成流畅的自然语言。
GPT-3及以上版本对海量预训练数据的捕获,使其生成能力极为强大。
适用场景:
多样性生成:GPT在开放性问题生成上表现出色,可以生成多个风格迥异的问题。
自由文本问题生成:对于没有明确模板或约束的问题生成任务,GPT尤其擅长。提供更具创意和多样性的问题。
多样性生成:GPT在开放性问题生成上表现出色,可以生成多个风格迥异的问题。
自由文本问题生成:对于没有明确模板或约束的问题生成任务,GPT尤其擅长。提供更具创意和多样性的问题。
如何使用BERT模型微调找出实体,关键词?
基于BERT字级别微调进行实体识别(NER)
整体思路:
直接在 BERT 的基础上微调,用于中文NER任务使用(包括)中文预训练模型。
将BERT的输入设计为 字级别,然后通过标注好的NER数据进行训练。
输出层增加一个 分类头,用于预测每个字的标签(如BIO标签)。
整体思路:
直接在 BERT 的基础上微调,用于中文NER任务使用(包括)中文预训练模型。
将BERT的输入设计为 字级别,然后通过标注好的NER数据进行训练。
输出层增加一个 分类头,用于预测每个字的标签(如BIO标签)。
训练中loss的合理范围是多少?
初始 loss:
在训练开始时,loss 通常会较大,尤其是在模型参数未经初始化或随机初始化的情况下。
常见的初始 loss 值可能在 2.0 到 10.0 之间(具体范围取决于标签类别数量和数据分布)。
在训练开始时,loss 通常会较大,尤其是在模型参数未经初始化或随机初始化的情况下。
常见的初始 loss 值可能在 2.0 到 10.0 之间(具体范围取决于标签类别数量和数据分布)。
收敛后的 loss:
在训练接近收敛时,loss 通常会降至 0.01 到 0.5 左右(取决于模型的复杂性、任务难度和数据质量)。
对于简单任务或小型数据集,loss 可能更接近 0。
对于标签不平衡的复杂任务,loss 即使接近 0.5 也可能表示良好的性能。
在训练接近收敛时,loss 通常会降至 0.01 到 0.5 左右(取决于模型的复杂性、任务难度和数据质量)。
对于简单任务或小型数据集,loss 可能更接近 0。
对于标签不平衡的复杂任务,loss 即使接近 0.5 也可能表示良好的性能。
注意事项
如果 loss 过早趋于 0,可能表明模型过拟合。
如果 loss 长时间停留在较高值(如 > 1.0),可能需要检查学习率、数据预处理、或模型容量是否匹配任务。
如果 loss 过早趋于 0,可能表明模型过拟合。
如果 loss 长时间停留在较高值(如 > 1.0),可能需要检查学习率、数据预处理、或模型容量是否匹配任务。
训练中的epoch值合理范围多少?
多轮训练的 Epoch 数量经验值:
对于大多数 NER 任务,训练 3-10 个 epoch 通常足够。
微调预训练的 BERT 模型时,2-5 个 epoch 通常已经可以得到很好的结果。
对于大多数 NER 任务,训练 3-10 个 epoch 通常足够。
微调预训练的 BERT 模型时,2-5 个 epoch 通常已经可以得到很好的结果。
早停的依据:
观察验证集性能(如 F1-score、Precision、Recall 等)而非仅仅依赖训练 loss。
如果验证集性能停止提升,继续增加 epoch 可能导致过拟合。
观察验证集性能(如 F1-score、Precision、Recall 等)而非仅仅依赖训练 loss。
如果验证集性能停止提升,继续增加 epoch 可能导致过拟合。
BERT 算法优化与改进
多语言BERT
mBERT介绍
多语言数据训练
跨语言迁移能力
XLM与XLM-R
XLM模型架构
XLM-R的改进与优势
完全掩码BERT
完全掩码BERT概念
全词掩码与部分掩码的区别
全词掩码的优势
部分掩码的局限性
实现完全掩码BERT的步骤
数据预处理
文本清洗
去除停用词
去除标点符号
分词与标记化
基于空格的分词
基于子词单元的分词
全词掩码实现
基于词典的全词掩码
基于统计的全词掩码
模型训练与优化
损失函数设计
交叉熵损失
Focal Loss
优化器选择
Adam优化器
SGD优化器
学习率调整策略
固定学习率
学习率衰减
算法优化RoBERT
算法优化ModernBert
去掉bias
去掉除输出层外的所有线性层bias权重,把参数省给更多的weight权重
更新激活函数
ModernBERT也把GELU改成了GeGLU
增加网络层数
base从12层增加到22层,large从24层增加到28层
全局与局部注意力机制
引入了一种称为交替注意力的东西。这意味着不是每次都使用全局注意力(查看所有单词的注意力),而是不时应用局部注意力(仅查看周围的单词)。
Unpadding 和 Sequence Packing机制
为了能够处理同一批次中的多个序列,编码器模型要求它们具有相同的长度,以便它们可以执行并行计算。
传统上,我们依靠填充来实现这一点:找出哪个句子最长,并添加无意义的标记(填充标记)来填充其他每个序列。
传统上,我们依靠填充来实现这一点:找出哪个句子最长,并添加无意义的标记(填充标记)来填充其他每个序列。
ModernBERT不会保留这些填充标记,而是将它们全部删除,并将它们连接到批大小为 1 的小批中,从而避免所有不必要的计算。
BERT与其他模型融合
BERT+CNN/RNN
在文本分类中的应用
在序列标注中的应用
BERT+Transformer变体
在生成式任务中的应用
在图像-文本联合任务中的应用
0 条评论
下一页