5D Library › 行动的经典与统计力学 · English

第五章 社会耦合与「教中学」

别人作为外力

第三、四章的模型里,有一种力量反复出现:持续的外部拉力,它把地形朝新状态倾斜,并且只要它在,复发就很慢。对人来说,最常见的持续外力来自别人:有人在等你的结果,有人和你一起练,你要教别人。本章考察两类证据:为教而学对学习本身有什么作用;以及一种行为怎样在人际网络中传播。然后用一个模型检验一条具体的课程规则:「必须辅导两位同伴才能解锁下一阶段」。

为教而学

证据

巴格与舒尔在 1980 年的实验中让大学生学习一段材料,一组以为学完后要教给另一位学生,另一组以为学完后要接受测验;结果「准备去教」的一组在保持测验中表现更好 (Bargh and Schul 1980)。菲奥雷拉与梅耶的四项实验把「预期要教」与「真的去教」(对着摄像机讲解)分开:准备去教在即时测验中带来优势(d 约 0.55–0.59),但一周后的延迟测验中,这种优势消失了;只有真正讲解过的学生在延迟测验中保持领先(d 约 0.79–0.90)(Fiorella and Mayer 2013)。期待去教还会让学习者更好地组织所学内容 (Nestojko et al. 2014)。

证据

小林敬一对 28 项研究的元分析估计,「准备去教」相对于普通学习的效应量 g 约为 0.35,「准备后真的去教」约为 0.56;互动式的教(有真实的学习者提问)效果大于单向讲解 (Kobayashi 2019)。一项关于「为他人编写教学材料」的元分析得到的平均效应较小,g 约为 0.17 (Ribosa and Duran 2022)。早期对辅导项目的元分析发现,不仅被辅导者受益,担任辅导者的学生自己的成绩也有提高,效应量约 0.33 (Cohen et al. 1982)。在「可教代理」研究中,学生为一个需要他们去教的电脑角色学习时,比为自己学习更努力,研究者称之为「门生效应」(Chase et al. 2009)。

这些证据支持「教别人有助于自己学习」,尤其是真实、互动的教。但「教别人是最好的学习方法」这一说法并没有得到支持。广为流传的「学习金字塔」(听讲保留 5%、教别人保留 90% 之类)找不到可靠的原始研究出处 (Masters 2013)。本书只采用有出处的效应量。

一种行为如何在网络中传播

疾病和消息只要接触一次就可能传开,这叫简单传染。很多行为不同:要不要开始跑步、加入一个学习小组、采用一种新工具,人们往往要看到不止一位熟人这样做才会跟进。格兰诺维特用阈值模型描述这种集体行为:每个人有一个阈值,周围采纳的人数超过阈值才采纳 (Granovetter 1978)。森托拉与梅西把需要多个来源强化的传播称为复杂传染,并指出,对简单传染有利的「长距离弱连接」,对复杂传染反而不利 (Centola and Macy 2007)。

证据

森托拉在 2010 年做了一项在线实验:把参与者放进人为设计的网络,一种是高度聚簇的格子网络(朋友的朋友常常也是朋友),另一种是同样人数、同样联系人数的随机网络,然后观察一种健康行为(登记加入一个健康论坛)如何传播。当参与者从多个网络邻居那里收到信号时,采纳的可能性高得多;这一行为在聚簇网络中传播得更远、更快 (Centola 2010)。

推导

400 人,每人 8 位联系人。聚簇网络:每人认识环上左右各 4 位邻居;随机网络:把同样的联系通过保持人数不变的交换打乱。从一个人和他的 8 位联系人开始,比较需要 1 位、2 位、3 位采纳者才跟进的三种情况。

# Simple vs complex contagion (Centola & Macy 2007; Centola 2010).
# 400 people, each with 8 contacts. Clustered network: a ring where everyone knows their 4 nearest
# neighbours on each side. Random network: the same contacts shuffled by degree-preserving swaps.
# Simple contagion: adopt after 1 adopting contact. Complex contagion: adopt only after 2 or 3 (a behaviour
# that needs reinforcement from more than one person). Simplified model.
import random
random.seed(5)
N, K = 400, 4

