心理学的强化学习

  • 条件反射

  • 单臂老虎机任务

  • 概率反转学习

  • 学习率是什么

1、四种著名的动物

心理学中有四只著名的动物分别代表了四种不同的学习方式:

1.1 巴甫洛夫的狗(Pavlov's dog)

动物无需学习就会对食物分泌口水,这是生理过程决定的,被称为无条件刺激,而对食物产生的口水分泌被称为非条件反射(或无条件反应)。但是俄国生理学家巴甫洛夫注意到,除了食物之外,狗还会对着喂他们的人分泌口水。为了实验验证这一观察,他在喂食狗之前先给予一个中性刺激,如响铃或亮灯。在重复多次之后,仅提供这些中性刺激就可以诱发狗分泌口水。这一将无条件刺激与中性刺激联系起来的学习过程被称为经典条件反射(classic conditioning)。

图1 巴图洛夫的狗实验

1.2 桑代克的猫(Thorndike's cat)

美国心理学家桑代克把饥饿的猫放在带闩的木箱里,这个木箱的门可以通过移动闩来打开,猫如果成功打开门就可以获取箱外的食物。一开始,猫只会发出焦虑的叫声并随即抓箱子,最后会偶然撞上门闩成功获得食物。经过反复试验,猫会学会更快地操作锁扣,以逃离盒子并到达食物。桑代克测量了猫在每次试验中逃离盒子所需的时间,并绘制了一条学习曲线,在该曲线中,逃脱时间随着连续试验而减少。桑代克认为这一学习过程是通过尝试慢慢减少错误,因此又称为基于错误的学习(error-based learning)。桑代克同时提出了效果律(law of effect),即得到满意效果的行为重复出现的概率会上升,得到不满意效果的行为重复出现的几率会下降。

图2 桑代克的猫实验

1.3 科勒的黑猩猩(Kohler’s chimpanzee)

德国格式塔心理学家科勒为黑猩猩设计了一系列更加复杂的任务,例如将食物扔到窗外,并关上窗户,黑猩猩能够很快以最短路径找到消失的食物。因而科勒认为动物学习过程并非单纯的试错,也有对事物的深入理解参与其中,这种学习方式称之为顿悟式学习(insight learning)。

1.4 斯金纳的老鼠(Skinner’s mouse)

在桑代克的基础上,斯金纳设计了操作性条件反射室(斯金纳箱)来研究老鼠的学习行为。老鼠必须按下特定按钮来获得奖励(食物)或者消除惩罚(噪声),实验过程中动物会强化能获得奖赏的行为,减少得不到奖赏的行为。因而斯金纳提出了操作性条件反射(operant conditioning),也称工具性条件反射(instrumental conditioning)。在工具性条件反射的学习过程中,动物的自主行为受到由该行为带来的奖励或惩罚的调控,其频率会因为强化而增加,因为惩罚而减少。

图3 斯金纳的老鼠实验

经典条件反射与工具性条件反射代表了两种不同的学习模式,经典条件反射是通过无条件刺激与中性刺激的配对形成的非自愿的、机体自动发生的学习过程;而工具性条件反射是动物自愿行动的结果反过来强化其特定行为的学习模式。经典条件反射是所以工具性条件反射是一种可以基于反馈不断学习最优策略的方法,并由此启发了强化学习。

2、单臂老虎机问题

在斯金纳箱中,老鼠每按下一个按钮就能获得对应的奖赏或惩罚,而在自然界中,决定与奖赏的对应关系是并不明确的,某个决策并不能每次都能获得奖赏,如是否采取捕猎行为或是否投资某一个项目。在这种情形下,生物要如何学习使得奖赏最大化呢?

图4 单臂老虎机

老虎机即是一个最简单的例子,玩家投币之后拉动侧面的拉杆,内部的三个转轴就会带动前方的图案旋转,最后出现三个相同的图案时就可以获得奖金。进一步假设玩家可以向左或向右拉动拉杆,即左右两个选项,选择左边选项获得奖励的概率是p,则选择右边选项获得奖励的概率是1-p。如果每次老虎机给出的奖励数量是固定的,每一个选项的价值(value)就可以简单等同于获得奖励的概率,某一选项获得奖励的概率越大,价值越高。在这样一个赌博试验中,受试并不知道这一概率的设定,因此需要不断地试错来学习这一奖赏概率。显然,最简单的一种方法是尝试很多次同一选项,然后求该选项的平均奖赏。为了模拟这一学习过程,我们假设受试每次都选择左边,因为试验结果是二元的,故可以用伯努利分布模拟被试每次获得的奖励。

import numpy as np
from scipy.stats import bernoulli
p = 0.6 # 人为设定奖赏概率(reward probability)
T = 1000 # 尝试1000次

# 模拟T个试次中被试获得的奖赏
reward = bernoulli.rvs(p, size=T)
print(reward[:10])

受试每选择一次,就把之前的t次奖赏进行平均,由此可以画出受试随着试次数增加,对左边选项的价值的估计。

import matplotlib.pyplot as plt
v = np.empty(T)
for i in range(T): # 为每个试次执行循环操作
    if i == 0: 
        v[i] = reward[0]
    else:
        v[i] = reward[:i].mean()# 对之前i个试次中的奖赏求平均

plt.plot(v, '-o')
plt.axhline(p, color='r')
plt.xlabel('Trials')
plt.ylabel('Value')
plt.ylim([0, 1])

我们可以看到随着试次数增加,受试对左边选项的价值的估计会逐渐收敛到其真实值,这一方法叫做历史平均法。但是历史平均法要求受试在“内存”里面记录下之前所有试次的奖赏值,人脑容量是有限的,因此这是一种非常不经济的方法,有没有其他方法可以更经济地实现对某一选项价值的估计呢?

首先观察一下历史平均法,在第 tt 个试次,之前所有tt 个奖赏值rr 的平均值即为该选项的价值的估计值 VtV_t,可以表示为:

Vt=1t(r1+r2+...+rt1+rt)(1)V_t=\frac{1}{t} (r_1 + r_2 + ... + r_{t-1} + r_t)\tag{1}

我们可以得出 tt的前一个试次时价值的估计值:

Vt1=1t1(r1+r2+...+rt1)(2)V_{t-1}=\frac{1}{t-1} (r_1 + r_2 + ... + r_{t-1})\tag{2}

因此联立以上两个公式,我们可以得出VtV_t 是基于 Vt1V_{t-1}进行更新的:

Vt=1t((t+1)Vt1+rt)=Vt1+1t(rtVt1)(3)V_t=\frac{1}{t} ((t+1) V_{t-1} + r_t)\\ =V_{t-1}+\frac{1}{t}(r_t - V_{t-1})\tag{3}

这就是强化学习的递推公式,该式子中有几个关键的要素:

VtV_tVt1V_{t-1}分别是 tt时刻与前一时刻( t1t-1)某一选项的估计价值(value); rtVt1r_t - V_{t-1}表示 tt时刻观察到的奖赏与前一时刻的估计价值之间的差距,因而可以定义为预测误差1t\frac{1}{t} 表示这一预测误差以一定的比例贡献于估计价值的更新,因此定义为学习率(learning rate)。

了解了这三个关键要素之后,式子(3)可以解释为,tt 时刻对某一选项的估计价值 VtV_t 是在前一时刻估计价值的基础上,以一定的学习率,更新一部分的预测误差。这样受试就不必记住之前所有试次的奖赏值,而只需要记住上一个试次时对价值的估计值就可以了,这样就大大地释放了他的“内存压力”。

在历史平均法中,学习率 1t\frac{1}{t} 是随着试次数量增加而逐渐减小的,因此可以预见当试次数特别大的时候,学习率将趋近于0,价值也就几乎不更新了。这个时候一旦我们将两个选项的奖赏概率进行调整,受试对真实值的估计将收敛得非常慢,因此缺乏灵活性,难以适应新环境,这就是所谓的概率反转学习(probabilistic reversal learning)。

3、概率反转学习

概率反转学习(probabilistic reversal learning)是心理学强化学习中最常用的一个实验范式。在之前的老虎机问题中,我们将左边选项的中奖概率p设定为0.6。但如果经历了1000个试次之后,左右两个选项的中奖概率发生了反转,如下图所示,这个时候历史平均法就将面临收敛极慢的问题。

T1 = 1000
p1 = 0.6
T2 = 1000
p2 = 0.4
a = 0.02

reward1 = bernoulli.rvs(p1, size=T1) 
reward2 = bernoulli.rvs(p2, size=T2)
reward = np.hstack((reward1, reward2))

v_fix = np.empty(T1+T2)

for i in range(T1+T2):
    if i == 0: # 第一个试次,没有reward, 认为其概率为0.5
        v_avg[i] = 0.5
    else:
        # 历史平均法
        v_avg[i] = v_avg[i-1] + 1/(i+1) * (reward[i]-v_avg[i-1])

plt.figure(figsize=(4,4))
plt.plot(range(T1+T2), v_avg, '--')

plt.hlines(p1, 0, T1, color='m')
plt.hlines(p2, T1, T1+T2, color='m')
plt.vlines(T1, p1, p2, color='m')

plt.legend()
plt.xlabel('Trials')
plt.ylabel('Value')

这一问题的关键在于历史平均法的学习率是随着试次增加而逐渐减小的,这显著限制了学习的灵活性,因此我们可以将学习率固定下来,这种学习过程叫做固定学习率的方法。

for i in range(T1+T2):
    if i == 0: # 第一个试次,没有reward, 认为其概率为0.5
        v_fix[i] = 0.5
    else:
        # 固定学习率
        v_fix[i] = v_fix[i-1] + a * (reward[i]-v_fix[i-1])
        
plt.figure(figsize=(4,4))
plt.plot(range(T1+T2), v_avg, '--')

plt.hlines(p1, 0, T1, color='m')
plt.hlines(p2, T1, T1+T2, color='m')
plt.vlines(T1, p1, p2, color='m')

plt.legend()
plt.xlabel('Trials')
plt.ylabel('Value')

可以看出,固定学习率的方法相对于历史平均法有以下两个好处:(1)需要更少的记忆资源的开销(2)有利于较快地适应新环境

plt.figure(figsize=(4,4))
plt.plot(range(T1+T2), v_avg, '--', label='averaging')
plt.plot(range(T1+T2), v_fix, '--', label='fixed rate')

plt.hlines(p1, 0, T1, color='m', label='True value')
plt.hlines(p2, T1, T1+T2, color='m')
plt.vlines(T1, p1, p2, color='m')

plt.legend()
plt.xlabel('Trials')
plt.ylabel('Value')

最后,我们得到了心理学中强化学习最终的递推公式:

Vt=Vt1+a(rtVt1)(4)V_t=V_{t-1}+a*(r_t - V_{t-1})\tag{4}

其中 VtV_tVt1V_{t-1} 为某一选项的价值(value), rtVt1r_t - V_{t-1} 表示预测误差, aa 表示学习率(learning rate)。

4、强化学习的神经基础

在上一节中,我们推导得出了心理学中强化学习的公式(式子4),这个公式几乎是目前几千篇论文背后的数学基础,这一基于行为实验得来的学习模式的神经基础是什么呢?

4.1 多巴胺能神经元编码预测误差

首先在猴子上重复巴普洛夫的经典实验,让猴子把一张图片和果汁(奖赏)联系起来,即出现一张图片之后的一定时间(例如500ms),给猴子一定量的果汁作为奖赏。然后记录其在不同奖赏模式下多巴胺神经元的反应,实验结果如下图所示。

在未建立条件反射的阶段,相当于没有条件刺激(CS,conditioned, reward-predicting stimulus,即图片刺激)而直接给予奖赏(R, primary reward),奖赏 rtr_t 大于预测 Vt1V_{t-1},因而 rtVt1r_t - V_{t-1}是一个正向的预测误差(positive error in prediction of reward),记录到了多巴胺神经元更加活跃的发放模式。建立了条件反射之后,条件刺激本身就会引发多巴胺神经元的高发放,但是实际的奖赏却不再能够激活其发放,因为神经元对奖赏有了预期,因而预测误差 rtVt1r_t - V_{t-1} 为0.但此时如果只给一个条件刺激,而不给后续的奖赏,在本来应该获得奖赏的时刻观察到了多巴胺神经元被显著抑制,与之对应,此时的预测误差 rtVt1r_t - V_{t-1}是负向的。这一实验结果表明,多巴胺神经元并不是单纯地编码奖赏的信息,而是与预测误差有关,而且预测误差有正负(或者“好坏”)之分。

最后更新于