author: 张俊林
看深度学习文献,门函数基本上已经是你必然会遇到的一个概念了,最典型的就是LSTM,首先上来你就得过得去“遗忘门”“输入门”“输出门”这三个门。门函数本身是个独立概念,不过LSTM使用多个门函数来组合出一个带有状态记忆的计算模型而已。随着LSTM大行其道,各种计算模型开始在计算过程中引入门函数的概念,相信这些论文你也没少看,其实这也是一种研究模式,比如你看看你手头的模型,想想能不能把门函数引进来?会不会有效?也许能走得通。
RNN概念非常直接简单很好理解,但是看到了LSTM,估计不少人会挠头。学习LSTM刚开始看模型一般都不太容易立马搞明白到底这是怎么回事?其实很重要的原因一个是一下子引入了三个门,太多,另外一个是把记忆状态存储单独独立出来,所以看上去整个逻辑很复杂,其实你要是把门函数到底在干嘛搞清楚,那么LSTM的计算逻辑是非常清晰直接好理解的,跟RNN在概念上其实是一样的。所以首先得搞明白“门函数”们到底在干什么事情。
|猪家的神经网络门控系统
既然叫做门,那么我们可以和现实生活中的门的作用进行类比,比如我们在家里安装门是干嘛的呢?是个控制人进出房间的控制设备,门打开了,那么人就能通过,门闭上了,那么人就过不去,被锁在门外了,门要是半开半闭呢,如果不进一步推门的情况下,如果你体积小,可以侧着身子蹭进去。门打不打得开,打开能打多大,这是由谁来决定的?是由门控设备来决定的。什么是门控呢?我们都听说过“小红帽和狼外婆”以及“三只小猪”的故事,是吧?如果忘了可以看看下面图片辅助回忆一下:
在两个故事中,门控的作用就是狼字辈的不允许进入,妈妈和吃草的动物可以进,不过故事里的门控是通过室内的人或动物的观察来手动实现的,属于真正的“人工智能”或“猪工智能”。我们现在科技发达了,都使用刷卡或者刷脸的方式由门控设备来判断你是猪妈妈还是狼外婆,依此来决定是否让你进入。
假设现在我们帮小红帽或者三只小猪做个刷脸的门控设备,而且我们用目前流行度爆棚的神经网络来做这个门控,怎么做呢?
我们假设猪家其实是当地土豪,人称“豪猪”,有经济实力购买北京三环内学区房,而且房子还挺大,为了方便进出,在东南西北各个方向各有一个门,其神经网络建筑图如下:
当然,目前每个门还没有安装门控设施,所以每个门都可以随意进出,不论”X=猪妈妈”也好,还是“X=狼外婆”也好,X顺着实线箭头路径找到四个门,推门就能闯进卧室跟你抬手say hello。很明显,此时室内安全指数为负数,这个房子的设计师按理说是需要负分滚粗的。这绝对是不允许的,得想想办法,于是经过李开复老师的引荐,猪妈妈用了250万美金聘请了深度学习房屋架构师老狼来给房子加上安全措施,老狼ML经验丰富,尤其是DL,一拍脑袋就给了个解决方案:加个门控不就完了么,而且我们这是DL牌的门控,加上门控的深度学习安防系统长这样:
图中标为虚线的箭头就是安防门控的神经网络参数了,门控系统的公式如下所示:
这样东南西北每个门是打开还是关上或者是半开半合就通过这个门控系统参数U来自如控制了。比如拿东门来说,假设输入是“X=猪妈妈”,那么通过UX矩阵计算,也就是猪妈妈的脸的照片乘以U中通向东门的虚线箭头权重,再经过Sigmod非线性映射,东门门控会输出一个值,我们知道Sigmod的分值区间在[0,1]之间,通过训练,可以让U中通向东门那个网络连接的权重学习到合适的数值,使得如果“X=猪妈妈”的时候,经过Sigmod的输出是1,就是说东门完全打开,让猪妈妈顺利通过W参数网络那条通向东门的实线箭头路径进入卧室和猪爸爸抬手say hello。而反过来,如果输入是“X=狼外婆”,就是说此刻狼外婆到门外敲门了,争取让U学习到合适的参数,使得Sigmod(UX)的值为0,就是说门控系统决定门紧紧关上,不漏一丝缝隙,绝对不给狼外婆留下一丝性侵猪爸爸的机会。当然,这只是东门,其它四个门也如此处理即可,核心是神经网络门控参数U设置成什么值的问题,只要保证看到狼外婆通过U把四个门都关上,看到猪妈妈就把门都打开热烈欢迎就行了,当然门开的大小也可以控制,比如小松鼠来猪家做客:“X=小松鼠”,那么也没必要四个门都打开显得那么费电,只要把一个门打开一条缝就行了,就是说门控系统控制东南西三个门Sigmod值输出为0,关上门,北门Sigmod值输出为0.2,这就足够了。这下理解为啥门控经常用Sigmod作为非线性函数了吧,因为它很好地在物理含义上解释门开的大小,0就是关上,1就是“我家大门常打开,开放怀抱等你”。
|深度学习里的门函数
上面讲了猪家的神经网络门控系统是如何工作的,其实深度学习的各种门作用是类似的,懂了上面小猪家的门控就明白了深度学习里门函数的作用,区别无非是现在这个门控不像现实生活中的门用来控制人或动物的进出,而是控制信息的进出及进出程度的控制设备。如果门函数取值1,那么等于把门大开,允许门前的信息畅通无阻地流入流出,如果门函数取值0,则紧紧关上大门,所有信息被阻断,“此门不开,禁止出入”。如果取得0和1之间的值,代表允许部分信息进入或者流出后续的部件,如此而已。
在这个指导思想下我们再回顾下LSTM的几个门及其计算公式,估计此时不用看那个九曲回肠的LSTM神经网络图,光看公式也能明白LSTM到底在干嘛了吧:
上面是LSTM的计算公式,首先找那几个门,其实好找,那三个Sigmod作为非线性函数的就是三个门,很明显其取值范围在0到1和门打开关闭的物理意义是很好对应起来的。这个门的计算公式和上面猪家的门控计算公式其实是一样的,区别无非多出了一个h(t-1)部分,这个也好理解,这是因为LSTM是RNN模型,决定t时刻节点的除了当前输入值x(t)外,还有t-1时刻的隐层节点输出h(t-1),这代表了历史信息对当前的影响,所以决定门开关程度的除了当前输入 x(t)外,还有h(t-1),仅此区别而已,其计算流程和物理含义和猪家的门控其实是一样的。
所以含义很清楚,输入门是用来控制输入i’(t)进出多少或者是否允许进出的门控设备;输出门是用来控制t时刻状态值m(t)对外多少是可见的门控设备;遗忘门是控制RNN中历史状态m(t-1)流动到t时刻后允许多少进入t时刻的门控设备;
所以关键在LSTM的状态值更新函数和隐层节点输出值函数上。对于状态更新函数来说:
f(t)是遗忘门门控,m(t-1)是历史状态信息,两者相乘代表t时刻允许多少历史信息进入来决定m(t)当前状态,如果遗忘门全关取值0,则历史对当前状态无影响,如果遗忘门全开取值1,则历史信息原封不动的传到t时刻,没有任何信息损失,当然更大可能是取值0到1之间,代表历史信息的部分流入;
i(t)是输入门门控,i’(t)是当前t时刻输入值, 两者相乘代表t时刻允许多少当前输入信息进入来决定m(t)当前状态,如果输入门全关取值0,则LSTM忽略当前输入的影响,等于没看到这个输入直接跳过去了,如果输入门全开取值1,则当前输入最大化地决定当前状态m(t),没有任何信息损失,当然更大可能是取值0到1之间,代表输入信息的部分流入;
经过上面两个门控控制历史信息的影响以及当前输入的影响,就形成了t时刻的隐层节点状态值m(t)。
隐层节点输出值h(t)好理解,就是说通过输出门控制当前状态m(t)对外有多少是可见的,因为m(t)是内部隐藏的状态信息,除了往t+1时刻隐层传输外,外部其它地方是看不到的,但是它们可以看到h(t)。
这就是LSTM是如何用三个门控以及抽离出的m状态存储器来表达运算逻辑的思路,其实可以看到它本质跟RNN一样,无非是体现历史影响及当前输入的影响,但是相对RNN来说,通过门控来自适应地根据历史和输入来控制信息的流动,当然其实更主要的是通过抽离出的m存储往后传递方式来解决梯度弥散问题的,因为今天主讲门控,所以这块不展开讲。
很多其它深度学习的工作也引入了门函数,其思路和上面介绍的猪家的门控系统思路本质上是一样的,无非是用门函数来控制信息流动程度的。在计算模型上怎么理解“有门”和“没门”的模型呢?其实你可以缺省地认为所有的模型都是“有门”的,而“没门”只是有门的一种特例情况。为什么呢?因为“没门”等价于什么,等价于:“有门”但是那个门是永远全开的,永远不会关上或者半遮半掩。所以引入门其实在干什么呢,就是加入控制,在有些情况下让你进入,有些情况下不让你进入,比如看见x不让进,看见y则自由出入。
|其它的类比
上面为了方便理解门函数的作用,我们用现实生活中的门作为类比例子。其实生活中还有很多起到类似类比作用的设备,比如水龙头,打开水龙头那么水就可以流进来,如果关上水龙头,那么就切断了水源,水龙头打开的大点,那么水流量就大些,水龙头打开的小点,那么水流量就小些。DL中的门函数其实跟这个水龙头调节的作用是一样的,区别无非是控制的不是水流量,而是流入的信息流量。
再比如,也可以把门函数类比为灯的光调节器,我们常见到带有光调节器的灯控设备,把设备调大,则照明强度增加,把设备调小,则照明强度减少。这个类比也能很形象地说明门函数的作用。
其实归纳起来,所有这些生活中的门起的是什么作用呢?其实起的作用是个“调节阀”的作用,通过开关调节阀来控制物体的流入;通过开关调节阀大小来控制流入程度;所以,所有起到调节阀作用的生活设施都可以用来做门函数的类比。