深度学习14(循环神经网络)
目录
循环神经网络背景--序列模型
循环神经网络结构
序列生成案例
词的表示(one-hot)
输出表示(softmax)
矩阵运算表示
交叉熵损失计算
时序反向传播算法(BPTT)
梯度消失与梯度爆炸
循环神经网络背景--序列模型
通常在自然语言、音频、视频以及其它序列数据的模型。催生了自然语言理解、语音识别、音乐合成、聊天机器人、机器翻译等领域的诸多应用。常见的场合有:
语音识别,输入一段语音输出对应的文字。
情感分类,输入一段表示用户情感的文字,输出情感类别或者评分。
机器翻译,两种语言的互相翻译。
循环神经网络结构
循环(递归)神经网络(RNN)是神经网络的一种。RNN将状态在自身网络中循环传递,可以接受时间序列结构输入。常分为以下结构:
一对一:固定的输入到输出,如图像分类
一对多:固定的输入到序列输出,如图像的文字描述
多对一:序列输入到输出,如情感分析,分类正面负面情绪
多对多:序列输入到序列的输出,如机器翻译,称之为编解码网络
同步多对多:同步序列输入到同步输出,如文本生成,视频每一帧分类,也称之为序列生成
而放在神经网络中,其基础结构为
xt:表示每一个时刻的输入
ot:表示每一个时刻的输出
st:表示每一个隐层的输出
中间的小圆圈代表隐藏层的一个unit(单元)
所有单元的参数共享
其通用公式为:
g1,g2:表示激活函数,通常g1:tanh/relu,g2:sigmoid、softmax其中如果将公式展开:
可以看到,循环神经网络的输出值ot,是受前面历次输入值xt-1,xt,xt+1影响。
序列生成案例
通常对于整个序列给一个开始和结束标志,start,end标志。
例如:s(start),我 ,昨天 ,上学 ,迟到 了 ,e(end)
输入到网络当中的是一个个的分词结果,每一个词的输入是一个时刻。
它的效果可以理解为类似于输入法的联想功能,训练完成后,当输入“我”,该模型输出为“昨天”;当输入“上学”,该模型输出为“迟到”。
但是,对于电脑来说,不能理解我们的日常语言,需要将我们的输入(中英文等等)转化为向量表示。
1、建立一个包含所有序列词的词典包含(开始和标志的两个特殊词,以及没有出现过的词用等),每个词在词典里面有一个唯一的编号。
2、任意一个词都可以用一个N维的one-hot向量来表示。其中,N是词典中包含的词的个数。
词的表示(one-hot)
One-Hot 编码(独热编码)是一种将分类变量转换为数值形式的常用方法,特别适用于机器学习算法中处理类别型数据。One-Hot 编码将一个具有 N 个不同类别的特征转换为 N 个二进制特征,每个特征对应一个类别。对于每个样本,只有一个特征为 1("热"),其余都为 0。
特点:
1、消除数值大小带来的偏见:如果不使用 One-Hot 而直接用 1,2,3 表示不同类别,算法可能会误认为数值大小有意义。
2、适用于大多数机器学习算法:特别是那些期望输入是数值型的算法。
3、处理无序类别数据:当类别间没有自然顺序时特别有用。
输出表示(softmax)
RNN这种模型,每一个时刻的输出是下一个最可能的词,可以用概率表示,总长度为词的总数长度。
矩阵运算表示
1、形状表示:[n, m]x [m, 1] +[n, n] x[n,1]= [n, 1]
则矩阵U的维度是nxm,矩阵W的维度是nxn
m:词的个数,n:为输出s的维度
注:此步骤可以简化:[u,w]x[]=[n,n+m]x[n +m,1]=[n,1]
2、形状表示:[m, n]x [n,1]= [m,1]
矩阵V维度:[m,n]
总结:其中的n是可以人为去进行设置。
交叉熵损失计算
总损失定义:一整个序列(一个句子)作为一个训练实例,总误差就是各个时刻词的误差之和。
在这案例中,yt是时刻t上正确的词,必是预测出来的词
时序反向传播算法(BPTT)
对于RNN来说有一个时问概念,需要把梯度沿时问通道传播的 BP 算法,所以称为Back PropagationThrough Time-BPTT。
我们的目标是计算误差关于参数U、V和W以及两个偏置bx,by的梯度,然后使用梯度下降法学习出好的参数。由于这三组参数是共享的,我们需要将一个训练实例在每时刻的梯度相加。
要求:每个时间的梯度都计算出来t=0,t=1,t=2,t=3,t=4,然后加起来的梯度,为每次W更新的梯度值。
求梯度需要分为两种情况:
最后一个celt:
计算最后一个时刻交叉熵损失对于s_t的梯度,记忆交叉损失对于s^t,V,by的导数
按照图中顺序计算
除最后一个的celt:
第一步:求出当前层损失对于当前隐层状态输出值的梯度+上一层相对于st的损失
第二步:计算tanh激活函数的导数
第三步:计算的对于不同参数的导数,主要运用链式法则。
梯度消失与梯度爆炸
由于RNN当中也存在链式求导规则,并且其中序列的长度位置。所以:
如果矩阵中有非常小的值,并且经过矩阵相乘N次之后,梯度值快速的以指数形式收缩,较远的时刻梯度变为0。
如果矩阵的值非常大,就会出现梯度爆炸。