NLP基础(RNN,LSTM,GRU)

📅 2026/6/23 7:52:13
NLP基础(RNN,LSTM,GRU)
参考https://www.rethink.fun/RNN 循环神经网络RNN是最早的NLP任务SOTA。核心思想是循环文本数据的一个重要特征是有序性也就是token出现的顺序会影响语义的理解对于这种具有时序的数据经典处理方法都是RNN。经典的时序任务有NLP语音识别时序预测比如股票视频理解RNN的关键是会在隐藏层传递记忆单看隐藏层的话是一个循环的过程这也是循环神经网络名字的由来。为了处理下游任务在隐藏层基础上加任务层比如分类任务就加个线性层分类。如图所示这是一个NER实体识别任务也就是对每个token要把他归类为某一类实体一个token进入RNN后的过程是经过嵌入层映射为词向量经过隐藏层输出为RNN最关键的内容隐藏层状态也可以称为记忆记忆一方面接入下游的线性分类层输出NER结果记忆同时还和下一个token的词向量拼接作为下一步的RNN输入这样下一次就不仅有当时的token还能看到前一步的记忆可以理解上下文。详细公式则为httanh([ht−1∣xt]whbh)h_ttanh([h_{t-1}|x_t]w_hb_h)ht​tanh([ht−1​∣xt​]wh​bh​)ytsoftmax(htwyby)y_tsoftmax(h_tw_yb_y)yt​softmax(ht​wy​by​)其中hth_tht​是ttt时刻的隐藏层输出wh,bhw_h,b_hwh​,bh​是隐藏层的参数xtx_txt​是输入yty_tyt​是输出wy,byw_y,b_ywy​,by​是任务层的参数RNN的应用RNN实际上能解决我们前一节讲的所有NLP任务这也是RNN及其变种在很长时间内是NLP SOTA的原因多对一任务输入一个文本序列只输出一个值比如文本分类文本回归。在最后一个token再加上任务层或者只允许最后一个token的输出有效即可一对多输入一个文本类型直接输出一整段文本。这是文本生成任务只有第一次的输入是真实输入后面每一次的输入都是隐藏层模型生成的上一个token多对多如果输入输出长度一致类似前面的NER任务每一步的输入都是前一步记忆当前输入如果长度不一致比如翻译摘要问题。则引入一个重要的思想编码器-解码器架构先用多次循环读入全部输入这被称为编码阶段这个阶段没有输出再把编码阶段的记忆传递下去每一步都输出一个token然后新的输入为上一步的记忆上一步的输出token。这样能实现变长输出的同时还参考了输入的记忆。RNN的缺点和LSTM序列长时前面的token信息被压缩了很多次加上隐状态本身维度不大跟token大小是一个数量级的一般也就512,256不足以保存全部信息于是长文本时对前面的信息记忆会逐渐下降。这个问题的本质是隐状态是短期记忆越远的信息保存的越少越近的信息保存的越多。那么为了记住远处信息一个解决方法就是再设置一个长期记忆。这就是LSTM(Long Short-Term Memory)名字的由来既有短期记忆也有长期记忆。具体架构如下图对每一轮的输入xtx_txt​做线性层和激活。同时输入也传入一个输入门经过线性层和sigmoid激活得到一个激活向量和输入相乘相当于对这一轮的输入选择性接受输入用类似的方式再产生一个遗忘向量和旧的长期记忆ct−1c_{t-1}ct−1​相乘相当于把旧的长期记忆遗忘一部分。再加上这一轮选择性接受的输入信息作为新的长期记忆ctc_tct​输入再产生一个输出向量输出向量和长期记忆乘起来得到这一轮的短期记忆也就是隐状态输出hth_tht​hth_tht​可以直接传到下一轮也可以接上任务层做这一轮的输出ctc_tct​直接传到下一轮这里的W−h,Wi,Wf,WoW-h,W_i,W_f,W_oW−h,Wi​,Wf​,Wo​都是可训练的矩阵把多个这样的网络拼起来就是处理一个序列的LSTM结构如下图。这样的优点是长期记忆实际上没有经过任何线性层和激活层类似resnet的残差链连接更容易把长期记忆传递下去。这个网络略复杂但确实是transformer之前最好的NLP模型可见注意力机制诞生之前为了让模型保持长期记忆有多困难GRULSTM效果虽然好但是网络太复杂推理慢GRU是一个基于LSTM思想但是实现更简单的RNN变体。GRU推理更快效果接近LSTM网络如下去掉了长期记忆ctc_tct​但是对短期记忆hth_tht​增加了LSTM中的更新门和重置门类似于遗忘门。这里的思想是既然短期记忆的容量有限与其在循环中被动压缩不如用可训练的Wr,WuW_r,W_uWr​,Wu​模块来决定每一轮遗忘什么记住什么学习什么双向RNN(BiRNN)前面的RNN很容易发现一个问题推理都是从前往后读的也就是生成第i个token的隐状态时只能看到前i个token但现实文本很容易出现的情况是一个词的含义不仅要看上文还要看下文比如“我喜欢苹果味的汽水。”“我喜欢苹果手机。”这里苹果的含义需要看下文的被修饰词是什么才能确定。但RNN本身必须是单向的像同时看到上下文只能用一个正序RNN一个逆序RNN来实现如下图两个RNN看到前iii个的正向RNN和看到后n−i1n-i1n−i1个逆向RNN的隐状态拼接就是看到全文时第i个token的隐状态。深度RNN提高模型性能的一个无脑办法就是堆参数于是一个优化是增加多层RNN如下图把第一个隐藏层的隐状态作为第二个隐藏层的输入。这样的优点是增加了模型的抽象能力可以类比生产一个工艺品时增加工序可以实现更精细的加工只有一个工序的话这个工序做的再好也是有上限的。当然普通的线性层也是可以增加的