深入BERT内核:用数学解密掩码语言模型的工作原理

简介: BERT通过掩码语言建模(MLM)实现双向语言理解,随机遮蔽15%的词并预测,结合Transformer的自注意力与多头机制,利用上下文信息生成深层语义表示。其数学设计如√d_k缩放、80-10-10掩码策略和交叉熵优化,显著提升模型性能,奠定现代NLP基础。

传统语言模型有个天生缺陷——只能从左往右读,就像你现在读这段文字一样,一个词一个词往下看,完全不知道后面会出现什么。人类可不是这么学语言的。看到"被告被判_",大脑会根据上下文直接联想到"有罪"或者"无罪",这就是双向理解在起作用。

Google搞出来的BERT(Bidirectional Encoder Representations from Transformers)终于让机器也有了这种能力。BERT的核心不是简单地双向阅读,而是用了一种叫掩码语言建模(Masked Language Modeling,MLM)的巧妙方法。

通过随机遮住15%的词,BERT反而比那些完整阅读文本的模型学得更好。这有点像做填空题学英语,只不过空是随机出现的,而且BERT要处理的是几十亿个句子。

这篇文章会把MLM的数学机制拆开来逐一讲解。从一个被遮住的句子开始,经过注意力计算、概率分布、梯度下降,看看这些数学操作到底怎么让BERT达到接近人类的语言理解能力。搞懂这些数学原理,对于想要调优BERT或者设计类似模型的人来说很关键。

看完之后你会明白,BERT做的不只是遮词这么简单——注意力机制里的√d_k缩放、80-10-10的掩码策略,这些看似细节的数学设计对性能影响巨大。

核心机制:掩码预测

原理很简单:随机选一些词遮起来,让模型去猜。比如这句话:

"猫坐在[MASK]上。"

人看到"猫坐在……上",马上就能想到可能是"垫子"、"地板"之类的词。这种推理来自对语法结构和词语关系的理解。BERT学的也是这套推理逻辑,只不过它靠的是数学优化而不是人的直觉。

训练分三步:

  1. 掩码:随机挑出15%的词,80%换成[MASK]标记,10%换成随机词,剩下10%保持原样
  2. 预测:把处理后的句子扔进BERT的transformer层,生成预测结果
  3. 优化:算出预测和真实答案的差距,用反向传播更新参数

这个简单粗暴的方法逼着BERT学会深层的语言规律。关键在于MLM用了双向上下文——同时看左边和右边的词,不像传统的"下一词预测"模型只能看左边。所以得到的结果就是预测准确率高了很多。

从信息论来看,MLM制造了一个理想的学习信号。遮掉一个词,就产生了明确的预测任务和已知的不确定性。模型必须从上下文里榨取尽可能多的信息来降低这个不确定性。

一个词w在上下文c中的信息量,用惊讶度(surprisal)衡量:

 I(w|c) = -log P(w|c)

容易预测的词惊讶度低(信息量少),难预测的词惊讶度高。通过训练掩码标记,BERT学会建模完整的概率分布P(w|c),既能掌握常见模式也不会忽略罕见结构。

80-10-10这个掩码策略也是有讲究的。如果只用[MASK]替换,模型在训练时见到的是特殊标记,但微调和推理时永远看不到这个标记,就会产生gap。随机替换词或者保持原词,强迫BERT在有干扰的情况下也能学出好的表示。

Transformer架构

BERT通过自注意力机制来理解上下文,这个机制用数学方式编码了序列中所有词之间的关系。对于n个token的输入序列,自注意力给每个token生成三个向量:

  • Query(Q):这个token想找什么信息
  • Key(K):这个token能提供什么信息
  • Value(V):这个token提供的具体内容

这些向量通过学习的线性变换得到:

 Q = XW_Q  
 K = XW_K  
 V = XW_V

X是输入嵌入矩阵,W_Q、W_K、W_V是可学习的权重矩阵。

然后注意力机制计算value的加权平均,权重表示每个token对其他token的关注程度:

 Attention(Q, K, V) = softmax(QK^T / √d_k)V

拆开来看:

1、 算注意力分数(QK^T)

