> 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-liu-zhang-zhi-jue-jue-ce/6.4-jing-dian-piao-yi-kuo-san-mo-xing.md).

# 6.4 经典漂移扩散模型

Edited by 孙宇鸿

前一小节中，我们通过假设决策过程中存在漂移-扩散的过程，模拟了随机点运动实验中决策边界、正确率和反应时的关系。我们发现，速度-准确性的权衡受到决策边界的影响：当决策边界较大时，决策者需要积累更多证据才能做出反应，因此通常表现为反应更慢但准确率更高；当决策边界较小时，决策者只需要积累较少证据便可以做出选择，因此通常表现为反应更快但准确率更低。这说明，反应时和正确率并不只是刺激加工能力的直接反映，它们还受到个体决策策略的影响。例如，一个人反应较慢，可能是因为他获取和积累证据的能力较弱，也可能只是因为他采取了更加谨慎的决策策略，需要积累更多证据才愿意做出决定。仅仅比较反应时和正确率，我们很难区分这两种情况。这正是计算模型的价值所在：通过一个能够描述决策过程的数学模型，我们可以进一步估计行为数据背后潜在的认知过程参数。漂移扩散模型(drift-diffusion model, DDM)正是其中最典型的一类模型。

## 漂移扩散的原理

漂移扩散模型是目前在知觉决策领域最经典、应用最广泛的证据积累模型之一<sup>1</sup>。自从被Ratcliff提出以来，经过半个世纪的发展，漂移扩散模型已被广泛应用于记忆、知觉决策、社会认知以及精神疾病等多个领域，并获得了一定的神经证据支持<sup>2</sup>。漂移扩散模型属于证据积累模型（又名序列采样模型）。这类模型将决策假设为随着时间推移，对来自感觉或者记忆的刺激连续不断地积累证据的过程，当支持一个反应的累积证据超过阈值时做出反应。换句话来说，决策并不是在某一个瞬间突然产生的，而是在一段时间内不断收集与当前选择有关的信息，并逐渐积累这些信息。

例如，在随机点运动任务中，决策者需要判断点云整体是向左还是向右运动。刺激出现以后，视觉系统不断接收到新的运动信息。有些信息支持“向左”，有些信息支持“向右”。随着观察信息数量的增加，决策者脑中的证据也不断发生变化。我们可以想象成决策者根据观察到的证据在上下两堵墙之间“游走”（图1）。上方的墙代表正确的反应，下方的墙代表错误的反应。每获得一点新的证据，就往一个方向移动一点。当碰到一堵墙的时候，就做出反应。

前面的小节中，我们用模拟正确方向和错误方向的运动点数量来直观解释漂移-扩散过程的原理。我们使用每一帧中正确方向与错误方向运动点数量之间的差值作为感觉证据(sensory evidence)，然后将这些感觉证据随时间不断积累，形成决策变量(decision variable)，当决策变量触及一个决策边界的时候，决策过程结束。这种模拟方法非常直观，但它并不是经典漂移扩散模型真正使用的数学形式。真实的决策过程并不是一个人隔一段时间数一遍“现在有几个点支持左边、几个点支持右边”，然后把两个数字相减。神经系统中的感觉信息是连续变化的，同时还存在大量无法完全预测的随机波动。

## 经典漂移扩散模型

经典漂移扩散模型可以看作对上述过程的一种数学化描述（图1）。它最重要的特点，是用少数几个参数描述一个完整的决策过程。

<div align="center"><figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2FQEUx9AOsVMyKOaxGEU0h%2FDDM%E5%9B%BEby%E5%AD%99%E5%AE%87%E9%B8%BF.jpg?alt=media&amp;token=c6da7f0e-c1e2-4abf-912b-d6ed9805ded1" alt="" width="563"><figcaption><p>图1 经典的四自由参数漂移扩散模型示意图。根据 <sup>3</sup>改编。</p></figcaption></figure></div>

经典的漂移扩散模型包含4个核心自由参数：

