共计 1931 个字符,预计需要花费 5 分钟才能阅读完成。
技术背景:NLP 发展的三个阶段
自然语言处理技术经历了三个主要发展阶段,每个阶段都有其特点和局限性:

- 规则系统时代(1950s-1980s)
- 基于人工编写的语法规则和词典
- 需要大量语言学专家知识
- 无法处理语言歧义和复杂语义
-
典型系统:ELIZA 聊天机器人
-
统计学习时代(1990s-2010s)
- 基于概率模型和统计方法
- 需要大量标注数据
- 难以捕捉长距离依赖关系
-
代表技术:n-gram 语言模型、隐马尔可夫模型
-
神经网络时代(2010s- 至今)
- 基于分布式表示和端到端学习
- 可以自动学习语言特征
- 计算资源需求大
- 代表技术:词嵌入、循环神经网络
里程碑模型解析
ELMo(2018):双向 LSTM 的突破
- 首次提出上下文相关的词表示
- 使用双向 LSTM 捕捉上下文信息
- 解决了传统词嵌入的一词多义问题
GPT(2018):自回归模型的崛起
- 基于 Transformer 解码器架构
- 采用自回归生成方式
- 在多项任务上实现零样本学习
BERT(2018):双向 Transformer 的革命
- 引入 Masked Language Model 预训练目标
- 使用双向 Transformer 编码器
- 通过 Next Sentence Prediction 任务学习句子关系
关键技术对比
| 模型 | 训练目标 | 注意力机制 | 参数规模 | 代表论文 |
|---|---|---|---|---|
| ELMo | 语言模型 | 无 | 94M | NAACL2018 |
| GPT-1 | 语言模型 | 单向 | 117M | arXiv:1801.10198 |
| BERT | MLM+NSP | 双向 | 340M | arXiv:1810.04805 |
现代挑战
- 推理成本高 :大模型推理需要大量计算资源
- 偏见消除难 :训练数据中的偏见难以完全消除
- 知识更新慢 :静态训练无法适应快速变化的知识
- 解释性差 :模型决策过程难以解释
实践建议
选择预训练模型时需要考虑以下指标:
- 计算效率(FLOPS)
- 任务准确率
- 微调成本
- 模型大小
- 推理延迟
Transformer 自注意力实现
import torch
import torch.nn as nn
class SelfAttention(nn.Module):
def __init__(self, embed_size, heads):
super(SelfAttention, self).__init__()
self.embed_size = embed_size
self.heads = heads
self.head_dim = embed_size // heads
# 线性变换矩阵
self.values = nn.Linear(self.head_dim, self.head_dim, bias=False)
self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)
self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)
self.fc_out = nn.Linear(heads * self.head_dim, embed_size)
def forward(self, values, keys, query, mask):
N = query.shape[0] # batch size
value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]
# 分割多头
values = values.reshape(N, value_len, self.heads, self.head_dim)
keys = keys.reshape(N, key_len, self.heads, self.head_dim)
queries = query.reshape(N, query_len, self.heads, self.head_dim)
# 计算注意力分数
energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])
if mask is not None:
energy = energy.masked_fill(mask == 0, float("-1e20"))
# 计算注意力权重
attention = torch.softmax(energy / (self.embed_size ** (1/2)), dim=3)
# 应用注意力权重
out = torch.einsum("nhql,nlhd->nqhd", [attention, values])
out = out.reshape(N, query_len, self.heads * self.head_dim)
# 输出线性变换
out = self.fc_out(out)
return out
开放问题
在多模态趋势下,纯文本大模型的发展边界在哪里?随着视觉、听觉等多模态数据的融合,纯文本模型是否会逐渐被取代?或者它们将在特定领域继续保持优势?这是值得思考的问题。
正文完
发表至: 未分类
近三天内
