本文通过论文精读,介绍了一下分层强化学习技术的细节,论文传送门贴在最下方。该论文是发表在AAAI 2019的顶会论文,想用分层强化学习改善推荐模型的同学都可以来学习一下,码字不易喜欢的话可以评论交流(文中我把自认为重要的部分用红色标出,方便大家学习)。
其实本来我关注的模型复杂度都比较简单的,也是最近在导师的影响下,才开始研究这篇分层强化学习的paper,收获很大,文章难度适中,在这里给大家写一写我对它的分析,希望能帮的上忙,让大家学习得更快一点(PS:我之前刚开始学习的时候搜过还没有人分析过这篇paper,所以我来尝试开个荒吧)。不过,在大家开始跟着我学习这篇分层强化学习文章之前,先给大家普及一下基本的强化学习知识,当然只是皮毛,还是希望大家有一些深度学习基础再来看这篇文章。先上基本知识部分:
深度强化学习(Deep Reinforcement Learning,DRL)本质上属于采用神经网络作为值函数估计器的一类方法,其主要优势在于它能够利用深度神经网络对状态特征进行自动抽取,避免了人工定义状态特征带来的不准确性,使得Agent能够在更原始的状态上进行学习。
强化学习主要包含四个元素:智能体(Agent)、环境状态(environment)、奖励(reward)、动作(action)。
举个例子作为一个决策者(agent)你有两个动作(action)学习、打游戏,你去打游戏学习成绩就会下降,学习成绩就是你的(state)你的父母看到你学习成绩会对你相应的奖励和惩罚(reward)所以经过一定次数的迭代你就会知道什么样的成绩下选择什么样的动作会能够得到最高的奖励的,这就是强化学习的主要思想。
嗯,先有这些概念,剩下的就要看大家的深度学习基础和数学功底了,我们直接来看论文吧。
目前的Attention机制已经可以区分不同的历史课程对推荐目标课程的贡献了。但这样不够,问题在于当用户对许多不同的课程都有兴趣时,也就是说一条历史兴趣序列反应的信息很丰富的时候。由于对目标推荐课程有贡献的课程的影响效果被不同兴趣的其他的历史课程节点影响所稀释,因而导致Attention机制表现变差。
如图所示的第一行:目标课程为大数据课程,他原本与数据结构、操作系统、编程基础这三门用户历史学习课程是有着较高的Attention得分的,但由于用户的学习历史序列中有着大量无关的课程,于是导致目标推荐课程最终得分很低,可能不会被推荐给用户(但用户本应该收到该推荐,因为与他的实际偏好很相关)
如图所示第二行,目标课程为金融管理,与用户之前所有的学习历史记录都是弱相关或者无关,但是这些无关或弱相关item却仍然会严格的给该目标课程提供一个Attention得分,甚至还比第一行的得分高(这就导致它比刚才本该推荐给用户的课程有更大的几率被推荐,这是严重错误的,导致一个与用户偏好无关的课程被推荐)
筛选后的数据集:1302门课程,82535用户,458454次用户参与课程的记录(用户-课程对的形式)。(学堂在线的记录数据集)
数据集来自学堂在线的平台收集,对于课程作者将不同年份的相同课程归为同一门课程,对于用户的清洗,选择从16年10月到18年3月至少注册了三门的用户(筛选掉了所有不具备长学习序列的用户)。另外还收集了用户观看的课程中每个视频的持续时间,作为备用分析素材。
为不断涌现的大量不同类型的课程进行有效的推荐,具体表现为得到用户t时刻之前的所有参与课程记录,去尝试在t+1时刻推荐最相关的课程给用户。精准区分用户,并为用户的偏好建模。
根据之前提出的问题,我们发现主要问题就是来自于历史学习课程序列当中的噪声(也就是那些对目标课程item本质上相关度很小或者贡献度很低的课程)会严重干扰到最终的Attention得分,进而影响到预测推荐结果。本文打算通过去除噪声课程来修改用户的profile,而不再是为每个课程item分配一个独立的Attention系数。
但是有一个比较大的问题就是,如果我们想要移除这些噪声课程,我们需要知道(标注)哪些课程相对于目标属于噪声,这种结论通过专家标注的代价太大,导致手头没有标注数据可以使用,工作难以展开。并且即便请人标注后模型也难以应用在大规模的新数据集当中,这不利于模型的迁移。
为了解决这个问题,作者提出了一种分层强化学习算法。第一步先将这个问题形式化为一个分层的顺序决策过程。然后在由数据集和预训练模型构成的环境的反馈监督下,执行高级别(high-level task)和低级别(low-level task)的任务来去除profile中的噪声课程。模型核心由两部分profile reviser(序列修改器)和basic recommendation model(基本推荐模型)构成,本质上来讲,二者是进行联合训练的。
首先,进行数据分析,要找到解释做这个work的必要性依据(我们需要证明修正用户profile会影响到推荐结果),可以根据下面的几组图来分析:
可以看到,图1上方的图表示出了数据集中用户参与课程门数的一个分布情况,而下方的图表示了用户参与课程门类的个数的分布情况。我们不难发现,大多数用户参与的课程数量很门类还是相对少并且集中的,少部分用户参与了多种类型的课程,或者参加了多门课程。但只有这些是不够的,我们想要确定数据集能否拿来解决我们提出的实际问题,或者说有没有实验的价值。那么基于此该怎么继续分析呢?在这里作者设计通过计算一个用户课程门类数和课程参与总数的比值,来反映用户的专注度。(这个比值越高意味着用户越容易分心,越小则代表这用户是越专注的)于是我们得到了图2的这个分布:
有了专注度的分布后,我们结合三个图一起看,可以发现,虽然大量用户仅参与了少量的课程,但是没关系,他们之间的比例分布是相对均匀地。有了这个结论后,我们等于初步验证了数据集对于解决当前问题的有效性。但我们还希望能更好地去使用专注度这个数据。怎么办呢?
于是,进一步作者又对“相同专注度的用户序列”能否通过“NAIS基本推荐模型”来“成功推荐真实的目标课程的概率”进行了平均,并将结果分布在图3中给了出来:
通过观察,我们可以看出,从左到右,随着用户的专注力下降(x轴比值升高),目标课程被成功推荐的概率越低。
总之,通过以上分析,我们知道了大量用户参与了不同的课程,并且基于这些不同的profile推荐的性能是受到影响的,这也就得出了我们想要的结果,证实了修证用户profile会影响推荐结果。因此我们的研究是有必要的,必须要研究如何去修正用户的profile。
在这里,作者多做了进一步分析。还记得我们刚才在数据集分析的过程中说过的吗,作者还收集了用户观看的课程中每个视频的持续时间这个数据。这时候用上了,作者计算一个视频的观看时长与总时长的比值作为观看比值,并使用同一个课程中所有视频的最大观看比值表示用户在该课程中的努力(笔者在这里认为是不是用均值更好一些)。随后在图4中,作者给出了用户课程的努力分布:
在右上角嵌入的子图中给出了过滤后的努力分布(即过滤出了大于0.01的努力部分),这表明用户在不同的课程中付出了不同的努力。这一现象可以指导随后模型的Agent代理策略设计。
U代表用户集合,C代表课程集合。
其中,代表u的历史课程序列,也就是用户u的profile,其中的每一个小e代表着用户在某时刻参与的某一个课程结点。T代表的是相对时刻,目标就是推荐时u将会参加的课程。
这个基本的推荐模型是会参与到联合训练中的,所以也拿出来介绍一下,论文中也有详细的解释。
基础模型中将每一个历史课程看作一个实值的低维的Embedding向量,将所有历史课程Embedding聚合起来表示用户的偏好,如果我们把目标推荐课程也表示成的话,那么把目标课程c推荐给用户u的概率就可以表示为:
此时y=1代表的就是将课程成功的推荐给用户。以上表示了一个常规推荐模型共有的部分。那么,不同点在于聚合起来表示用户的偏好是如何实现的。可以采用前文提及的NAIS方法加入Attention机制来计算相关度。
至于具体计算注意力的打分函数f的选取,可以选择多层感知器打分也可以选择内积方式打分。当然也可以选择使用NASR方式来进行聚合计算,在每个时刻t,NASR利用t时刻及之前t-1时刻的所有先前课程结点输出一个隐向量来表示用户在时间t之前的偏好,再对所有时间戳的隐向量用与NAIS类似的注意力机制。但是由于,论文后续部分basic model使用的是NAIS,所以在此不再赘述与NASR相关的内容,有兴趣可以根据我上文提及的相关工作去阅读NASR的工作内容,我也会在文章底部给出链接。
这里,首先先概括的说一下模型的整体结构,然后我再详细的说明模型的训练过程。
之前说过,虽然basic model已经能够提供很好的注意力机制来为课程打分从而更有针对性的推荐,但是问题在于当用户参与课程的diversity很高时,历史课程序列中的贡献课程所提供的贡献度影响会被其他无关课程所稀释。为了解决这个问题,作者提出了一种模型通过对用户的历史参课序列中噪声课程的去除来修改用户profile,并基于新的profile再进行推荐。核心挑战就在于如何去在无标注的情况下对不同的目标推荐课程来有针对性的区分噪声课程。
于是本文提出了一种分层强化学习算法来解决相关问题,具体来说,最核心的就是将用户profile的修正过程形式化为由Agent执行分层顺序决策的过程。按照修正策略执行high-level task 和low-level task两部分任务来实现对用户profile的修正。当全部用户profile都被修正过后,agent从环境中得到延迟的反馈奖励,并基于反馈奖励更新它的修正策略。(这里说的环境就是我们先前的数据集和Basic Recommendation model)。当修正策略更新后,将根据代理修改的profile重新训练Basic Recommendation model。基本上我们可以看出,profile reviser与basic Recommendation model是进行联合训练的。图5表现了我刚才描述的这一过程:
如上图所示的左半部分就是Profile Reviser部分,它用来移除序列中对推荐目标课程没有贡献或贡献很低的噪音结点。本文将Reviser看作是一个分层马尔科夫决策过程(MDP)。但更具体来说,是将马尔科夫决策过程分为了两部分:高阶任务部分Mh和低阶任务部分Ml,其中高阶任务Mh的彻底完成代表着整个马尔可夫决策任务的完成,低阶任务Ml在高阶任务进行过程中将被反复多次的执行。每一种任务都可以抽象为4元组的MDP表示(S, A, T, R),其中S代表状态集,A是动作集,T是将S->A->S(代表SA由某一动作而发生转移为SB的状态转移过程)映射成[0, 1]区间上的概率的状态转移模型,R是将状态转移过程映射为实值奖励的函数。
关于Agent具体执行过程如下:Agent执行一个二值判断的高阶任务来判断是否需要进行profile的修正,如果Agent通过高阶任务发现的确需要修改profile,则执行有多个动作构成的低阶任务,来确定每个课程是否为噪声需不需要被删除。低阶任务完成后,标着这一轮完整任务的完成。当然如果,高阶任务发现不用修改profile了。低阶任务就不用执行,则整个任务直接完成了。
之所以选择分层体系的主要原因是有一部分用户的profile已经具备一定的识别力,并且已经可以被准确推荐,那么这种情况下高阶任务将会直接通过少量的迭代就跳过它们。(这种判断不是空穴来风的,之前的数据集分析起到了非常关键的作用,通过之前的专注力分布我们可以看出大概有30%的用户有着比较高的专注力,并且为这一部分用户采用NAIS推荐的命中率已经能高于6成了)对于这些profile,我们可以简单的保留下它们作为图中原始的original profiles的一部分,只去重点针对性的修改那些区分度不高的用户的profile。
论文中强调,它们定义对于所有层次的任务,给定一个状态和一个动作。必将以概率1过渡到一个确定的状态。对于高阶任务来说,他所采取的动作取决于用户的整体profile也就是,低阶任务采取行动是取决于profile序列中的每一个课程历史结点 接下来基于此对两种不同层次的任务进行分别解释。
这其实很好理解,因为带有随机目标课程的目标课程负例序列实例很难引导代理去选择对目标课程有贡献的课程,我们没必要使用它。即放弃考虑P(y = 0|,)。
接下来就是要定义一下每次策略中要执行的动作了,首先定义为高阶任务动作,它是二值的来表示是否会对profile进行修改。同时定义低阶任务的动作来代表是否移除历史课程,低阶任务的动作执行策略可以参照这几个公式(策略用π表示):
其中,d1为状态数,d2为隐藏层维数,目标是学习w1,w2,b这三个参数。其中,H为输入,使用Sigmoid的作用是将输入转换为一个概率值。π(s,a)代表着t时刻s状态下,执行a动作的策略也就是上面表达成条件概率的形式的那部分。
高阶任务也是求这三个参数(w1,w2,b),与低阶类似,维度稍低而已。
好,策略也定义结束了,那么再来看看奖励怎么算,奖励是很重要的,奖励reward直接反映了我们执行的上一个动作是不是有意义。我们假定,在最后一课程上执行完最后一个动作后,低级任务中的每个低级动作都才能获得延迟奖励。换言之,在最后一个低级动作结束之前,没有任何即时奖励,只有最后一个动作会引发延迟奖励。所以可以定以奖励的表达式R:
其中表示修正后的profile,这个表达式表示了只计算低级任务最终的延时奖励,而不计算过程中的即时奖励。并且计算表达式为对数型表达式是为了方便收敛,结果为正差时则代表修改有了比较好的结果。(作者还考虑到了一种特殊情况,那就是所有课程都被移除了的情况,所以他在课程选取的过程中加入了一些随机性,由于没有进一步说明,笔者推测具体应该是体现在代码中了)
同样的高阶任务在作出修正指令后,一方面安排执行低阶任务,另一方面也会收到相同的低阶任务的延迟奖励。而假如高阶任务判定无需修改,而没有让低阶任务执行,自然收到的反馈也为0。
另外,论文还有一个创新点在这里,作者定义了一个内部奖励机制,放在了低阶任务当中(图5中有),设置内不讲理的主要原因是为了加速局部学习,并且它不会传播到高阶任务当中去(此处作者参考引用了分层策略梯度算法Hierarchical Policy Gradient Algorithms.ICML 2003):
具体来说,就是计算每个历史课程和目标课程在修改前后的平均余弦相似度然后将其差值记作内部奖励G。内部奖励的加入能够激励Agent选择与目标课程更相关的课程。最终将内部奖励G与R相加来计算作为低级任务的奖励反馈。
目标是为了让奖励最大化,或者叫最大化报酬。所以定义目标函数为:
θ即可以代表高阶任务也可以代表低阶任务报酬。
τ代表采样动作和过渡状态的混合轨迹。
由于两个任务混合起来的整个序列有太多的可能的动作-状态轨迹。作者采用了策略梯度定理和基于蒙特卡洛的策略梯度方法(这两种方法本文没有展开细述),对M个动作-状态轨迹进行采样,在此基础上作者计算低级策略函数的参数梯度表达式为:
而高级策略的参数梯度表达式为:
高级策略这里要注意一下,只有也就是需要修改的时候再更新参数,其他情况下不动。
首先看看论文给出的模型训练过程表示:
其实核心在于二者联合训练的解释,其余部分刚才在分别介绍basic Model和Reviser的过程中已经讲过。关于联合训练,首先基于原始数据集与训练基本的Recommendation model,然后固定模型的参数。Profile Reviser启动并开始自动的修正用户profile,在不断修正的过程中更新参数,参数既包括Reviser参数也包含推荐模型参数。一代一代迭代下去,进行联合训练知道输出。为了有一个稳定的参数更新过程,每个参数通过其原始值和新的值的线性组合来更新。
至于实验部分就与我们自己的科研工作不太相关了,在这里不再展开描述,对该封层强化模型的分析就到此为止,希望能够对各位同学产生影响带来帮助,如果有理解错误的地方请指出,非常感谢。
Hierarchical Reinforcement Learning for Course Recommendation in MOOCs. AAAI 2019
https://ojs.aaai.org//index.php/AAAI/article/view/3815