<table data-full-width="true"><thead><tr><th width="211.54296875" align="center">参数名称</th><th width="106.12109375" align="center">参数缩写</th><th width="195.33203125" align="center">取值范围</th><th align="center">代表的认知过程</th></tr></thead><tbody><tr><td align="center"><p>漂移系数</p><p>（Drift Coefficient）</p></td><td align="center"><span class="math">k</span></td><td align="center">(0, +∞)</td><td align="center">描述证据积累的平均方向和速度，反映个体从当前刺激中提取和积累有效证据的能力，可以用来反映任务的难度之间的差异。</td></tr><tr><td align="center"><p> </p><p>决策边界</p><p>（Decision Boundary）</p></td><td align="center"><span class="math">b</span></td><td align="center">(0, +∞)</td><td align="center">描述做出决策所需要积累的证据量，反映了决策者的速度-准确性权衡和决策策略。决策边界越大意味着响应越慢但越准确，决策边界越小意味着响应越快但错误率越高。</td></tr><tr><td align="center"><p> </p><p> </p><p>初始偏好</p><p>（Initial Bias）</p></td><td align="center"><span class="math">z</span></td><td align="center">(0, 1)</td><td align="center">描述证据积累开始之前，决策起点相对于两个决策边界的位置，代表个体对其中一个反应的偏好。证据积累的开始位置为<span class="math">b*z</span> 。当<em>z</em> = 0.5时代表反应是无偏的，当<em>z</em> &#x3C; 0.5时代表反应偏向下边界，当<em>z</em> > 0.5时代表反应偏向上边界。</td></tr><tr><td align="center"><p> </p><p> </p><p>非决策时间</p><p>(Non-Decision Time)</p></td><td align="center"><span class="math">t</span></td><td align="center"><p>(0, +∞)</p><p>（不可以超过总反应时）</p></td><td align="center">描述证据积累之外的时间，包括对刺激进行感知编码和执行动作反应等过程。</td></tr></tbody></table>

### 漂移系数

漂移系数描述证据本身以多快的速度推动决策向某一个选择移动。想象判断两个不同的随机点运动刺激。对于一个非常清晰的随机点刺激，大多数运动点可能都朝同一个方向运动，因此支持正确答案的证据非常强。此时，决策变量会比较稳定地向正确答案对应的决策边界移动。而对于一个非常模糊的随机点刺激，正确方向和错误方向的运动点数量可能相差不大。此时，证据对决策的推动较弱，决策变量需要更长时间才能积累到某一个决策边界。这就是漂移系数所描述的核心过程：单位时间内，证据积累对决策变量产生的平均推动作用。

经典漂移扩散模型进一步假设，每一时刻(通常为1毫秒)所积累的证据并不是完全确定的，而是是受到随机噪声影响。因此，可以将单位时间内的证据积累表示为一个均值$$\mu$$，标准差为$$σ$$的正态分布$$\mathcal{N}(\mu, \sigma^2)$$。其中，$$\mu$$表示证据积累的平均方向和大小，$$σ$$表示随机波动的大小。我们假设在随机点运动实验中，每一帧所积累的感官证据满足的正态分布标准差$$σ$$ = 0.1。这里我们固定标准差而不是设置为一个自由参数是因为随机波动的标准差可以被其他自由参数数学上取代。从直觉上讲，由于朝同一个方向运动的点的一致性(coherence)越高，刺激越明显，每一帧感官证据积累的强度越强，所以整体的证据积累会越快，所以我们假定每一帧积累的感官证据的正态分布均值$$\mu$$和coherence为一个线性关系：$$\mu=k\*coherence$$。其中，$$k$$是漂移系数，代表个体信息累计的能力，$$\mu$$代表证据积累的速度。

### 决策边界和决策偏好