点积QK^T生成一个n×n的矩阵,元素(i,j)代表token i对token j的关注度。点积越大说明query和key向量在语义或句法上越相似。

2、缩放(√d_k)

除以√d_k(key维度的平方根)防止点积太大。不缩放的话,当d_k很大时,点积方差会很高,把softmax推到梯度极小的区域,训练就不稳定了。

数学上,如果query和key是均值0方差1的随机变量,它们的点积方差就是d_k。除以√d_k把方差归一化回1。

3、Softmax

softmax把分数转成概率分布:

 softmax(z_i) = exp(z_i) / Σ_j exp(z_j)

保证每个token的注意力权重加起来是1,形成有效的概率分布。指数函数放大了分数之间的差异,让模型能聚焦在相关token上,同时弱化无关的。

4、加权聚合

最后把注意力权重乘以value矩阵V,得到加权和。每个token的输出表示都融合了其他所有token的信息,按相关性加权。

BERT不是算一个注意力函数,而是并行算h个(BERT-base是12个头,BERT-large是16个)。每个头学习关注输入的不同方面:

 head_i = Attention(QW_Q^i, KW_K^i, VW_V^i)

输出拼接后做线性变换:

 MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W_O

为什么要多头?每个头可以关注不同类型的关系:

  • 有的头专注句法关系(主谓一致)
  • 有的头专注语义关系(同义反义)
  • 还有的头关注位置模式

这种并行机制让BERT能同时建模多种语言结构。

跟按顺序处理的RNN不同,transformer一次性处理所有token。为了让模型知道词的顺序,BERT在输入嵌入里加入了位置编码:

 Input = Token_Embedding + Position_Embedding + Segment_Embedding

BERT用的是可学习的位置嵌入,不是原始Transformer论文里的正弦编码。每个位置(BERT里是0到511)都有一个d维向量可以学习,直接加到token嵌入上。

结果就是一个向量同时包含了位置和token的身份信息——既知道这个词是什么,也知道它在句子里的位置。

MLM预测头:从表示到概率

过完L层transformer(BERT-base是12层,BERT-large是24层)之后,每个token都有一个上下文化的表示h_i ∈ R^d。对于被掩码的token,需要把这些表示转成词汇表上的概率分布。

预测头包含三步变换:

带激活的全连接层

 h_mlm = GELU(h_i W_1 + b_1)

GELU(Gaussian Error Linear Unit)激活函数引入非线性:

 GELU(x) = x · Φ(x)

Φ(x)是标准正态分布的累积分布函数。GELU比ReLU的梯度更平滑,训练更稳。

层归一化

 h_norm = LayerNorm(h_mlm)

层归一化通过归一化激活值来稳定训练:

 LayerNorm(x) = γ(x - μ)/σ + β

μ和σ是跨特征计算的均值和标准差,γ和β是可学习参数。

输出投影

 logits = h_norm W_vocab + b_vocab

把归一化后的表示投影到词汇表大小V(BERT一般是30,000),给每个可能的token生成一个logit。

用softmax把logit转成概率:

 P(w_i | context) = exp(logit_i) / Σ_{j=1}^V exp(logit_j)

softmax有几个关键特性:

  1. 输出范围:所有概率都在(0, 1)之间
  2. 归一化:概率总和是1
  3. 单调性:logit越高概率越大
  4. 敏感性:指数放大了logit之间的差异

分母(配分函数)保证归一化,但计算开销很大——每次预测要对30,000多项求和。训练时这个成本避不开,但推理时可以用分层softmax之类的技术加速。

损失函数

对每个掩码token,用交叉熵衡量BERT预测分布和真实分布的差距(真实分布把全部概率放在正确token上):

 L_token = -log P(w_true | context)

这个损失函数特性很好:

  • 范围:L_token ∈ [0, ∞)
  • 最小值:当P(w_true | context) = 1时达到
  • 梯度:直接关联到预测误差

负对数概率处理了预测接近1时softmax指数增长的问题。模型给正确token分配高概率时,log P接近0,损失就低。反之概率低时,-log P变大,给学习提供强信号。

对于B个序列的batch,每个序列有M个掩码token,总MLM损失是:

 L_MLM = (1/BM) Σ_{b=1}^B Σ_{m=1}^M -log P(w_m^b | context_b)

这个平均操作保证损失大小不依赖batch大小或掩码率,让不同配置下的训练都稳定。

反向传播时计算损失相对于所有参数θ的梯度:

 ∇_θ L_MLM = (1/BM) Σ_{b=1}^B Σ_{m=1}^M ∇_θ (-log P(w_m^b | context_b))

相对于正确token的logit的梯度特别简单:

 ∂L/∂logit_true = P_predicted - 1

错误token的:

 ∂L/∂logit_wrong = P_predicted

梯度就是预测误差——预测概率和真实概率的差,这个干净的梯度结构让训练既稳定又高效。

优化

BERT用Adam优化器,它维护梯度及其平方的滑动平均:

 m_t = β_1 m_{t-1} + (1-β_1)g_t  
 v_t = β_2 v_{t-1} + (1-β_2)g_t^2

g_t是第t步的梯度,β1=0.9,β2=0.999是衰减率。

这些平均值需要做偏差修正:

 m̂_t = m_t / (1 - β_1^t)  
 v̂_t = v_t / (1 - β_2^t)

参数更新用自适应学习率:

 θ_t = θ_{t-1} - α · m̂_t / (√v̂_t + ε)

α是基础学习率,ε=10^-8防止除零。

Adam的自适应学习率能处理不同参数梯度的不同尺度,这对训练BERT这种有110M(base)或340M(large)参数的深度网络很关键。

BERT用两阶段学习率调度:

  1. 线性预热:前10,000步把学习率从0升到α_max
  2. 线性衰减:剩余步骤把学习率从α_max降到0

数学表达:

 α(t) = α_max · min(t/t_warmup, (t_total - t)/(t_total - t_warmup))

预热避免训练初期梯度不稳时做大幅参数更新。末期衰减让模型细粒度收敛到最优解。

预测掩码词

走一遍完整流程看看这些数学组件怎么配合工作。

输入句子

原始:"The quick brown fox jumps over the lazy dog"掩码:"The quick brown [MASK] jumps over the lazy dog"

步骤1:分词和嵌入

BERT的tokenizer把句子转成token ID:

 [101, 1996, 4248, 2829, 103, 14523, 2058, 1996, 13971, 3899, 102]

101是[CLS],103是[MASK],102是[SEP]。

每个token ID转成768维嵌入(BERT-base)。加上位置嵌入和段嵌入:

 X = Token_Emb + Pos_Emb + Seg_Emb

位置4的[MASK] token包含:

  • Token嵌入:token 103的学习向量
  • 位置嵌入:位置4的学习向量
  • 段嵌入:段A(第一句)的向量

步骤2:自注意力计算

第一层注意力里,每个token和所有其他token计算注意力。对[MASK] token:

 Q_mask = X_mask W_Q  
 K_all = X_all W_K

[MASK]和各个上下文token的注意力分数:

 scores = Q_mask · K_all^T / √64

(BERT-base有12个头,d_k = 64,每个头维度是768/12=64)

softmax之后,假设得到注意力权重:

  • "brown"(左边):0.35
  • "jumps"(右边):0.40
  • 其他token:0.25

这些权重乘以value向量:

 output_mask = 0.35·V_brown + 0.40·V_jumps + 0.25·V_others

这个输出进入下一层,"brown"和"jumps"的信息被整合进[MASK]表示。

步骤3:层层堆叠

这个过程在12层transformer里重复。每层都细化表示,整合越来越抽象的上下文信息。到最后一层,[MASK]表示h_mask包含了丰富的局部上下文(相邻词)和全局上下文(句子结构)信息。

步骤4:预测

MLM头转换最终隐藏状态:

 h_mlm = GELU(h_mask W_1 + b_1)  
 h_norm = LayerNorm(h_mlm)  
 logits = h_norm W_vocab + b_vocab

假设前5个logit是:

  • "fox":8.2
  • "animal":6.1
  • "creature":5.8
  • "dog":4.3
  • "cat":4.1

softmax之后(简化显示):

 P("fox" | context) = exp(8.2) / Z ≈ 0.73  
 P("animal" | context) = exp(6.1) / Z ≈ 0.15  
 P("creature" | context) = exp(5.8) / Z ≈ 0.11  
 ...

