Fork me on GitHub

要提升微信看一看推荐混排的长期收益?试试深度强化学习

第一篇:微信「看一看」 推荐排序技术揭秘

第二篇:详文解读微信「看一看」多模型内容策略与召回
微信 "看一看" 内容理解与推荐

导语

相比于传统的监督学习方法,强化学习能够最大化长期收益,正是推荐系统更加需要的。做好当下做好固然重要,但放眼未来才能看得更远。

本文主要是在看一看算法推荐算法过程中的实践,文章主要从强化学习的基本概念、为什么要用强化学习、强化学习在混排中的应用和一些思考四个方面展开论述。

什么是强化学习

(1)基本概念

<A, S, R, P>就是RL中经典的四元组了。A代表的是Agent的所有动作;State是Agent所能感知的世界的状态;Reward是一个实数值,代表奖励或惩罚;P则是Agent所交互世界,也被称为model。

(2)与监督学习,非监督学习的区别

简单来看就是,强化学习与其他最显著的区别就是最大化了长期收益。

(3)Multi-armed bandit 多臂赌博机

作为大家在推荐算法中最常用的强化学习算法系列,MAB相关算法基本大部分人都很了解,基本思想就是对于未知进行explore,当对于未知有一定认知之后,就用认知到的信息就行exploit。

(4)强化学习的算法和AlphaGo

对于绝大多数的人来说,第一次听说强化学习,还是从AlphaGo战胜李世石了解到的。

强化学习中常用的算法主要分为两类,policy-based和value-based,而在AlphaGo中就同时应用了这两种类型的网络,分别建立了分析当前局面的值网络和根据当前局面下棋的策略网络。

(5)强化学习实践

如果大家要实践自己的强化学习算法,可以在OpenAI的GYM上去实践。

比如,我们看最经典的CartPole这个游戏:

我们去尝试用经典的QLearning方法来做,

import gym

import random

import numpy

 

N_BINS = [5, 5, 5, 5]

LEARNING_RATE=0.05

DISCOUNT_FACTOR=0.9

EPS = 0.3

 

MIN_VALUES = [-0.5,-2.0,-0.5,-3.0]

MAX_VALUES = [0.5,2.0,0.5,3.0]

BINS = [numpy.linspace(MIN_VALUES[i], MAX_VALUES[i], N_BINS[i]) for i in xrange(4)]

 

def discretize(obs):

    return tuple([int(numpy.digitize(obs[i], BINS[i])) for i in xrange(4)])

 

qv = {}

 

 

env = gym.make('CartPole-v0')

print(env.action_space)

print(env.observation_space)

an = env.action_space.n

 

def get(s, a):

    global qv

    if (s, a) not in qv:

        return 0

    return qv[(s, a)]

 

def update(s, a, s1, r):

    global qv

    nows = get(s, a)

    m0 = get(s1, 0)

    m1 = get(s1, 1)

    if m0 < m1:

        m0 = m1

    qv[(s, a)] = nows + LEARNING_RATE * (r + DISCOUNT_FACTOR * m0 - nows)

 

for i in range(500000):

    obs = env.reset()

    if i % 1000 == 0:

        print i

    for _ in range(5000):

        s = discretize(obs)

        s_0 = get(s, 0)

        nowa = 0

        s_1 = get(s, 1)

        if s_1 > s_0:

            nowa = 1

        if random.random() <= EPS:

            nowa = 1 - nowa

        obs, reward, done, info = env.step(nowa)

        s1 = discretize(obs)

        if done:

            reward = -10

        update(s, nowa, s1, reward)

        if done:

            break

 

 

for i_episode in range(1):

    obs = env.reset()

    for t in range(5000):

        env.render()

        s = discretize(obs)

        maxs = get(s, 0)

        maxa = 0

        nows = get(s, 1)

        if nows > maxs:

            maxa = 1

        obs, reward, done, info = env.step(maxa)

        if done:

            print("Episode finished after {} timesteps".format(t+1))

            break

为什么用强化学习

(1)看一看混排

做混排有几个难点:

数据异构:不同的数据包含不同的特征。

目标不同:不同内容的各自优化目标不同,很难做统一的内容排序。

