当前位置:   article > 正文

深度学习 | Pytorch深度学习实践 (Chapter 12 Basic RNN)

深度学习 | Pytorch深度学习实践 (Chapter 12 Basic RNN)

十二、Basic RNN —— 实际上就是对线性层的复用

         

使用RNN最重要的两点:

  1. 了解序列数据的维度;
  2. 循环过程所用的权重共享机制
    一般就是自己写个循环,权重层重复用就行了;


回顾:----------------------------------------------------------------------------------------------------------------------

        以前是用的神经网络也称为Dense、Deep(稠密层)的网络。

        

        但现在来考虑一下这个情况:

        

        若使用稠密的网络,需要把其拼成有九个维度的向量,

        将日期、温度和湿度拼成一个九维向量是为了让模型能够同时考虑所有三个特征,从而更好地进行预测。如果只使用三维的向量,可能会导致模型无法充分利用所有的特征信息,从而影响预测的准确性。此外,使用多维向量还有助于模型学习不同特征之间的关系,例如日期与温度的关系和日期与湿度的关系等。

        

        全连接层的权重要比卷积神经网络大很多,这是由于卷积神经网络虽然运算复杂但整个图像上的卷积核是共享的。

        但如果序列很长而且维度很高,拼接成高维向量 则权重数量太多到难以处理。

 

        —— 因此,RNN就是专门用来处理带有序列模式的数据,同时也要结合权重共享的思想来减少权重数量;不仅要考虑x1,x2之间的连接关系,还要考虑其时间上的先后序列关系(即x1和x2的数据依赖于x2/3)

        

         除了天气等一系列经典的时间顺序的数据以外,自然语言也是一种有着序列关系的数据;


12.1、RNN Cell

        RNN Cell:xt是指在序列中t时刻相应的数据,它可以把3维向量变为5维的向量。不难看出其本质为一个线性层。

         

         和普通的线性层相比,这里的RNN Cell是可以共享的。将上面的图像展开后就是下面这样:

         

12.1.1、和线性层的区别

在于:

        由于每一项的数据都和前一项相关,所以送进RNN Cell的数据不止其本身的数据,还要有上一项的数据(也就是图中的红色箭头。)

        而对于x1来说也需要一个相应的h0,表示先验知识。比如果要通过图像来生成文本,那么h0就设成一个CNN+Fc,如果没有的话就可以把它设成一个对应维度的0向量)。

        注意,这里所有的RNN Cell是同一个层

        

        若用公式来表示一下这个循环过程:

        


12.1.2、具体计算过程

        xt为输入,input_size为输入维度,hodden_size为隐层维度。

        

  • 这里是矩阵运算,x是一个维度为input_size的列向量也可以说是一个input_size*1的矩阵
  • 先将输入做一次线性变化,将其维度(input_size)转为隐藏层的维度(hidden_size)——Wih是一个hidden_size×input_size的矩阵;
  • 而上一个隐层的输入的权重矩阵就是hidden_size×hidden_size;
  • 然后将他们俩相加就完成了信息融合;
  • 接着要做一次激活,tanh被认为是一个效果较好的激活函数,得到的结果就是ht了;
  • 即 每个时间步的隐层状态 ht​ 是由当前时刻的输入 xt 和上一时刻的隐层状态 ht−1经过非线性变换得到的。

        实际上黄色阴影和红色阴影部分可以写到一起。见上面图上面部分的红色笔迹。

        在构建RNN Cell的时候,实际上的工作就是把x和h拼起来。

        最后的公式即为:

        

       


12.2、RNN

        那什么叫RNN呢?

—— 将RNN Cell以循环的形式把序列一个一个送进去,然后依次算出隐层的过程,就叫做循环神经网络,其中RNN Cell是其中的一个单元。

        在pytorch中有两种构造RNN的方式:

        1、做自己的RNN Cell,自己设计处理逻辑的循环。

        2、直接使用RNN。

12.2.1、RNN Cell in Pytorch

        

  1. #要设定的参数主要是两个:输入维度和隐层的维度
  2. cell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size)
  3. #调用方法
  4. hidden = cell(input, hidden)
  5. # 本质上还是一个线性层。

        使用时注意维度的要求。

        

举例:----------------------------------------------------------------------------------------------------------------------

先假设我们的参数是下面这样的:

推荐阅读
相关标签