循环神经网络(Recurrent Neural Network)

本文是李宏毅教授课程的学习笔记,深入解析循环神经网络(RNN)及其变体,包括LSTM。RNN用于解决序列数据处理,如智慧订票系统,通过记忆单元保留上下文信息。介绍了RNN的基础框架,以及Jordan网络和双向RNN,重点讲解了LSTM的工作机制和优缺点,并展示了实际运算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本博客是针对李宏毅教授在Youtube上上传的课程视频的学习笔记。

课程视频链接

Introduction

假设我们想做一个智慧订票系统,它能根据用户的文本输入获得订票必须的信息。那么对于系统来说,它所需的订票信息可以被视作若干槽(slot),这些槽需要被填充。比如在订票这里,槽包括目的地(destination),和到达时间(time of arrival)。那么订票系统就需要从用户的输入中提取出两个槽对应的信息填入。

picture

那么,这个问题当然是可以用前馈神经网络来解的,只要把每个句子中的词都用一个词向量(word vector)来表示(最简单的方法是如下的1-of-N encoding,也包括Beyond 1-of-N encoding的一些方法),然后扔到NN(神经网络)里,让NN来判断该词是否代表目的地或者到达时间(属于某个槽的概率)。

picture

  • 1-of-N encoding

picture

  • Beyond 1-of-N encoding

为了保证能够顾及到所有的词,我们可以加入一个”other”分量,表示未出现在该向量其它分量中的词;也可以做词散列化(word hashing)。

picture

如下图,但是使用前馈神经网络的问题也很明显:我们会需要系统有记忆能力,即它能判断句子中的地点到底是目的地,还是出发地。 (eg:arrive Taipei on Nov.2nd 和 leave Taipei on Nov.2nd中的Taipei都是地点,但前者是目的地,后者是出发地,要买的票完全不一样)。所以,我们可能会希望我们的系统会记得它在看过“Taipei”之前,有看过”arrive”或”leave”。也即面对相同的输入,能输出相应的不同的结果的能力,于是,循环神经网络(Recurrent Neural Network)登场了。

picture

Framework

RNN会将隐层的输出暂存到一个额外的单元中( a1,a2 ),而这些额外单元会再将储存的值也作为下一次隐层的输入的一部分。

RNN Example

我们用一个简单的RNN例子来说明一下它的效果。

首先给定额外单元初始值0,然后我们的输入序列如下图所示。那么,当我们输入第一个向量[1,1],那么其最终对应的output会是[4,4],而隐层会将它的output[2,2]写入到额外单元。

picture

<
### 卷积递归神经网络 (CRNN) 概念 卷积递归神经网络(Convolutional Recurrent Neural Network, CRNN)是一种混合型深度学习框架,它结合了卷积神经网络(CNN)的空间特征提取能力和递归神经网络(RNN)的时间序列处理能力。这种架构特别适用于既具有空间结构又存在时间依赖性的复杂数据集。 #### 结构特点 CRNN 的典型结构由三部分组成: 1. **前端卷积层** - 使用多层卷积操作来捕捉输入数据中的局部模式和层次化特征[^1]。 2. **中间循环层** - 将经过卷积变换后的特征图作为输入传递给 RNN 或其变体 LSTM/GRU 层,在这里进行序列建模以理解不同时间步之间的关系。 3. **末端全连接层或其他输出模块** - 负责最终的任务决策,比如分类或回归预测。对于某些特定任务还可以采用 CTC (Connectionist Temporal Classification) 或者 Seq2Seq 加 Attention 机制来进行优化[^2]。 ```python import torch.nn as nn class CRNN(nn.Module): def __init__(self, num_classes=10): super(CRNN, self).__init__() # 定义卷积层 self.cnn = nn.Sequential( nn.Conv2d(in_channels=1, out_channels=64, kernel_size=(3, 3), padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=(2, 2)), nn.Conv2d(in_channels=64, out_channels=128, kernel_size=(3, 3), padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=(2, 2)) ) # 定义循环层 self.rnn = nn.LSTM(input_size=128*7*7, hidden_size=512, batch_first=True) # 输出层 self.fc = nn.Linear(512, num_classes) def forward(self, x): cnn_out = self.cnn(x).view(-1, 128 * 7 * 7) rnn_out, _ = self.rnn(cnn_out.unsqueeze(1))[-1] output = self.fc(rnn_out.squeeze()) return output ``` #### 应用场景 - **语音识别**:通过 MFCC 特征表示的心音信号可以通过 CRNN 进行有效分类,其中 CNN 提取音频帧内的频谱特性而 RNN 则负责捕捉跨帧间的动态变化趋势。 - **手写文字识别**:利用图像形式呈现的文字样本能够借助于该模型完成字符级别的转录工作;此时 CNN 主要关注笔画形态学属性,而 RNN 可帮助解析书写顺序逻辑。 - **视频动作检测**:针对连续帧组成的视觉流媒体资料实施行为分析时,先经由 CNN 获取每一时刻的画面信息再交予 RNN 来跟踪随时间演变的动作轨迹[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值