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

star2017 1年前 ⋅ 549 阅读

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

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

导语

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

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

什么是强化学习

(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共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: