Language Model and Recurrent Neural Networks (二)

本文是我去年十月份在公司的团队技术分享会里面分享过的内容,分享这个内容的初衷是我发现自己对RNN(本文均指Recurrent Neural Networks而非Recursive Neural Networks)比较陌生,想找个时间攻克一下,以便以后有此类工作需求可以快速上手。另外本文加入了CS224N关于语言模型和RNN的课堂内容。因此本文属于科普性质的文章,基本上RNN的细节会涉及到,但并非每个细节都会深入去研究。
因为篇幅较长,所以重新编辑了一下,把标题提到的两部分分开了,本文是RNN部分。


RNN浅析

1.神经网络种类

相信我们之中大部分人,接触神经网路都是从前馈神经网络开始的,在我印象中,以前大多数时候都被叫做BP神经网络或者人工神经网络,当然随着深度学习的发展,这些称呼基本上已经消失了。

Karpathy把神经网络按输入输出的数量或者映射关系归纳成几种类型:

图一 神经网络种类

One-to-One这种类型应该是最常见的,譬如Wide&Deep之类的对单个输入数据产生一种输出的网络,又或者AutoEncoder,都属于此类。One-to-many可能稍微少见一点,比较典型的应用应该是Image Captioning,以图像作为输入,接着生成若干词的文本。Many-to-one是以不定长的序列作为输入,返回固定的内容,例如文本分类、情感分析。Many-to-many分两种情况,一个是非对其的,例如机器翻译,不同目标语言翻译出来的词数和顺序都不一定跟原语言相同;另一种是对其的情形,这种就是序列标注的相关应用了,需要对每个词产生对应的tag,例如词性标注、命名实体识别、分词等等。

2.循环神经网络

因为通常它的输入和输出是固定size的,并且前馈神经网络对历史信息没有记忆,所以普通的前馈神经网络并不擅长处理序列类型的数据。RNN在这方面做了专门的改进:

图二 循环神经网络

图中等号左边是RNN的结构,右边是摊开(unroll)之后的样子。注意:这里只是逻辑上或者流程上的“展开”,而非物理上的展开,因此图中每一个A是一模一样的东西,并非每个时间步上都有一个独立的RNN

不难看出,RNN的每个time step需要以上期的状态和本期输入统一作为输入值,也即,每一期的计算都综合了当前和历史的信息,而不是固定的几个上下文信息。图中的A代表RNN的cell,我们可以先观察一下里面的结构:

图三 循环神经网络内部结构

接着我们用数学描述一下这个过程:

h t = t a n h ( W i n ⋅ [ h t − 1 , x t ] + b i n ) h_{t} = tanh(W_{in}\cdot{[h_{t-1},x_{t}]}+b_{in}) ht=tanh(Win[ht1,xt]+bin)

上式表示 h t − 1 h_{t-1} ht1 x t x_t xt先拼接起来,再乘以权值加上偏置,这个过程其实跟前馈神经网络没什么区别。根本区别就在于,RNN的每个cell的输出都会copy一份传递到下一个时间步,而下一个时间步又重复这样的操作。当然,每一步也可以根据实际场景的需要增加一个输出层的计算

y ^ t = f ( W o u t ⋅ h t + b o u t ) \hat{y}_{t} = f(W_{out}\cdot{h_{t}}+b_{out}) y^t=f(Woutht+bout)

这里啰嗦一句,很多深度学习框架都有unit这个概念,并且RNN的相关API中都要用户传入unit的数量,那么unit是什么?据我参考各个文档得出来的结果是,unit其实就是隐藏层的维度,即上图tanh输出的维度。

3.传统RNN的缺点

模型参数的更新是依靠链式法则进行的,而越靠前的层,其梯度信息就包含越多的偏导项,如果偏导项数值较小,在多次乘积之后就可能造成梯度消失(gradient vanishing),如果较大则可能造成梯度爆炸(gradient exploding)。在梯度消失情况下,RNN因为时间步的增多导致误差信号在往早期的时间步传递中变得越来越弱;在梯度爆炸情况下,模型参数的优化过程会出现大幅度的变动。但无论哪种情况都导致相同的结果,那就是模型无法收敛。

梯度消失和梯度爆炸并不是RNN特有的问题,而是Deep Learning中很普遍的问题,也正是这两个问题导致发展早期,网络层数不能加得太深。

既然出现了问题,聪明的人们总是会想到办法去解决。对于梯度爆炸,人们提出了gradient clipping的方式去避免单步偏导过大,也即是只需要把梯度按一个阈值去截断就能比较好的解决。但梯度消失这个问题是没办法解决的,咱总归不能刻意去放大梯度信号吧?

上面提到的是一个general problem,也是从训练角度发现的问题,下面咱们提一个在序列建模中比较特有的问题,而这是则是从推断角度发现的。

假设h是一个实数,咱们建立一个不包含bias和误差项 ϵ \epsilon ϵ的一阶自回归模型: h t = α ⋅ h t − 1 h_{t} = \alpha\cdot{h_{t-1}} h

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值