“文心楼”后厨最近闹改革。以前的教学方式是这样的:大师傅把每道菜用布蒙住,随机挑出 15% 的菜让学徒猜里面是什么食材,猜对了就教他一种搭配。剩下的 85% 道菜,学徒连看都没看到,更别说学了——这就是 BERT 的掩码语言模型(MLM)。改革后,后厨多了两位新角色:一位“换菜师”会偷偷把一部分菜的食材换成看起来几乎一样的替代品;另一位“品鉴师”则把端上来的每一道菜都尝一口,判断食材有没有被掉包。品鉴师品尝的每一道菜,都是一次学习。这就是 ELECTRA 的核心——用“替换检测”任务取代“掩码填空”,让模型在每一个词上都获得训练信号,用同样的人力时间,训练出更强的语言模型。

岗位关联

学会 ELECTRA,你将在同等算力预算下训练出更强的语言模型,并能设计“判别式预训练”方案——这是从“会跑 BERT”到“能优化预训练效率”的关键一跃。

目录
  1. 可视化演示
  2. 预训练困境
  3. 核心思想
  4. 生成器设计
  5. 判别器训练
  6. 效率优势
  7. 下游迁移
  8. 训练技巧
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示ELECTRA的核心机制,通过采集/分析/决策/反馈四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ELECTRA:替换检测 替换检测预训练核心思想与判别器 全token参与训练的计算效率 核心机制可视化 ELECTRA整体架构与关键组件

预训练困境

“文心楼”的老教学法看似合理:蒙布猜菜,猜不出就教学徒。但细算一笔账——每天后厨出品 100 道菜,大师傅只揭开 15 道让学徒猜,剩下 85 道学徒连味道都没闻过。练了一个月,学徒只对那 15 道菜的搭配了如指掌,对其他菜品依然陌生。学得慢的根子,不在学徒笨,而在“抽查”。

这正是 BERT 所处的困境。BERT 随机挑选句中约 15% 的位置,用 [MASK] 这个特殊记号把词盖住,让模型根据上下文把被盖住的词“填”回来。每填对一个词,模型就学到一点语言知识。可问题是:句子中另外 85% 的 token 在损失函数里贡献为零,它们只是“陪跑”,模型看了一整句,却只练了几个词。

数学上,BERT 的预训练目标是对掩码位置的极大似然估计:

蒙布猜菜的效率瓶颈,本质是“抽查”造成的。能不能让学徒把端上桌的每一道菜都尝一遍?这正是 ELECTRA 改革的起点——把“猜测”改成“检验”。

LMLM=−∑i∈Mlog⁡Pθ(xi∣x~)\displaystyle \mathcal{L}_{MLM} = -\sum_{i \in \mathcal{M}} \log P_{\theta}(x_i \mid \tilde{x})
这个损失只在被 [MASK] 盖住的 15% 位置上计算,其余 85% 的位置梯度为零,相当于课堂上大部分时间在发呆。
  1. 掩码位置集合 $\mathcal{M}$BERT 随机挑出句中约 15% 的位置放入这个集合,只有这些位置的计算结果能进入损失。
    M={i∣tokeni 被 [MASK] 遮盖}\mathcal{M} = \{ i \mid token_i \text{ 被 [MASK] 遮盖} \}
  2. 带噪输入 $\tilde{x}$原句被遮掉若干词之后的序列,模型看不到被遮位置的原词。
    x~=mask(x,M)\tilde{x} = \mathrm{mask}(x, \mathcal{M})
  3. 条件概率 $P_{\theta}(x_i \mid \tilde{x})$模型在给定残缺句子的条件下,预测第 $i$ 个位置原词的概率,希望它越大越好。
    Pθ(xi∣x~)=softmaxxi(Encoderθ(x~))P_{\theta}(x_i \mid \tilde{x}) = \mathrm{softmax}_{x_i}\big( \mathrm{Encoder}_{\theta}(\tilde{x}) \big)
  4. 负对数求和 $-\sum_{i \in \mathcal{M}} \log$把所有被遮位置的概率取负对数再加总,把“猜得越准越好”变成可做梯度下降的最小化目标。
    −∑i∈Mlog⁡Pθ(xi∣x~)→min⁡θ-\sum_{i \in \mathcal{M}} \log P_{\theta}(x_i \mid \tilde{x}) \to \min_{\theta}

