今天写的博客主要参考了2018年WWW会议上的论文《DRN: A Deep Reinforcement Learning Framework for News Recommendation》,主要讲解了在新闻推荐领域如何使用深度强化学习的方法。从整个发展趋势来看,强化学习最近无论是在学术界还是工业界都越来越火了,而由于强化学习框架中包含的实体概念比较多(Agent,State,Action,Reward)等,所以真正使用强化学习并解决问题对建模要求比较高的,往往也是比较复杂的。
其实推荐领域近些年一直被深度学习框架垄断,一般目标都是从优化CTR和CVR入手,从FM到W&D,从DeepFM到Deep interest等等。但是本篇提出使用强化学习思路是为了解决传统深度学习在推荐领域上的不足:
1 新闻领域推荐的多变性,一方面是会不断的有新的新闻产生,另一方面是用户在新闻领域的兴趣会不断地发生变化,传统的方法在这个方面考虑较少;
2 传统的推荐的领域只会单单考虑提升CTR或者CVR,但是用户下一次的return间隔其实也是非常重要的,如果能缩短用户下一次return APP的间隔,也是十分有意义的。
基于此,作者提出了一种基于Q-network(Critic)的强化学习架构,如下图所示:
从图中我们可以看出作者对于强化学习框架中几个实体的定义,Reward=click + user activiness,state= user features + context features,action=feature representation for candidates news。其中Q-network的网络架构如下所示:
最终的网络输出
Q
(
s
,
a
)
Q(s,a)
Q(s,a)就是在当前state采取action a获得的reward,从图中不难看出网络的输入一共用到4类特征:user features, context features, user-news feature, news features。
news features:由417维的one-hot编码向量组成,来描述当前news是否有包含headline,entity name等,已经过去1小时,6小时,24小时中的总点击次数。
user features: 指的是该用户在过去1小时,6小时,24小时内点击过的news的特征的融合表征。
user-news features:描述的是当前推荐的news和用户的交互特征,比如过去一段时间内用户对当前news的交互历史。
context features:描述的是用户在请求当前news的上下文特征,比如请求在一天内的时间特征,在一周内的时间特征,请求该news的时间和news发布时间的时间差。
下面来介绍一下这里使用的Q-network 的一些实现细节:
y
s
,
a
=
Q
(
s
,
a
)
=
r
i
m
m
e
d
i
a
t
e
+
β
r
f
u
t
u
r
e
=
r
a
,
t
t
+
1
+
β
Q
(
s
a
,
t
+
1
,
a
r
g
m
a
x
a
∗
Q
(
s
a
,
t
+
1
,
a
∗
;
W
t
)
;
W
t
∗
)
y_{s,a}=Q(s,a)=r_{immediate}+ \beta r_{future}=r_{a,t_{t+1}}+\beta Q(s_{a,t+1},arg max_{a^*}Q(s_{a,t+1},a*;W_t);W_t^*)
ys,a=Q(s,a)=rimmediate+βrfuture=ra,tt+1+βQ(sa,t+1,argmaxa∗Q(sa,t+1,a∗;Wt);Wt∗)
其中
W
t
∗
W_t^*
Wt∗和
W
t
W_t
Wt是完全两套不同的参数,但是在训练一定的iterations之后这两个部分的参数值会互换,这样有效的缓解了Q-network的over estimate问题。
需要注意的一个细节是,为了能够更好的表征一次推荐结果带来的增益好处,
r
i
m
m
e
d
i
a
t
e
=
r
c
l
i
c
k
+
β
r
a
c
t
i
v
e
r_{immediate}=r_{click}+\beta r_{active}
rimmediate=rclick+βractive,
r
c
l
i
c
k
r_{click}
rclick代表是否用户点击了该news即1或者0,这一项是比较好算的;
r
a
c
t
i
v
e
r_{active}
ractive代表用户点击了该news之后再一次返回APP的概率,这部分的计算借鉴了先人之前的研究成果,这里就直接给出结论了:
r
a
c
t
i
v
e
=
S
(
t
)
=
e
−
∫
0
t
λ
(
x
)
d
x
r_{active}=S(t)=e^{-\int_0^t\lambda(x)dx}
ractive=S(t)=e−∫0tλ(x)dx,这里为了简化起见,将
λ
(
t
)
=
λ
0
\lambda(t)=\lambda_0
λ(t)=λ0,即假设每一个用户return的概率是一个固定值,那么
S
(
t
)
=
e
−
λ
0
t
S(t)=e^{-\lambda_0 t}
S(t)=e−λ0t,每当检测到用户返回APP的时候,
S
(
t
)
=
S
(
t
)
+
S
0
S(t)=S(t)+S_0
S(t)=S(t)+S0,
S
0
S_0
S0是一个固定值,如果说
S
(
t
)
+
S
0
>
1
S(t)+S_0>1
S(t)+S0>1那么就强制令其等于1,那么整个过程的
S
(
t
)
S(t)
S(t)变化图像如下所示:
整个模型的训练分为线下和线上两个部分,其中线下部分就是从用户点击日志入手,使各个用户的在过去一段时间内的日志作为训练集进行训练,并无特别之处。但是线上部分是有一定策略的,下面来详细说一下这个过程:
1 PUSH:在每一个
t
i
m
e
s
t
a
m
p
(
t
1
,
t
2
,
t
3
.
.
.
.
)
timestamp (t_1,t_2,t_3....)
timestamp(t1,t2,t3....),当每一次用户发送了request给系统,Agent 将会把当前user representation 和candidate news representation作为输入生成L个候选集推给用户;
2 FEEDBACK: user 会把对于推荐news list L的反馈list B反馈给推荐系统,推荐系统将B记录到日志中去;
3 MINOR update:发生在每一个timestamp之后,用户将会根据network Q Q Q和exploration network Q ∗ Q^* Q∗的结果来决定是否对 Q Q Q更新,这部分细节将在后面详细讲解。
4 MAJOR update:发生在多个timestamp之后,当Agent的日志积累了一定量的反馈之后,Agent会sample一部分的日志记录对 Q Q Qnetwork进行更新,这个过程其实和离线部分是一样的,就不赘述了。
下面我们对于3步骤进行详细讲解,之所以存在一个expoloration network
Q
∗
Q^*
Q∗,是因为这是为了使强化学习
Q
−
n
e
t
w
o
r
k
Q-network
Q−network具有更广的搜索空间,具体做法如下图所示:
其实从图中可以看出,这个exploration
Q
∗
Q^*
Q∗并没有给网络增加额外的参数量,即
W
+
Δ
W
=
W
∗
W+\Delta W=W^*
W+ΔW=W∗,而
Δ
W
=
α
.
\Delta W=\alpha.
ΔW=α.
r
a
n
d
(
−
1
,
1
)
.
W
rand(-1,1).W
rand(−1,1).W。其实就是在原有网络参数的基础上加上一个很小的随机扰动,使其具有在小范围内的搜索能力,即explore能力。这样子把
Q
−
n
e
t
w
o
r
k
Q-network
Q−network和
Q
∗
−
n
e
t
w
o
r
k
Q^*-network
Q∗−network推荐的结果各抽取几条推荐给用户,根据用户的反馈来决定对
Q
−
n
e
t
w
o
r
k
Q-network
Q−network的参数是否跟新,如果用户对于
Q
−
n
e
t
o
w
r
k
Q-netowrk
Q−netowrk的推荐结果news比较肯定,那么
Q
−
n
e
t
w
o
r
k
Q-network
Q−network的参数
W
W
W不变;而如果用户对于
Q
−
∗
−
n
e
t
w
o
r
k
Q-^*-network
Q−∗−network的推荐结果比较肯定,那么就将
Q
−
n
e
t
w
o
r
k
Q-network
Q−network向
Q
∗
−
n
e
t
w
o
r
k
Q^*-network
Q∗−network的方向进行微调,即
W
=
W
+
η
W
∗
W=W+\eta W^*
W=W+ηW∗。
最终,作者通过大量的在线和离线实验对比了该模型和传统的基于深度学习的推荐系统在news上的推荐效果,证明了该提出模型的有效性。