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

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

微信 “看一看” 内容理解与推荐

导语

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

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

什么是强化学习

(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

![](https://img.6aiq.com/e/