循环神经网络RNN
1.循环神经网络RNN
1.1.序列模型
1.1.1 应用
语音识别 情感分类 机器翻译
1.1.2为什么不能用CNN?效果不好
· 序列之间的关联性
· 输入输出长度不固定
1.2.循环(递归)神经网络
1.2.1 类型
一对一:固定输入到输出 如图像分类
一对多:固定输入到序列输出 如图像的文字描述
多对一:序列输入到固定输出 如情感分析
多对多:序列输入到序列输出 如机器翻译,也称为编解码网络
同步多对多:同步序列输入到同步输出 如文本生成 每帧视频的分类 序列生成
1.2.2 基础循环网络
xt:表示每一个时刻的输入
ot:表示每一个时刻的输出
st:表示每一个隐层的输出
中间⭕️是cell细胞 一个单元
所有细胞单元的参数U、V、W共享 同一层的RNN单元参数相同,即参数共享
每个细胞有
两个输入:前一个的隐藏层状态 和 当前序列的输入
两个输出:当前细胞的隐藏层状态 和 当前预测的输出
通用公式表达:
s0 = 0
st = g1(Ux t + Ws t-1 + ba)
st = g2(Vs t + by)
g1一般用tanh/relu
g2一般用sigmoid、softmax
(sigmoid用于二分类、softmax用于多类)
展开后发现输出收到前面时刻隐藏层状态影响 st-1,st-2…
1.2.3 例子
1.2.4 词的表示
将词向量化表示 one-hot编码表示
建立一个词典 所有词的词库 包含开始和结束标志、未出现的词 唯一的编号
任意一个词 N维的one-hot编码 N是词典中词的个数
高维 稀疏
###1.2.4 输出的表示-softmax
每一个时刻的输出是所有词的概率组成的向量 M个词 长度为M
使用softmax来计算概率
1.2.5 矩阵运算表示
1. st=relu(Uxt+Wst-1)
假设m个词
n为输出 隐藏层状态s 的维度
[n,m]x[m,1] +[n,n]x[n,1]=[n,1]
矩阵U是n x m, 矩阵W是 n x n
2. ot=softmax(Vst)
[m,n]x[n,1] =[m,1]
矩阵V是 m x n
n是可以手动设置的 隐藏层状态 s 的维度 cell的输出
m取决于词的个数
1.2.6 交叉熵损失
总损失定义
一整个序列(一个句子)作为一个训练实例,
总误差就是各个时刻词的误差之和。
1.2.7 时序反向传播算法 BPTT 重要!
RNN有时间概念
梯度沿时间通道传播的BP算法——BPTT
目标是优化——
计算误差关于参数U、V和W以及两个偏置bx和by的梯度,
使用梯度下降法学习出最好的参数
由于参数共享,需要将每一个训练实例在每一个时刻的梯度相加
1.每个时间的梯度都计算 t=0,t=1…t=m时刻 然后dw相加 作为每次W更新的梯度值
2.求不同参数的导数 区分最后一个cell和前面的celll的区别 s的梯度值 ds
从最后一个细胞(最后一个时刻):
计算 最后一个时刻 交叉熵损失对于s_t的梯度,
记忆交叉熵损失对于s^t,V,by的导数
前面的cell:
1:求出前层损失对于当前层隐藏层状态s^t的梯度+上一层相对于s^t的损失 计算dst
2:计算激活函数tanh的导数
3:计算Uxt+Wst-1+ba对于不同参数U、W、ba的导数
利用链式法则 用st求U、W、ba、x_t、s_t-1的梯度
链式法则
1.2.8 梯度消失与梯度爆炸
由于RNN当中也存在链式求导法则 序列的长度位置 反向传播连续相乘
梯度消失:矩阵中有非常小的值,连续相乘,指数式收缩,较远的时刻趋近于0 然后消失
梯度爆炸:矩阵的值非常大
1.3 RNN总结
1.前向传播
两个输入:x_t和s_t-1的输入
两个分别和矩阵U、W相乘 相加 再加偏置
经过激活函数tanh
➡️ 就可以得到隐藏层状态s^t 传递到下一层
➡️ s^t进而得到输出结果 o^t=softmax(Vs^t+by)
2.反向传播
从后往前 先求s^t 再求U、W、b...
1.4 代码
分为四部分 1个cell的前向 所以序列前向 1个cell的反向 所有序列反向