def ring():
    return {(min(i, (i + j) % N), max(i, (i + j) % N)) for i in range(N) for j in range(1, K + 1)}

def shuffled(edges, swaps=20000):
    e = list(edges)
    s = set(e)
    for _ in range(swaps):
        i, j = random.randrange(len(e)), random.randrange(len(e))
        (a, b), (c, d) = e[i], e[j]
        if len({a, b, c, d}) < 4:
            continue
        n1, n2 = (min(a, d), max(a, d)), (min(c, b), max(c, b))
        if n1 in s or n2 in s:
            continue
        s -= {e[i], e[j]}
        s |= {n1, n2}
        e[i], e[j] = n1, n2
    return s

def spread(edges, threshold):
    nb = {i: set() for i in range(N)}
    for a, b in edges:
        nb[a].add(b)
        nb[b].add(a)
    adopted = {0} | nb[0]                     # one person and their contacts start
    steps = 0
    while True:
        new = {i for i in range(N) if i not in adopted and len(nb[i] & adopted) >= threshold}
        if not new:
            return len(adopted) / N, steps
        adopted |= new
        steps += 1

lattice = ring()
print("threshold   clustered network          random networks (20): mean reach, networks reaching > 90 %")
for threshold in (1, 2, 3):
    f_lat, s_lat = spread(lattice, threshold)
    runs = [spread(shuffled(lattice), threshold) for _ in range(20)]
    mean = sum(r[0] for r in runs) / len(runs)
    full = [r[1] for r in runs if r[0] > 0.9]
    speed = f" (in {sum(full) / len(full):4.1f} rounds)" if full else ""
    print(f"{threshold:5d}       {100 * f_lat:5.1f} % in {s_lat:3d} rounds     {100 * mean:5.1f} %, {len(full):2d} of 20{speed}")
# threshold   clustered network          random networks (20): mean reach, networks reaching > 90 %
#     1       100.0 % in  49 rounds     100.0 %, 20 of 20 (in  3.9 rounds)
#     2       100.0 % in  65 rounds      71.1 %, 14 of 20 (in 11.9 rounds)
#     3       100.0 % in  98 rounds       2.3 %,  0 of 20
需要 3 位联系人采纳才跟进时的传播过程(横轴为对数刻度)。蓝线:聚簇网络,传播虽慢但最终覆盖所有人;金色点:5 个随机网络,传播在起点附近就停住了;灰虚线:只需 1 位联系人的简单传染,在随机网络中几轮就覆盖所有人。

结果再现了理论的要点。简单传染在随机网络中最快,不到 4 轮就覆盖所有人。需要 3 位联系人强化的复杂传染,在 20 个随机网络中没有一个传开,平均只到 2% 左右;在聚簇网络中则一圈一圈地扩散到所有人。需要 2 位时介于两者之间,结果取决于具体网络。对需要强化的行为,紧密的小圈子比广泛的弱联系更能让它传开。

「教两人解锁」规则:一个算术难题

原先的设想是:要求每位学员必须辅导 2 位同伴通过考核才能解锁下一阶段,这条规则既能充当防止滑回旧势阱的棘轮,又能成为指数级传播的引擎。核对之后,这个设想需要较大修正。

推导

一个 30 天、4 个阶段的课程,每组 120 人。A 组独自学习;B 组每通过一个阶段,必须帮助 2 位同学才能开启下一阶段(如果这一阶段已经没有同学在学,就自动开启)。比较三种计算「帮助 2 人」的方式,以及「教」使每日放弃概率下降 0%、30%、60% 三种假设。所有数字都是假设,只用来展示机制。

# A 30-day course in 4 stages, 120 learners per arm. Arm A: study alone. Arm B "teach to unlock":
# after passing a stage you must help 2 classmates before the next stage opens (if no classmate is
# left on that stage, it opens anyway). Three ways of counting "help 2":
#   B1  2 classmates must PASS while you are their tutor; one tutor per classmate
#   B2  the same, but a classmate may have two tutors at once (a learning trio)
#   B3  2 logged tutoring sessions with different classmates, whether or not they have passed yet
# Simplified model; every number is an assumption, chosen only to show the mechanics.
import random
random.seed(2)
DAYS, STAGES, COHORT, REPS = 30, 4, 120, 40
P_ALONE, P_HELPED = 0.22, 0.30     # daily chance of passing the current stage: alone / with a tutor
QUIT = 0.02                        # daily chance of quitting, arm A

