深度学习03 从Self-Attention到BERT
【深度学习】从Self-Attention到BERT:自然语言处理的核心技术详解
大家好,我是~墨-。今天我们来聊聊自然语言处理(NLP)中两个非常重要的概念:Self-Attention(自注意力机制) 和 BERT(双向编码器表示)。这篇文章将带你从最基础的文本表示开始,一步步理解为什么需要Self-Attention,它是如何工作的,以及BERT又是怎样站在Transformer的肩膀上成为NLP界的“万金油”。无论你是初学者还是有一定基础的开发者,希望这篇文章能帮你理清思路,掌握这些核心概念。
一、引言
自然语言处理的任务五花八门:情感分析、机器翻译、命名实体识别……但无论任务是什么,计算机首先要解决一个问题:如何把文字变成它能理解的数字?
早期的做法很简单,比如One-hot Encoding,但很快发现它有很多缺点。后来有了Word Embedding,词的表示变得稠密且富含语义。接着,为了处理序列数据(比如一句话),人们发明了RNN、LSTM,但它们无法并行计算,且长距离依赖依然困难。直到2017年,Google提出Transformer,其中的Self-Attention机制彻底改变了NLP的格局。随后,BERT横空出世,将NLP带入预训练时代。
下面我们就一步步揭开它们的神秘面纱。
二、文本的向量表示
1. One-hot Encoding:独热编码
假设我们有一个词表,包含“我”、“你”、“他”、“猫”、“狗”五个词。用One-hot表示就是:
我 = [1, 0, 0, 0, 0]
你 = [0, 1, 0, 0, 0]
他 = [0, 0, 1, 0, 0]
猫 = [0, 0, 0, 1, 0]
狗 = [0, 0, 0, 0, 1]
缺点:
- 维度灾难:词表多大,向量就有多长。
- 无法体现词与词的关系:比如“猫”和“狗”都是宠物,但它们的向量正交,看不出任何相似性。
2. Word Embedding:词嵌入
为了解决上述问题,我们让模型自己学习词的向量表示。通过一个线性层(例如Linear(21128, 768)),我们可以把每个词的One-hot向量映射到一个低维稠密空间(比如768维)。这样,“猫”和“狗”的向量就会在空间上比较接近,因为它们经常出现在相似的语境中。
三、序列建模的演进:RNN → LSTM → Self-Attention
1. RNN与LSTM
RNN(循环神经网络)的核心思想是:逐个词处理,并传递一个“记忆单元”。这个记忆单元会随着时间步更新,从而捕捉上文信息。
LSTM(长短期记忆网络)引入了输入门、遗忘门、输出门,让网络可以选择性地记住或忘记信息,从而更好地处理长距离依赖。
但是,它们都有一个共同的痛点:
- 无法并行计算:必须按顺序一个一个词处理,速度慢。
- 长距离依赖依然有限:即使LSTM,也很难捕捉很远的依赖关系。比如一段长文中,问“谁与赛汗塔拉结下了不解之缘?”答案可能在很前面,LSTM可能早已遗忘。
2. 从RNN到Self-Attention的思考
有没有一种方法,可以一次性看完整句话,同时知道每个词与其他所有词的关系呢?这就是Self-Attention要解决的问题。
四、Self-Attention 机制详解
Self-Attention 的核心思想是:每个词不仅看自己,还要看与其他词的关系,然后加权融合。
1. 三个核心向量:Query, Key, Value
对于输入序列中的每个词向量 (a_i),我们通过三个不同的权重矩阵 (W_q, W_k, W_v) 计算出三个新向量:
- Query(查询):(q_i = a_i W_q)
- Key(键):(k_i = a_i W_k)
- Value(值):(v_i = a_i W_v)
直观理解:Query 就像是你在问“我要找什么?”,Key 就是每个词提供的“我有什么信息?”,Value 是“我实际的内容”。
2. 计算注意力分数
以第一个词 (a_1) 为例,它需要知道整个序列中每个词对它的重要性。我们计算 (q_1) 与所有 (k_j) 的点积,就是注意力分数(Attention Score),表示 (a_1) 对 (a_j) 的关注程度。
3. Softmax 归一化
4. 加权求和得到输出
最后,用这些权重去加权求和所有的 Value 向量,得到 (a_1) 对应的输出 (b_1),同理,我们可以计算出 (b_2, b_3, b_4)。
5. 矩阵形式
上面过程可以用矩阵简洁表达:
- (Q = X W_q)
- (K = X W_k)
- (V = X W_v)
- 注意力矩阵:(A = QK^T)
其中 (X) 是输入矩阵(每一行是一个词向量)。
6. 举个栗子
假设输入有四个词 (a_1, a_2, a_3, a_4),计算出的注意力分数经过 Softmax 后可能得到:
- (a_1) 对 (a_1) 的权重 0.1,对 (a_2) 的权重 0.3,对 (a_3) 的权重 0.2,对 (a_4) 的权重 0.4。
这说明 (a_1) 认为 (a_4) 最重要,(a_2) 次之……
然后输出 (b_1 = 0.1 v_1 + 0.3 v_2 + 0.2 v_3 + 0.4 v_4)。
五、多头注意力与位置编码
1. 多头注意力
单一的注意力可能只关注到某一种关系。为了让模型关注不同方面的信息(比如语法、语义、指代等),我们可以使用多头注意力(Multi-Head Attention)。
做法:将 (Q, K, V) 分成多个头(比如8个头),每个头独立计算注意力,最后把所有头的输出拼接起来,再经过一个线性层。
2. 位置编码
Self-Attention 本身不具备位置信息——它把输入当作一个集合,词序被打乱也不影响输出。但在语言中,顺序至关重要。所以我们需要在输入中加入位置编码(Positional Encoding)。
常见做法:使用正弦和余弦函数生成固定位置向量,或者让模型学习位置向量。然后将词嵌入与位置编码相加,作为最终的输入。
六、Transformer 简介
Transformer 是一个基于 Self-Attention 的 Encoder-Decoder 架构,最初用于机器翻译。它的核心就是多头自注意力 + 前馈神经网络 + 残差连接 + 层归一化。
- Encoder:将输入序列编码为连续表示。
- Decoder:根据编码器的输出和已生成的目标词,逐步生成目标序列。
由于我们的重点是 BERT,这里只做简要介绍。
七、BERT:双向编码器表示
BERT(Bidirectional Encoder Representations from Transformers)本质上是一个堆叠了多个 Transformer Encoder 的模型。它的创新在于双向:在预训练时,同时利用上下文的左右两侧信息。
1. BERT的结构
- 输入 = Token Embedding + Segment Embedding + Position Embedding。
- 经过多层 Transformer Encoder 后,输出每个 token 对应的特征向量。
- 可选输出方式:
- 取 [CLS] 位置的向量(适合分类任务)
- 平均池化或最大池化
2. BERT的预训练任务
BERT 的成功很大程度上归功于它的两个预训练任务:
(1)Masked Language Model(MLM)
随机遮盖输入中15%的词,然后让模型预测被遮盖的词。但为了缓和预训练与微调之间的差异,BERT 对那15%的词做了特殊处理:
- 80% 替换为 [MASK]
- 10% 替换为随机词
- 10% 保持不变
这样模型必须根据上下文理解每个词,而不是简单地记忆。
(2)Next Sentence Prediction(NSP)
输入是两句话 A 和 B,让模型判断 B 是不是 A 的下一句(IsNext / NotNext)。这个任务帮助 BERT 理解句子间的关系,对问答、自然语言推理等任务很有帮助。
八、BERT的微调与应用
预训练后的 BERT 可以看作一个强大的特征提取器。我们只需要在它的输出层加上一个简单的分类层,就可以在各种下游任务上进行微调(Fine-tuning),比如:
- 情感分类(取 [CLS] 输出)
- 命名实体识别(每个 token 输出一个标签)
- 问答任务(预测答案的开始和结束位置)
由于 BERT 已经学会了通用的语言知识,微调只需要少量数据就能达到很好的效果。
九、总结与展望
| 模型/概念 | 主要贡献 | 局限性 |
|---|---|---|
| One-hot | 最简单的数值化 | 维度灾难,无语义 |
| Word Embedding | 稠密向量,有语义 | 静态,不能根据上下文变化 |
| RNN/LSTM | 序列建模,有记忆 | 不能并行,长距离依赖弱 |
| Self-Attention | 全局关系建模,可并行 | 无位置信息,需配合位置编码 |
| Transformer | 完全基于注意力,强大特征提取 | 参数量大,需要大量数据 |
| BERT | 双向预训练,迁移学习 | 模型大,推理慢 |
如今,BERT 及其变体(RoBERTa、ALBERT、DistilBERT 等)已经成为 NLP 任务的标配。但随着 GPT 等生成式模型的兴起,NLP 又迎来了新的变革。不过,Self-Attention 和 Transformer 作为基石,依然值得我们深入理解。
希望这篇文章能帮你理清 Self-Attention 到 BERT 的脉络。如果你有任何问题或想法,欢迎在评论区留言讨论!
本文首发于CSDN,作者:~墨-。未经许可,禁止转载。
更多推荐
所有评论(0)