5D Library › 心理物理学、韦伯-费希纳定律与多感官贝叶斯整合的数学模型 · English

第一章 物理世界与主观世界之间的对数桥梁:韦伯定律与费希纳定律

针落地与街头大喊

在安静的房间里,一根针落地都听得见;在喧闹的街头,对面的人大喊你也可能听不清。这个对比里有两件事。第一,能被察觉的变化取决于背景:同样大小的声音增量,加在安静的背景上很显眼,加在嘈杂的背景上就淹没了。第二,耳朵能在相差许多个数量级的强度范围内工作,它不可能对每一份物理增量都给出同样大的反应。

19 世纪的德国生理学家韦伯最早把第一件事写成了规律。他在关于触觉与重量的研究中发现,能分辨的最小重量差并不是一个固定的克数,而是与作为比较标准的重量成正比;而且举起重物时比把重物放在静止的手上分辨得更精细 (Weber 1834)。后人把这个规律写成

ΔII=k,\frac{\Delta I}{I} = k,

其中 II 是标准刺激的强度,ΔI\Delta I 是最小可觉差(just noticeable difference,JND),kk 叫韦伯分数。说「一根针在安静房间里听得见」,就是说背景 II 很小时,很小的 ΔI\Delta I 就够了。

证据

白噪声强度的最小可觉差。 米勒 1947 年在很宽的强度范围内测量了人对白噪声强度变化的敏感度:在约 30 分贝感觉级(高于本人听阈的分贝数)以上,最小可觉差大致恒定,约为 0.41 分贝,相当于 ΔI/I≈0.10\Delta I/I \approx 0.10;在更低的强度,最小可觉差(以分贝计)变大。他还指出,同样的强度辨别函数可以描述白噪声对纯音与言语的掩蔽,而且相等数目的最小可觉差并不对应相等的响度 (Miller 1947)。最后一点在本章后面还要用到。

韦伯定律从哪里来:内部噪声

为什么能分辨的差会与强度成正比?信号检测论给出一个自然的解释(第 26 本第四章介绍过信号检测论,这里只用到它最基本的形式):神经系统对强度 II 的内部表征不是一个固定的数,而是带噪声的,可以写成均值为 II、标准差为 σ(I)\sigma(I) 的随机变量。比较两个刺激时,只有当两者内部表征的差明显大于噪声时,才能可靠地分辨。于是最小可觉差与噪声的大小成正比:ΔI≈σ(I)\Delta I \approx \sigma(I)(取「两个间隔中选强的那个」任务中 76% 正确,即 d′=1d' = 1)。

如果噪声的标准差与强度成正比,σ(I)=cI\sigma(I) = cI,就得到韦伯定律。但神经系统还有与刺激无关的「本底」噪声 σ0\sigma_0,以及随强度按平方根增长的泊松型噪声(例如光子或神经脉冲的计数涨落)。把三者的方差相加:

σ2(I)=σ02+qI+c2I2.\sigma^2(I) = \sigma_0^2 + qI + c^2I^2 .

下面的程序在两种噪声组合下计算最小可觉差:模型 A 只有本底噪声(σ0=1\sigma_0 = 1)与倍增性噪声(c=0.05c = 0.05);模型 B 再加上泊松型噪声(q=1q = 1)。单位是示意的。程序最后用 4 万次模拟的二选一试验检查计算。

推导

# Weber's law from internal noise (illustrative units). Internal response R ~ N(I, s(I)^2)
# with s^2 = s0^2 + q*I + (c*I)^2: additive, Poisson-like and multiplicative noise.
# 2AFC "which is stronger?": threshold dI = the step giving 76 % correct (d' = 1).
import math, random
from statistics import NormalDist
PHI = NormalDist().cdf
TARGET = PHI(1 / math.sqrt(2))                      # 0.760: 2AFC with d' = 1

def sd(i, s0, q, c):
    return math.sqrt(s0 ** 2 + q * i + (c * i) ** 2)

def jnd(i, s0=1.0, q=0.0, c=0.05):
    lo, hi = 0.0, 10 * sd(i, s0, q, c) + 1
    for _ in range(80):                             # bisection on percent correct
        d = (lo + hi) / 2
        pc = PHI(d / math.hypot(sd(i, s0, q, c), sd(i + d, s0, q, c)))
        lo, hi = (d, hi) if pc < TARGET else (lo, d)
    return hi

if __name__ == "__main__":
    levels = [0.1, 1, 10, 100, 1e3, 1e4, 1e5]
    print("intensity  | A: additive + multiplicative | B: plus Poisson-like term (q = 1)")
    print("           |      dI      dI/I            |      dI      dI/I   dI/sqrt(I)")
    for i in levels:
        a, b = jnd(i), jnd(i, q=1.0)
        print(f"{i:10.1f} | {a:9.2f} {a / i:8.3f}            | {b:9.2f} {b / i:8.3f}"
              f" {b / math.sqrt(i):8.2f}")
    k = jnd(1e6) / 1e6                              # Weber fraction at the top
    ia = jnd(0.0) / k                               # floor: dI at I = 0 equals k * Ia
    xs = [10 ** (e / 20) for e in range(-40, 101)]
    lin = max(k * (x + ia) / jnd(x) - 1 for x in xs)
    quad = max(abs(k * math.hypot(x, ia) / jnd(x) - 1) for x in xs)
    print(f"model A: k = {k:.4f}, Ia = {ia:.1f} (s0 / c = 20). Largest error of"
          f" dI = k (I + Ia): {lin:+.1%};")
    print(f"  of dI = k sqrt(I^2 + Ia^2): {quad:.1%} (the two differ only near I = Ia)")
    rng = random.Random(1834)
    for i in (1.0, 1000.0):
        d = jnd(i)
        ok = sum(rng.gauss(i + d, sd(i + d, 1, 0, 0.05)) > rng.gauss(i, sd(i, 1, 0, 0.05))
                 for _ in range(40000))
        print(f"check by simulation at I = {i:6.0f}: {ok / 40000:.3f} correct"
              f" (target {TARGET:.3f})")
# intensity  | A: additive + multiplicative | B: plus Poisson-like term (q = 1)
#            |      dI      dI/I            |      dI      dI/I   dI/sqrt(I)
#        0.1 |      1.00   10.008            |      1.33   13.294     4.20
#        1.0 |      1.00    1.003            |      1.69    1.690     1.69
#       10.0 |      1.13    0.113            |      3.63    0.363     1.15
#      100.0 |      5.23    0.052            |     11.61    0.116     1.16
#     1000.0 |     51.31    0.051            |     60.73    0.061     1.92
#    10000.0 |    512.99    0.051            |    523.15    0.052     5.23
#   100000.0 |   5129.85    0.051            |   5140.10    0.051    16.25
# model A: k = 0.0513, Ia = 19.5 (s0 / c = 20). Largest error of dI = k (I + Ia): +40.7%;
#   of dI = k sqrt(I^2 + Ia^2): 0.6% (the two differ only near I = Ia)
# check by simulation at I =      1: 0.763 correct (target 0.760)
# check by simulation at I =   1000: 0.758 correct (target 0.760)

模型 A 在高强度区给出恒定的韦伯分数 0.051;强度降到 1 以下时,最小可觉差停在本底噪声决定的 1.00,ΔI/I\Delta I/I 随之迅速变大(I=0.1I = 0.1 时为 10.0)。这正是框架所说的「低强度区的修正」:把高强度区的韦伯分数 k=0.0513k = 0.0513 与零强度处的最小可觉差合起来,得到 Ia=19.5I_a = 19.5,约等于 σ0/c=20\sigma_0/c = 20。

但程序也显示,框架中的写法 ΔI=k(I+Ia)\Delta I = k(I + I_a) 只是近似:两种噪声的方差相加时,与之对应的形式是 ΔI=kI2+Ia2\Delta I = k\sqrt{I^2 + I_a^2}(与程序的精确计算最多相差 0.6%);线性写法在 I≈IaI \approx I_a 附近高估了最多 40.7%。线性写法对应的是两种噪声的标准差直接相加(例如两者完全相关)的情形。两种形式在远离拐点处一致,真实数据中能否区分它们,取决于拐点附近的测量精度。

模型 B 多了一个中间区:在 II 约为 10 到 100 之间,ΔI/I\Delta I/\sqrt{I} 几乎不变(1.15、1.16),最小可觉差按平方根增长;更高强度才回到韦伯定律。所以「韦伯定律」不是一条普遍定律,而是倍增性噪声占主导时的近似。最后两行是模拟检查:在 I=1I = 1 与 I=1000I = 1000 处,按计算出的 ΔI\Delta I 做 4 万次二选一试验,正确率为 0.763 与 0.758,与目标 0.760 相符。

注

针落地与街头大喊是掩蔽。 严格说,韦伯定律说的是「在强度 II 上再加多少才能察觉」,而街头听不清的是另一种声音(对方的话)被背景噪声掩蔽。米勒的数据显示,两种任务可以用同一组强度辨别函数描述 (Miller 1947)。按韦伯定律粗略地说:背景强了 60 分贝(一百万倍),要被听见的信号也要强约 60 分贝。这是示意的推论,真实的掩蔽还取决于两个声音的频谱是否重叠。

从韦伯到费希纳:一个额外的假设

1860 年,费希纳在《心理物理学纲要》中提出,主观感觉量可以通过「数」最小可觉差来测量 (Fechner 1860)。他的论证是:如果每个最小可觉差在主观上都是同样大小的一步,$S = $ 常数,那么由韦伯定律 ΔI=kI\Delta I = kI 得到 dS∝dI/IdS \propto dI/I,积分即得

S=1kln⁡II0,S = \frac{1}{k}\ln\frac{I}{I_0},

I0I_0 是绝对阈限。这就是费希纳定律:感觉随刺激强度的对数增长。

这一步里有两个问题。第一个是数学上的:用微分代替有限的「一步」,在韦伯分数不是常数时会出错;卢斯与爱德华兹 1958 年对此提出了系统的批评 (Luce and Edwards 1958),德扎法罗夫与科洛纽斯 2011 年重新梳理了费希纳的论证:经典的「韦伯定律 + 最小可觉差等大」推导只是近似成立,韦伯分数越小越准确;费希纳另有一个不用最小可觉差的推导,只要两个刺激之间的主观差异只取决于它们的强度之比,就能得到对数定律,而这个原则与韦伯定律在逻辑上相互独立 (Dzhafarov and Colonius 2011)。第二个问题更根本:「每个最小可觉差在主观上一样大」是一个假设,不是观察。

下面的程序先按广义韦伯定律 ΔI=k(I+Ia)\Delta I = k(I + I_a) 一步一步地数最小可觉差,与费希纳的积分比较;然后看接近阈限时一个「加倍」包含多少个最小可觉差;最后用米勒的 0.41 分贝与响度的「宋」标度比较两种感觉量。

推导

# From Weber to Fechner, and what logarithmic units do and do not measure.
# (1) Count JNDs step by step when dI = k (I + Ia), against Fechner's integral.
# (2) Equal JNDs are not equal loudness: 0.41 dB JNDs (Miller 1947) vs sones (loudness
#     doubles per 10 dB above 40 phon, Stevens). (3) One unit of three logarithmic scales.
import math

def count_jnds(i0, i, k, ia):
    n, x = 0, i0
    while x * (1 + k) + k * ia <= i:                 # next step: x + k (x + Ia)
        x, n = x * (1 + k) + k * ia, n + 1
    return n

if __name__ == "__main__":
    k, ia, i0 = 0.10, 1.0, 1.0
    print("I / I0   JNDs counted  (1/k) ln R  ln R / ln(1+k)   [R = (I+Ia)/(I0+Ia)]")
    for i in (2, 10, 100, 1e4, 1e6):
        r = (i + ia) / (i0 + ia)
        print(f"{i:9.0f} {count_jnds(i0, i, k, ia):12d} {math.log(r) / k:12.1f}"
              f" {math.log(r) / math.log(1 + k):12.1f}")
    print("JNDs per doubling of I when Ia = 10 (Weber's law fails near threshold):")
    print("  " + "  ".join(f"{a:g}->{2 * a:g}: {count_jnds(a, 2 * a, k, 10)}"
                           for a in (1, 4, 16, 64, 1000)))
    step = 0.41                                      # dB per JND
    print("level (dB)  sones   sones gained per 0.41-dB JND")
    for level in (40, 60, 80, 100):
        s = 2 ** ((level - 40) / 10)
        print(f"{level:8d} {s:8.1f} {s * (2 ** (step / 10) - 1):14.3f}")
    print(f"40 -> 100 dB = {60 / step:.0f} JNDs; loudness grows 64-fold;")
    print(f"  one JND at 100 dB adds {2 ** 6:.0f} times the loudness of one JND at 40 dB")
    print("unit        definition                         one unit means")
    print("decibel     10 log10(P / P0)                   power x 10^0.1 = 1.259")
    print(f"magnitude   -2.5 log10(F / F0) (Pogson 1856)   flux / {100 ** 0.2:.3f}")
    print("Richter ML  log10(A / A0) (Richter 1935)       trace amplitude x 10")
# I / I0   JNDs counted  (1/k) ln R  ln R / ln(1+k)   [R = (I+Ia)/(I0+Ia)]
#         2            4          4.1          4.3
#        10           17         17.0         17.9
#       100           41         39.2         41.1
#     10000           89         85.2         89.4
#   1000000          137        131.2        137.7
# JNDs per doubling of I when Ia = 10 (Weber's law fails near threshold):
#   1->2: 0  4->8: 2  16->32: 5  64->128: 6  1000->2000: 7
# level (dB)  sones   sones gained per 0.41-dB JND
#       40      1.0          0.029
#       60      4.0          0.115
#       80     16.0          0.461
#      100     64.0          1.845
# 40 -> 100 dB = 146 JNDs; loudness grows 64-fold;
#   one JND at 100 dB adds 64 times the loudness of one JND at 40 dB
# unit        definition                         one unit means
# decibel     10 log10(P / P0)                   power x 10^0.1 = 1.259
# magnitude   -2.5 log10(F / F0) (Pogson 1856)   flux / 2.512
# Richter ML  log10(A / A0) (Richter 1935)       trace amplitude x 10

第一张表显示,逐步数出的最小可觉差与准确的离散解 ln⁡R/ln⁡(1+k)\ln R/\ln(1+k) 一致(例如强度比 10610^6 时为 137 与 137.7),费希纳的积分 (1/k)ln⁡R(1/k)\ln R 系统地少了约 5%,这是 ln⁡(1.1)\ln(1.1) 与 0.10.1 之差;三者都随强度的对数增长。所以只要韦伯定律成立,「数最小可觉差」确实给出对数标度,费希纳的计算在这一点上没有错。第二行显示,接近阈限时情况不同:Ia=10I_a = 10 时,从 1 加倍到 2 一个最小可觉差都不到,从 1000 加倍到 2000 有 7 个。所以在阈限附近,「最小可觉差标度」接近线性而不是对数。

第二张表回到假设本身。从 40 分贝到 100 分贝共有 146 个 0.41 分贝的最小可觉差;如果每个最小可觉差在主观上一样大,响度应当均匀增长。但按「宋」标度,响度在这 60 分贝里增长了 64 倍,100 分贝处的一个最小可觉差带来的响度增量是 40 分贝处的 64 倍。这里用的宋标度本身来自史蒂文斯的量值估计法(第二章),它并非没有争议;但米勒的观察已经足以说明:「最小可觉差的数目」与「感觉的大小」不是同一个量。

左:内部噪声模型中的最小可觉差与强度之比。实线为本底噪声加倍增性噪声,虚线再加泊松型噪声,点线为 \Delta I = k(I + I_a);高强度处都趋向韦伯分数 k。右:从 40 分贝到 100 分贝,最小可觉差的数目(实线,左轴)随分贝数线性增长,而按宋标度的响度(虚线,右轴)每 10 分贝加倍。

分贝、星等与里氏震级:三种对数,三种来历

框架中说分贝、星等与里氏震级有「共同的心理物理学起源」。核对它们各自的历史,结论是否定的。程序的最后一张表列出了三种单位的定义。

证据

星等。 古代天文学家把肉眼可见的恒星按亮度分为六等;1856 年,波格森建议把相邻两等的亮度比固定为 100 的五次方根(约 2.512),使一等星恰好比六等星亮 100 倍 (Pogson 1856)。这早于费希纳 1860 年的著作。舒尔曼与考克斯指出,波格森当时的依据是相信眼睛对光的反应是对数的,而后来的心理物理学研究认为它更接近幂函数 (Schulman and Cox 1997)。今天的星等由光度计测量,与肉眼感觉无关。

证据

分贝。 分贝来自电话工程。贝尔系统先定义了「传输单位」,1929 年改名为分贝,定义为功率比的常用对数的 10 倍 (Martin 1929)。用对数的工程好处是:信号经过多段线路时各段的衰减相乘,取对数后变成相加。声学中的声压级沿用了这个定义,基准取为大致的听阈。分贝数与响度不成正比:声级提高约 10 分贝,响度约加倍(第二章)。

证据

里氏震级。 里克特 1935 年提出用标准扭力地震仪在震中距 100 千米处记录的最大振幅的对数来给地震分级;「震级」一词是伍德建议的,取对数是因为地震大小的范围极其巨大 (Richter 1935)。震级是仪器读数,与人对地震的感受无关;描述人的感受与破坏程度的是另一种分级,叫烈度。

所以,三种对数单位中,只有星等的前身来自人的感觉分级,而且它的对数形式是在费希纳之前由天文学家确定的;分贝与里氏震级是为了处理极大的数值范围与方便计算而采用的工程约定。它们与费希纳定律的共同点是数学形式,不是心理物理学起源。

假说 · 尚未验证

尚未确立:知觉训练主要降低本底噪声,而不是改变韦伯分数。 如果最小可觉差由本底噪声与倍增性噪声共同决定(本章的模型 A),那么一段辨别训练带来的改善应当集中在低强度区(IaI_a 变小),高强度区的韦伯分数 kk 变化很小。如果预先登记的实验发现,训练后高强度区的韦伯分数与低强度区的最小可觉差按相同比例下降,这个假说就是错的。

本章小结

韦伯定律说最小可觉差与标准刺激的强度成正比;用内部噪声的模型可以解释它,也可以解释它在低强度区的失效:本底噪声使最小可觉差在阈限附近停止下降,泊松型噪声在中间强度产生平方根区。框架中的 ΔI/(I+Ia)=k\Delta I/(I + I_a) = k 是近似,噪声方差相加时对应的形式是 ΔI=kI2+Ia2\Delta I = k\sqrt{I^2 + I_a^2},两者在拐点附近最多相差约 40%。费希纳定律需要「每个最小可觉差在主观上一样大」的额外假设,米勒的观察与响度标度都表明它不成立。星等、分贝与里氏震级的对数形式各有来历,并无共同的心理物理学起源。

参考文献

Dzhafarov, Ehtibar N., and Hans Colonius. 2011. “The Fechnerian Idea.” American Journal of Psychology 124 (2): 127–40.
Fechner, Gustav Theodor. 1860. Elemente der Psychophysik. Breitkopf und Härtel.
Luce, R. Duncan, and Ward Edwards. 1958. “The Derivation of Subjective Scales from Just Noticeable Differences.” Psychological Review 65 (4): 222–37.
Martin, W. H. 1929. “Decibel—the Name for the Transmission Unit.” Bell System Technical Journal 8 (1): 1–2.
Miller, George A. 1947. “Sensitivity to Changes in the Intensity of White Noise and Its Relation to Masking and Loudness.” Journal of the Acoustical Society of America 19 (4): 609–19. https://doi.org/10.1121/1.1916528.
Pogson, Norman. 1856. “Magnitudes of Thirty-Six of the Minor Planets for the First Day of Each Month of the Year 1857.” Monthly Notices of the Royal Astronomical Society 17 (1): 12–15.
Richter, Charles F. 1935. “An Instrumental Earthquake Magnitude Scale.” Bulletin of the Seismological Society of America 25 (1): 1–32.
Schulman, E., and C. Cox. 1997. “Misconceptions about Astronomical Magnitudes.” American Journal of Physics 65 (10): 1003–7. https://doi.org/10.1119/1.18714.
Weber, Ernst Heinrich. 1834. De Pulsu, Resorptione, Auditu et Tactu: Annotationes Anatomicae et Physiologicae. Koehler.

Fan, Y. (2026). Psychophysics, the Weber-Fechner Law and Optimal Bayesian Multisensory Integration: From Stevens's Power Law and the McGurk Effect to Sensory Substitution, Read Beside Classical Chinese Thought on the Six Senses [心理物理学、韦伯-费希纳定律与多感官贝叶斯整合的数学模型] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23788548 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).