强化学习随笔(2)

<img src="./images/rl_gambling.jpg">

  • 状态
    State = (item_1,item_2,item_3,item_4)

  • 行为
    Action = (0,1,0,0)

  • 奖励
    Reward = (0,1)

  • 状态到动作
    S = \pi(a|s)

  • 状态、动作到奖励关系
    R = \pi(S,A)

  • 动作到状态
    S^{\prime} = \pi(S,A)

  • S^{\prime},A,R 都是随机变量

目标函数

通过调整参数更新参数,让模型的参数最小。

我们需要将问题变为一个优化问题,
\max \sum R

调整的\pi(s|a),在系统中,可以改变就是策略,所以能够改变,
这里有一个问题,这个问题是什么,如果要优化策略时间点和最大目标时间点是否一致,这个是需要考虑,我们那 alphaGo 来解释这个问题,在 alphaGo 每下一局会得到 reward,但是对于每一步是没有 reward 的。但是我们在 AlphaGo 优化策略是每一步上,这也就是优化难点,

例如现在努力学习,要考研,就要放下当前找工作来获得 reward ,探索与利用之间矛盾。

N \max(P_1,\cdots,P_{10})

E = \sum P_i

汤普森采样

Beta 分布

Beta 布可以看作是一个概率的分布,当我们不知道一个东西的具体概率是多少时,给出了所有概率出现的可能性大小,可以理解为概率的概率分布。

棒球运动的一个指标就是棒球击球率,就是用一个运动员击中的球数除以总的击球数,一般认为 0.27 是一个平均的击球水平,如果击球率达到 0.3 就会认为非常优秀了。如果我们要预测一个棒球运动员,他整个赛季的棒球击球率,怎么做呢?你可以直接计算他目前的棒球击球率,用击中数除以击球数。但是,这在赛季开始阶段时是很不合理的。假如这个运动员就打了一次,还中了,那么他的击球率就是100%;如果没中,那么就是 0%,甚至打 5、6 次的时候,也可能运气爆棚全中击球率 100%,或者运气很糟击球率 0%,所以这样计算出来的击球率是不合理也是不准确的。

当运动员首次击球没中时,没人认为他整个赛季都会一次不中,所以击球率不可能为 0。因为我们有先验期望,根据历史信息,我们知道击球率一般会在 0.215到0.36之间。如果一个运动员一开始打了几次没中,那么我们知道他可能最终成绩会比平均稍微差一点,但是一般不可能会偏离上述区间,更不可能为 0。

一个最好的方法来表示这些先验期望(统计中称为先验(prior))就是beta,表示在运动员打球之前,我们就对他的击球率有了一个大概范围的预测。假设我们预计运动员整个赛季的击球率平均值大概是 0.27左右,范围大概是在 0.21 到0.35之间。那么用 Beta 分布来表示,我们可以取参数 \alpha=81\beta=219,因为 \frac{\alpha}{\alpha + \beta}=0.27,图形分布也主要集中在0.21~0.35之间,非常符合经验值,也就是我们在不知道这个运动员真正击球水平的情况下,我们先给一个平均的击球率的分布。

假设运动员一次击中,那么现在他本赛季的记录是“1次打中;1次打击”。那么我们更新我们的概率分布,让概率曲线做一些移动来反应我们的新信息。

汤普森采样

汤普森采样的背后原理正是上述所讲的 Beta 分布,把 Beta 分布的 a 参数看成是推荐后用户点击的次数,把分布的 b 参数看成是推荐后用户未点击的次数,则汤普森采样过程如下

  • 取出每一个候选对应的参数 a 和 b
  • 为每个候选用 a 和 b 作为参数,用 Beta 分布产生一个随机数
  • 按照随机数排序,输出最大值对应的候选
  • 观察用户反馈,如果用户点击则将对应候选的 a 加 1,否则 b 加 1

实际上在推荐系统中,要为每一个用户都保存一套参数,比如候选有 m 个,用户有 n 个,那么就要保存 2 \times m \times n 个参数。

1)如果一个候选被选中的次数很多,也就是 a+b 很大了,他的分布会很窄,换句话说这个候选的收益已经非常确定了,就是说不管分布中心接近 0 还是 1 都几乎比较确定了。用他产生随机数,基本上就在中心位置附近,接近平均收益。

2)如果一个候选,不但 a+b 很大,即分布很窄,而且 a/(a+b) 也很大,接近 1,那就确定这是个好的候选项,平均收益很好,每次选择很占优势,就进入利用阶段。反之则有可能平均分布比较接近与0,几乎再无出头之日。

3)如果一个候选的 a+b 很小,分布很宽,也就是没有被选择太多次,说明这个候选是好是坏还不太确定,那么分布就是跳跃的,这次可能好,下次就可能坏,也就是还有机会存在,没有完全抛弃。那么用它产生随机数就有可能得到一个较大的随机数,在排序时被优先输出,这就起到了前面说的探索作用。

choice = numpy.argmax(pymc.rbeta(1 + self.wins, 1 + self.trials - self.wins))

首先我们有一个先验概率,然后通过做实验会有一个后验概率,
P(x) = p^{k}q^{(N-k)}

具体来说,我们就考虑 Beta-Bernoulli Bandit,也就是说,对于 我们的先验分布(prior distribution)是 Beta 分布,而每个 arm reward 的分布是以 \theta 为参数的 Bernoulli 分布。容易知道,在这种情况下,的后验分布仍然是 Beta 分布。

这里只用到了最基本的概率论和统计的知识,以防大家有些失忆,我写一些关键的公式出来。假设现在我们有 K 个机器,那么平均的 reward \theta = (\theta_1,\theta_2,\cdots,\theta_K) 事先是不知道的。在一开始,算法会选择一个 A 然后会观察到 reward r_1 \in \{0,1\}这是一个从Bernoulli分布进行 sample P(r_1 = 1|a_1,\theta) = \theta_{a1} P(r_1 = 0|a_1,\theta) = 1 -\theta_{a1}

此外对于 Bernoulli 的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章