循环神经网络RNN

From @AI

循环神经网络(Recurrent Neural Network, RNN)是一种专门用于处理序列数据的神经网络,能够捕捉数据中的时间依赖关系。与传统的前馈神经网络不同,RNN通过隐藏状态(Hidden State)记忆之前的输入信息,从而实现对序列数据的建模。

核心原理

RNN的核心在于其循环连接机制。每个时间步的输出不仅依赖于当前输入,还依赖于前一时间步的隐藏状态。这种结构使RNN能够处理任意长度的序列数据,例如文本、语音和时间序列。

数学公式描述如下:

  • 隐藏状态更新:hₜ = tanh(Wₕₕ·hₜ₋₁ + Wₓₕ·xₜ + b)

  • 输出计算:yₜ = g(Wₕᵧ·hₜ + c)

其中,tanh和g通常为激活函数(如tanh或softmax)。

优势与局限

RNN的优势在于能够处理变长序列,并捕捉序列中的时间依赖关系。然而,其局限性包括:

  • 梯度消失/爆炸问题:难以学习长序列中的依赖关系。

  • 计算效率低:无法并行处理时间步。

为了解决这些问题,改进的变体如LSTM和GRU被提出。

改进变体

  1. LSTM(长短期记忆网络) LSTM通过引入遗忘门、输入门和输出门,解决了梯度消失问题,能够捕捉长序列中的依赖关系。其核心是记忆单元(Cell State),用于存储长期信息。

  2. GRU(门控循环单元) GRU是LSTM的简化版本,合并了遗忘门和输入门,减少了参数数量,同时保持了良好的性能。

  3. 双向RNN(Bi-RNN) 双向RNN通过同时考虑序列的前向和后向信息,增强了对上下文的理解能力,适用于自然语言处理和语音识别等任务。

应用场景

RNN及其变体广泛应用于以下领域:

  • 自然语言处理:机器翻译、文本生成、命名实体识别。

  • 语音处理:语音识别、语音合成。

  • 时间序列分析:股票预测、气象预报。

  • 视频分析:动作识别、视频生成。

实现示例

以下是一个简单的RNN实现示例:

import numpy as np
class SimpleRNN:
   def __init__(self, input_size, hidden_size):
       self.Wx = np.random.randn(hidden_size, input_size) # 输入权重
       self.Wh = np.random.randn(hidden_size, hidden_size) # 隐藏状态权重
       self.b = np.zeros((hidden_size, 1)) # 偏置项
   def forward(self, x, h_prev):
       h_next = np.tanh(np.dot(self.Wx, x) + np.dot(self.Wh, h_prev) + self.b)
       return h_next

总结

RNN是处理序列数据的强大工具,其变体(如LSTM和GRU)进一步增强了对长序列的建模能力。尽管存在计算效率低和梯度问题,RNN在自然语言处理、语音识别和时间序列分析等领域仍然具有广泛的应用价值。

参考资料:LSTM长短期记忆递归神经网络

常用激活函数/损失函数/代价函数

 

posted @ 2025-10-23 14:22  PKICA  阅读(14)  评论(0)    收藏  举报