1215 字
6 分钟
[模式识别与机器学习] 深度序列模型

用于处理语言、语音、视频等序列数据的模型

古典方法:隐马尔可夫模型(HMM)#

有一串看不见的状态在随时间变化(比如今天是晴天还是雨天),每个状态会产生一个可观测的结果(比如地上是干的还是湿的)。HMM就是用来描述这种”隐藏状态 → 可见观测”的序列模型。

常见使用场景:语音识别(音素是隐藏的,音频是观测的)、词性标注(词性是隐藏的,词语是观测的)

三个核心参数#

  • π\pi:初始状态概率,第一天各状态出现的概率
  • AA:状态转移矩阵,AijA_{ij} = 从状态ii跳到状态jj的概率
  • BB:发射矩阵,Bj(k)B_j(k) = 在状态jj下看到观测kk的概率

三个经典问题#

  1. 评估:给定模型参数,某个观测序列出现的概率有多大?→ 前向算法
  2. 解码:给定观测序列,最可能的隐藏状态序列是什么?→ 维特比算法
  3. 学习:只有观测序列,怎么估算模型参数?→ Baum-Welch算法

前向算法#

暴力算概率要枚举所有状态路径(NTN^T种组合),前向算法用动态规划把复杂度降到O(N2T)O(N^2T)

定义 αt(i)\alpha_t(i) = 到第tt步为止看到前半段观测且当前状态为ii的概率:

α1(i)=πiBi(o1)\alpha_1(i) = \pi_i B_i(o_1)
αt+1(j)=[iαt(i)Aij]Bj(ot+1)\alpha_{t+1}(j) = \left[ \sum_{i} \alpha_t(i) A_{ij} \right] B_j(o_{t+1})

最后把所有αT(i)\alpha_T(i)加起来就是整个观测序列的概率

维特比算法#

跟前向算法类似,但把”求和”换成”取最大值”——每一步只记住最有可能的那条路径

定义 δt(i)\delta_t(i) = 到第tt步为止,以状态ii结尾的最优路径的概率:

δ1(i)=πiBi(o1)\delta_1(i) = \pi_i B_i(o_1)
δt(j)=maxi[δt1(i)Aij]Bj(ot)\delta_{t}(j) = \max_i \left[ \delta_{t-1}(i) A_{ij} \right] B_j(o_t)

结束时取maxiδT(i)\max_i \delta_T(i),再回溯得到完整路径

Baum-Welch算法#

没有标注数据时的参数估计方法,属于EM算法的一种:

  1. E步:用当前参数算出每个时刻在各个状态的概率(前向-后向算法)
  2. M步:用这些概率重新估算π,A,B\pi, A, B

反复迭代直到收敛

第一代:RNN循环神经网络#

每一时刻的输出不仅依赖于当前的输入,还依赖于前一时刻的输出,具有记忆能力

更新隐藏状态#

ht=tanh(Whhht1+Wxhxt+bh)h_t = \tanh(W_{hh}h_{t-1} + W_{xh}x_t + b_h)

当前时刻的输出#

yt=Softmax(Whyht+by)y_t = \text{Softmax}(W_{hy}h_t + b_y)
  • tt:当前时刻
  • xtx_t:当前时刻的输入
  • hth_t:当前时刻的隐藏状态
  • yty_t:当前时刻的输出
  • WhhW_{hh}: 给前一时刻隐藏状态用的权重矩阵
  • WxhW_{xh}: 给当前时刻输入用的权重矩阵
  • WhyW_{hy}: 给当前时刻输出用的权重矩阵

RNN在推理时每个时刻用的WhhW_{hh}WxhW_{xh}WhyW_{hy}都不变

RNN缺点#

  1. 梯度消失/爆炸:当序列过长时,前面时刻的输入对后面时刻的输出影响很小,导致梯度消失;或者梯度过大,导致梯度爆炸
  2. 长期依赖问题:RNN只能记住短期的依赖关系,无法记住长期的依赖关系
  3. BPTT连乘计算量巨大

第二代:LSTM长短期记忆网络#

在RNN的基础上引入了细胞状态和门控机制,细胞状态贯穿整个链条避免隐式状态的衰减问题

门控机制#

每个门由一个Sigmoid层和一个逐元素乘法组成:

  • Sigmoid输出0: 完全关闭(遗忘)
  • Sigmoid输出1: 完全打开(全部保留)
  • Sigmoid输出0~1: 部分打开(部分保留)

遗忘门#

看上一时刻的隐状态ht1h_{t-1}和当前时刻的输入xtx_t,决定保留多少上一时刻的细胞状态Ct1C_{t-1}

ft=σ(Wf[ht1,xt]+bf)f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)

输入门#

决定当前时刻的新信息哪些值得存入长期记忆

it=σ(Wi[ht1,xt]+bi)i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)

候选细胞状态#

tanh\tanh生成一个新的候选细胞状态C~t\tilde{C}_t

C~t=tanh(WC[ht1,xt]+bC)\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)

更新细胞状态#

新的长期记忆 = (遗忘门 x 旧记忆) + (输入门 x 新信息)

Ct=ftCt1+itC~tC_t = f_t * C_{t-1} + i_t * \tilde{C}_t

输出门#

基于更新后的细胞状态CtC_t,决定当前时刻的隐状态hth_t是什么

ot=σ(Wo[ht1,xt]+bo)o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)

最终的隐状态输出为ht=ottanh(Ct)h_t = o_t * \tanh(C_t)

缺点#

  1. 结构复杂,参数多,训练时间长
  2. 无法并行计算,训练速度慢
  3. 还是会失忆

第三代:Transformer自注意力机制#

Attention(Q,K,V)=Softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V

Q,K,VQ,K,V都来自同一个输入

  • QQ:查询,当前输入词要找什么
  • KK: 键,当前输入词有什么可以被别的词查询的标签
  • VV: 值,当前输入词的具体信息
  • dkd_k:键的维度,dk\sqrt{d_k}是缩放因子,防止点积过大导致Softmax梯度消失
[模式识别与机器学习] 深度序列模型
https://alkaid114.github.io/posts/ml/deep_sequence/
作者
Alkaid114
发布于
2026-06-28
许可协议
CC BY-NC-SA 4.0