def run(rule, quit_cut):
    q = QUIT * (1 - quit_cut) if rule != "A" else QUIT
    max_tutors = 2 if rule == "B2" else 1
    passed, teaching, credit = [0] * COHORT, [False] * COHORT, [set() for _ in range(COHORT)]
    out = [False] * COHORT
    for _ in range(DAYS):
        live = [i for i in range(COHORT) if not out[i] and passed[i] < STAGES]
        for i in live:
            if random.random() < q:
                out[i] = True
        live = [i for i in live if not out[i]]
        studying = [i for i in live if not teaching[i]]
        tutors = {s: [] for s in studying}
        if rule != "A":
            for t in (i for i in live if teaching[i]):
                pool = [s for s in studying if passed[s] == passed[t] - 1
                        and len(tutors[s]) < max_tutors and s not in credit[t]]
                if pool:
                    s = random.choice(pool)
                    tutors[s].append(t)
                    if rule == "B3":
                        credit[t].add(s)          # a session counts as help
        for s in studying:
            if random.random() < (P_HELPED if tutors[s] else P_ALONE):
                passed[s] += 1
                if rule in ("B1", "B2"):
                    for t in tutors[s]:
                        credit[t].add(s)          # only a pass counts as help
                if rule != "A" and passed[s] < STAGES:
                    teaching[s], credit[s] = True, set()
        if rule != "A":
            for t in live:
                if teaching[t]:
                    left = [s for s in live if not teaching[s] and passed[s] == passed[t] - 1]
                    if len(credit[t]) >= 2 or not left:
                        teaching[t] = False
    return sum(1 for p in passed if p >= STAGES) / COHORT

def mean(rule, cut=0.0):
    return sum(run(rule, cut) for _ in range(REPS)) / REPS

a = mean("A")
print(f"A   study alone: {100 * a:4.1f} % complete by day 30")
print("rule   quitting reduced by:     0 %      30 %      60 %")
for rule in ("B1", "B2", "B3"):
    row = "  ".join(f"{100 * mean(rule, c):6.1f} %" for c in (0.0, 0.3, 0.6))
    print(f"{rule}                        {row}")
print(f"why B1 jams: on each stage, {COHORT} learners need 2 x {COHORT} = {2 * COHORT} credited passes,")
print(f"but at most {COHORT - 1} classmates can pass after someone else - so most tutors wait for the slowest")
# A   study alone: 65.6 % complete by day 30
# rule   quitting reduced by:     0 %      30 %      60 %
# B1                           5.6 %     6.4 %     6.7 %
# B2                          10.9 %    11.2 %    12.8 %
# B3                          56.4 %    62.8 %    70.8 %
# why B1 jams: on each stage, 120 learners need 2 x 120 = 240 credited passes,
# but at most 119 classmates can pass after someone else - so most tutors wait for the slowest

结果的关键在最后两行。如果「帮助」以「被辅导的同学通过考核」来计算,而每次通过只能算在一位辅导者名下(B1),那么在一个封闭班级里,这条规则在算术上就无法让所有人满足:每个阶段 120 人需要 240 次被认可的通过,但能在别人之后通过的同学最多只有 119 人。多数学员只能等到这一阶段最慢的同学也通过、规则自动放行,课程因此严重阻塞,完成率从独自学习的约 66% 跌到 6% 左右。允许两位辅导者共同辅导一位同学(B2)也不能解决问题:学得最慢的人仍然卡住所有人。只有把「帮助」定义为两次有记录的辅导时段、不论对方是否已经通过(B3),规则才不造成阻塞;而它是否胜过独自学习,取决于「教」能把放弃率降低多少——在这些假设下,放弃率降低 30% 时仍略低于独自学习,降低 60% 时才明显胜出。

注

关于「指数级传播」:在一个人数固定的班级里,任何辅导规则都不会让人数增加;所谓指数增长,只有在每一代学员都必须引入新的学员时才会出现。如果这种引入与付费挂钩,结构就变成了推荐链,其伦理与法律风险是另一回事。本书不检验、也不建议这种做法;第八章的试验只在已经入组的学员之间安排辅导,不要求任何人招募新人。

