> For the complete documentation index, see [llms.txt](https://ruyuanzhang.gitbook.io/compmodcogpsy/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ruyuanzhang.gitbook.io/compmodcogpsy/di-ba-zhang-qiang-hua-xue-xi/8.2-xin-li-xue-de-qiang-hua-xue-xi.md).

# 8.2 心理学的强化学习

Edited by 李凌宇

在从机器学习的角度讲完了强化学习之后，我们不妨重新换个视角，从认知心理学的角度重新审视强化学习。在这一章中，我们刻意把机器学习里面的强化学习和认知心理学里面的强化学习作为两条平行线来介绍，在章节8.3中我们会把两条线交汇介绍两者之间的关系。

## 心理学史上四种著名的动物

我们经常说心理学的开端是弗洛伊德。从实验的角度来说，心理学起源的另一条线其实不来源于人本身，而是来源于对动物的研究。我们不妨先回顾一下心理学史上的四大“神兽”：巴普洛夫的狗(Pavlov's dog)，桑代克的猫(Thorndike's cat)，科勒的黑猩猩(Kohler’s chimpanzee)，还有斯金纳的老鼠(Skinner’s mouse)。

### 巴甫洛夫的狗

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

<figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2FYJbcpIgLLIJGVRuUKJl4%2Fimage.png?alt=media&amp;token=a2ee0d1a-861f-41b8-bc0a-bef274169f29" alt="" width="315"><figcaption><p>图1 巴图洛夫的狗实验</p></figcaption></figure>

### 桑代克的猫

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

<figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2FrWLcs3cOdxru4qiX1jVC%2Fimage.png?alt=media&amp;token=ac233e4e-3f53-475f-ba45-62affa2d6a10" alt="" width="375"><figcaption><p>图2 桑代克的猫实验</p></figcaption></figure>

### 科勒的黑猩猩

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

### 斯金纳的老鼠

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

<figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2F60ruDlP00DPT5nW2EIix%2Fimage.png?alt=media&amp;token=b1f16bbf-9ed6-44bf-9e2f-358e018ef2d9" alt="" width="260"><figcaption><p>图3 斯金纳的老鼠实验</p></figcaption></figure>

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

可以看到，以上四种心理学史上耳熟能详的动物，都是被用来研究学习的机制的，其中大部分都涉及到从反馈或者奖赏来学习知识。这就是强化学习的本质。

## 单臂老虎机问题

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

<figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2FFwAMqgOKHI81cBMCZfpV%2Fimage.png?alt=media&amp;token=3337a41e-707d-469f-806e-15a7b3112eff" alt="" width="200"><figcaption><p>图4 单臂老虎机</p></figcaption></figure>

老虎机即是一个最简单的例子，玩家投币之后拉动侧面的拉杆，内部的三个转轴就会带动前方的图案旋转，最后出现三个相同的图案时就可以获得奖金。

我们假设玩家可以向左或向右拉动拉杆，即这台老虎机有左右两个选项，选择左边选项获得奖励的概率是$$p$$，则选择右边选项获得奖励的概率是$$1-p$$。我们可以进一步定义一个选项的价值(value)为这个选项所获的的奖赏的期望。

{% hint style="info" %}
注意，这里我们从心理学的角度定义了价值，可以思考一下这里的定义和前面章节机器学习里面强化学习关于价值的定义有何不同。
{% endhint %}

如果每次老虎机给出的奖励数量是固定的，每一个选项的价值就可以简单等同于获得奖励的概率。知觉上看某一选项获得奖励的概率越大，价值越高。在这样一个赌博试验中，受试并不知道这一概率的设定，因此需要不断地试错来学习这一奖赏概率。显然，最简单的一种方法是尝试很多次同一选项，然后求选择该选项多次的平均奖赏。为了模拟这一学习过程，我们假设受试每次都选择左边，因为试验结果是二元的，故可以用伯努利分布模拟被试每次获得的奖励。

```python
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]) # 我们展示前10次选择的结果
```

{% code overflow="wrap" %}

```
[0 1 0 1 1 1 1 1 1 1]
```

{% endcode %}

这里前10次的选择左边选项的结果，0代表没有获得奖赏，1代表获得了奖赏。

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

```python
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])
```

<figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2FG1MfSUlUhO2sfHmJvsQs%2Fimage.png?alt=media&amp;token=80d590fb-6b4b-42a4-b651-a9c3ca640d8d" alt="" width="315"><figcaption></figcaption></figure>

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

首先观察一下历史平均法，在第$$t$$个试次，之前所有$$t$$个奖赏值$$r$$的平均值即为该选项的价值的估计值 $$V\_t$$，可以表示为：

$$
V\_t=\frac{1}{t} (r\_1 + r\_2 + ... + r\_{t-1} + r\_t)   \tag{1}
$$

我们可以得出 $$t-1$$的试次时价值的估计值：

$$
V\_{t-1}=\frac{1}{t-1} (r\_1 + r\_2 + ... + r\_{t-1})\tag{2}
$$

因此联立以上两个公式，我们可以得出$$V\_t$$ 是基于 $$V\_{t-1}$$进行更新的：

$$
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}
$$

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

