一文读懂:RNN及其输入,输出,时间步,隐藏节点数,层数

循环神经网络(Recurrent Neural Network, RNN)是一种能够处理序列数据的神经网络,能够对输入的序列数据进行建模处理。与传统的前馈神经网络不同的是:RNN在网络中引入时间的概念,通过当前的输入和前一个时刻的状态联合完成输出,这种特殊的结构使得其在处理语音、文本、视频等序列信息时表现卓越。

RNN的原理

RNN 的特殊结构被设计用来“记忆”之前的信息,因此被广泛应用于顺序性的数据分析和处理。

在一般实现中,RNN通常会先将序列分成多个时间步,如下图:

这里,w代表权重、x代表输入数据、h代表隐藏层的状态、y代表输出数据。在当前时间步t,输入数据x(t)和上一个时间步t-1的隐藏状态h(t-1)一起作为输入传入到RNN网络中,计算当前时间步内部的计算,并得到当前时间步的输出`y(t)`和更新后的隐藏状态`h(t)`,这些信息会被存入记忆体。

上图所示,RNN 利用当前时间步的输入值X(t)和上一个时间步的状态值H(t-1),计算出当前时间步的状态值H(t),并输出此时的预测结果。此时的状态值H(t)作为下一个时间步的状态值H(t+1)的输入。

RNN的这种状态值被称为隐藏状态,H(t) 可以被表示为:

H(t) = f(WX(t) + UH(t-1) + b)  

其中,是激活函数,W 是从输入层到隐藏层的权重参数,U 是从隐藏层到隐藏层的权重参数,b是偏置参数。可以看出,当前时间步的状态值 H(t)不仅仅依赖于当前时间步的输入值 X(t),还依赖于上一个时间步的状态值 H(t-1),因此可以记忆之前的信息。

虽然这种网络结构的理论很好,但实际上,当序列长度很长时,解决起来却又非常困难。这是由于长序列中的梯度计算存在梯度消失梯度爆炸两个问题。

为了解决这些问题,研究人员在 RNN 的基础上,提出了 GRULSTM 等变种。这些变种网络通过引入许多更新门来实现对信息的选择,从而使其在处理长序列时表现更好。本文为了方便,我们以RNN作为代表来进行介绍。

RNN的应用

RNN在语音识别、自然语言处理、机器翻译、图像识别、预测等领域均有广泛应用。

语音识别

语音信号是一种具有时间序列的信号,离散语音表示为一个包含多个时间窗口的帧,每个帧是由一组语音信号组成,因此语音信号具有明显的顺序性。

RNN可以处理输入的顺序性信息,因此可以用于语音识别。以语音识别为例,RNN网络通过接受音频信号的每一帧作为输入,在隐藏层中联合处理前面的帧,以分解出句子的声学表示形式。这个声学表示可以被转换成标记,形成句子的文本表示。

自然语言处理(NLP)

NLP是对人类语言进行计算机处理的领域,在自然语言处理中,RNN 最常用于进行情感分类、语义标注、问答等等。在自然语言处理中,一个句子中的每个单词都表达了不同的信息,因此需要使用 RNN 对该句子中的所有单词进行编码。

RNN可以根据先前输入的上下文生成新的表达,从而生成一个句子。例如,假设我们有一个输入句子“Hello, how are you?”,我们可以用一个 RNN 模型来预测下一个可能的单词,如“Fine”、“Thanks”,从而实现对输入句子的自然补全。

图像描述生成

图像描述生成是为给定的图像生成相关的自然语言描述的任务,RNN也可以应用于图像描述生成。首先,将图像作为输入送到卷积神经网络(CNN)进行处理,从而得到图像的特征向量表示。然后,将特征向量经过全连接层映射到隐藏状态,再将隐藏状态作为起点,产生描述结构。

RNN的函数调用方法

在机器学习任务中,RNN可以通过深度学习库方便快捷地调用。以PyTorch为例,使用RNN可以进行序列标注、预测等操作。

在使用PyTorch的RNN函数调用时,需要创建一个nn.RNN对象以及定义输入数据和初始状态,其中输入数据是一个三维张量,第一维代表每个时间步的数据,第二维代表整个序列的样本数,第三维代表每个时间步的特征数。初始状态也是一个张量,表示模型接收输入数据时的初始状态,通常我们会将其初始化为全零张量。下面是一个使用PyTorch调用RNN模型的示例代码:


        import torch.nn as nn
        import torch

# 创建输入数据,共5个样本,每个样本都有句子5个单词的长度,每个单词以3个特征向量表示
        x = torch.randn(5, 5, 3)

# 创建rnn模型,共有2层,每层有一个隐藏层
        rnn = nn.RNN(input_size=3, hidden_size=1, num_layers=2)

# 初始化隐藏状态
        hidden_0 = torch.zeros(2, 5, 1)

# 使用rnn模型进行前向传播
        output, hidden_n = rnn(x, hidden_0)

# output是所有时间步骤的输出,hidden_n是最后一个时间步的隐藏状态
        print("Output shape:", output.shape)
        print("Hidden state shape:", hidden_n.shape)
 

在上面的代码中,我们创建了一个RNN模型对象rn,其输入的特征数为3隐藏层维度为1两层RNN网络。然后,使用全零张量初始化初始状态。

接下来,使用使用rnn()函数进行前向传播,输出结果是所有时间步的输出以及最后一个时间步的隐藏状态。

总结

循环神经网络(RNN)是可以处理序列数据的神经网络,它在处理语音、文本、视频等序列信息时表现卓越,可以通过前一个时刻的输出状态和当前的输入状态计算出当前的输出状态,从而实现对序列数据信息的存储和处理。通过 PyTorch等深度学习库,我们可以方便快捷地定义和运行RNN模型,实现对序列数据的处理和分析。

猜你喜欢

转载自blog.csdn.net/fantastick99/article/details/130130801
今日推荐