用于处理语言、语音、视频等序列数据的模型
古典方法:隐马尔可夫模型(HMM)#
有一串看不见的状态在随时间变化(比如今天是晴天还是雨天),每个状态会产生一个可观测的结果(比如地上是干的还是湿的)。HMM就是用来描述这种”隐藏状态 → 可见观测”的序列模型。
常见使用场景:语音识别(音素是隐藏的,音频是观测的)、词性标注(词性是隐藏的,词语是观测的)
三个核心参数#
- π:初始状态概率,第一天各状态出现的概率
- A:状态转移矩阵,Aij = 从状态i跳到状态j的概率
- B:发射矩阵,Bj(k) = 在状态j下看到观测k的概率
三个经典问题#
- 评估:给定模型参数,某个观测序列出现的概率有多大?→ 前向算法
- 解码:给定观测序列,最可能的隐藏状态序列是什么?→ 维特比算法
- 学习:只有观测序列,怎么估算模型参数?→ Baum-Welch算法
前向算法#
暴力算概率要枚举所有状态路径(NT种组合),前向算法用动态规划把复杂度降到O(N2T)
定义 αt(i) = 到第t步为止看到前半段观测且当前状态为i的概率:
α1(i)=πiBi(o1) αt+1(j)=[i∑αt(i)Aij]Bj(ot+1) 最后把所有αT(i)加起来就是整个观测序列的概率
维特比算法#
跟前向算法类似,但把”求和”换成”取最大值”——每一步只记住最有可能的那条路径
定义 δt(i) = 到第t步为止,以状态i结尾的最优路径的概率:
δ1(i)=πiBi(o1) δt(j)=imax[δt−1(i)Aij]Bj(ot) 结束时取maxiδT(i),再回溯得到完整路径
Baum-Welch算法#
没有标注数据时的参数估计方法,属于EM算法的一种:
- E步:用当前参数算出每个时刻在各个状态的概率(前向-后向算法)
- M步:用这些概率重新估算π,A,B
反复迭代直到收敛
第一代:RNN循环神经网络#
每一时刻的输出不仅依赖于当前的输入,还依赖于前一时刻的输出,具有记忆能力
更新隐藏状态#
ht=tanh(Whhht−1+Wxhxt+bh) 当前时刻的输出#
yt=Softmax(Whyht+by)
- t:当前时刻
- xt:当前时刻的输入
- ht:当前时刻的隐藏状态
- yt:当前时刻的输出
- Whh: 给前一时刻隐藏状态用的权重矩阵
- Wxh: 给当前时刻输入用的权重矩阵
- Why: 给当前时刻输出用的权重矩阵
RNN在推理时每个时刻用的Whh、Wxh、Why都不变
RNN缺点#
- 梯度消失/爆炸:当序列过长时,前面时刻的输入对后面时刻的输出影响很小,导致梯度消失;或者梯度过大,导致梯度爆炸
- 长期依赖问题:RNN只能记住短期的依赖关系,无法记住长期的依赖关系
- BPTT连乘计算量巨大
第二代:LSTM长短期记忆网络#
在RNN的基础上引入了细胞状态和门控机制,细胞状态贯穿整个链条避免隐式状态的衰减问题
门控机制#
每个门由一个Sigmoid层和一个逐元素乘法组成:
- Sigmoid输出0: 完全关闭(遗忘)
- Sigmoid输出1: 完全打开(全部保留)
- Sigmoid输出0~1: 部分打开(部分保留)
遗忘门#
看上一时刻的隐状态ht−1和当前时刻的输入xt,决定保留多少上一时刻的细胞状态Ct−1
ft=σ(Wf⋅[ht−1,xt]+bf) 输入门#
决定当前时刻的新信息哪些值得存入长期记忆
it=σ(Wi⋅[ht−1,xt]+bi) 候选细胞状态#
用tanh生成一个新的候选细胞状态C~t
C~t=tanh(WC⋅[ht−1,xt]+bC) 更新细胞状态#
新的长期记忆 = (遗忘门 x 旧记忆) + (输入门 x 新信息)
Ct=ft∗Ct−1+it∗C~t 输出门#
基于更新后的细胞状态Ct,决定当前时刻的隐状态ht是什么
ot=σ(Wo⋅[ht−1,xt]+bo) 最终的隐状态输出为ht=ot∗tanh(Ct)
- 结构复杂,参数多,训练时间长
- 无法并行计算,训练速度慢
- 还是会失忆
Attention(Q,K,V)=Softmax(dkQKT)V Q,K,V都来自同一个输入
- Q:查询,当前输入词要找什么
- K: 键,当前输入词有什么可以被别的词查询的标签
- V: 值,当前输入词的具体信息
- dk:键的维度,dk是缩放因子,防止点积过大导致Softmax梯度消失