* $$V\_t$$ 和 $$V\_{t-1}$$分别是 $$t$$时刻与前一时刻（ $$t-1$$）某一选项的估计**价值**（value）
* &#x20;$$r\_t - V\_{t-1}$$表示前一时刻的对该选项价值(获得奖赏的期望)与该试次实际获得奖赏之间的差距，因而可以定义为**预测误差**；&#x20;
* $$\frac{1}{t}$$ 表示这一预测误差以一定的比例贡献于估计价值的更新，因此定义为**学习率**（learning rate）。

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

## 概率反转学习

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

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

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

可以看出，固定学习率的方法相对于历史平均法有以下两个好处：（1）需要更少的记忆资源的开销（2）有利于较快地适应新环境。我们把两个方法画到一起。

```python
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)
v_avg = 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])
        # 固定学习率
        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')
```

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

$$
V\_t=V\_{t-1}+a\*(r\_t - V\_{t-1})\tag{4}
$$

其中 $$V\_t$$ 和 $$V\_{t-1}$$ 为某一选项的**价值**（value）， $$r\_t - V\_{t-1}$$ 表示**预测误差，** $$a$$ 表示**学习率**（learning rate）。

## 学习率的意义

在心理学的计算建模中，学习率是个很重要的概念。在大多数模型中，学习率是一个自由参数(后面的章节会讲代码)。学习率在文献中被解释为认知灵活性，即受试有多大程度地可以根据预测误差来更新对价值的估计。我们不妨思考如下问题:&#x20;

{% hint style="info" icon="question" %}
如果学习率代表认知灵活性，那么学习率是越高越好么？
{% endhint %}

而认知灵活性的异常在近些年来同样被认为是很多精神疾病的行为指标，我也不妨思考以下问题:

{% hint style="info" icon="question" %}
和正常人群比，如果同样完成概率反转学习任务，哪一类精神病人的学习率会偏高？哪一类精神病人的学习率会偏低？我们能从发病机制和症状学来解释原因么？
{% endhint %}

## 强化学习的神经基础

在上一节中，我们推导得出了心理学中强化学习的公式（式子4），这个公式几乎是目前几千篇论文背后的数学基础。近些年来，强化学习的神经机制一直是研究的热点，我们现在以强化学习作为例子，介绍一下，算法层面的结论如何和神经活动联系起来。

这里我们问一个基本的问题，我们的大脑真的执行了上面的强化学习更新公式么？有一个基本的预测，如果真的是这样，那么我们的大脑内部应该编码了选项的价值$$V\_t$$、奖赏$$r$$、和预测误差$$r-V\_{t-1}$$。强化学习领域几位著名的学者Wolfram Schultz，Peter Dayan和P. Read Montague1997年在Science杂志发表了一项著名的研究，为大脑表征这些强化学习元素提供了重要证据。

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

大量的前人研究结果表明，给予奖赏的时候，多巴胺神经元会有强烈的活动。长期以来，学界普遍认为多巴胺神经元编码的是奖赏。但是Wolfram Schultz，Peter Dayan和P. Read Montague的研究挑战了这一观点。他们具体完成了三个实验。

第一个实验，他们在猴子上直接供给果汁（奖赏），前面没有出现任何的刺激。当给予奖赏的时候，猴子的多巴胺神经元出现了明确的反应。

第二个实验，研究者重复了巴普洛夫的经典条件反射实验，让猴子先看一张图片，然后在固定的时间间隔(例如500ms)之后给予奖赏。经过多次的条件反射实验，猴子把图片和奖赏联系起来，仅仅出现图片刺激，尚未直接给与奖赏，猴子的多巴胺神经元就会强烈的反应。而到真正给与奖赏的时候，多巴胺反而没有显著的活动。

第三个实验，当猴子已经建立了图片-奖赏的联结之后，呈现图片之后，撤掉了本应出现的奖赏，发现猴子的多巴胺神经元被抑制得比基线水平更低。

{% hint style="info" icon="question" %}
思考: 以上实验结果说明多巴胺神经元编码的是奖赏么？
{% endhint %}

<figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2FRm0u1KSPFRuG8gBDEq2h%2Fimage.png?alt=media&amp;token=4beaaa57-54b7-449b-a7f5-537e1f99bc04" alt="" width="375"><figcaption></figcaption></figure>

以上的结果表明，多巴胺神经元可能编码的不是奖赏本身($$r$$)，而是预期奖赏和实际奖赏之间的差值，即预期误差(prediction error).

* 在未建立图片-奖赏的条件反射联结的阶段，相当于没有条件刺激（CS，conditioned, reward-predicting stimulus，即图片刺激）而直接给予奖赏（R, primary reward），奖赏 $$r\_t$$ 大于预测 $$V\_{t-1}$$，因而 $$r\_t - V\_{t-1}$$是一个正向的预测误差（positive error in prediction of reward），记录到了多巴胺神经元更加活跃的发放模式。
* 在未建立图片-奖赏的条件反射联结的阶段，条件刺激本身就会引发多巴胺神经元的高发放，但是实际的奖赏却不再能够激活其发放，因为神经元对奖赏有了预期，因而预测误差 $$r\_t - V\_{t-1}$$ 为0.
* 此时如果只给一个条件刺激，而不给后续的奖赏，在本来应该获得奖赏的时刻观察到了多巴胺神经元被显著抑制，与之对应，此时奖赏$$r\_t$$为0，预测误差 $$r\_t - V\_{t-1}$$是负向的。

这一系列结果表明，多巴胺神经元并不是单纯地编码奖赏的信息，而是与预测误差有关，而且预测误差有正负（或者“好坏”）之分。