Z = Σ exp(logit_i)是配分函数。

步骤5:计算损失

正确token是"fox",所以:

 L = -log P("fox" | context) = -log(0.73) ≈ 0.31

损失梯度反向传播更新所有参数,让模型在将来类似上下文中提高P("fox" | context)。

MLM为什么有效

传统从左到右的语言模型只能基于前面的token:

 P(w_i | w_1, ..., w_{i-1})

MLM同时用两个方向:

 P(w_i | w_1, ..., w_{i-1}, w_{i+1}, ..., w_n)

双向上下文让预测准确率大幅提升。看这个例子:

"河的[MASK]被淹没了。"

单向模型看不到"淹没","bank"(银行/河岸)就很模糊。双向上下文里BERT看到"淹没"就能正确预测是"河岸"。

MLM逼着BERT学习能泛化语义和句法属性的密集向量表示。语义相似的token应该有相似的表示,这样才能在相似上下文里做出相似预测。这个预测目标创造了一个语义空间:

  • 同义词聚在一起
  • 不同句法类别(名词、动词)在不同区域
  • 关系(king-queen、man-woman)表现为一致的向量偏移

MLM预训练产生的通用表示可以用在下游任务上。预训练过程中模型学到:

  • 句法:语法结构和词语关系
  • 语义:词义和上下文依赖
  • 世界知识:训练数据里包含的事实和关系

微调特定任务时,模型能利用这些学到的表示,需要的任务数据比从头训练少很多。

总结

BERT的掩码语言建模在数学上是一套精巧的语言表示学习机制。自注意力通过查询-键空间的相似度计算,用值向量的加权平均学习上下文关系。多头注意力并行学习不同的语言表示。MLM目标逼着模型基于双向上下文预测掩码token,通过交叉熵损失和梯度下降优化不断改进。

理解这些数学原理不只是学术练习——它让实践者能在模型架构、训练流程、微调策略上做出明智决策。不管是针对特定领域调整BERT,开发新的预训练目标,还是debug训练不稳定,扎实的数学基础都很有价值。

自然语言理解不断突破边界,BERT体现的原则——基于注意力的上下文聚合、自监督学习、迁移学习——仍然是核心。未来的架构可能规模更大训练更快,但会建立在BERT奠定的数学基础上。

参考文献

  1. Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2018). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. arXiv preprint arXiv:1810.04805.
  2. Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., … & Polosukhin, I. (2017). Attention is all you need. Advances in neural information processing systems, 30.
  3. Liu, Y., Ott, M., Goyal, N., Du, J., Joshi, M., Chen, D., … & Stoyanov, V. (2019). RoBERTa: A Robustly Optimized BERT Pretraining Approach. arXiv preprint arXiv:1907.11692.
  4. Lan, Z., Chen, M., Goodman, S., Gimpel, K., Sharma, P., & Soricut, R. (2019). ALBERT: A Lite BERT for Self-supervised Learning of Language Representations. arXiv preprint arXiv:1909.11942.
  5. Clark, K., Luong, M. T., Le, Q. V., & Manning, C. D. (2020). ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators. arXiv preprint arXiv:2003.10555.

https://avoid.overfit.cn/post/dc093dcb26fe4e00b7d43c4715c91546

作者:Harish K

目录
相关文章
|
6天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
5天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。
|
5天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
Linux 虚拟化 iOS开发
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
1080 4
|
8天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
677 2
|
6天前
|
编解码 自然语言处理 文字识别
Qwen3-VL再添丁!4B/8B Dense模型开源,更轻量,仍强大
凌晨,Qwen3-VL系列再添新成员——Dense架构的Qwen3-VL-8B、Qwen3-VL-4B 模型,本地部署友好,并完整保留了Qwen3-VL的全部表现,评测指标表现优秀。
510 7
Qwen3-VL再添丁!4B/8B Dense模型开源,更轻量,仍强大
|
7天前
|
JavaScript API 开发工具
如何在原生App中调用Uniapp的原生功能?
如何在原生App中调用Uniapp的原生功能?
331 139