今天我们要深入探讨一个在人工智能领域,尤其是在处理语音、文本等序列数据时,拥有不可替代地位的强大武器——循环神经网络(Recurrent Neural Networks, RNN)! 这份总结基于斯坦福大学深度学习课程的精华笔记,带你快速掌握 RNN 的核心。

什么是 RNN 循环神经网络
循环神经网络或 RNN 是一种深度神经网络,基于顺序或时间序列数据进行训练,以创建机器学习模型,可以根据序列输入做出序列预测或结论。
RNN 可用于根据过去每日洪水、潮汐和气象数据预测未来每日洪水水位。但是,RNN 也可以用于解决序数或时间问题,例如语言翻译、自然语言处理 (NLP)、情感分析、语音识别和图像字幕。
RNN 的前世今生:为何我们需要它?
传统的神经网络(如全连接网络或CNN)在处理某些问题时表现出色,但它们通常假设输入(甚至输出)之间是相互独立的。然而,现实世界中很多数据是有序列依赖性的,比如:
文本: 一个词的含义依赖于它前面的词。
语音: 当前的音素发音受前后音素影响。
时间序列数据: 股票价格、天气预报等,当前值与历史值密切相关。
为了处理这种“记忆”需求,RNN 应运而生。早在上世纪 80 年代末、90 年代初,就有了 RNN 的早期概念(如 Elman 网络、Hopfield 网络)。它们的核心思想是引入“循环”结构,让网络在处理序列的下一个元素时,能够记住之前处理过的信息。尽管早期 RNN 面临训练困难(尤其是梯度消失问题),但随着后来 LSTM、GRU 等改进结构的提出以及计算能力的增强,RNN 迎来了复兴,并在自然语言处理等领域取得了巨大成功
1. RNN 的基本架构与原理
核心思想: RNN 拥有一种“记忆”能力。在处理序列中的每个元素时,它不仅考虑当前的输入 x(t),还会考虑来自上一个时间步的隐藏状态(或称为激活值)a(t-1)。
信息传递:
当前的隐藏状态 a(t) 由前一个隐藏状态 a(t-1) 和当前输入 x(t) 计算得出:a(t) = g1(Waa * a(t-1) + Wax * x(t) + ba)
当前时间步的输出 y(t>), 由当前隐藏状态 a(t) 计算得出:y(t) = g2(Wya * a(t>)+ by)
这里的 Waa, Wax, Wya, ba, by 是网络的权重和偏置,关键在于它们在所有时间步是共享的,这大大减少了模型参数。g1 和 g2 是激活函数(如 Tanh, Sigmoid, ReLU)。
2. RNN 的不同形态与应用 (Applications of RNNs)
RNN 的结构非常灵活,可以根据输入 (Tx) 和输出 (Ty) 序列的长度变化,适应不同任务:
一对一 (Tx=1, Ty=1): 标准的、没有序列依赖的前馈神经网络。
一对多 (Tx=1, Ty>1): 输入单一信息,生成序列。例如:音乐生成(输入一个种子音符/风格,生成一段旋律)。
多对一 (Tx>1, Ty=1): 输入一个序列,输出单一结果。例如:情感分类(分析一句话的情感倾向)。
多对多 (Tx=Ty): 输入序列,对应输出序列。例如:命名实体识别 (NER)(标注句子中每个词的类型,如人名、地名)。
多对多 (Tx != Ty): 输入序列,输出不同长度的序列。例如:机器翻译(将一种语言的句子翻译成另一种语言)。
3. 应对挑战:长程依赖问题 (Handling long term dependencies)
问题: 传统 RNN 难以捕捉序列中距离较远元素间的依赖关系,这主要是因为梯度消失/爆炸 (Vanishing/Exploding Gradient) 问题。在反向传播(Backpropagation Through Time, BPTT)过程中,梯度会连乘很多次,导致其变得极小(消失)或极大(爆炸)。
解决方案:
梯度裁剪 (Gradient Clipping): 当梯度超过某个阈值时,强制将其缩减,以防止梯度爆炸。
门控机制 (Gated Units): 引入更复杂的单元,如 LSTM (Long Short-Term Memory) 和 GRU (Gated Recurrent Unit)。
核心思想: 通过引入“门”(Gate)结构(本质是使用 Sigmoid 或 Tanh 函数控制信息流)来有选择地让信息通过、遗忘或输出。
激活函数:
激活函数是一种数学函数,应用于网络中每一层神经元的输出,以便引入非线性,并支持网络阐明数据中的复杂模式。如果没有激活函数,RNN 将仅计算输入的转变,因此无法处理非线性问题。非线性对于学习和建模复杂模式至关重要,尤其是在 NLP、时间序列分析和序列数据预测等任务中。
激活函数控制神经元输出的幅度,将值保持在指定范围内(例如,介于 0 和 1 之间或 -1 和 1 之间),这样有助于防止值在向前和向后传递期间增长得过大或过小。在 RNN 中,激活函数在每个时间步长都应用于隐藏状态,控制网络如何根据当前输入和过去的隐藏状态更新其内部记忆(隐藏状态)。
关键门控:
LSTM: 遗忘门 (Forget Gate, Γf)、输入门 (类比 GRU 的 Update Gate, Γu)、输出门 (Output Gate, Γo)。LSTM 还有一个独立的“细胞状态 (Cell State)” c<t> 来存储长期记忆。
GRU: 更新门 (Update Gate, Γu)、相关门 (Relevance Gate, Γr)。GRU 结构比 LSTM 稍简单。
作用: 这些门使得网络能够学习到何时遗忘旧信息、何时吸纳新信息、何时输出信息,从而更好地处理长期依赖。
4. 词语表达:让机器理解语言 (Learning word representation)
背景: 要让 RNN 处理文本,首先需要将词语转换成机器能理解的数值形式。
方法:
1-hot 表示法: 简单直观,但向量维度高、稀疏,且无法体现词语间的相似性。
词嵌入 (Word Embedding): 将每个词映射到一个低维、稠密的向量空间。优点是能捕捉词语间的语义相似性(例如,“国王”和“女王”的向量会比较接近)。
学习方法:
Word2Vec: 基于上下文预测词语(Skip-gram)或基于词语预测上下文(CBOW)。Negative Sampling 是其优化训练效率的技术。
GloVe (Global Vectors): 基于全局词-词共现统计来学习词嵌入。
Embedding Matrix (E): 一个查找表,将 1-hot 向量乘以该矩阵即可得到对应的词嵌入向量 ew = E * ow。
5. 高级话题与技巧
比较词语相似度:
余弦相似度 (Cosine Similarity): 衡量词嵌入向量在方向上的接近程度,常用方法。
t-SNE: 一种降维可视化技术,可以将高维词嵌入投影到 2D/3D 空间,观察词语聚类情况。
语言模型 (Language Model): 目标是估计一个句子的概率 P(y)。
n-gram 模型: 简单的基于计数的方法。
Perplexity (困惑度): 评估语言模型好坏的常用指标,越低越好。
机器翻译 (Machine Translation):
架构: 通常看作是条件语言模型,包含一个编码器 (Encoder) 读取输入句子,和一个解码器 (Decoder) 生成翻译后的句子。
Beam Search: 一种启发式搜索算法,用于在生成翻译时,不仅仅选择每一步最优的词,而是保留 B 个最可能的候选序列,以找到整体更优的翻译结果(B 是 beam width)。
Bleu Score: 评估机器翻译质量的常用指标,衡量机器翻译结果与人工参考翻译在 n-gram 上的重合度,越高越好。
注意力机制 (Attention Model):
动机: 解决长序列输入时,单一固定长度的上下文向量难以包含所有重要信息的问题(信息瓶颈)。
核心思想: 允许解码器在生成每个输出词时,“关注” 输入序列中不同部分的相关性,并给予不同的权重。这样,模型可以动态地聚焦于当前最相关的输入信息。
实现: 计算注意力权重 α(t,t)(表示输出 y(t>)应给予输入 a(t>)多少关注),然后生成加权的上下文向量 c(t)。
应用: 极大地提升了机器翻译、图像描述生成等任务的效果。
关于注意力机制的模型,可以参考上期内容。
其他 RNN 变种:
双向 RNN (Bidirectional RNN, BRNN): 同时考虑过去和未来的信息,对于需要完整上下文的任务(如 NER)很有用。单向 RNN 只能从先前输入中抽取数据,做出有关当前状态的预测;而双向循环神经网络 (BRNN) 还可以拉取未来的数据,从而提高预测的准确性。回到前面“feeling under the weather”的示例,如果基于 BRNN 的模型知道序列中的最后一词是“weather”,它就更有可能预测词组中的第二个词是“under”。
深度 RNN (Deep RNN): 在每个时间步堆叠多个 RNN 层,以学习更复杂的特征表示。
长短期记忆 (LSTM)
LSTM 是一款热门的 RNN 架构,由 Sepp Hochreiter 和 Juergen Schmidhuber 提出,作为梯度消失问题的解决方案。这项工作解决了长期依赖的问题。也就是说,如果影响当前预测的先前状态不是最近的状态,则 RNN 模型可能无法准确预测当前状态。
例如,假设我们想要预测这句话中的斜体单词,“Alice 对坚果过敏。她不能吃花生酱。”坚果过敏的背景可以帮助我们预测不能吃的食物含有坚果。但是,如果这个背景来自再之前的几句话,那么 RNN 将难以甚至不可能连接信息。
为了解决这个问题,LSTM 网络在人工神经网络的隐藏层中设有“单元”,其中有 3 个门:输入门、输出门和遗忘门。这些门控制着预测网络输出所需的信息流。例如,如果第三人称代词(例如“她”)在前面的句子中多次重复出现,则可以将其从单元状态中排除。
门控循环单元 (GRU)
GRU 类似于 LSTM,也可以解决 RNN 模型的短期记忆问题。但是它不使用“元胞状态”调节信息,而是使用隐藏状态;它使用 2 个门(而非 3 个门):一个重置门和一个更新门。类似于 LSTM 中的门,重置门和更新门控制要保留哪些信息以及保留多少信息。
由于其架构更简洁,GRU 计算效率更高,且需要的参数更少。这使得它们的训练速度更快,并且通常更适合某些实时或资源受限的应用程序。
RNN 的优点与缺点
优点 (Advantages):
处理任意长度输入: 不受序列长度限制。
模型大小固定: 模型参数数量不随输入长度增加而增加(权重共享)。
考虑历史信息: 能利用过去的输入来影响当前的决策。
权重共享: 跨时间步共享参数,有效学习序列模式。
缺点 (Drawbacks):
计算相对较慢: 序列处理通常是顺序的,难以完全并行化。
难以访问久远信息: 标准 RNN 对长期依赖的处理能力有限(梯度消失问题,虽然 LSTM/GRU 很大程度缓解了)。
无法考虑未来信息: 标准 RNN 的当前状态只依赖于过去(BRNN 解决了这个问题)。
循环神经网络(RNN)及其变种(LSTM, GRU)是处理序列数据的强大基石。它们通过独特的循环结构和门控机制,实现了对时间信息的记忆和处理。再加上词嵌入、注意力机制等技术的加持,RNN 在自然语言处理、语音识别、时间序列预测等众多领域都扮演着至关重要的角色。
后续:
RNN 在人工智能中的使用有所减少,特别在transformer模型等架构流行之后,但 RNN 并未过时。RNN 传统上在序列数据处理(例如,时间序列和语言建模)中很受欢迎,因为它们能够处理时间依赖性。
然而,RNN 在梯度消失和梯度爆炸问题上的弱点,以及 BERT 和 GPT 等转换器模型的兴起,导致了这种减少。transformer 模型可以更有效地捕获远程依赖关系,更容易并行化,并且在 NLP、语音识别和时间序列预测等任务上性能更优。
尽管如此,RNN 仍在其序列性质和记忆机制发挥作用的特定环境中使用,特别是在较小、资源受限的环境中,或者用于数据处理优点于逐步递归的任务。
笔记:stanford.edu/~shervine/