视频链接:6 循环神经网络_哔哩哔哩_bilibili
给神经网络增加记忆能力
对全连接层而言,输入输出的维数固定,因此无法处理序列信息
对卷积层而言,因为卷积核的参数是共享的,所以卷积操作与序列的长度无关。但是因为卷积层的后面往往会跟着一些全连接层,从而导致卷积层的输出不能任意改变
这是一个有限状态自动机:遇到不同的输入会跳到另一个状态上去
从这不难看出,当前结果的输出不仅依赖于当前时刻的输入,还依赖于上一时刻所处的状态
这是一个图灵机:一种抽象的数学模型,可以用来模拟任何可计算问题
输出不单单依靠输入,同时也与控制器的行为、纸带上存下来的信息等有关,比起有限状态自动机更加复杂
对于有限状态机,我们可以改造前馈网络实现。但是对于更加复杂的图灵机就不能仅依靠改造前馈网络实现,而是需要引入记忆能力
当前的输入经过z延时单元就得到了上一时刻的信息
第一个隐藏层中的t-2是由输入层中的t-2与t-3得到的,t-1是由t-1、t-2、t-3得到的,t同理
自回归模型:w0是偏置,wk是权重,当前时刻的yt由前k个时刻的yt-k加权得到
非线性自回归模型:自回归模型没有外部输入,只是y自己预测自己。因此非线性自回归模型引入了非线性函数,x是输入,y是输出,做到了通过时间序列的输入与时间序列的输出一起预测
循环神经网络
通过上一时刻的状态与当前时刻的输入计算当前时刻的状态
RNN在时间维度上是很深的网络,但是在非时间维度上却是很浅的网络。因为在时间维度上过深,所以需要考虑梯度消失的问题;因为在非时间维度上过浅,所以需要考虑增加模型的复杂度
如果我们认为前馈神经网络可以模拟任何函数的话,那么循环神经网络就可以模拟任何程序
应用到机器学习
序列到类别
两种常见的方法:
情感分类
因为文本是一个变长的序列,把每个字看成不同时刻的输入(一个词向量),所以可以使用RNN
把不同字的状态拼到一起送到分类器中得到不同的结果
同步的序列到序列模式
输入一个序列,输出一个序列,且输入输出之间有对应关系
中文分词
把一句话以词为单位分隔开
示例中的这句话分词应为:他说的,确实,在理
但是在中文中,的确是一个词,实在是一个词,词语分隔存在歧义性
在机器学习中我们把这个任务变成一个序列标注的任务,S表示单个词语,B表示一个词语的开始,E表示一个词语的结束
在RNN中我们直接把词向量输入RNN得到结果就行了
信息抽取
CRF是条件随机场
抽取小米——品牌,雷军——人名,2015年——时间等信息
语音识别
异步的序列到序列模式
左边输入x得到状态,可以看作是编码器encoder
EOS表示上一个序列的结束
右边的状态是通过上一时刻的状态与上一时刻的输出得到的,没有输入x,可以看作是解码器decoder
右边y影响h,是自回归的方法,h影响h是RNN的方法
机器翻译
参数学习与长程依赖问题
随时间反向传播
对误差在时间维度上求和就得到了总误差,因此反向传播时也可分为不同时刻的反向传播结果U的结果求和
Lt对U求偏导,就是第t时刻的loss对(第k时刻的zk的导数)*(上一时刻隐藏状态的转置)求和
按照链式法则展开为上图所示
长程依赖问题
将链式法则求出的式子继续展开得到(t-k个激活函数的导数的对角矩阵乘U的转置)再乘Lt对zt的偏导
由于f'(zτ)是一个有界函数,U是共享的参数,所以把他们近似看作γ
因此δt,k近似等于γ^t-kδt,t,当γ>1时,若t时刻距离k时刻很长,则会梯度爆炸,反之则会梯度消失,所以实际上只能学到短周期的时间依赖关系
如何解决长程依赖问题
我们希望γ=1,首先把f的非线性f去掉,也就是让ht=Uht-1+Wxt+b,这样使得f’为1。接下来把U变成1也就是单位矩阵,因此ht=ht-1+Wxt+b,此时的γ=1
如图所示,激活函数g是对Wxt+b引入非线性,但是由于ht-1与ht之间变成了线性关系,导致模型能力变差
进一步改进,后面的g(xt,ht-1;θ)其实就是原来的f(Uht-1+Wxt+b),这样改进既保留了非线性,又解决了梯度的问题
当激活函数g选取sigmoid、relu等一直为正的激活函数,加上ht-1是一个累计的状态(不断增大)
例如当激活函数为sigmoid时,由于h不断累计,导致g(xt,ht-1;θ)趋近0或1而出现梯度消失,从而导致难以向网络增加新的信息。因此我们可以在ht-1中选择性地丢弃一些信息,接下来会给大家介绍两种基于门控的方法
残差:如果把g(xt,ht-1;θ)中的xt去掉,得到ht = g(ht-1;θ),这个式子与残差网络是十分相似的,都解决了梯度消失的问题
GRU与LSTM
GRU
zt是一个与h维度相同的向量,每一维都在0~1之间,用sigmoid激活函数
g用得到是tanh激活函数,将0~1变成-1~1,且梯度更大一些
当zt接近1时,ht的信息更多来自于ht-1;当zt接近0,ht的信息更多来自于xt
若想要ht的信息只来源于xt,则可以加一个rt在ht-1之前
LSTM
引入了内部记忆单元c,通过c进行记忆线性的传递,把h释放出来更好地去做非线性
i是input gate,决定加入多少新信息
f是forget gate,决定遗忘多少旧信息
o是output gate,决定输出多少信息
深层循环神经网络
虽然循环神经网络在时间维度上可以认为是一个非常深的网络,但在非线性维度上是非常浅的,我们希望把它加深,看看模型能力有没有提升
堆叠循环神经网络
时间维度上是对齐的
变式
可以使某个状态来自于下一层所有时刻的状态
也可以使某个状态来自于上一时刻的所有层
双向循环神经网络
对输入的时序数据,既可以从左往右建模,也可以从右往左建模,好处是得到了双向的信息与趋势,模型效果更好
循环神经网络应用
扩展到图结构
树结构
递归神经网络把循环神经网络从序列结构扩展到树结构
应用到自然能语言上:
先将red与bike组合,再与a组合
图结构
在实际应用中,很多数据是图结构的,比如知识图谱、社交网络、分子网络等。而前馈网络和循环网络很难处理图结构的数据
v是结点向量、e是边向量、u是全局向量
图的更新步骤为:
(1)更新边:通过边所连的两点与u更新
(2)更新点:通过所有指向该点的边与u更新
(3)更新u
mt(v)是指v收到的信息,ht-1是上一时刻的状态,u是v的所有邻居结点