深度学习之灾难性遗忘问题
深度学习之灾难性遗忘问题
健忘是⼀种病态,善忘是⼀种智慧。 ——写在前⾯
⽂章⽬录
1. 背景
当你在看这篇博客的时候,就正在使⽤⼀个复杂的⽣物神经⽹络。你有⼀个约为876亿个神经元的⾼度互连的⼤脑帮你完成阅读、呼吸、运动和思考。你的每⼀个⽣物神经元都是⽣物组织和化学物质的有机结合。若不考虑其速度的话,可以说每个神经元都是⼀个复杂的微处理器。你的某些神经结构是与⽣俱来的,⽽其他⼀些则是在实践中形成的。
科学家们对⽣物神经⽹络⼯作机理有⼀定的认识。⼀般认为,包括记忆在内的所有⽣物神经功能,都存储在神经元和及其之间的连接上。学习被看作是在神经元之间建⽴新的连接或对已有的连接进⾏修改的过程。 早在20世纪60年代,科学家们就基于对⽣物神经⽹络⼯作机理认识,期望构造出像⼈类⼤脑⼀样容纳智慧、意识、记忆的⼈⼯神经⽹络。但均以失败告终。就连被⼤家推向神坛的深度学习在结构上、以及功能与⽣物神经⽹络都相去甚远。
与⽣物神经⽹络相⽐较,现有的深度学习存在诸多缺陷。灾难性遗忘就是缺陷之⼀。所谓的灾难性遗忘:即学习了新的知识之后,⼏乎彻底遗忘掉之前习得的内容。它使得⼈⼯智能体缺乏像⽣物⼀样不断适应环境以及增量式(持续)学习的能⼒。早在神经⽹络的远古时代,研究⼈员[1-2]就已经发现⼈⼯神经⽹络中存在这⼀问题了。直到现在,仍然有许多研究⼈员(例如… Goodfellow, yoshua Bengio等[3])偿试解决(缓解)深度学习中的灾难性遗忘问题。
bluea2. What and Why 灾难性遗忘
⾸先回答第⼀个W:什么是灾难性遗忘?
上⾯已经给出灾难性遗忘的定义,此处复述:灾难性遗忘即学习了新的知识之后,⼏乎彻底遗忘掉之前习得的内容。
challengeable具体描述:我们搭建了⼀个深度神经⽹络来学习识别各种动物。假定我们遇到了⼀个⾮常吝啬的数据提供者,每次只提供⼀种动物的数据,并在学习完成识别该动物后,将数据收缴上去;然后才给下⼀个动物的训练数据。有意思的现象出来了,这个神经⽹络在学习识别⼩狗后,让它识别之前学习过的⼩猫,它竟然识别不出来。这就是灾难性遗忘,它⼀直是深度学习领域⼀个⽐较严重的问题。
基于深度学习的智能体们就像陈列在书架上的⼀本本⼯具书,它利⽤预先收集好的静态的数据集学习,
在学习过程结束后就是⼀种静态(没有⽣命)的存在。⽆法对新数据进⾏学习,如果硬塞给它学习,就会出现灾难性遗忘问题。当然,我们可将新数据加⼊到历史训练数据集中,⽤包含新旧训练数据的数据集对⽹络进⾏重新训练,可想⽽知,这样做法的学习效率是有多低!星期二英文
在现实世界中,很多任务不可能⼀次性得到所有的训练数据(例如开放的环境、⾮特定的任务)。这就使得神经⽹络必须能够利⽤不断产⽣的新数据持续学习新知识,并且不遗忘之前所学过的重要内容。然⽽,持续学习却是⼈类以及其他⽣物与⽣俱来的能⼒。只有解决了灾难性遗忘问题,⼈⼯神经⽹络才有可能变成像⼈类⼀样强⼤的智能体,⽽不是摆在书架上⼀本本静态的⼯具书。
nationalbank
注意:深度强化学习的训练过程似乎不需要预先收集所有的训练数据,但是它的环境与任务都是封闭的。深度神经⽹络的结构是针对任务⼿⼯调整确定,并在训练、测试与利⽤时保持不变。我想强调的是,深度强化学习披上了强化学习利⽤机器⼈与环境交互的数据进⾏学习的外⾐,让我们有种深度学习具备持续学习的能⼒,不存在灾难性遗忘的问题的错觉。⾸先,⼤部分深度强化学习成功的例⼦中的任务是特定的、环境的状态空间也是确定的。机器⼈在这样⼀个环境中,学习这⼀任务,相当于有⼀个已经确定的有边界的数据集,每⼀个训练数据都是按特定的概率分布在这个数据集中采样得到的。并且,类似于有监督的深度学习,喂给深度强化学习的交互数据也是会重复出现,通过对神经元不断的刺激完成学习的。最近,有研究⼈员利⽤深度强化学习对多任务进⾏学习,作者明确指出⾸先需要⾯的问题就是深度神经⽹络的灾难性遗忘问题,⾥⾯有⾮常明显的缓解灾难性遗忘问题的机制。
their rooms接着回答第⼆个W:为什么会灾难性遗忘?
深度学习的灾难性遗忘问题是深植于它的基因,是⽆法解决的问题,只能通过各式各样的机制、策略来缓解。
为什么说是深植于它的基因⾥呢?神经⽹络由⽹络结构与⽹络参数构成。不凑巧的是,深度学习在结构与参数两⽅⾯都植⼊了灾难性遗忘的基因:
important的反义词
深度学习的结构⼀旦确定,在训练过程中很难调整。神经⽹络的结构直接决定学习模型的容量。固定结构的神经⽹络意味着模型的容量也是有限的,在容量有限的情况下,神经⽹络为了学习⼀个新的任务,就必须擦除旧有的知识。
深度学习的隐含层的神经元是全局的,单个神经元的细⼩变化能够同时影响整个⽹络的输出结果。另外,所有前馈⽹络的参数与输⼊的每个维度都相连,新数据很⼤可能改变⽹络中所有的参数。我们知道,对于本⾝结构就已经固定的神经⽹络,参数是关于知识的唯⼀变化量。如果变化的参数中包含与历史知识相关性很⼤的参数,那么最终的效果就是,新知识覆盖了旧的知识。
其它类型的⼈⼯神经⽹络如果也存在灾难性遗忘问题,也逃不掉以上两种原因(或其中之⼀)。
备注:那么,有没有不含灾难性遗忘问题的⼈⼯神经⽹络,当然有:例如增量式径向基函数⽹络、⾃
组织增量学习⽹络等代表的宽度学习就不存在灾难性遗忘问题。但它们⼜存在其他⾮常严重的问题,使其不具备到类⼈的持续学习能⼒,本⽂暂不表。
3. 现有的解决⽅法综述
现有的灾难性遗忘问题解决⽅法⼤致可以分为两派:参数派与结构派。其中,参数派主张对深度学习进⾏修补,结构派主张提出新的⼈⼯神经⽹络模型。此部分主要针对深度学习的灾难性遗忘问题进⾏综述,因此主要介绍参数派的⽅法,不过多涉及结构派。
新数据会修改与历史知识相关的重要神经元的参数,这是造成深度学习灾难性遗忘的根本原因。⼤致有四种⽅法:1) 利⽤新数据训练的同时,不断⽤包含历史数据相关的信息刺激神经元,形成⼀种竞争,从⽽使历史知识相关的重要神经元的参数尽可能少的受影响,同时也保证了新知识能够被学习;通常称为Self-refreshing Memory Approaches[5];2)在开始训练新数据前,利⽤旧⽹络对新数据进⾏预测得到虚拟的训练数据【可以看作是旧⽹络的⼀个回忆】,⽬标函数中包含新旧⽹络的参数约束,每训练⼀个新数据,利⽤所有的虚拟数据约束旧参数,抑制遗忘;这类⽅法被称为知识蒸馏法[6];3)[7]从另⼀个⾓度来约束参数的变化,⽂中认为参数是⼀个概率分布,只要在这个分布的核⼼地带,对于该任务就是可⾏的,不同的任务对应不同的概率分布,如果能找到两个分布重叠的部分,并将参数约束到这个区域,那么这⼀参数不就可以对这些任务都有效吗,这类⽅法被称之为Transfer
Techniques法[7]。4)第四类,我称它为其它⽅法,例如保留所有的历史数据,研究评判重要数据的技术,只保留那些重要的,信息量⼤的数据。这只是保留所有历史数据的⼀个改进版本,只要评判⽅法合理,肯定也能缓解灾难遗忘问题,本⽂对这⼀类⽅法就不介绍。下⾯只介绍前三种⽅法。
3.1 Self-refreshing Memory Approaches
关于这类⽅法,具有代表性的⽂章为[4]。
3.1.1 核⼼思想——递归⽹络的吸引⼦特性
这类⽅法的核⼼思想是利⽤不断递归的混响过程来⽣成虚拟的知识实体(⽤来提醒学习器,以防⽌遗忘)。这个过程能够通过⼀个随机的输⼊收敛到⽹络的吸引状态与输出。这样的吸引状态与输出更能刻画之前学到的知识。
⼀个递归的⾃编码神经⽹络具备的⼀个重要特性——attractor 吸引⼦。
具体描述如下:
对于⼀个⾃编码器(期望的输出就是输⼊本⾝),我们利⽤⼀个状态空间⼦集包含的状态来训练这个⾃编码器,训练结束后,我们⽤不在这个状态空间的状态输⼊到⽹络中,得到输出,然后将得到的输出⼜作为输⼊,经过若⼲次迭代后,⽹络的输出会被吸引到训练的状态⼦空间中。
red fox
下图是⼀个标准的⾃编码神经⽹络结构图。
现在将如下图粉⾊圏内的⼆维状态以随机采样的⽅式输⼊到⾃编码器中,直到训练收敛。然后我将粉⾊圏外的20个状态输⼊到训练好的⾃编码器中,并不断循环迭代。下图画出每个输⼊数据吸引轨迹,我们发现最终都吸引到了训练所⽤到的状态⼦空间中。Self-refreshing Memory Approaches主要就是利⽤了⾃编器神经⽹络的这⼀特点,来隐式的存储历史数据的信息,以备将来训练新数据时,能够⽣成⽤于唤醒历史知识的虚拟训练数据。
3.1.2 ⽅法介绍
以上是Self-refreshing Memory Approaches主要思想。
⽂章的摘要简述如下:
peppapig
本⽂⽅法主要是利⽤⼀个lf-refreshing memory⾃更新的存储器来存储已经学到的知识,并利⽤该存储的知识来不断“提醒”学习器不要忘记之前的学到的知识,从⽽达到避免灾难性遗忘的⽬的。⽽之前最粗暴的作法是,提取能很好代表之前知识的训练样本集,并且在训练新样本的时候,不断的利⽤这个代表之前知识的样本集对学习器进⾏“提醒”功能,从⽽达到避免灾难性遗忘的⽬的。⽽提取并存储这样的代表样本集即耗费时间⼜浪费空间。本⽂直接利⽤⼀个能⾃我更新的存储器来存储现今学到的所有知识,并且在新样本训练学习器的期间,不断对学习器进⾏“提醒”。
⽂章最核⼼的⼀张图如下:
⽂章提出了⼀个dual-network结构,由两个相互偶合的多层⽹络与组成。对于每⼀个⽹络,输⼊层与隐含层以及隐含层与输出层都是全连接的。与普通⽹络不同的是,此处隐含层到输⼊层也是全连接的,意思是输⼊层与隐含层是双向的,当然不同的⽅向对应的是不同的连接权值。即能够学习外部(环境的)的信息,也能够学习发布的信息。⽽则只能学习发布的信息。此处利⽤BP算法来更新两个⽹络的参数。当⼀个从环境中得到的新样本external input–target输⼊到中,输⼊输出的误差,以及输⼊以及从隐含层到输出层的计算值的误差(这个结构相当于⾃编码⽹络)都需要被⽤来更新⽹络。这样,输⼊-隐含-输出 相当于异联想,⽽输⼊-隐含-输⼊ 相当于⾃联想。也是利⽤同样的训练⽅法与⽅式。此处值得强调,⾃联想与异联想都是需要的。
下⾯利⽤⼀个简单的学习过程来说明,怎么利⽤该结构实现避免灾难性遗忘的⽬的。
⼀个初始的状态如,已经对给定的数据集完成学习任务,此时应该还是“空”的状态,参数还是处于随机设定的状态。假定此时进⼊第⼀阶段,denoted stage(如图左):此时停⽌接受环境中的样本,但是仍处理⼯作状态。利⽤噪声⽣成器随机的⽣成⼀个随机的激发信号(ed),对于该激发输⼊信息按照input-hidden-input路线计算最终的值,第⼀次得到的输出层激活值被再次注⼊隐含层,从⽽得到⼀个输出和⼀个输⼊活跃值。第⼆次的输⼊活跃值⼜被重新注⼊到隐含层,得到下⼀个输出以及输⼊活跃值,⼀直这样重复次,得到最终的输出值与输⼊活跃值作为的训练样本。第⼆阶段(图右):学习新样本的同时,利⽤⽣成的“提醒”样本来对进⾏不断复习。
简⽽⾔之,本⽅法利⽤两个结构上⼀模⼀样的⽹络(替⾝⽹络与真⾝⽹络)来克服灾难性遗忘的问题。学习过程由两个周期迭代(训练步与梳理步)的步骤组成。在训练步时,真⾝⽹络同时利⽤替⾝⽹络⽣成的虚拟数据以及新数据学习新参数,学习稳定后进⼊第⼆步。第⼆步时,将真⾝⽹络的现有知识传授给替⾝⽹络(⽂中采⽤了⽐较简单的⽅法:直接将真⾝⽹络的参数copy给替⾝⽹络)。本⼈利⽤⼀个简单的序列训练数据来测试⽅法的有效性。
火炬木小组基情3.1.3 ⼀个例⼦
训练数据集
humidity利⽤两组数据集(⽣成于函数)。先利⽤对模型进⾏训练,训练⼀定步数后,再利⽤对模型进⾏训练。NET 1NET 2NET 1NET 2NET 2NET 1NET 1NET 2NET 1NET 2NET 1NET 1R NET 2NET 1NET 2NET 1y =+
x 1sin (x )
110x 2S ,S 12S 1S 2
对照实验
原始⽅法:只利⽤⼀个模型先对数据集学习,然后对学习,最后测试对数据集的拟合误差。本⽂⽅法:利⽤两个模型,⽤于学习新的知识,⽤于存储当前学习到的知识,并对进⾏‘提醒’,以防⽌灾难性遗忘。
结果
原始⽅法:各数据集的训练步长都为60000S :1x =1[−20,0],x =2[−20,0]
S :2x =1[0,20],x =2[−20,0]
S 1S 2S 1NET 1NET 2NET 1