经典漂移扩散模型设定两个决策边界，其中上边界为自由参数($$b$$)代表正确决策，下边界(0)代表错误决策。如果两条边界距离较近，那么只需要积累少量证据，决策变量就可以碰到其中一条边界。因此，决策会比较快，但由于证据还没有充分积累，错误的可能性也更高。相反，如果两条边界距离较远，决策变量需要经过更长时间才能到达边界。这样可以减少随机波动对决策的影响，使决策通常更加准确，但需要付出更长的反应时间。因此，决策边界可以理解为个体在决策时的谨慎程度。

在之前的模拟中，我们假设决策偏好刚好位于上下边界的中间，即$$z=0.5$$。此时，决策者对两个反应没有偏好。但在真实情况下，决策者在刺激出现之前可能已经对某一个选择存在一定倾向。例如，在两个选项出现之前，被试可能因为利手优势、先验信息、刺激历史或者任务规则，对其中一个选择更加偏好。如果起始点偏向某一侧，则表示在真正获得当前刺激的信息之前，决策过程已经对某一个选择具有一定的偏向。因此，经典漂移扩散模型允许决策变量从两个决策边界之间的任意位置开始，但是对于一个决策者，决策偏好是固定的。

### 非决策时间

实验中测量到的反应时，是从刺激出现到被试按下按键之间的总时间。但是，并不是从刺激一呈现，我们的知觉系统就开始做证据积累。例如，看到视觉刺激后，视觉信号从视网膜传到知觉决策相关皮层存在一定的时间，这个时间从几毫秒到几十毫秒不等。另一方面，当证据累积完成以后，也不是立即就做出行为选择，知觉相关皮层会把决策信号发送到运动皮层指导手部运动做出按键反应，这一过程也需要一定的时间。所以，在经典漂移扩散模型中，实验测量得到的反应时间被拆解为非决策时间($$t$$，non-decision time)和决策时间(decision time)。其中非决策时间就包含了证据积累开始前的知觉信号传导时间和证据积累结束后的动作信号传导时间。而决策时间就指前述的从决策起点开始积累证据，直到证据累积触及一个决策边界的时间。经典漂移扩散模型假设一个被试的这部分时间在不同一致性coherence的试次之间是固定的。

## 经典漂移扩散模型的模拟

在前面的模拟中，我们从给定的参数出发，模拟了一个试次中的证据积累过程，并最终得到被试的选择和反应时间。但在真实研究中，我们面对的问题恰好相反。我们并不知道一个被试的漂移系数是多少，也不知道他的决策边界、初始偏好和非决策时间是多少。我们手里只有真实的实验数据，例如每个试次的随机点刺激一致性、反应时和正确率。因此，我们需要解决的问题是：什么样的参数，最有可能产生我们观察到底这些数据？这就是漂移扩散模型中的参数估计问题。

在进行参数估计之前，我们首先需要明确模型中的未知参数，以及每一个试次中实际观察到的数据。

我们令参数向量$$θ = (k,b,z,T)$$，代表所有需要估计的自由参数；$$k$$是漂移系数；$$b$$是决策边界；$$z$$是初始偏好；$$T$$是非决策时间。

对于第i个试次，我们观察到三个变量：$$(\text{coh}\_i, \text{rt}\_i, c\_i)$$；coh是一致性；rt是反应时，c是每个试次的选择正确还是错误(correct/wrong, 1/0)。

假设共有N个试次，那么我们的数据可以表示为：$$D = {(\text{coh}\_i, \text{rt}*i, c\_i)}*{i=1}^{N}$$

在确定了未知的参数和数据后，接下来我们要将模型与数据拟合，以估计具体的参数值。目前有多种成熟的方法可以进行参数估计，如：$$\Chi^2$$卡方检验<sup>4</sup>，最大似然估计（见第三章第二小节），贝叶斯方法<sup>5</sup>和贝叶斯分层方法<sup>6</sup>。每种方法都有其各自的优点和缺点。本节我们用最大似然估计方法进行参数估计。

