先有鸡还是先有蛋?
数据闭环
推荐系统根据用户日志来进行建模推荐,即:
日志 -> 推荐算法 -> 用户
日志也是由用户产生的,即:
用户 -> 日志
两者拼成一个环状,我们称之为”数据闭环”,即:
“数据闭环”和”越推越窄”
这是一个”先有鸡还是先有蛋?”的问题
问:为什么给A推荐”摇滚”歌曲?
答:因为A过去听的都是”摇滚”歌曲,所以A喜欢”摇滚”。
问:推荐系统不给A用户推”非摇滚”,用户怎么能听到”非摇滚”?
在数据闭环中流转的都是”老Item”,新”Item”并没有多少展现机会,推荐变得越来越窄
“越推越窄”解决方案
越推越窄是典型的EE问题(explore & exploit)
解决方案有两类:
- Bandit: epsilon-greedy, thompson sampling, UCB, linUCB
- RL
Bandit的方案
bandit方案可以参考 http://banditalgs.com/ ,此处不做详细解释, 常见有以下方法:
- epsilon-greedy
- Thompson Sampling
- UCB
- linUCB
RL的方案
RL解决了ML解决不了的两大问题:
- 延迟reward问题
- 数据缺失问题(EE问题,先有鸡先有单
RL有两大实体: - agent
- agent可以从environment中得到reward
- agent需要知道自己的state, agent可以选择自己的action,即是一个p(action|state)的求解过程
- environment
- environment需提供一个reward函数(往往自定义设计)
- environment需进行state的状态转移(往往是黑盒子)
- environment需接收agent的action
两大实体互相作用,有几大重要的元素:
- action: 动作,由agent产生,作用于environment
- reward: 奖赏,environment针对agent的state+action产生的奖赏or惩罚
- state: agent的状态,由action实现状态转移,即p(state_x+1|state_x, action_x)的马尔科夫转移过程
- observation: 即state的外在表现
用图可视化即
两种observation
observation是state的外在表现,那么observation也有两种:
- state space: 直接表达state的空间
比如cartpole中的observation(state)的定义是[position of cart, velocity of cart, angle of pole, rotation rate of pole]
有意思的是,并不需要(往往也不知道)其具体的含义,只知道是一个四维数组 - pixels:
直接从像素级别(声音,嗅觉,味觉,触觉)等得到observation
有意思的是,某时刻的图片不一定能够表达全部信息(比如速度),因此可能用图片串表示observation
p(action_t|pixel_t, pixel_t-1, pixel_t-2, …, pixel_1)
RL
reinforcement learning有两个比较通用的算法
- Q learning
- policy gradients
Q-learning
Q-learning的核心是计算Q值,那么Q值的定义是:
Q value = what our return would be, if we were to take an action in a given state
即Q是一个两维空间[observation, action],表示在某个observation时执行某个action的总的reward和(立即的reward和之后的reward的discount)
Q值 -> action
假设已经有了Q值,那么如何sample出一个action,可以简单用目前observation下的最大的Q,顺便加一些随机性来探索。
Q值更新
Q值的更新需要用到Bellman equation,即:
Q(s,a) = r + γ(max(Q(s’,a’))
其中,
s表示state,也即observation
a表示action
r表示current reward
s’表示next state,即state下做出action之后到达的new state
a’表示next state后的策略,max(Q(s’,a’)表示s’后的最佳策略的Q值
γ表示future reward的一个discount
有意思的是,我们用差分,设置步长,确定方向,来逼近这个值:
1 | Q[s,a] = Q[s,a] + lr*(r + y*np.max(Q[s1,:]) - Q[s,a]) |
OpenAI的FrozenLake-v0完整的code如下:
1 | import gym |
DQN(Deep Q Network)
比如利用CNN来做observation来表达state,即是DQN,后续再更新。