当样本具有空间的局部相关性,卷积神经网络大大减少网络参数量的依靠:局部相关性、权值共享
当样本具有时间的局部相关性:循环神经网络
序列表示方法
- 信号能用标量数值表示
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 网络
由于循环网络容易梯度爆炸,控制在十层以内