对于每一个试次，我们可以根据$$(\text{coh}\_i, \text{rt}\_i, c\_i)$$计算模型在当前参数θ下对该试次数据的联合预测概率密度（我们同时考虑了反应时和正确率这两个观测结果）：$$f(\text{rt}\_i, c\_i \mid \text{coh}\_i, \boldsymbol{\theta})$$

对于N个相互独立的试次，所有数据的似然函数为：$$L(\boldsymbol{\theta} \mid D) = \prod\_{i=1}^{N} f(\text{rt}\_i, c\_i \mid \text{coh}\_i, \boldsymbol{\theta})$$

从概率推断的角度，我们用最大似然估计的方法，假定有*N*个试次，已知第*i*个试次的coherence 水平$$coh\_i$$，每个试次的选择是正确还是错误$$c\_i$$，以及反应时$$rt\_i$$。对于所有试次来说，负对数似然函数（见本书3.2.2(3.2)）是：$$\Chi^2$$

$$
\text{NLL} = -LL(\theta\mid D) = -\sum\_{i=1}^{N} \log p(rt\_i, \ c\_i\mid \ coh\_i,\theta)
$$

其中：

$$\text{NLL}= -LL(\theta)$$是负对数似然函数。我们希望通过调整参数$$θ$$来最小化这个损失函数，从而找到最符合数据的参数组合。

$$p(rt\_i \mid \theta, \ coh\_i, \ c\_i)$$指的是在给定参数$$θ$$、一致性$$coh\_i$$、和决策$$c\_i$$的情况下，模型预测在第*i*次试验中观测到反应时间$$rt\_i$$的概率。

$$\sum\_{i=1}^{N} \log$$表示我们要对所有的*N*个试次的观察值计算似然函数。逐个试次计算反应时间和决策的概率，然后取对数累加。

最大似然估计的目标就是寻找能够使这个负对数似然函数最小的参数组合：$$\hat{\boldsymbol{\theta}} = \arg\min\_{\boldsymbol{\theta}} \[-\log L(\boldsymbol{\theta} \mid D)]$$

也就是说，最优参数就是能够使我们实际观察到的数据具有最大似然、或者等价地使负对数似然最小的参数。

### 模拟证据积累过程

让我们用漂移扩散模型思想模拟一个试次中的证据积累过程。

我们先对部分参数做出定义：

```python
from scipy.stats import norm #用于从正态分布中采样随机数。这里正态分布代表每一帧输入的证据波动。
import numpy as np #用来做数值计算，比如生成数组、计算随机数等。
import matplotlib.pyplot as plt #用来绘制图表，帮助我们可视化累积的证据变化过程。

b = 2 # 我们假设底部的边界为0，顶部的边界为2
k = 1 # 漂移系数和朝同一个方向运动的点的一致性百分比之间的比例系数
coh = 0.064 # choose one coefficient #朝同一个方向运动的点的一致性百分比，越低任务越难
DriftRate = k * coh # 漂移率
sigma = 0.1 #正态分布的宽度（即标准差）
```

然后，让我们对数据进行初始化：

```python
z = 0.5 # initial bias
evidence = b*z #设定初始证据为一半的边界值，假设一开始对正确和错误的决策倾向是无偏的
accumEvidence = [] #创建列表以储存每一帧积累的证据
accumEvidence.append(evidence)
```

接着，让我们循环模拟决策过程中的证据积累：

<pre class="language-python"><code class="lang-python"><strong>i = 0 #记录当前是第几帧
</strong>while np.abs(evidence) &#x3C; b: #当累积的证据绝对值还没达到决策边界b时，继续累积证据，直到累积到边界停止
    evidence = evidence + norm.rvs(loc=driftRate, scale=sigma, size=1)[0] #从正态分布中生成一个随机数，用来模拟漂移扩散模型中的随机游走
    accumEvidence.append(evidence)
    i = i+1 
</code></pre>

最后，让我们来对一个试次中的证据积累过程进行可视化：

```python
plt.figure(figsize=(4,4))
plt.plot(np.arange(i+1), accumEvidence, '-o')
plt.axhline(B, color='k', label='Decision boundary')
plt.xlabel('# of frame')
plt.ylabel('Accumulated evidence')
plt.ylim([0, B+1])
```

<figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2F6ZyPdzvxyHN1BKLaw2o2%2Fimage.png?alt=media&amp;token=a0eb3668-6db9-41ea-baa0-55cff8a5e42d" alt=""><figcaption></figcaption></figure>

### 拟合真实实验数据

让我们接着使用最大似然估计值，根据真实的数据来估计参数[^1]。在本节的代码库中，我们附带了示例数据`exampledata.txt` , 让我们先导入示例数据：[^1]

````python
import requests
import numpy as np

# 加载数据
data = np.loadtxt('exampledata.txt')
# 打印数据的整体情况
print(data.shape)
```
````

{% code overflow="wrap" %}

```
(300, 3)
```

{% endcode %}

这说明示例数据是一个300行（试次）x 3列（变量）的数组：

| 列     | 变量          | 含义                   |
| ----- | ----------- | -------------------- |
| 第 1 列 | `coherence` | 当前试次的刺激一致性           |
| 第 2 列 | `RT`        | 反应时间（秒）              |
| 第 3 列 | `correct`   | 反应是否正确，1 表示正确，0 表示错误 |

接下来，我们需要利用这些数据估计漂移扩散模型的四个参数：漂移系数、决策边界、起始偏差和非决策时间。本书配套代码文件`ddm.py` 提供了`ddmpdf()` 代码：

| 函数         | 功能                                                                            | 输入                                                                                                                                           | 输出                    |
| ---------- | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
| `ddmpdf()` | 调用`pdf()`，根据一个真实试次的刺激、反应时间和正确性，计算该试次在给定漂移扩散模型参数和选择上边界的反应时间的概率密度。相应的，下边界为1减该密度 | `k`：漂移系数；$$a$$：相对起始点（0<$$a$$<1，以决策分离的比例代替）；`B`：决策边界，表示两个决策边界的距离；`ndt`：非决策时间；`coh`：刺激一致性；`correct`：当前试次是正确还是错误，1表示正确，0表示错误；`rt`：当前试次记录的到的反应时间 | 当前试次的反应时间和选择结果的联合概率密度 |

使用以上函数，我们来获得拟合的参数：

````python
from scipy.optimize import minimize
from ddm import ddmpdf # 漂移扩散模型的概率密度函数，我们先前已作出定义
res = minimize(fun=negloglikeli, x0=(1, 2, 0.5, 0.2), bounds=((0, 10), (0, 5), (0, 1), (0, 1))) # 使用 scipy.optimize.minimize 函数进行参数优化（使负对数似然函数最小化的漂移系数、决策边界、初始偏差和非决策时间）；x0指初始参数值，其中四个数值分别代表漂移系数、决策边界、初始偏差和非决策时间；bounds定义了边界来限制参数的范围，其中四个数值分别代表漂移系数、决策边界、初始偏差和非决策时间

print('\n拟合的漂移系数是 ', res.x[0])
print('拟合的决策边界是 ', res.x[1])
print('拟合的起始偏差是 ', res.x[2])
print('拟合的非决策时间是 ', res.x[3])
```
````

拟合的漂移系数是 5.230241590116383&#x20;

拟合的决策边界是 3.7366640686792887&#x20;

拟合的起始偏差是 0.5365699686795544&#x20;

拟合的非决策时间是 0.03953784720249189

## 漂移扩散模型的工具包

虽然在本次演示中的代码较为复杂，但是在实际使用漂移扩散模型中已有较为成熟的工具包来计算。具体有以下一些：

<figure><img src="https://1379976374-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu8x1pCBjIDBIizdIV9Wv%2Fuploads%2F7jYNvSahPKmK51P3NSU7%2Fimage%20(1).png?alt=media&amp;token=886b6b24-0496-49e7-b7dc-58f31d397689" alt=""><figcaption><p>图源自<sup>7</sup></p></figcaption></figure>

[^1]:
