N-Back 评分用的是 d′(d-prime)而不是直观的准确率。本页从”防 cheese strategy”的工程动机入手,推导 d′ 和 criterion 的几何直觉,讲清 loglinear correction 为什么要全量启用,以及 Abramowitz & Stegun 26.2.23 近似的精度传导。
概述:为什么不用准确率
N-Back 的最朴素评分是 accuracy = (hits + correctRejects) / totalTrials。但两种 cheese strategy 都能拿到不错的 accuracy:
- 全按:accuracy = 1/3(全 hit),target rate 1/3 下
- 全不按:accuracy = 2/3(全 correctReject)
第二种特别诡异 —— 完全没在工作记忆里持有信息,光靠不响应就能拿 67%。这显然不能反映”工作记忆能力”。SDT 通过把感知敏感性 (d′) 与决策偏好 (criterion) 分开,让两种 cheese 策略 d′ ≈ 0,真实能力 d′ > 0。
历史背景
1954 年 Tanner & Swets 研究雷达检测员时遇到一模一样的问题,从统计决策理论借来 SDT:把检测建模为两个分布重叠 ——“noise”和”signal+noise”。检测员的内部感觉强度在 criterion 以上就报告”有”。
两个核心参数:
- d′:两个分布均值的距离,单位标准差。测感知敏感性
- criterion:检测员选的阈值位置。测决策偏好
这两个参数正交:d′ 反映能力本身,criterion 反映策略偏好。SDT 后来被认知心理学全面采纳,记忆 / 注意 / 知觉测验的标准指标。
工作方式
公式推导
设用户对每个 trial 在内心打一个连续”我觉得是 target”分数。SDT 假设 target 和 non-target 两类 trial 的内心分数都是标准正态分布(均值 d′ 和 0),用户在 criterion 以上响应。反解:
d′ = z(hitRate) - z(falseAlarmRate)
criterion = -0.5 × (z(hitRate) + z(falseAlarmRate))
z 是 inverse normal CDF(标准正态分布的分位数函数)。
Criterion 语义
- criterion = 0 → 用户没偏好
- criterion > 0 → 保守(偏向不响应)
- criterion < 0 → 激进(偏向响应)
长期追踪 criterion 漂移能反映”信心 / 策略”变化。新手保守 (criterion=+0.5) → 训练两周后中立 (criterion=0) 本身是认知训练的成果。
边界 case 与 loglinear correction
hitRate=1 或 faRate=0 时 z 炸成 ±∞,d′ 没法用。N=20 trial 下 totalGo 只有 6 个,完美 hit (6/6) 直接撞边界。
Hautus 1995 的 loglinear correction:
function correctRate(numerator, total) {
return (numerator + 0.5) / (total + 1)
}
完美 hit (6/6) → corrected 0.929(不是 1.0)→ z ≈ 1.47 →
完美 FA (0/13) → corrected 0.0357 → z ≈ -1.80 →
d′ = 3.27(不是 +∞)
全量启用 vs 仅边界启用
设计决策:全量启用。仅边界会让 dPrime 在 hit=0/6 → 1/6 时跳跃 0.34 z 单位(约 7.3 分)—— 视觉上”用户多答对一题分数反而跳了一大截”。全量启用牺牲非边界精度换取单调性,在小样本任务里产品价值更高。
zScore 自实现:A&S 26.2.23
JavaScript 无内置 Φ⁻¹,自实现 ~10 行,bundle 不增加。jstat 引入 ~50KB —— 不值。
export function zScore(p: number): number {
if (p <= 0) return -Infinity
if (p >= 1) return +Infinity
const flipped = p > 0.5
const q = flipped ? 1 - p : p
const t = Math.sqrt(-2 * Math.log(q))
const num = 2.515517 + 0.802853 * t + 0.010328 * t * t
const den = 1 + 1.432788 * t + 0.189269 * t * t + 0.001308 * t * t * t
const z = -(t - num / den)
return flipped ? -z : z
}
中部精度 ~10⁻⁴,尾部 ~5×10⁻⁴。
精度传导分析
z 误差: 10⁻⁴
dPrime = z(H) - z(F) → 误差至多 2×10⁻⁴
score = dPrime / 3.27 × 100 → 误差 < 0.007 分
result.tsx 显示整数 score,0.007 分误差远低于显示精度。精度匹配显示精度,不过度是工程美德。
与其他评分对比
| 任务 | 评分公式 | 防 cheese | 原因 |
|---|---|---|---|
| CPT | (hits − 0.5×FA) / totalGo | 中 | go/no-go 范式,简单线性惩罚 FA 够用 |
| Flanker | accuracy × (1 - RT/baseline) | 强 | accuracy 接近 1 时 RT 提供区分度 |
| N-Back (d′) | z(H) - z(F),归一化 | 强 | 两端 cheese 都被 d′ 自动惩罚 |
为什么 Flanker 不用 d′?Flanker target rate 50%、必须响应、accuracy 接近 1 时 d′ 退化。N-Back target rate 1/3、可不响应、accuracy 远未饱和,d′ 是最佳维度。任务设计 ↔ 评分公式是 SDT 工程的核心 trade-off。
面试问题
- 为什么 N-Back 不用准确率?
- d′ 和 accuracy 什么关系?
- criterion 在工程上有什么用?
- loglinear correction 为什么全量启用而不只在边界?
- 为什么自实现 zScore 而不用 jstat?
- N=20 数据量够吗?
参见
- 工作记忆状态机抽象 — N-Back 的 trial state 设计(同 milestone)
- zustand-状态机模式 — 训练 store 的双层状态机(同 milestone)
- cpt-评分公式 — go/no-go 任务的简单线性评分
参考
- Stanislaw & Todorov (1999) — Calculation of signal detection theory measures(标准引用)
- Macmillan & Creelman (2005) — Detection Theory: A User’s Guide(教科书)
- Hautus (1995) loglinear correction 原始论文
- Tanner & Swets (1954) — A decision-making theory of visual detection(源头)
- Abramowitz & Stegun §26.2.23
- 项目源码:
features/nback/logic.ts:121-302