核心思想

掌柜给出了新方案:后厨增加“换菜师”和“品鉴师”两个岗位。换菜师先上手,把一部分菜的食材换成高仿替代品;品鉴师随后登场,把每道菜都尝一口,响亮报出“原样”或“掉包”。注意,品鉴师的工作对象不是抽查的 15%,而是端上桌的每一道菜。

对应到模型,这就是替换词检测(RTD)任务。生成器(Generator)模仿“换菜师”,对输入序列中约 15% 的位置用从词表采样的词替换;判别器(Discriminator)模仿“品鉴师”,对序列中每一个位置都输出一个二分类结果:这个词是原词,还是被替换过的冒牌词。生成器负责“出题”,判别器负责“做题”,题目覆盖全句。

每一道菜都要过口,品鉴师每尝一口都能积累“什么搭配自然、什么搭配别扭”的经验。这种经验密度,是蒙布猜菜完全没法比的。

LDisc=−∑t=1T[1[xtc=xt]log⁡D(xc)t+1[xtc≠xt]log⁡(1−D(xc)t)]\displaystyle \mathcal{L}_{Disc} = -\sum_{t=1}^{T} \Big[ \mathbb{1}[x_t^{c} = x_t] \log D(x^{c})_t + \mathbb{1}[x_t^{c} \neq x_t] \log \big( 1 - D(x^{c})_t \big) \Big]
这是判别器的训练目标:对句子中每一个 token 都做一个“原词 / 替换词”的二分类,一个位置都不放过。
  1. 损坏序列 $x^{c}$生成器把一部分 token 换成仿冒词后得到的整句,这是判别器唯一的输入,它不知道哪些位置被动过手脚。
    xc=perturb(x)x^{c} = \mathrm{perturb}(x)
  2. 判别打分 $D(x^{c})_t$判别器把整个序列编码后,在第 $t$ 个位置输出“这是原词”的概率,取值在 0 到 1 之间。
    D(xc)t=σ(wD⊤hD(xc)t)D(x^{c})_t = \sigma\big( w_D^{\top} h_D(x^{c})_t \big)
  3. 指示函数 $\mathbb{1}[\cdot]$括号内条件成立时取 1,否则取 0,用来分别选中“原词位”和“替换位”两类样本。
    1[xtc=xt]={1,第 t 位未被替换0,第 t 位被替换\mathbb{1}[x_t^{c} = x_t] = \begin{cases} 1, & \text{第 } t \text{ 位未被替换} \\ 0, & \text{第 } t \text{ 位被替换} \end{cases}
  4. 全员求和 $\sum_{t=1}^{T}$句子有 $T$ 个 token,就有 $T$ 个二分类损失,一个不漏,这就是“所有 token 参与训练”的来源。
    ∑t=1T⇒T 个训练信号,而非 0.15T 个\sum_{t=1}^{T} \Rightarrow T \text{ 个训练信号,而非 } 0.15T \text{ 个}

生成器设计

掌柜给换菜师定的招聘要求很特别:“别招太强的,也别招太弱的。”太弱的换菜师只会把螃蟹换成石头,品鉴师闭眼都能识破,学不到真功夫;太强的换菜师能把老鼠肉做出牛肉味,品鉴师尝什么都觉得可疑,同样无从学起。换菜师的水平,要刚好让品鉴师“踮踮脚才够得着”。

论文中的生成器正是如此:它通常是一个小型 Transformer,参数规模只有判别器的 1/4 到 1/2。它的任务也更轻——只需要在被选中的位置预测一个“像样的词”,而不是为整个句子做精细的语义判断。

生成器用极大似然(MLM 式)目标训练:在原句被选中的位置,输出词表上的概率分布,让原词的概率最大。真正替换时不是取概率最大的词(那样会换成最普通的词),而是按概率采样,保证替换词既自然又多样。

一个“水平中等、勤恳换菜”的换菜师,恰好把题目难度调到品鉴师踮脚才够得着的程度——这是 ELECTRA 配方里最精妙的一味调料。

LGen=−∑i∈Mlog⁡PG(xi∣xc),xtc∼PG(⋅∣xc)\displaystyle \mathcal{L}_{Gen} = -\sum_{i \in \mathcal{M}} \log P_{G}(x_i \mid x^{c}), \qquad x_t^{c} \sim P_{G}(\cdot \mid x^{c})
生成器的目标是“猜中原词”,但它真正的工作是产出“以假乱真”的替换词——它学的是这个语境中最可能出现的词。
  1. 掩码集合 $\mathcal{M}$生成器只在这约 15% 的位置接受监督,与 BERT 的掩码位置一致。
    M={i∣第 i 位被选中做替换}\mathcal{M} = \{ i \mid \text{第 } i \text{ 位被选中做替换} \}
  2. 概率采样 $x_t^{c} \sim P_{G}$从词表分布中按概率抽取替换词,而不是取 argmax,保证冒牌词多样且自然。
    xtc=samplew∼V PG(w∣xc)x_t^{c} = \mathrm{sample}_{w \sim \mathcal{V}}\, P_{G}(w \mid x^{c})
  3. 极大似然目标让原词在生成器预测分布中的概率最大,即换出的词尽量“像这个语境里会出现的词”。
    PG(xi∣xc)↑  ⟺  LGen↓P_{G}(x_i \mid x^{c}) \uparrow \iff \mathcal{L}_{Gen} \downarrow

判别器训练

品鉴师是这场改革的主角。他不负责做菜,只负责在每一道菜端上桌时动一动舌头和脑子:这道菜里的每一样食材,是原装的还是掉包的?回答只有两种,但他必须结合整道菜的搭配、火候、味道来下判断。

判别器就是那位品鉴师。输入是生成器处理过的混合序列 $x^{c}$,输出是逐位置的二分类概率:第 $t$ 个 token 是原词时目标为 1,被替换时目标为 0。整个 ELECTRA 的总损失由生成器损失和判别器损失加权相加,$\lambda=50$ 让判别器信号主导训练。判别器是最终要用的主编码器,它必须对每个位置都做判断,因此被迫学到融贯全句的上下文表示。

品鉴师尝的是每一道菜,练的是整条舌头的灵敏度。等培训结束,“辞职”的不是品鉴师,而是换菜师——这正是下一节要讲的“带谁去新餐厅”的问题。

L=LGen+λ LDisc,λ=50\displaystyle \mathcal{L} = \mathcal{L}_{Gen} + \lambda\, \mathcal{L}_{Disc}, \qquad \lambda = 50
两个子网络联合训练,但判别器是“主角”,它的损失被放大 50 倍;生成器只是称职的“出题人”。
  1. 双损失相加训练总目标是生成器损失与判别器损失的加权和,两者一起最小化。
    L=LGen+λ LDisc\mathcal{L} = \mathcal{L}_{Gen} + \lambda\, \mathcal{L}_{Disc}
  2. 判别主导$\lambda=50$ 是论文实验调出的经验值,让判别器收到足够强的梯度信号。
    λ=50,LDisc≫LGen\lambda = 50, \quad \mathcal{L}_{Disc} \gg \mathcal{L}_{Gen}
  3. 判别器评分在编码器第 $t$ 位隐状态上接一个线性层和 sigmoid,输出“原词概率”。
    D(xc)t=σ(wD⊤hD(xc)t),hD=EncoderD(xc)D(x^{c})_t = \sigma\big( w_D^{\top} h_D(x^{c})_t \big), \quad h_D = \mathrm{Encoder}_{D}(x^{c})
  4. 参数解耦生成器与判别器共享词嵌入表,但其余参数各自独立更新,生成器的梯度不流过判别器。
    eG=eD,θG≠θDe_{G} = e_{D}, \quad \theta_{G} \neq \theta_{D}

效率优势

账房先生最先算出改革的好处:同样一桌菜,老办法只尝 15%,新办法尝 100%。训练信号密度从 15% 提升到 100%,理论比值约 6.7 倍。信号多,意味着同样的 GPU 时长里,模型“开口练习”的次数是原来的数倍。

除了数量,还有质量。BERT 训练时引入 [MASK] 这个特殊记号,而真实任务里从没有这种记号,造成“预训练-微调不一致”;ELECTRA 的输入全是真的词,只是部分被调包,分布更接近自然文本,模型学到的规律更容易迁移。

论文实测:相同算力预算下,ELECTRA-Large 在 GLUE 上平均 88.0 分,超过 BERT-Large 的 85.0 分;ELECTRA-Small 用一张 GPU 训练四天,就达到接近 BERT 基座的成绩。注意,单步计算因为多了个生成器会略增,但收敛步数大幅减少,总账更划算。

品鉴师在同样的工时里尝了 6.7 倍于学徒的菜,自然出师快、手艺精。效率从来不是“一次看多少”,而是“单位时间记住多少”。

R=T0.15 T=10.15≈6.7\displaystyle R = \frac{T}{0.15\,T} = \frac{1}{0.15} \approx 6.7
一句话:同样一份语料,BERT 只有 15% 的位置有损失,ELECTRA 有 100% 的位置有损失,有效信号约为 6.7 倍。
  1. BERT 的信号数 $0.15\,T$一句话有 $T$ 个 token,BERT 只有约 15% 的位置产生损失。
    NBERT=0.15 TN_{BERT} = 0.15\,T
  2. ELECTRA 的信号数 $T$判别器对每个位置都做一次二分类,$T$ 个位置有 $T$ 个信号。
    NELECTRA=TN_{ELECTRA} = T
  3. 信号密度比 $R$两者相除,得到理论上的有效样本利用率提升倍数。
    R=T0.15 T=10.15≈6.7R = \frac{T}{0.15\,T} = \frac{1}{0.15} \approx 6.7
  4. 实践换算加上 “无 [MASK] 分布一致” 的质量红利,同算力下 GLUE 反超 BERT 约 3 分。
    GLUE: 88.0 (ELECTRA-Large)  vs  85.0 (BERT-Large)\text{GLUE: } 88.0 \ (\mathrm{ELECTRA\text{-}Large}) \;\text{vs}\; 85.0 \ (\mathrm{BERT\text{-}Large})

下游迁移

培训期结束,新店开业。掌柜带谁去?答案出人意料:不是那位辛辛苦苦练习换菜的换菜师,而是品鉴师。理由是——品鉴师的舌头已经在成千上万道菜的“原/换”判断中被打磨成了一把通用的尺子,而换菜师只会“偷梁换柱”这一门手艺。

技术细节正是如此:微调时,丢掉生成器,把判别器的 Transformer 编码器作为初始化,在上面接一个任务头(分类头、问答头、序列标注头),用下游标注数据继续训练。这就是标准的“预训练-微调”范式,只不过预训练阶段学到的表示更扎实。

为什么判别器迁移得更好?因为它在预训练时必须对每一个位置都做判断,这迫使隐状态 $h_t$ 编码了每个词与全句上下文的精细关系;而 BERT 只在掩码位置监督,其余位置的表示“没人管”。实践中,ELECTRA 在 GLUE、SQuAD 上全面占优,小模型在低资源任务上优势更明显。

把品鉴师升任主厨,是因为他尝过百味、心里有“应当的味道”。判别器,才是 ELECTRA 留给下游任务的真正遗产。

Ltask=−E(x,y)∼Dlog⁡Pθ(y∣x),θ=θDpre\displaystyle \mathcal{L}_{task} = -\mathbb{E}_{(x, y) \sim \mathcal{D}} \log P_{\theta}(y \mid x), \qquad \theta = \theta_{D}^{\mathrm{pre}}
用任务标注数据继续训练:把判别器的预训练参数作为起点,让模型把“品鉴百味”的经验迁移到具体任务上。
  1. 有监督数据 $\mathcal{D}$下游任务的标注数据集,比如情感分类里的“句子-标签”对。
    (x,y)∼D(x, y) \sim \mathcal{D}
  2. 预训练初始化 $\theta = \theta_{D}^{\mathrm{pre}}$把 ELECTRA 判别器的编码器参数作为初始值,任务头随机初始化。
    θtask=[θDpre;  wheadrand]\theta_{task} = \big[ \theta_{D}^{\mathrm{pre}};\; w_{head}^{\mathrm{rand}} \big]
  3. 交叉熵微调 $\mathcal{L}_{task}$继续用任务数据做梯度下降,让预训练学到的语言知识适配具体任务。
    min⁡θLtask(θ)\min_{\theta} \mathcal{L}_{task}(\theta)

训练技巧

一切就绪,掌柜还得定几条后厨规矩,让两位新员工配合默契。规矩一:考核权重。尝菜判断比换菜练习重要 50 倍——毕竟最终要的是分辨力,不是换菜手艺。规矩二:控制换菜师个头。实验发现,生成器取判别器 1/4 到 1/2 的参数量是最佳区间,替换率沿用 BERT 的 15%,保留大部分原词充当“锚点”。规矩三:共享基本功。生成器和判别器共用词嵌入表,嵌入训练一次、两处受益。

NGen=α NDisc,α∈[0.25,  0.5]\displaystyle N_{Gen} = \alpha\, N_{Disc}, \quad \alpha \in [0.25,\; 0.5]

1. 参数量比例 $\alpha$:生成器通常是判别器的 1/4 到 1/2,因为它的任务更简单。

α=14∼12\alpha = \frac{1}{4} \sim \frac{1}{2}

2. 难度匹配:太小的换菜师换得太假,太大的换菜师让判别器无从下口,中等规模把 RTD 难度调到最优。

NGen=14NDisc⇒RTD 难度适中N_{Gen} = \frac{1}{4} N_{Disc} \Rightarrow \text{RTD 难度适中}

3. 词嵌入共享:两个网络共享同一张词嵌入表,生成器少学一半参数,也更快学会“像样的词”。

eG=eDe_{G} = e_{D}

好的配合不是各练各的,而是在同一个厨房、按同一套火候标准磨合。当你用 ELECTRA 训练自己的模型时,这三条“后厨规矩”就是最值得先抄的作业。

AI 应用场景

大规模预训练成本优化

阶段:预训练

解决的问题:传统 BERT 预训练只有 15% 的 token 产生学习信号,把大量算力浪费在“陪跑”上;中小团队预算有限,很难在合理时间内训练出领域模型。

具体案例:某医疗 AI 团队有 20 亿字符的电子病历语料,只有 4 张 V100。用 BERT 训练预计要 6 周,改用 ELECTRA-Small 结构(判别器 12 层、生成器 6 层),2 周完成预训练,在病历命名实体识别上 F1 反超原来的 BERT-Base 微调结果。

低资源下游任务迁移

阶段:微调与下游适配

解决的问题:标注数据稀少时,模型容易过拟合;ELECTRA 判别器对所有位置都做过判断,学到的上下文表示更完整,在小样本场景下泛化更好。

具体案例:某电商平台只有 5000 条带标注的客服投诉分类数据。直接用 BERT-Base 微调 F1 为 82.3;换用 ELECTRA-Base 预训练权重微调,F1 提升到 85.7,而且只用原来一半的训练轮次就收敛。

用生成器做数据增强

阶段:数据构建与增强

解决的问题:训练数据缺少“反事实”样本,模型鲁棒性差;ELECTRA 生成器天然会产出“以假乱真”的替换词,正好用来构造困难负样本。

具体案例:做文本蕴涵(NLI)的团队用 ELECTRA 生成器对前提句做同义词级别替换,构造与结论相矛盾的难负例,把模型在对抗样本上的准确率从 71% 提升到 78%。

Python 演示

python73 行
import numpy as np V = 6                         # 词表大小:5 个词 + 1 个句尾标点corpus = [                    # 微型语料:每句是 token id 序列    [0, 1, 2, 3, 5],    [1, 2, 3, 0, 5],    [2, 3, 0, 1, 5],    [3, 0, 1, 2, 5],    [0, 2, 1, 3, 5],] def build_bigram(sents, V):    # 生成器:统计相邻词共现,得到一张"换菜师"概率表    m = np.ones((V, V))    for s in sents:        for a, b in zip(s[:-1], s[1:]):            m[a, b] += 1    return m / m.sum(axis=1, keepdims=True) def perturb(sent, trans, rng, rate=0.25):    # 生成器按 bigram 概率把 25% 的位置换成冒牌词    out = list(sent)    for i in range(len(sent) - 1):        if rng.random() < rate:            out[i] = rng.choice(V, p=trans[sent[i]])    return out def encode(seq, i, V):    # 左右邻居 + 当前 token 作为判别器输入(3V 维 one-hot)    v = np.zeros(3 * V)    if i > 0:        v[seq[i - 1]] = 1    v[V + seq[i]] = 1    if i + 1 < len(seq):        v[2 * V + seq[i + 1]] = 1    return v class Discriminator:    # 品鉴师:微型 MLP,输出"这是原词"的 logit    def __init__(self, dim, h=8):        self.w1 = np.random.randn(dim, h) * 0.1        self.w2 = np.random.randn(h, 1) * 0.1     def forward(self, x):        self.h = np.tanh(x @ self.w1)        return self.h @ self.w2 def train(epochs=300):    rng = np.random.default_rng(0)    tr = build_bigram(corpus, V)    disc = Discriminator(3 * V)    for ep in range(epochs):        total, hits, n = 0.0, 0, 0        for sent in corpus:            noise = perturb(sent, tr, rng)            x = np.array([encode(noise, i, V) for i in range(len(noise))])            y = np.array([1.0 if a == b else 0.0 for a, b in zip(sent, noise)])            logit = disc.forward(x).ravel()            p = 1 / (1 + np.exp(-logit))            loss = -np.mean(y * np.log(p + 1e-9) + (1 - y) * np.log(1 - p + 1e-9))            d = (p - y) / len(sent)                  # 输出层残差            dh = d[:, None] * disc.w2.T            disc.w2 -= 0.1 * disc.h.T @ d[:, None]            disc.w1 -= 0.1 * x.T @ (dh * (1 - disc.h ** 2))            total += loss            hits += np.sum((p > 0.5) == (y > 0.5))            n += len(y)        if ep % 60 == 0:            print("epoch", ep, "loss", round(total / len(corpus), 4),                  "acc", round(hits / n * 100, 1)) if __name__ == "__main__":    train()
目的:用 NumPy 从零实现一个“微型 ELECTRA”——生成器统计共现概率换词,判别器用一个小 MLP 对每个位置做“原词/替换词”二分类,演示 RTD 全流程。
  1. def build_bigram(sents, V):换菜师不需要复杂训练,只统计“哪些词经常一起出现”就能换出像样的冒牌词。
  2. if rng.random() < rate:只对 25% 位置下手,模仿论文的稀疏替换策略。
  3. v[V + seq[i]] = 1判别器输入的是“可能被换过的当前位置”,而不是原始词,它必须真的尝出味道。
  4. y = np.array([1.0 if a == b else 0.0 ...])逐个位置对照原句与调包句生成标签,这就是全员参与的“品鉴标准答案”。
  5. p = 1 / (1 + np.exp(-logit))sigmoid 把打分换算成“这是原词”的概率。
  6. d = (p - y) / len(sent)手工反传第一步:输出层残差,后续所有梯度都从它开始流动。
  7. if __name__ == "__main__":直接运行脚本,可观察 loss 下降、acc 稳定上升的训练过程。

常见误区

误区我觉得 ELECTRA 和 GAN 一样,生成器和判别器对抗训练,生成器应该越强越好。

正解不一样!ELECTRA 的生成器用极大似然(MLM 式)训练,目标是“在掩码位置预测原词”,而不是被判别器“骗”着训练。生成器太强,替换太逼真,判别器对所有位置都生疑,梯度信号全是噪声,反而学不到东西。论文明确观察到适度弱小的生成器效果更好。

为何常见:“生成器+判别器”的结构太像 GAN,初学者很容易直接把对抗训练的概念套上来。

误区ELECTRA 每个 token 都要过判别器,前面还有个生成器,肯定比 BERT 贵得多。

正解单次前向确实多了一个生成器,但它很小(约 1/4 参数量)。更重要的是,同样的算力预算下,ELECTRA 每个训练步的信息量约为 BERT 的 6.7 倍,收敛需要的步数大幅减少。小模型单 GPU 四天即可训练完——效率要看“效果/算力”,而不是“单步算力”。

为何常见:只看了结构复杂度,忽略了收敛速度;把“每个位置都算损失”误解成“每个位置都重跑一遍模型”。

误区两个网络各有用处,既然生成器能生成词,用它做迁移学习应该也行。

正解论文和实践中只保留判别器做微调。判别器在每个位置都做二分类,被迫理解整句上下文与词语关系;生成器只学了“哪些词常搭配”,表示能力弱很多。用生成器微调,下游任务效果会明显下降。

为何常见:直觉上觉得“能生成词就更通用”,但自然语言理解任务要的是判别式上下文表示,不是生成能力。

误区判断一个 token 是不是被换的,只看这个 token 本身不就行了?

正解单独看“猫”和“狗”都像原词,只有结合前后文(“我家的__会抓老鼠”)才能判断哪个违和。判别器必须基于整个句子的编码对每个位置输出,本质是“在语境中做判断”。这正是它能学到上下文表示的原因。

为何常见:把二分类想得太简单,忽略了 Transformer 编码器对全句建模这一前提。

误区既然所有 token 都要被检查,那把 100% 的 token 都换掉,判别器岂不是学得更多?

正解全换会让句子面目全非,判别器只能学到“原词长得像词典里的词”这种低级线索,生成器也缺少真实上下文做参考。论文默认替换率约 15%(与 BERT 掩码率一致),保留大部分真实词当“锚点”,判别器才能学到细微语义。

为何常见:直觉认为“练得多=学得多”,忽略了任务难度与信息结构的平衡。

面试题

Q1. ELECTRA 取代 BERT 掩码任务的核心训练任务是什么?

单选题 · easy

  • A.替换词检测(RTD)← 正确答案
  • B.完形填空(MLM)
  • C.下一句预测(NSP)
  • D.词序还原(WSR)

答案:A。ELECTRA 的核心是替换词检测(RTD):生成器换词,判别器对每个位置判断“原词还是替换词”。MLM 是 BERT 的任务,NSP 是 BERT 的辅助任务,WSR 与 ELECTRA 无关。

Q2. 一句 20 个 token 的句子,BERT 掩码任务大约有多少 token 参与损失计算?

单选题 · easy

  • A.0 个
  • B.20 个
  • C.3 个← 正确答案
  • D.10 个

答案:C。BERT 的掩码率是 15%,20 个 token 中约 3 个被掩码,只有这 3 个位置产生损失。这就是“抽查式教学”的浪费所在,ELECTRA 则让 20 个位置全部参与。

Q3. ELECTRA“所有 token 参与训练”的正确含义是?

单选题 · mid

  • A.每个 token 都被生成器替换
  • B.每个 token 都参与掩码预测
  • C.每个 token 都被判别器二分类← 正确答案
  • D.每个 token 都被打上掩码

答案:C。生成器只替换约 15% 的 token,但判别器会对整句每一个位置输出“原词/替换词”的二分类,所以每个 token 都有梯度信号。A、D 把全员参与误解为全部替换或全部掩码,B 是 BERT 的做法。

Q4. 在 ELECTRA 框架中,生成器的主要职责是?

单选题 · mid

  • A.构造新的训练语料
  • B.直接用于下游任务微调
  • C.计算最终的预测概率
  • D.产生以假乱真的替换词← 正确答案

答案:D。生成器负责把部分 token 换成看似合理的冒牌词,为判别器出题。微调阶段生成器会被丢弃,它也不计算最终任务概率,只服务于预训练阶段。

Q5. 关于 ELECTRA 的生成器与判别器,下列说法正确的有?

多选题 · mid

  • A.生成器参数量通常更小← 正确答案
  • B.两者可以共享词嵌入← 正确答案
  • C.生成器用对抗损失训练
  • D.微调时只保留判别器← 正确答案

答案:ABD。生成器取判别器 1/4~1/2 参数量,二者共享词嵌入表;微调时丢弃生成器、保留判别器。C 错误:生成器用极大似然(MLM 式)训练,不是对抗损失。

Q6. 为什么生成器太强反而不利于判别器学习?

单选题 · hard

  • A.替换太逼真,处处生疑,梯度模糊← 正确答案
  • B.生成器过大会挤占显存资源
  • C.生成器会覆盖判别器输出
  • D.两个网络的损失会互相抵消

答案:A。生成器太强时,替换词几乎无法区分,判别器对所有位置都输出“可疑”的中间概率,正负样本边界消失,梯度信号失去指向性。参数变多导致的显存问题不是根本原因,梯度也不会被“覆盖”或“抵消”。

Q7. 与 BERT 的 MLM 相比,ELECTRA 的优点包括?

多选题 · hard

  • A.每个 token 都获得训练信号← 正确答案
  • B.不需 [MASK] 标记,输入分布一致← 正确答案
  • C.单步计算量必然显著变小
  • D.相同数据能学到更通用的表示← 正确答案

答案:ABD。ELECTRA 全员参与训练、无 [MASK] 特殊记号,判别器表示更通用。C 错误:多了生成器,单步前向计算量反而略增,收益来自收敛更快、信号密度更高,总账更划算。

Q8. 判别器对某个位置输出的概率表示什么?

单选题 · easy

  • A.该位置词表上的概率分布
  • B.该位置是否为替换词的概率← 正确答案
  • C.整个句子的情感极性
  • D.下一个词出现的概率

答案:B。判别器做的是逐位置二分类,输出“这个词是不是被换过”的概率。A 是生成器在掩码位置的输出,C 是下游分类任务,D 是语言模型的预测目标。

Q9. 组合损失 L = L_gen + λ·L_disc 中,论文常用的 λ 是?

单选题 · mid

  • A.通常取 50 放大判别器信号← 正确答案
  • B.通常取 0.1 削弱判别器信号
  • C.通常取 1 保持两者完全相等
  • D.通常取 5 略偏向判别器

答案:A。论文实验表明,判别器是主角,λ=50 能让判别器收到足够强的梯度,同时不让生成器主导训练。λ 太小则判别器学不动,λ 太大则生成器换词质量崩坏。

Q10. 关于 ELECTRA 的效率与效果,正确的说法有?

多选题 · hard

  • A.有效样本利用率约是 BERT 的 6.7 倍← 正确答案
  • B.小模型单 GPU 四天即可训练完← 正确答案
  • C.同等算力下 GLUE 分数超过 BERT← 正确答案
  • D.需要把词表缩小一半才能提速

答案:ABC。15% 与 100% 的信号密度比约为 6.7;ELECTRA-Small 单卡四天能完成预训练;ELECTRA-Large 在 GLUE 88.0 对 BERT-Large 85.0。D 错误:ELECTRA 不靠缩小词表提速,靠的是信号密度与无 [MASK] 的一致性。