为什么 Transformer 值得单独讲一篇
上一篇我们讲了 Attention(注意力机制)——它解决了 RNN 处理长文本时的两大难题:信息瓶颈和无法并行。但 Attention 始终是 RNN 的"外挂",主体还是 RNN。
2017 年 Google 的一篇神文 Attention Is All You Need,把这件事推到了极致:干脆把 RNN 全部干掉,整个模型就用 Attention 搭建。这个架构就是 Transformer。
类比:上一篇说 Attention 像是给 RNN 加了一副"可以回头看"的眼镜,但 RNN 还是那个只能一步一步走的蜗牛。Transformer 直接把蜗牛壳扔了——让 Attention 当骨架,重新搭了一个四条腿可以并行走路的结构。
Transformer 是怎么诞生的?
原论文标题本身就是一个回答:"Attention Is All You Need"——只要 Attention 就够了。你不再需要 RNN、LSTM、CNN 这些复杂的序列建模结构,只用 Attention 就能达到甚至超过它们的效果。
Transformer 诞生的标志性事件是:
| 时间 | 事件 |
|---|---|
| 2017 年 6 月 | Google 发表 Attention Is All You Need |
| 2017 年底 | 在 WMT 2014 英德、英法机器翻译任务上拿下 SOTA |
| 2018 年 | BERT、GPT 等基于 Transformer 的预训练模型井喷 |
| 2022 年底 | ChatGPT 发布,Transformer 成为大模型时代的基石 |
理解 Transformer 的结构,是理解今天所有大模型(GPT-4、文心一言、Gemini、Llama 等)的底层基础。
一、Transformer 整体长什么样?
我们先抛掉所有细节,从最高视角看一眼整个模型。Transformer 本质上还是个 seq2seq 结构——左边编码,右边解码——只是编码器和解码器从 RNN 换成了基于 Attention 的模块:
把它"看成一个黑盒",输入是法语文本序列,输出是英语文本序列:
拆开黑盒,就是经典的 encoder-decoder 结构:
把 encoder 内部和 decoder 内部再展开,就是 6 层 encoder + 6 层 decoder(原论文用的层数,这个 6 不是固定的,可以调):
类比:Transformer 的多层结构像一个工厂流水线。每个车间(层)负责把原料(词向量)加工得更精细。原料进入第 1 车间,被打磨一次,送入第 2 车间,再打磨一次……经过 6 个车间后,出来的东西已经是高品质的成品。不同车间可以做不同的事——前几个车间专门抓语法结构,中间几个抓语义关系,最后几个抓语用信息。
PM 视角:为什么 Transformer 不像 RNN 那样"深度大"(比如 100 层)?因为每层内部已经做了很多事(多头 Attention、FFNN 等),层数不需要太深。这告诉我们一个产品启示——不要追求"模型越大越好",而是要找到效果和成本的最优平衡点。 GPT-3 有 96 层、1750 亿参数,所以单次推理贵得离谱;很多业务场景下 6~12 层的小 Transformer 就够用了。
二、单层 Encoder 的构成
每一层 Encoder 由两个子层组成:
- Self-Attention 层(自注意力层)
- 前馈神经网络(FFNN, Feed-Forward Neural Network)
工作流程:
- 输入:每个词的 embedding 向量 $x_1, x_2, ..., x_n$(维度 $d$)
- Self-Attention 层处理后:$h_1, h_2, ..., h_n$(每个 $h_i$ 都融合了上下文信息)
- FFNN 再处理一遍:得到新的 $x_1, x_2, ..., x_n$
- 这些 $x_i$ 继续传给下一层 encoder,重复上述过程
类比:Self-Attention 像是"小组讨论"环节——让每个词先听听其他词怎么说,融合大家的意见;FFNN 像是"个人消化"环节——融合完意见后,每个词再独立思考整理。这种"先讨论后消化"的两步走,是 Transformer 每层的标准动作。
三、单层 Decoder 的构成
Decoder 比 Encoder 多一个子层:Encoder-Decoder Attention 层(也叫 cross-attention)。这一层让 Decoder 在生成每个词时,能"回头看" Encoder 的输出:
三个子层分别是:
- Masked Self-Attention:自己看自己(带掩码,看不到未来的词)
- Encoder-Decoder Attention:Q 来自 Decoder,K/V 来自 Encoder
- FFNN:常规前馈网络
类比:Decoder 像一个翻译官在交传——他边听边译,但他只能翻译"已经听到的部分"(Masked Self-Attention 保证看不到未来),并且每翻译一句都要回头核对原文(Encoder-Decoder Attention)。
四、输入处理:词向量 + 位置向量
Transformer 处理输入的第一步,是把每个词变成向量。这有两步:
4.1 词向量(Word Embedding)
用 embedding 算法把每个词变成一个向量(比如 4 维示意,真实场景是 256 或 512 维):
4.2 位置向量(Positional Encoding)
但是!Transformer 没有 RNN/LSTM 那种天然的"顺序感"。RNN 是逐字读的,所以它知道"第 1 个词在前面,第 2 个词在后面"。Transformer 是一次性把整句话喂进去——它需要一种额外的方式告诉模型"这个词在哪个位置"。
这就是位置向量的作用——给每个词向量"加上"一个代表位置的向量:
类比:Transformer 像一个把整本书"摊开在桌上"一次性扫描的人。这种读法的好处是能并行,坏处是分不清词的前后——"苹果手机"和"手机苹果"如果只看摊开的两个词,对机器来说是一样的。位置向量就是给每个词贴一个"门牌号"——1 号、2 号、3 号——让模型知道谁在前、谁在后。
PM 视角:为什么位置信息这么重要?想象一下,如果不告诉模型"苹果"和"手机"哪个在前哪个在后,模型可能会以为"苹果手机"和"手机苹果"是同一个东西。位置编码是 Transformer 区别于词袋模型(Bag-of-Words)的关键。 作为 PM,你以后看到"RoPE"、"ALiBi"这些词,都是位置编码的不同实现方案——不用懂原理,但要明白它们都在解决同一个问题。
具体的位置向量怎么算?原论文给的公式是:
$$ PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}}) $$
$$ PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}}) $$
其中:
- $pos$ 是词的位置(0、1、2、...)
- $d_{model}$ 是位置向量的维度
- $i$ 是维度下标($i \in [0, d_{model})$)
为什么用 sin 和 cos?是因为这两个函数有周期性——这意味着位置编码可以泛化到训练时没见过的句子长度。
五、Self-Attention:Transformer 的灵魂
这一节是整篇文章的核心。Self-Attention 的"自"意思是:句子里的每个词,都要把注意力分给同一句话里的所有其他词,包括自己。
5.1 为什么需要 Self-Attention?
看这个经典例子:
"The animal didn't cross the street because it was too tired."
句子里的 it 指的是谁?人一看就知道是 animal,但对模型来说这是个难题——可能是 animal,也可能是 street。
Self-Attention 机制让模型自动学会把 it 和 animal 关联起来:
类比:Self-Attention 像一个学生在做阅读理解。每读完一个词,他都会回头看一下整段话,确认这个词到底在指什么。"it" 单独看是模糊的,但回头看了"animal"和"tired"之后,就清楚了。
PM 视角:这是 AI 产品中"指代消解"问题的核心技术。比如你的客服系统收到用户问题:"这个东西能退款吗?"——这里的"这个东西"指的是哪件商品?Self-Attention 让模型能"读懂"这种模糊指代。
5.2 Self-Attention 的 6 步计算过程
我们以 "Thinking Machines" 两个词为例,演示 Self-Attention 的 6 步计算:
第 1 步:每个词向量 $X_i$ 乘以 3 个不同的权重矩阵,得到 3 个向量:$Q_i$(Query,查询)、$K_i$(Key,键)、$V_i$(Value,值):
类比:你去图书馆找一本书,Q 是你想找的书名(比如"机器学习"),K 是书架上每本书的标签,V 是书的内容。Q 和 K 越相关(点积越大),你越会"关注"对应的 V。
第 2 步:计算 Attention Score。比如算 Thinking 的注意力分数,就是把 Thinking 的 $q_1$ 跟所有词的 $k_i$ 做点积:
第 3 步:把分数除以 $\sqrt{d_k}$($d_k$ 是 Key 向量的维度)。除以这个数是为了让训练时梯度更稳定。
第 4 步:softmax 归一化,把分数变成概率(加起来等于 1):
第 5 步:每个 $V_i$ 乘以自己的分数。
第 6 步:把加权后的 $V_i$ 加起来,得到当前位置的输出 $z_1$:
PM 视角:如果你跟算法工程师开会,他们说"我们在算 QK^T",说的就是这个过程。Self-Attention 的本质就是:计算"我对其他词的关注度",然后按关注度加权汇总信息。
5.3 矩阵形式:实际代码怎么算
上面是按"词"一步步算的,实际代码里我们用矩阵一次性算完所有词。
输入矩阵 $X$(每一行是一个词的 embedding):
$$ X = [X_1; X_2; ...; X_n] $$
三个权重矩阵 $W^Q, W^K, W^V$ 是模型要学习的参数。算出 Q、K、V 矩阵:
$$ Q = X W^Q, \quad K = X W^K, \quad V = X W^V $$
最后用一行公式算出 Self-Attention 输出:
$$ Z = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V $$
PM 视角:你不需要会写这段代码,但要明白 "矩阵运算让 Self-Attention 天然适合 GPU 并行"。这是 Transformer 训练速度远超 RNN 的根本原因——产品启示是:当你评估一个 NLP 模型的训练成本时,Transformer 架构往往是性价比最高的选择。
六、多头注意力(Multi-Head Attention):让模型"多角度看问题"
单个 Self-Attention 头有个局限:它只能从"一个角度"看句子。比如翻译 "it" 时,可能重点看了 "animal",但忽略了 "tired"。
多头注意力的解决方案是:同时用多组 $W^Q, W^K, W^V$(每组叫一个 head),每个 head 学到不同的关注模式。
原论文用了 8 个 head。每个 head 独立计算,得到 8 个输出矩阵:
但下游的 FFNN 只需要一个矩阵,所以把 8 个 head 的结果拼起来,再乘一个权重矩阵 $W^O$ 做一次线性变换:
完整流程放在一起:
回到 "it" 的例子,不同的 head 关注不同的词:
图中:
- 一个橙色 head 把注意力放在 "the animal"
- 一个绿色 head 把注意力放在 "tired"
类比:多头注意力就像一个专家团队会诊一个病人。内科医生看的是生理指标,外科医生看的是解剖结构,影像科医生看的是片子——同一份病历,每个人从自己的专业视角提取不同特征,最后汇总成综合诊断。Transformer 的多个 attention head 就是在做这件事:每个 head 学不同的关注模式,最后拼起来。
PM 视角:多头机制的本质是"让 AI 像专家团队一样协作"——每个 head 是一个"专才",有的关注主语,有的关注动词,有的关注情感。当 AI 产品需要处理复杂场景时(比如法律合同的多重条款审查、医疗报告的多维度提取),多头机制天然适合。你以后听到"模型有 32 个 attention head",就知道这意味着模型能同时从 32 个角度分析问题。
七、残差连接 & Layer Normalization
到目前为止,我们算了 Self-Attention 的输出。但单层 Encoder 还有两个关键操作:残差连接 + 层标准化。
Encoder 的每个子层(Self-Attention 和 FFNN)都用了残差连接和 LayerNorm:
把 Self-Attention 内部的 LayerNorm 细节也画出来:
把两层 Transformer 的所有内部细节都画出来,是这个样子:
类比:残差连接就像高速公路的"应急车道"——主路上堵车(梯度消失)走不动时,信息可以从应急车道绕过去。这让几十层、上百层的网络还能稳定训练。
PM 视角:残差连接解决了深度网络的"梯度消失"问题——简单说就是让模型能训得动几十层、上百层。这是深度学习能 scale up 的关键技术。你不用懂数学,但要明白一个产品结论:基于 Transformer 的大模型可以做到 100+ 层深,本质上是因为残差连接 + LayerNorm 解决了深度训练难题。
八、Decoder 是怎么工作的?
Encoder 部分讲完了,现在看 Encoder 和 Decoder 如何配合:
Decoder 的每个时间步:
- 接收上一个时间步生成的词作为输入
- 通过 Self-Attention 看到之前生成的所有词
- 通过 Encoder-Decoder Attention 看到 Encoder 的全部输出
- 经过 FFNN 输出当前时间步的词
- 重复,直到生成结束符
整体动态过程:
Decoder 里的 Self-Attention 和 Encoder 里的有两点关键区别:
| 区别点 | Encoder Self-Attention | Decoder Masked Self-Attention |
|---|---|---|
| 看到未来词吗 | 可以(看到整句话) | 不可以(只能看到当前位置及之前) |
| 实现方式 | 普通 Attention | 在 Softmax 之前把未来位置设为 $-\infty$ |
为什么 Decoder 要"看不到未来"?因为训练时如果模型提前看到了答案,那就没意义了——它必须学会一步一步、自左向右地生成。这就像考试时不能偷看答案——必须现场推演。
九、线性层 + Softmax:从向量到单词
Decoder 最后一个时间步的输出是一个浮点数向量,怎么变成具体的单词?
通过一个线性层(全连接层)+ Softmax:
假设词表大小是 10000("the"、"a"、"translation"、... 等 10000 个英文单词):
- 线性层把 Decoder 输出映射成一个 10000 维的 logits 向量
- 每个维度对应一个单词的分数
- Softmax 把分数转换为概率(加起来等于 1)
- 取概率最大的那个单词作为这一步的输出
PM 视角:这就是为什么 AI 有时会"胡说八道"——它本质上是从概率分布里挑一个词。如果某个上下文让模型把高概率放在了一个奇怪的词上,输出就会很奇怪。这告诉我们:AI 输出永远不应该被原样呈现给用户,必须做后处理(事实校验、敏感词过滤、置信度提示)。
十、损失函数:模型是怎么"学习"的
训练时,模型每个时间步都会输出一个概率分布。我们希望它输出的分布和正确答案尽可能接近。
下图展示了训练初期——模型输出的概率分布几乎是随机的(每个词的概率差不多):
通过反向传播 + 梯度下降,模型逐渐学会把高概率放在正确答案上:
训练充分后,模型在每个时间步都能给出接近真实的概率分布:
损失函数可以用欧氏距离、交叉熵(cross-entropy)、KL 散度等。这部分是算法工程师关心的,作为 PM 你只需知道:有大量标注数据 + 合适的损失函数 = 模型能学会任务。 数据是产品的护城河,不是算法。
十一、推理策略:Greedy Decoding vs Beam Search
模型每个时间步从概率分布里挑词的方式,叫解码策略:
- Greedy Decoding(贪心解码):每步都挑概率最大的词。简单、快,但可能不是全局最优。
- Beam Search(集束搜索):每步保留 top-k 个候选(比如 k=5),下一步基于这 5 个候选分别展开,最后选整体概率最高的序列。效果更好,但计算量成倍增加。
类比:贪心解码像下象棋每步都走"看起来最好"的那一步,但可能错过几步之后的精妙组合。Beam Search 像保留前 5 个候选局面往下推演,能找到更好的全局解,但代价是慢。
PM 视角:当你的 AI 产品响应太慢时,先问问算法工程师:"解码用的什么策略?能不能 beam size 砍半?"——这是产品性能优化的常见入口。
十二、BERT:把 Transformer 推向工业界
讲完 Transformer 本身,我们顺着历史线走,看一个用 Transformer 改变整个 NLP 行业格局的模型——BERT。
类比:如果说 Transformer 是一台新发明的超级引擎,BERT 就是第一辆把这台引擎装上、跑遍全世界并证明它好用的车。
12.1 BERT 干了啥?
2018 年 Google 发表 BERT 论文,直接打破了多个 NLP 任务的最好成绩。BERT 出现之前,做 NLP 任务基本是各家公司各训各的模型;BERT 之后,"预训练 + 微调"成了 NLP 的标准范式:
- 预训练:Google 在大规模无监督语料上训练了一个通用的 BERT 模型
- 微调:你下载这个模型,在自己业务数据上稍微调一调(通常几小时 vs 从零训练几周),就能在特定任务上达到很高准确率
PM 视角:BERT 出现之前,AI 产品落地 NLP 功能,每个场景都得自己造轮子;BERT 出现后,相当于 Google 把轮子造好了免费送,你只需要按自己车型换一下车轴(加一层任务网络)。这是 AI 普惠的关键节点——大公司烧钱预训练,创业公司拿来微调就能用。
12.2 BERT 怎么用?一个例子
假设你要做"垃圾邮件识别"任务:
- 下载预训练好的 BERT(一般 3 个文件:模型配置 + 模型参数 + 词表)
- 在 BERT 上面加一个简单的分类器
- 用你的标注邮件数据微调整个模型
- 部署上线
加了分类器后,整体是这样:
类似的,BERT 还能用于:
| 任务 | 输入 | 输出 |
|---|---|---|
| 情感分析 | 商品评价 | 正面 / 负面 |
| 句子相似度 | 两句话 | 是否同一个意思 |
| 问答 | 问题 + 一段文字 | 答案在文中的起止位置 |
| 命名实体识别 | 一句话 | 标记出每个人名、地名、机构 |
12.3 模型结构
BERT 的结构很简单——就是 Transformer 的 Encoder 部分:
- BERT-base:12 层 Encoder,1.1 亿参数
- BERT-large:24 层 Encoder,3.4 亿参数
PM 视角:BERT 只用了 Transformer 的 Encoder 部分——它擅长"理解"输入,但不会"生成"输出。所以 BERT 适合做分类、检索、问答这类理解任务;不适合做翻译、对话这种生成任务(生成任务要用 GPT 系列的 Decoder)。作为 PM,当算法工程师说"这个任务用 BERT 还是 GPT"时,你可以判断:如果是要从已有文本里提取信息,用 BERT;如果是要从零写一段文字,用 GPT。
12.4 模型输入:特殊 token 的作用
BERT 的输入有一个细节——在句首会插入一个特殊的 [CLS] token:
这个 [CLS] 位置经过 BERT 编码后的向量,会被用作整个句子的语义表示——下游任务(比如分类)通常就用这个向量喂给分类器。
类比:开会时主席位上坐的[CLS]——他不参与具体讨论,但会做最终总结。BERT 让[CLS]位置学会"如何压缩整段话的关键信息"。
12.5 模型输出
每个 token 经过 BERT 编码后,都会输出一个固定维度的向量(BERT-base 是 768 维):
每个位置的向量都融合了整句的上下文信息——这就是 BERT 比早期 word2vec 强的地方(后面 12.7 节会展开)。
12.6 预训练任务 1:Masked Language Model(掩码语言模型)
BERT 怎么在"无标注"的大规模文本上预训练呢?靠两个自监督任务,第一个是 Masked LM:
随机选 15% 的词,用 [MASK] 替换,让 BERT 预测这些被遮住的词。类比:这就像给学生一篇挖了几个空的文章,让他根据上下文猜词。学生要猜对,必须理解句意——这就逼着 BERT 学到了深层的语言理解能力。
这种训练方式最早可以追溯到 Word2Vec 时代(C-BOW:根据左右词预测中间词)。BERT 是这个思路的"豪华升级版"。
12.7 预训练任务 2:相邻句子判断(NSP)
第二个任务是判断两句话是不是原文里相邻的:
这个任务让 BERT 学会了"句子间关系"的建模,对问答、推理类任务很有帮助。后来很多后续模型(比如 RoBERTa)发现这个任务收益有限,就去掉了。
PM 视角:BERT 这种"在大规模无标注数据上自监督预训练"的方式,让所有 NLP 团队第一次拥有了"通用底座"。以前每个公司都得自己攒标注数据训模型,现在大家共用一个 BERT,自己的业务数据只需要几百~几千条就能微调出可用效果。标注数据成本从"十万条起步"降到"几千条就够",这是 NLP 商业化的关键转折。
12.8 BERT 的广泛应用
BERT 几乎可以处理所有主流 NLP 任务:
- 判断两个句子是否相似
- 单个句子的情感分类
- 抽取式问答
- 序列标注(命名实体识别、词性标注等)
12.9 BERT 还能做特征提取
除了"加任务层 + 微调",BERT 本身的输出向量本身就可以作为高质量的特征喂给传统机器学习模型(比如 SVM、随机森林)。你甚至可以提取不同层的输出做对比实验——研究表明 BERT 不同层的向量捕捉的信息不一样:
- 底层偏向语法(词性、句法)
- 中间层偏向句法结构
- 顶层偏向语义和任务相关特征
PM 视角:当你的产品只能接传统机器学习模型(比如团队还在用 sklearn 那一套),BERT 也能帮上忙——把文本喂给 BERT,提取向量,再喂给你的老模型。这是 BERT 给传统 NLP 产品升级提供的"最低成本路径"——不需要重写整个 pipeline。
12.10 从 word2vec 到 BERT:词嵌入的演进
这一节我们从历史的视角看词嵌入(embedding)的演进,理解 BERT 为什么是重大突破。
12.10.1 第一代:传统 word2vec / GloVe
一个词用一个固定的向量表示,无论上下文是什么,向量都一样。
缺陷:"stick" 这个词在不同上下文里有不同含义("stick to the plan"坚持 / "a wooden stick"木棍),但 word2vec 只给一个向量。
12.10.2 第二代:ELMo(语境化词嵌入)
ELMo 解决了这个问题——同一个词在不同上下文里有不同向量:
它用双向 LSTM 在大规模语料上预训练"预测下一个词"任务,然后学到的隐藏状态作为词嵌入:
ELMo 通过把 LSTM 的各层隐藏状态拼接 + 加权求和,得到语境化的词嵌入:
12.10.3 第三代:OpenAI Transformer(GPT 的前身)
OpenAI 用 Transformer 的 Decoder 替换 LSTM 做"预测下一个词"的预训练:
预训练完后,针对不同下游任务做微调:
通过输入变换,OpenAI Transformer 能处理多种任务:
但 OpenAI Transformer 有一个局限——它是单向的(Decoder 的 Masked Self-Attention 决定了只能看到当前及之前的词)。
12.10.4 第四代:BERT(双向 Transformer Encoder)
BERT 的关键创新:换用 Transformer 的 Encoder(可以看到双向的上下文),并改用 Masked LM 作为预训练任务——这样模型被迫同时利用"左边"和"右边"的信息来预测被遮住的词。
类比:ELMo 是"戴了近视镜看两边"(双向 LSTM),OpenAI Transformer 是"只戴了左边的眼镜"(单向 Decoder),BERT 是"两边都戴而且换了最清晰的镜片"(双向 Encoder)。
12.11 BERT 给 PM 的核心启示
讲完 BERT 的结构和训练方式,最重要的产品结论是:
| 现象 | 跟 BERT 的关系 |
|---|---|
| "为什么我们的 NLP 项目冷启动这么快?" | BERT 预训练模型提供了通用底座,只需少量业务数据微调 |
| "为什么同样数据,换 BERT 后准确率涨了 10 个点?" | BERT 已经在海量语料里学到了语言本身的结构,业务数据只需补业务知识 |
| "为什么 BERT 不能直接做对话?" | BERT 是 Encoder(理解),不是 Decoder(生成)。对话需要 GPT 系列的生成能力 |
| "BERT 还有什么限制?" | 单向输入长度有限(512 token),长文档处理仍是难点 |
十三、关键 takeaway:作为 PM 你需要记住什么?
如果你只能从这篇文章里带走三句话,我希望是这三句:
1. Transformer = 注意力机制 + FFNN + 残差连接 + 位置编码的组合拳。
它抛弃了 RNN,全用 Attention,并行计算能力拉满,成为现代大模型的基石架构。
2. Self-Attention 让模型在处理每个词时都能"看全"整句话。
这是 Transformer 强大表达能力的根本来源。
3. BERT = Transformer Encoder + 预训练 + 微调,奠定了 NLP "通用底座"的范式。
这让所有 NLP 团队第一次拥有"拿来即用"的基座模型,业务落地周期从月级降到天级。
由此延伸的产品决策启示:
| 业务场景 | Transformer/BERT 的启示 |
|---|---|
| 长文档处理 | 模型天然支持长上下文,但要小心显存——512 token 和 4096 token 成本差 8 倍 |
| 多语言翻译 | 同一个 Transformer 可以训出几十种语言的对齐能力——多语言 SaaS 产品可复用一套模型 |
| 实时对话 | Decoder 必须串行生成(一个字一个字吐),延迟是产品体验的关键约束 |
| 内容审核 | BERT 适合做"理解"类任务(分类、情感、命名实体识别),可直接用预训练模型微调 |
| 客服 FAQ | BERT 的句子相似度能力可以让用户问"怎么退款"自动匹配知识库答案 |
| 中文 NLP 产品 | 中文 BERT(RoBERTa-wwm-ext、ERNIE 等)已经成熟,效果比英文版本只差一点点 |
参考资料
补充阅读:






















































Comments | NOTHING