学习目标
- 目标
- 了解序列模型相关概念
- 掌握循环神经网络原理
- 应用
- 应用RNN原理手写一个RNN的前向和反向传播过程
4.1.1 序列模型
4.1.1.1 定义
通常在自然语言、音频、视频以及其它序列数据的模型。
催生了自然语言理解、语音识别、音乐合成、聊天机器人、机器翻译等领域的诸多应用。
4.1.1.2 类型
语音识别,输入一段语音输出对应的文字
情感分类,输入一段表示用户情感的文字,输出情感类别或者评分
机器翻译,两种语言的互相翻译
4.1.1.3 为什么在序列模型使用CNN等神经网络效果不好
- 序列数据前后之间是有很强的关联性
- 如:曾经有一份真挚的感情,摆在我面前,我没有去?_
- 序列数据的输入输出长度不固定
4.1.2 循环神经网络
循环(递归)神经网络(RNN)是神经网络的一种。RNN将状态在自身网络中循环传递,可以接受时间序列结构输入。
4.1.2.1 类型
- 一对一:固定的输入到输出,如图像分类
- 一对多:固定的输入到序列输出,如图像的文字描述
- 多对一:序列输入到输出,如情感分析,分类正面负面情绪
- 多对多:序列输入到序列的输出,如机器翻译,称之为编解码网络
- 同步多对多:同步序列输入到同步输出,如文本生成,视频每一帧的分类,也称之为序列生成
这是循环神经网络的一些结构以及场景,那么我们接下来以基础的一种结构来看具体RNN怎么做的?
4.1.2.2 基础循环网络介绍
- x_txt:表示每一个时刻的输入
- o_tot:表示每一个时刻的输出
- s_tst:表示每一个隐层的输出
- 中间的小圆圈代表隐藏层的一个unit(单元)
- 所有单元的参数共享
通用公式表示:
- s_0=0s0=0
- s_{t} = g1(Ux_t + Ws_{t-1} + b_{a})st=g1(Uxt+Wst−1+ba)
- o_{t} = g2(V{s_t}+b_{y})ot=g2(Vst+by)
g1,g2g1,g2:表示激活函数,g1:tanh/relu, g2:sigmoid、softmax其中如果将公式展开:
循环神经网络的输出值o_tot,是受前面历次输入值x_{t-1},x_{t},x_{t+1}xt−1,xt,xt+1影响。
4.1.2.3 序列生成案例
通常对于整个序列给一个开始和结束标志,start,end标志。
- s 我 昨天 上学 迟到 了 e
输入到网络当中的是一个个的分词结果,每一个词的输入是一个时刻。
4.1.2.4 词的表示
为了能够让整个网络能够理解我们的输入(英文/中文等),需要将词进行用向量表示。
- 建立一个包含所有序列词的词典包含(开始和标志的两个特殊词,以及没有出现过的词用等),每个词在词典里面有一个唯一的编号。
- 任意一个词都可以用一个N维的one-hot向量来表示。其中,N是词典中包含的词的个数
我们就得到了一个高维、稀疏的向量(稀疏是指绝大部分元素的值都是0)。
4.1.2.4 输出的表示-softmax
RNN这种模型,每一个时刻的输出是下一个最可能的词,可以用概率表示,总长度为词的总数长度:
每一个时刻的输出s_tst都是词的总数长度,接上softmax回归即可。
4.1.2.5 矩阵运算表示
假设以上面的例子:对于网络当中某一时刻的公式中
1、\mathrm{s}_t=relu(U\mathrm{x}_t+W\mathrm{s}_{t-1})st=relu(Uxt+Wst−1)
2、o_{t} = softmax(V{s_t})ot=softmax(Vst)
1、形状表示:[n, m] x [m, 1] +[n, n] x [n, 1] = [n, 1]
- 则矩阵U的维度是n x m,矩阵W的维度是n x n
- m:词的个数,n:为输出s的维度
注:此步骤可以简化:[u,w] x [\frac{x}{s}sx ] = [n, n+m] x [n +m, 1] = [n, 1]
2、形状表示:[m, n] x [n, 1] = [m, 1]
- 矩阵V维度:[m, n]
总结:其中的nn是可以人为去进行设置。
4.1.2.6 交叉熵损失
总损失定义:
- 一整个序列(一个句子)作为一个训练实例,总误差就是各个时刻词的误差之和。
E_{t}(y_{t},\hat{y_{t}}) = -y_{t}log(\hat{y_{t}})Et(yt,yt^)=−ytlog(yt^) E(y,\hat{y}) = \sum_{t}E_{t}(y_{t},\hat{y_{t}})=-\sum_{t}y_{t}log(\hat{y_{t}})E(y,y^)=∑tEt(yt,yt^)=−∑tytlog(yt^)
在这里, y_tyt是时刻 t 上正确的词, \hat y_{t}y^t是预测出来的词