理解RNN的结构+特点+计算公式

引入

在某一些情况下,我们是无法使用标准的全连接神经网络的。比如,预测句子中哪几个单词是人名,如果使用标准的全连接神经网络,网络结构如下:

在这里插入图片描述

如果使用这种结构,会存在两个问题

  1. 输入句子长度和输出向量的维度,可能会不一样。对不同的样本,其输入/输出维度都不同。
  • 当然你可以采用zero padding,将每个句子都填充到最大长度,但仍然不是一种很好的方式
  1. 改结构无法共享从文本不同位置上学到的特征
  • 举例来说,比如该网络已经学到了x位置上的单词为人名,但下一次该单词出现在了另一个位置,这种网络就不认识它了
  1. 网络参数很多
  • 如果直接按字典进行单词词向量提取,则每个x,可能都是100000维的向量,这会导致该网络有一个非常庞大的输入层

RNN基本原理

在本例中,输入句子中的单词数Tx,与输出向量维度Ty相等。(若不相等,如下的RNN结构就要做一些改变了)

下图表示一个普通的全连接层神经网络,网络的输入只有一个单词,输出label也是一个类别数。当其读到句子中的第一个单词,就根据这个单词预测一个输出值,如下图所示:

在这里插入图片描述

当读到句子中的第二个单词,就不仅仅是根据第二个单词,来预测第二个输出值了。它会根据第二个单词,以及上一个时间步中的激活函数输出值a<1>,来预测y<2>,如下图所示:

在这里插入图片描述

后面的y预测与之同理,但一般会为y<1>的预测,增加一个输入a<0>,一般a<0>为零向量,或随机数。RNN完整过程如下所示

在这里插入图片描述

对y<3>进行预测时,考虑的x<3>与a<2>。而a<2>考虑了x<2>与a<1>,a<1>又考虑了x<1>。所以y<3>预测其实考虑了x<1>, x<2>, x<3>。这可以推理到一般的情况,预测y时,RNN是根据x<1>到x来进行预测的。

RNN的表示

上一节最后一幅图(第1种表示法),就是RNN的一种常用表示法。出了这种表示,还有另一种(第2种表示法),如下所示:

在这里插入图片描述

该图展开后,就跟我们的第1种表示法是一样的,如下图。Andrew Ng认为,第2种表示法容易让人迷惑,所以他更喜欢第一种表示法。

在这里插入图片描述

第1种表示法,虽然看上去网络结构很大,但其实真实的网络结构只是第2种表示法中那部分。所以第1种表示法中的大部分权重是相同的,如下图所示,红色字体表示权重:

在这里插入图片描述

RNN的缺点/问题

这种传统的RNN,有一个缺点,就是在预测y时,只用了之前的x<1>,x<2>,…,x的信息,而没有参考之后的x<k+1>, …, x的信息。

这会导致预测的结果可能不准确。具体举例来说,比如给定如下两句话,让你判断Teddy是不是人名中的一部分:

  • (1)He said, “Teddy Roosevelt was a great President.”
  • (2)He said, “Teddy bears are on sale.”

句子(1)中的Teddy是人名的一部分;句子(2)中的Teddy是泰迪熊的意思,并不是人名。

如果用RNN来预测Teddy是不是人名,它只会根据这三个单词(He, said, Teddy)来进行预测,而这3个单词是无法预测准确的。

要准确预测,就必须考虑Teddy之后的信息,而传统的RNN并不会考虑之后的信息。(后面会讲到BRNN就能解决这个问题)

RNN的前向计算

所谓Forward Propagation,就是给定RNN的参数(Waa, Wax, Wya)后,计算具体的y值的过程。计算过程与计算公式如下:

在这里插入图片描述

其中g()为激活函数,这个y的计算公式,相对好理解。这个计算公式,还可以被简化为如下表示

在这里插入图片描述

这里用Wa,Wy两个参数矩阵,来简化表示。这种记法的好处是,将两个参数矩阵(Waa, Wax)压缩成一个(Wa)。所以当我们要建立复杂模型时,这就简化了我们要用到的符号。

RNN的优点

本文描述了这样一个RNN模型:输入一个单词,输出一个label。

这种模型的第一个优点,是无论你输入多少个单词,它都能给出相应的输出。这就很好的解决了不定长输入的问题。对RNN模型来说,输入不同字数的句子,它也能很好的匹配输入。

第二个优点,是它可以将先前的信息链接到当前的任务。即上面讲的预测y时,RNN是根据x<1>到x来进行预测的。所以,相同的单词,出现在句子中不同的位置,它都能根据该单词之前的信息,来进行准确的预测。

参考

  • [1] Andrew Ng. deep learning class. sequence model.
  • [2] 本文的符号,及其表示方法,请参考https://blog.csdn.net/ybdesire/article/details/102963683
### RNN 计算公式解析 #### 输入与输出张量形状 输入张量通常具有三维形状 `(seq_len, batch_size, input_size)`,其中 `seq_len` 表示时间步的数量;`batch_size` 是批量大小;而 `input_size` 则指定了每个时间步的特征数量。对于输出张量而言,在单向RNN的情况下,其形状同样为 `(seq_len, batch_size, hidden_size)`,这里 `hidden_size` 描述的是隐藏状态的维度。 #### 隐藏状态更新机制 在每一个时间步 t 上,当前时刻的隐藏状态 \( h_t \) 和上一时刻的状态 \( h_{t-1} \),以及对应的输入 \( x_t \) 一起决定了新的隐藏状态: \[h_t = \text{tanh}(W_{ih} * x_t + b_{ih} + W_{hh} * h_{t-1} + b_{hh})\] 在这个表达式里, - \( W_{ih} \) 和 \( b_{ih} \) 分别是权重矩阵和偏置项,用来处理来自输入的数据; - \( W_{hh} \) 和 \( b_{hh} \) 负责连接前一个时间步的记忆信息到下一个时间步[^1]。 #### 权重初始化策略的重要性 为了确保训练过程稳定有效,合理的权重初始化至关重要。一般情况下,默认采用均匀分布或正态分布在一定范围内随机赋值给这些参数。这一步骤能够帮助梯度更平稳地下降,从而加快收敛速度并提高最终性能表现[^2]。 ```python import torch.nn as nn rnn_layer = nn.RNN(input_size=10, hidden_size=20, num_layers=2) # 初始化权重 for name,param in rnn_layer.named_parameters(): if 'weight' in name: nn.init.xavier_uniform_(param) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值