@evilking
2018-02-08T16:14:04.000000Z
字数 2028
阅读 3490
NLP
在机器学习的众多方法中,有一类方法是通过观察生物活动而模拟出的,比如蚁群算法、遗传算法、模拟退火算法,本篇要介绍的遗忘算法也属于这类。
遗忘算法设计思路很自然,并不难理解,主要在于如何去应用,它更多的像是一种思想,而不是某一具体的方法。可以用来求最优解,也可用来做排名算法,就看如何去设计应用场景了。
就好像人学习知识一样,需要反复的复习,一段时间不用之后就容易忘记;这是人的一种机制,可以通过时间来淡忘掉不太重要的东西,减轻大脑负担,同时突出重要(需要铭记于心)的东西。
假设每个人都有一条遗忘曲线,某个知识点学习时就相当于给这个知识点一个激励,这个激励不是一成不变的,而是会随着时间的推移,慢慢降低,若长时间不重新给这个知识点激励,那么就会越来越低,直到忘却然后被过滤掉;通过复习重新给激励,这样随着时间的推移该知识点才不会被遗忘。
有人通过大量离散的实验数据,画出了著名的 艾宾浩斯遗忘曲线 ,如下图所示:
尽管该曲线没有确定的函数形式,但我们从图上可以看成,遗忘是呈指数衰减的。
另外有一个事实,有的人记性好些,有的人记性差些,不同人之间的遗忘曲线是不同的,但这并不会从本质上影响不同人对事物的认知,也就是说,如果存在一个遗忘的函数,它首先是指数形式的,其次在实用过程中,该函数的系数并不那么重要。
这就提醒我们可以尝试用一些指数形式的函数来代替遗忘曲线,然后用实践去检验,如果能满足工程实用就可以了。
这样的函数并不难找,比如:退火算法,半衰期公式。其中比较著名的就是 牛顿冷却公式 。
牛顿冷却公式最初是牛顿用来描述浸入冷的环境介质的热的物体,在冷却到周围空气温度这一过程的温度曲线。随着时间的推移,热的物体的温度会慢慢的趋于环境温度,这一过程与人的记忆遗忘过程比较类似,我们可以借助牛顿冷却公式来模拟遗忘曲线。
描述这一冷却过程的微分方程基于这样一个原理:物体的温度在任何给定时刻变化的速率大致地正比于它的温度和周围介质温度之差。
如果 是物体在时刻 的温度,而 是周围的常温度,则微分方程是:
如果令 ,则:
解微分方程 得:
其中 ;
还原回去得:
这里 是 时的温度,这就是 Newton 冷却定律的等式.
将该公式应用于遗忘曲线中,则可设 为遗忘阈值,小于该值就遗忘掉, 为初始“热度”值, 为超参数,人为指定。
笔者只是简单举个自己项目中应用遗忘算法的例子,比如我们做模式匹配,最开始的时候我们不知道项目的数据运行情况,但为了保证数据质量,可能会尽可能多的设置模式,只要发现了就往模式库里加,但其实里面有很多是实际应用中不需要的,我们得想办法将这些冗余的模式给去掉,从而得到优化的模式库。
这时我们就可以加入遗忘算法,把场景设置成模式库的每条模式最初始时有个“热度”,随着时间的推移,“热度”值会呈指数衰减,但当一条模式在项目运行的过程中被匹配到了,就相当于给这条模式加了个“刺激”,从而把这条模式的“热度”又提升了;可想而知在项目运行一段时间后,一些经常使用的模式的“热度”会逐渐升高,而不常用或根本没使用到的模式的“热度”就会衰减到很低,从而能被过滤掉。从而就能得到较优的模式库。
而且对“热度”进行排序,还可以得到众多模式的使用率排名;所以遗忘算法也可用于排名。
http://www.ruanyifeng.com/blog/2012/03/ranking_algorithm_newton_s_law_of_cooling.html 这篇文章中介绍了《基于用户投票的排名算法》就是用牛顿冷却定律来做的,读者可以参考学习。
http://www.52nlp.cn/forgetnlp2 这篇文章中是将遗忘算法应用于分词上,去优化词库,读者也可以看看。
由于遗忘算法就是一个牛顿冷却公式,编程非常简单,这里就不做源码分析了,读者可以自己去实现。
核心的问题是怎么将实际项目中的场景转换成遗忘算法能适应的。