棘轮需要能量

棘轮是一种只允许单向转动的装置。费曼在《物理学讲义》中用「棘轮与棘爪」说明:仅靠随机热运动,棘轮不能持续地单向转动并对外做功;在同一温度下,棘爪本身也会被热运动抖开 (Feynman et al. 1963)。棘轮要工作,需要外界持续供给能量或维持温度差。这个物理事实对本章的类比是一个有益的提醒:同伴辅导可以充当防止滑回的棘轮,但它本身需要组织、时间和精力来维持;一旦无人维护,它就会和第三章的外部拉力一样失效。

假说 · 尚未验证

尚未确立。 在一个 30 天课程中,采用「完成两次有记录的同伴辅导时段才能解锁下一阶段」规则的学员,与独自学习的学员相比,30 天完课率至少高 10 个百分点,盲评期末测验成绩至少高 0.25 个标准差。如果第八章的随机试验显示两项结局都没有达到这一幅度,或者任一结局显示该规则有害,这一假说就被推翻。

本章小结

为教而学有实证支持,真实而互动的教效果更好,但「最好的学习方法」与「学习金字塔」没有可靠依据。需要强化的行为在紧密的小圈子里传播得更好。把这两点合成一条课程规则时,细节决定成败:以「同伴通过」计数的「教两人解锁」在封闭班级里必然阻塞;以「辅导时段」计数则可行,但效果取决于它能否真正降低放弃率——这正是第八章试验要回答的问题。

参考文献

Bargh, John A., and Yaacov Schul. 1980. “On the Cognitive Benefits of Teaching.” Journal of Educational Psychology 72 (5): 593–604.
Centola, Damon. 2010. “The Spread of Behavior in an Online Social Network Experiment.” Science 329 (5996): 1194–97.
Centola, Damon, and Michael Macy. 2007. “Complex Contagions and the Weakness of Long Ties.” American Journal of Sociology 113 (3): 702–34.
Chase, Catherine C., Doris B. Chin, Marily A. Oppezzo, and Daniel L. Schwartz. 2009. “Teachable Agents and the Protégé Effect: Increasing the Effort Towards Learning.” Journal of Science Education and Technology 18: 334–52.
Cohen, Peter A., James A. Kulik, and Chen-Lin C. Kulik. 1982. “Educational Outcomes of Tutoring: A Meta-Analysis of Findings.” American Educational Research Journal 19 (2): 237–48.
Feynman, Richard P., Robert B. Leighton, and Matthew Sands. 1963. The Feynman Lectures on Physics, Vol. I. Addison-Wesley.
Fiorella, Logan, and Richard E. Mayer. 2013. “The Relative Benefits of Learning by Teaching and Teaching Expectancy.” Contemporary Educational Psychology 38 (4): 281–88.
Granovetter, Mark. 1978. “Threshold Models of Collective Behavior.” American Journal of Sociology 83 (6): 1420–43.
Kobayashi, Keiichi. 2019. “Learning by Preparing-to-Teach and Teaching: A Meta-Analysis.” Japanese Psychological Research 61 (3): 192–203.
Masters, Ken. 2013. “Edgar Dale’s Pyramid of Learning in Medical Education: A Literature Review.” Medical Teacher 35 (11): e1584–93.
Nestojko, John F., Dung C. Bui, Nate Kornell, and Elizabeth Ligon Bjork. 2014. “Expecting to Teach Enhances Learning and Organization of Knowledge in Free Recall of Text Passages.” Memory & Cognition 42: 1038–48.
Ribosa, Jordi, and David Duran. 2022. “Do Students Learn What They Teach When Generating Teaching Materials for Others? A Meta-Analysis Through the Lens of Learning by Teaching.” Educational Research Review 37: 100475.

Fan, Y. (2026). Classical and Statistical Mechanics of Human Action: Psychological Inertia, Static Friction Thresholds, Kramers Escape Rate in Double-Well Potentials and Habit Phase Transitions, Read Beside East Asian Philosophy of Practice [行动的经典与统计力学] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23738774 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).