GLM(General Language Model)试图用一个通用框架同时抓住语言的结构和语义,背后的想法是把概率图模型和深度网络揉到一起。这种组合让它既能显式建模词语间的依赖关系,又能利用神经网络的表达能力,在文本生成、翻译、问答等任务里站住脚。
核心思路:概率图遇上深度学习
GLM 的关键是把语言看成一组随机变量的集合,用概率图来刻画这些变量(比如词、短语、句子成分)之间的关联。实际实现时,图的结构由注意力机制来学习,参数则由深度网络拟合。三个核心组件通常是这样配合的:
- 概率图模型:提供结构化的先验,比如用条件随机场建模词序列,或贝叶斯网络捕捉语义关系。
- 语言模型:负责输出每个位置上词的概率分布,本质是一个条件概率估计器。
- 深度神经网络:承担特征提取和参数学习,让模型能从数据里自动找到有用的依赖模式。
下面这张图概括了 GLM 的前向流程:
graph LR A[输入文本] --> B{词嵌入层} B --> C{注意力层} C --> D{解码层} D --> E[输出文本]
算法拆解:不是黑盒
前向步骤
- 词嵌入:把输入文本中的每个词映射成固定维度的向量,这一步通常会结合位置编码,让模型知道词的顺序。
- 注意力计算:计算词与词之间的权重,模型据此决定当前要更关注上下文里的哪些部分。这是捕获长距离依赖的关键——比传统 n-gram 可靠得多。
- 解码生成:解码器(可以是 LSTM,也可以是 Transformer 结构)根据编码后的表示,逐步输出下一个词的概率。
- 训练目标:用交叉熵损失衡量预测分布和真实分布的差距,然后通过反向传播更新所有参数。目标函数本质上是最大化训练语料的似然:
$$ \mathcal{L} = \log P(w_1, w_2, ..., w_T) $$
其中序列概率可分解为条件概率的乘积:
$$ P(w_1, w_2, ..., w_T) = \prod_{t=1}^{T} P(w_t | w_{1:t-1}) $$
举个例子,对句子 "the cat sat on the mat",模型会学到类似下面的条件概率(数值只是示意):
- $P(\text{the} | \emptyset) = 0.2$
- $P(\text{cat} | \text{the}) = 0.5$
- $P(\text{sat} | \text{the cat}) = 0.3$
- $P(\text{on} | \text{the cat sat}) = 0.4$
- $P(\text{the} | \text{the cat sat on}) = 0.1$
- $P(\text{mat} | \text{the cat sat on the}) = 0.6$
优点与陷阱
- 长处:长距离依赖抓得准,语义表示也很强,在很多任务上比传统统计模型提升明显。
- 短板:训练代价不小,对数据质量和数量都很敏感,而且模型内部到底是怎么做的决策,解释起来依然费劲。
实际选型时,如果手头有高质量语料和充足算力,GLM 这类结构往往能带来不错的回报;但如果资源紧张,可能就得在模型规模和效果之间做取舍了。
代码上手:用 PyTorch 搭一个最小原型
开发环境:Python 3.6+ 和 PyTorch 1.0+,如果有 GPU 可以装 CUDA 10.0+。
下面是一个极简的 GLM 实现,核心就是嵌入层 → LSTM → 全连接输出:
import torch
import torch.nn as nn
class GLM(nn.Module):
def ():
(GLM, ).__init__()
.embedding = nn.Embedding(vocab_size, embedding_dim)
.lstm = nn.LSTM(embedding_dim, hidden_dim)
.fc = nn.Linear(hidden_dim, vocab_size)
():
x = .embedding(x)
x, _ = .lstm(x)
x = .fc(x[:, -, :])
x