运算量大:总的计算量高达业务数*每个业务的精排数量。

内容的质量不同:点击率高的优质内容,比如高点击率的视频,会挤压低点击率的业务。

(2)统一的点击率预估排序

结论:视频是业务中点击率最高的,新闻则是点击率最低的,把点击率高的业务占比提高,点击率低的业务占比降低会提高整体的点击率,但不会提高整体点击数。

(3)强化学习的引入 - 优化长期收益

用户在推荐场景浏览可以建模成 Markov Progress。

Agent是我们的推荐系统,Action是我们推荐了什么内容,Reward是反馈信息,包括点击、负反馈、退出等。

每次我们的推荐系统Agent采取某个Action,推荐了内容后,就会收到相应的反馈。

(4)强化学习的优势

为什么强化学习优于监督学习?

混排三路召回,mp,video,news合并

混排三路召回,mp,video,news合并



Case

mp,video,video(0,1,1)

video,mp,mp(1,0,0)

video,video,video(1,0,0)



监督学习预测最优解是第三种,

选择点击率最大的。

强化学习预测最优解是第一种,

选择总收益最大的。

监督学习预测最优解是第三种,

选择点击率最大的。

强化学习预测最优解是第一种,

选择总收益最大的。

强化学习在看一看混排中的应用

(1)Session wise recommendation

(2)Personal DQN

当用户的请求到来时会根据他之前的行为计算隐状态作为此次输入state的一部分,每次选择某个业务作为action,反馈点击作为reward。

(3)离线评估 AUC?

做算法,非常重要的一个环节就是做离线评估,传统的CTR预估用的就是AUC来评价:

我们先看看传统AUC的意义,传统AUC的意义有两种:假阳率和真阳率画出ROC曲线围成的面积表示了阈值移动情况下真阳假阳的表现。

随机取一个正值和负值,正值的预估值大于负值预估值的概率,即 P(pred(a) > pred(b) | y(a) > y(b))。

利用第二种定义,我们将其进行扩展来定义我们新的AUC:P(Q(a) > Q(b) | sum reward(a) > sum reward(b))。

为什么不像其他很多人一样利用一些模拟器的方式来做评价呢,很多实践表明,模拟器的方式有很大的偏置,利用一些模拟器可能会导致模型学偏。而这里新的AUC表征了实际数据的情况,比起利用模拟器来说更优。

我们可以看到新的AUC更符合我们长期收益的定义,即,最大化总点击数。

(4)线上效果

上线后,我们总的停留时长提高了7%,baseline对比的是规则混排,我们同样对比了相同网络的监督学习的效果,也有1-2%的提升。

(5)模型优化

Session based recommendation

利用RNN来建模session内的信息,将DQN内state用RNN的hidden来描述能更好的建模session内的特征。

(6)模型优化

** Bloom embedding & Dueling DQN**

Bloom embedding用于减小hash之间的冲突利用 Dueling DQN的方式,将user context的信息抽离出来,最后利用attention的方式连接,能够让模型很好地学到时间、位置等bias信息。

(7)模型优化Double DQN &

Dueling Double DQN (aka DDDQN)

(8)负反馈 Reward & Focal loss

我们可以把负反馈信息作为负的reward学到我们的模型里,但是有一个问题,负反馈信息过于稀疏。负反馈占总展现的比例大概千分之一,于是我们引入CV里的Focal loss做优化,对于easy case减小梯度权重,对于hard case加大权重,让稀疏的hard case能学得更好,最终使得负反馈率降低19%。

一些思考

AC 和 GAN

我也不是RL的专家,但我认为GAN是使用RL来解决生成建模问题的一种方式。GAN的不同之处在于,奖励函数对行为是完全已知和可微分的,奖励是非固定的,以及奖励是agent的策略的一个函数。但我认为GAN基本上可以说就是RL。

Ian Goodfellow(生成对抗网络之父)

我们发现强化学习的AC结构和GAN的结构非常类似,而且GAN的作者也表示GAN是一种RL,后面我们就考虑把RL和GAN做一些融合,利用相互间的优势,更好地提高我们的系统。


本文地址:https://www.6aiq.com/article/1600460653310
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出