RNN:有梯度消失,没有办法长时间记忆。
神经网络是用来特征提取
CNN因为后边加了一层全连接,才可以去做分类。
RNN和CNN
RNN:处理序列化数据(一句话,一段语音,一段视频)连续型的,具有记忆性,但是没有办法长期记忆,反向可能会导致梯度消失(梯度消失的原因是反向推到参数可能极小接近0)
CNN:第一张图片和第二张图片没有关系,一张张图片处理,所以不适合用来处理序列化数据(文本之类的)
BPTT:RNN的反向传播,通过时间步进行反向传播
RNN优点:可以处理序列化数据,使神经网络具有记忆功能
RNN缺点:如果序列太长可能会导致梯度消失或梯度爆炸,这个原因也使RNN不具备长期记忆功能
x:输入;h:隐藏层;o:输出
u包含了很多小w(第一层)。v包含了很多小w(第二层)。 w:权重
output 【-1】 多对一 (一个输出有用) 文本分类、情感分析
output 所有的 多对多 (多个输出都有用) 机器翻译
一对多 所有的 一对多
#循环神经网络梯度消失原因:
###因为层数太深,后边的代价调整不到前边的信息,产生梯度消失,导致不能长期记忆
RNN链式求导:提了两个
包含累乘的激活函数。
tanh求导:(0-1)
RNN输入数据维度:(batch_size,seq_legth,hidden_size)批量大小,句子长度,多少维度的向量
nn.dynamic_rnn 动态RNN 循环调用神经单元。(单元,数据,)
major_time=TRUE 会将batch_size和seq_legth调换位置,但是还是三维。
补全0后,参与运算了,权重调整了,不合理。
动态RNN,参数:seq_length:设置好(句子长短不一,需要处理一下,不让填0的加入运算) 效果:补全的0,不参与运算
全连接就是一层神经网络
seq2seq:(三步)
①经过一个softmax。一个预测数据3维(0,1,2),真实数据是2维(0,1);
②求交叉熵
③求均值
weights=tf.sequence_mask(lengths=[batch_size],dtype=tf.float32)
sequence_loss=tf.contrib.seq2seq.sequence_loss(logits=outputs,targets=y,weights=weights)
有的地方不应该产生代价,
一个列表,每个句子的长度,
LSTM(遗忘门,输入门,输出门):引入了一个门和细胞状态c
门,sigmoid激活函数:0-1,判断上一个时间步带的信息是否有用。
c,把有用的信息储存到c中
遗忘门作用对象:细胞状态c。(判断c里边的信息是否需要忘记)
遗忘门:遗忘过去的信息。
输入门:判断当前的输入有多少需要更新到细胞状态c中
遗忘门和输入门h和x拼接后 为什么sigmoid激活后,值不一样?
原因:权重不一样
tanh:提取所有的总特征(等同于一个标准RNN网络)* sigmoid
现在的c:过去有用的,和现在
输出门:
c里的东西有用,但不一定对下一个ht(输出)有用,故:
再加一个sigmoid,判断c里的信息是否对下一个ht有用,做进一步筛选。
LSTM:
线性变换,不会累乘零点几,故不容易梯度消失。.
GRU(重置门,更新门)
处理序列化数据的门,lstm的一种变种。
两个门
重置门:
作用对象:上一个h状态
作用:哪些信息需要记住,哪些需要忘记。
更新门:
作用对象:当前的ht,上一时刻作用ht-1
GRU的激活信息ht-1(新的)和xt,比LSTM的激活信息ht-1(有用的+没用的所有信息)都和xt拼接。
第一个sigmo作用:新的ht-1和xt进行拼接。
第二个sigmoid 两个作用:判断过去ht-1和当前ht的信息是否有用(判断两个,因为作用对象是2个)。
难点:1- sigmoid 取极端例子,全部都有用,走右边;之前全部都没用,走上边。
wr和wz的权重经过训练,最开始是随机的,但是权重会慢慢变。
因为去掉了细胞状态c,所以new_ht-1的状态又重新和xt进行了拼接,这一步代替了细胞状态c作用。
LSTM,GRU的区别
- LSTM有三个门,而GRU有两个门
- 去掉了细胞单元C
- 输出的时候取消了二阶的非线性函数
LSTM有三个门,GRU只有两个门,减少了一个tanh函数,从而减少参数,减少运算量