RNN循环神经网络基础

当样本具有空间的局部相关性,卷积神经网络大大减少网络参数量的依靠:局部相关性、权值共享
当样本具有时间的局部相关性:循环神经网络

序列表示方法

  • 信号能用标量数值表示
    shape 为[b,s] (b:样本数,s:样本长度)
  • 信号不能简单的标量表示
    shape 为[𝑏,𝑠,𝑓] (f:某一个时间戳上的特征)
    Word embedding:one-hot 的编码方式实现

但是 one-hot 编码的向量是高维度而且极其稀疏,大量的位置为 0,计算效率较低
最严重的是:它忽略了单词先天具有的 语义相关性
所以一般使用单词向量

网络结构

在这里插入图片描述

网络层接受当前时间戳的输入𝒙t和上一个时间戳的网络状态向量 t−1, h𝑡 = 𝑓𝜃( h𝑡−1,𝒙𝑡)

在这里插入图片描述

每个特征向量𝒙t,并刷新内部 状态向量 𝑡,同时形成输出𝒐t
做基本的循环神经网络:
在这里插入图片描述

激活函数更多地采用 tanh 函数,并且可以选择不使用偏执 bias 来进一步减少参数量。状态向量 𝑡可以直接用作输出,即𝒐𝑡 = 𝑡,也可 以对 𝑡做一个线性变换𝒐𝑡 = 𝑜 𝑡得到每个时间戳上的网络输出𝒐𝑡

梯度传播

首先明确RNN层有三个参数:
在这里插入图片描述

举例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SimpleRNNCell

# 初始化状态向量 
h0 = [tf.zeros([4, 64])]             # [样本数,cell状态长度]
x = tf.random.normal([4, 80, 100])   # [样本数,序列长度,样本状态长度]
xt = x[:,0,:]                        # 

cell = layers.SimpleRNNCell(64)      # 新建一个 SimpleRNNCell,不需要指定序列长度s
out, h1 = cell(xt, h0)               # 前向计算 

上面只计算了一步

h = h0 
# 在序列长度的维度解开输入,得到 xt:[b,f] 
for xt in tf.unstack(x, axis=1): 
    out, h = cell(xt, h)     # 前向计算 
    
# 最终输出可以聚合每个时间戳上的输出,也可以只取最后时间戳的输出 
out = out 

多层 SimpleRNNCell 网络

由于循环网络容易梯度爆炸,控制在十层以内

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值