2021-01-09

RNN笔记

为什么用RNN?

在这里插入图片描述
问题描述1: 要预测天气,需要用到前面几天中每天的若干特征,来预测明天天气,这样就需要用到这个天的多维特征。如果使用普通的稠密网络去预测,就需要把这几天的特征转化为长向量来输入,长向量维度过高的话,造成网络参数过多,计算量太大了。
问题描述2:如果是视频需要使用神经网络来训练的话,那么视频中每一帧当做feature时,长向量会很大,用全连接网络时权重会很大,而无法计算。
原因: 1、RNN能带来其他类型的神经网络更少的权值,大大减少计算量。2、RNN也可以更好的捕捉序列前面和后面的依赖关系,为机器翻译或者其他文本提供更好的相互依赖关系和时间顺序。

What is RNN?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

RNN本质就是线性变换
线性变换可以改变输入向量的维度

理解RNN维度问题

最主要的维度问题是出现在,RNNCell中是因为input和output是one_hot向量,所以在x_data中x_data.shape=(seq_len, batch_size, input_size),这里的input_size只占用一个维度,大部分人困惑在这里吧,因为input_size用的是one_hot向量,所以只需要一维就可以表示该向量。

看看np中对x_data输出和运算的结果,就能更加知道input_size是一维的但是表示one_hot向量,一维就可以了。
在这里插入图片描述
每一次for loop输出一个req_len序列,一个req_len里面有两个样本,每个样本中有四个特征值。而用enumerate可以清晰的知道,输出的是第几个序列。序列是指输入的x1,x2,x3……
在这里插入图片描述
RNNCell代码
在这里插入图片描述
运行结果:

在这里插入图片描述

torch.nn.RNN

使用torch.nn.RNN就可以不用自己写循环了,直接输入所有的序列和初始的隐层值,它会自动的搭建好循环。
在这里插入图片描述
num_layers:表示连接在RNN上面的层数,也就是连在RNN上面还有多少个RNN。RNN上面可以接很多层,可以一层也可以两层,但是层数选多了会非常耗时间。
inputs:整个输入序列(x1, x2, x3,……,xn)
hidden:h0
out:输出h1, h2,……, hN
hidden:指的是hN

RNN反向传播

RNN运行反向传播时,一定要等RNNCell全部运行完,也就是特征x1, x2, x3, ……,xn全部输入完,计算出来了结果,才开始反向传播backward。

embedding 在torch中算一个层torch.nn.Embedding

理论

  • embedding可以使输入的sparse的one-hot vector变得dense vector。
  • 原理是embbedding使用matrix表示,每一列表示不同的Word,每一行表示Word的feature。需要取出特点Word的feature vector时,用embedding matrix multiplication one-hot vector(one-hot vector 就表示你需要获得那个词)。

初始化·

  • https://my.oschina.net/earnp/blog/1113896关于torch.nn.Embedding的讲解
  • orch.nn.Embedding ()中需要初始化的参数就两个num_embeddings和embedding_dim。
    num_embeddings - size of the dictionary of embeddings就是指与one-hot的维度一样。
    embedding_dim - the size of each embeding vector
    torch.nn.Embedding (num_embeddings和embedding_dim)初始化后就构成了一个矩阵。
    注意这里的词向量的建立只是初始的词向量,并没有经过任何修改优化,我们需要建立神经网络通过learning的办法修改word embedding里面的参数使得word embedding每一个词向量能够表示每一个不同的词。

输入参数

  • input : LongTensor of arbitrary shape containing the indices to extract
    注意: self.emb()输入的一定是一个Longtorch
  • Output: (*, embedding_dim), where * is the input shpe

torch.nn.embedding()分析

初始化emb = torch.nn.embedding()构造一个矩阵(参数矩阵),根据数据更新embedding构造出来的参数矩阵,是最终更新出来的参数矩阵被当成embedding Word。每次输入features(x1, x2, x3, ……xn)时,就放入emb()中找到对应的tense tensor,这个tense tensor就代替输入的features。也就是一个sparse tensor变成一个tense tensor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值