1. 从词袋模型到自注意力:序列建模的进化之路
在自然语言处理领域,如何有效表示和处理序列数据一直是个核心挑战。早期最简单的方法是使用one-hot编码,每个词用一个维度等于词汇表大小的向量表示。比如中文约有2万个常用字,那么每个字就需要一个2万维的向量,其中只有对应位置为1,其余全为0。
这种表示方法存在两个明显缺陷:
- 维度灾难:2万维的稀疏向量会占用大量存储和计算资源
- 语义缺失:无法表达词语之间的任何关系,"猫"和"狗"的距离与"猫"和"汽车"的距离相同
为解决第一个问题,我们引入词嵌入(Word Embedding)技术,通过nn.Linear等全连接层将高维one-hot向量映射到低维稠密空间(如768维)。这不仅降低了维度,还能在一定程度上捕捉词语关系——语义相近的词在嵌入空间中距离更近。
但词嵌入仍然无法解决序列建模的关键需求:理解词语在特定上下文中的关系。例如:
- "苹果很好吃"和"苹果发布了新手机"中的"苹果"含义不同
- "我不喜欢这部电影"和"这部电影我不喜欢"表达相同情感但词序不同
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 循环神经网络的局限与突破
2.1 RNN的基本原理
循环神经网络(RNN)是最早用于处理序列数据的神经网络架构。其核心思想是通过隐藏状态h_t传递历史信息:
code复制h_t = f(W·[h_{t-1}, x_t] + b)
其中:
- x_t是当前时刻的输入
- h_{t-1}是上一时刻的隐藏状态
- W和b是可学习参数
- f是非线性激活函数(如tanh)
RNN理论上可以处理任意长度序列,但实际存在梯度消失/爆炸问题,难以学习长距离依赖。
2.2 LSTM的改进
长短期记忆网络(LSTM)通过引入三个门控机制(输入门、遗忘门、输出门)和细胞状态,解决了RNN的长程依赖问题:
code复制遗忘门:f_t = σ(W_f·[h_{t-1},x_t] + b_f)
输入门:i_t = σ(W_i·[h_{t-1},x_t] + b_i)
候选值:C̃_t = tanh(W_C·[h_{t-1},x_t] + b_C)
细胞状态:C_t = f_t*C_{t-1} + i_t*C̃_t
输出门:o_t = σ(W_o·[h_{t-1},x_t] + b_o)
隐藏状态:h_t = o_t*t
