5D Library › The 85% Rule for Optimal Learning, Myelination Kinetics and Deliberate Practice · 中文

Chapter 4 Forgetting Curves, the Spacing Effect and Retrieval Practice

Ebbinghaus’s nonsense syllables

In 1885 Ebbinghaus published Über das Gedächtnis (On Memory). Serving as his own and only subject, he learned lists of consonant–vowel–consonant nonsense syllables and, after an interval, relearned them to the point of one error-free recitation, measuring how much was retained by how much time relearning saved compared with original learning (the savings method) (Ebbinghaus 1885). He found that forgetting was rapid at first and then ever slower. More than a century later, Murre and Dros had a single participant repeat the experiment by the same method over about 70 hours, and obtained a forgetting curve similar in shape to Ebbinghaus’s (Murre and Dros 2015).

The exact shape of the forgetting curve has long been debated. An exponential function means that a fixed proportion of what remains is lost per unit of time; a power function means that the older a memory, the more slowly it fades. Comparing several data sets, Wixted and Ebbesen argued that power functions and similar forms describe forgetting better than exponentials (Wixted and Ebbesen 1991). This matters for the models and the scheduler below.

The spacing effect

Evidence

Meta-analysis of the spacing effect and the “optimal gap”. In 2006 Cepeda and colleagues pooled 839 assessments from 317 experiments and confirmed that in verbal recall tasks, spreading the same number of study sessions over time (spaced study) produces better long-term retention than concentrating them (massed study) (Cepeda et al. 2006). In 2008 the same group had 1,354 participants learn a set of obscure facts, with gaps of up to 3.5 months between first study and review and final tests up to a year after the review (Cepeda et al. 2008). The optimal gap grew longer as the test delay increased, but became a smaller proportion of it: for a test a week later, the optimal gap was about 20–40 % of the delay; for a test a year later, about 5–10 %.

So “how long should I wait before reviewing?” has no single answer; it depends on how long you need to remember.

Retrieval practice: why the familiarity of rereading misleads

Evidence

Roediger and Karpicke 2006. Students read short prose passages on scientific topics. Experiment 1 compared “read twice” with “read once and take one recall test”, tested after 5 minutes, 2 days or 1 week: after 5 minutes the rereading group did better, after 2 days and 1 week the testing group did (Roediger and Karpicke 2006). Experiment 2 compared three schedules: four study periods (SSSS), three study periods and one recall test (SSST), and one study period and three recall tests (STTT). The proportions recalled after 5 minutes were 83 %, 78 % and 71 %; after 1 week, 40 %, 56 % and 61 %. The group that read most was the most confident about its future memory at the end of learning, and remembered least a week later.

Evidence

Retrieval practice and concept mapping. In 2011 Karpicke and Blunt had 80 students read a science text and then either read it once only, reread it repeatedly, draw concept maps, or complete two rounds of free recall (with a chance to reread in between). A week later, average accuracy on factual and inference questions was about 67 % for retrieval practice, about 49 % for repeated reading, about 45 % for concept mapping and about 27 % for reading once (Karpicke and Blunt 2011). One limitation should be noted: study time was not fully equal across groups. Rowland’s 2014 meta-analysis of the testing effect gives an overall effect size of about g = 0.50 (Rowland 2014). Dunlosky and colleagues’ 2013 review rated practice testing and distributed practice as “high utility” learning techniques, and rereading and highlighting as “low utility” (Dunlosky et al. 2013).

Why should this be? A common explanation is that rereading produces fluency: the text is understood at a glance, so people mistakenly believe they have remembered it; retrieval, by contrast, is an effortful reconstruction that itself strengthens the memory and exposes what has in fact not been remembered. That active retrieval gives lower scores at the time is an example of the “desirable difficulties” discussed in Chapter 5.

Using only the published means of Roediger and Karpicke’s Experiment 2, pass each condition’s curve exactly through its two points, assuming either a power-law or an exponential form of forgetting, and find when the “read four times” and “read once, test three times” curves cross. Two points cannot distinguish curve shapes; this is arithmetic on published means, not a fit to individual data.

Calculation

# Roediger & Karpicke (2006, Exp. 2) means at 5 min and 1 week, passed exactly through a power
# law p0 (1 + t)^-d or an exponential p0 exp(-t / tau): when do SSSS and STTT cross?
import math

T1, T2 = 5.0, 7 * 24 * 60.0
data = {"SSSS": (0.83, 0.40), "SSST": (0.78, 0.56), "STTT": (0.71, 0.61)}

def power(p1, p2):
    d = math.log(p1 / p2) / math.log((1 + T2) / (1 + T1))
    return p1 * (1 + T1) ** d, d

def expo(p1, p2):
    tau = (T2 - T1) / math.log(p1 / p2)
    return p1 * math.exp(T1 / tau), tau

def fmt(m):
    if m < 120:
        return f"{m:.0f} min"
    return f"{m / 60:.1f} h" if m < 2880 else f"{m / 1440:.1f} days"

for name, (p1, p2) in data.items():
    p0, d = power(p1, p2)
    q0, tau = expo(p1, p2)
    print(f"{name}: power p0 = {p0:.3f}, d = {d:.3f};  exponential p0 = {q0:.3f},"
          f" tau = {tau / 1440:.1f} days")

(a0, ad), (b0, bd) = power(*data["SSSS"]), power(*data["STTT"])
tx = math.exp(math.log(a0 / b0) / (ad - bd)) - 1
print(f"power law: SSSS and STTT curves cross at about {fmt(tx)}")
(a0, at), (b0, bt) = expo(*data["SSSS"]), expo(*data["STTT"])
tx = math.log(a0 / b0) / (1 / at - 1 / bt)
print(f"exponential: they cross at about {fmt(tx)}")

print("power law (SSSS): share of what is still remembered that is lost over the next hour")
a0, ad = power(*data["SSSS"])
for t in (10, 60, 24 * 60, 7 * 24 * 60):
    loss = 1 - ((1 + t + 60) / (1 + t)) ** (-ad)
    print(f"   memory {fmt(t)} old: {loss:6.2%} lost in the next hour")
# SSSS: power p0 = 0.990, d = 0.098;  exponential p0 = 0.830, tau = 9.6 days
# SSST: power p0 = 0.845, d = 0.045;  exponential p0 = 0.780, tau = 21.1 days
# STTT: power p0 = 0.736, d = 0.020;  exponential p0 = 0.710, tau = 46.1 days
# power law: SSSS and STTT curves cross at about 44 min
# exponential: they cross at about 45.4 h
# power law (SSSS): share of what is still remembered that is lost over the next hour
#    memory 10 min old: 16.75% lost in the next hour
#    memory 60 min old:  6.51% lost in the next hour
#    memory 24.0 h old:  0.40% lost in the next hour
#    memory 7.0 days old:  0.06% lost in the next hour

The two shapes put the crossing point in very different places: about 44 minutes after learning under the power law, about 45 hours under the exponential. Experiment 1 already showed the testing group ahead at 2 days, which fits both. So “when does retrieval practice start to win?” cannot be answered from two time points; it needs data at several delays. The last lines of the program show a property of the power law: the older a memory, the smaller the share lost in the next hour (a 10-minute-old memory loses about 16.8 % in the next hour, a day-old memory about 0.4 %), consistent with Ebbinghaus’s “fast at first, slow later”.

The ACT-R activation model: why massed study is forgotten fast

Pavlik and Anderson proposed a model of the spacing effect within the ACT-R cognitive architecture (Pavlik and Anderson 2005). Each study event leaves a trace whose strength decays as a power function of time; the key is that the rate of decay depends on the item’s activation at the time of that study event:

m(t)=ln⁡∑j(t−tj)−dj,dj=cem(tj)+a.m(t) = \ln \sum_j (t – t_j)^{-d_j}, \qquad d_j = c\, e^{m(t_j)} + a.

If an item is studied again while it is still “fresh” (massed study), the new trace decays faster; if it is studied again after a gap, when it has partly faded (spaced study), the new trace decays more slowly. The probability of recall is set by the difference between activation and a threshold.

Four study events with gaps from 10 seconds to 10 days, tested from 10 minutes to a year after the last. The parameters are illustrative: aa and cc are of the order reported for this model, but the original model rescales the time between study sessions, which is omitted here, so the threshold is set lower.

Calculation

# ACT-R spacing model (Pavlik & Anderson 2005): m(t) = ln sum (t - t_j)^-d_j,
# d_j = c exp(m(t_j)) + a; P = 1 / (1 + exp((tau - m) / s)). Illustrative parameters
# (no between-session time rescaling, so tau is set lower). Time in seconds.
import math

A, C, TAU, S = 0.18, 0.22, -1.60, 0.30

def activation(times, t, decays):
    return math.log(sum((t - tj) ** (-dj) for tj, dj in zip(times, decays) if t > tj))

def study(gap, n=4):
    times, decays = [], []
    for k in range(n):
        t = k * gap
        m = activation(times, t, decays) if times else -math.inf
        decays.append(C * math.exp(m) + A)
        times.append(t)
    return times, decays

def p_recall(gap, ri, n=4):
    times, decays = study(gap, n)
    m = activation(times, times[-1] + ri, decays)
    return 1 / (1 + math.exp((TAU - m) / S))

MIN, HOUR, DAY = 60, 3600, 86400
gaps = (("10 s", 10), ("1 min", MIN), ("10 min", 10 * MIN), ("1 h", HOUR),
        ("1 day", DAY), ("3 days", 3 * DAY), ("10 days", 10 * DAY))
ris = (("10 min", 10 * MIN), ("1 day", DAY), ("7 days", 7 * DAY), ("30 days", 30 * DAY),
       ("1 year", 365 * DAY))
print("P(recall) after 4 presentations; rows: gap between presentations, columns: test delay")
print("   gap     | " + " | ".join(f"{r:>7s}" for r, _ in ris))
for g, gs in gaps:
    print(f"   {g:7s} | " + " | ".join(f"{p_recall(gs, rs):7.1%}" for _, rs in ris))
print("best gap for each test delay (search over 1 s to about 300 days):")
cands = [round(10 ** (i / 20)) for i in range(0, 150)]
for r, rs in ris:
    best = max(cands, key=lambda g: p_recall(g, rs))
    b = f"{best / HOUR:.2f} h" if best < DAY else f"{best / DAY:.1f} days"
    print(f"   delay {r:7s}: best gap {b:>9s} = {best / rs:5.1%} of the delay")
print("decay rates of the four traces, massed (10 s) vs spaced (1 day):")
for g in (10, DAY):
    print(f"   gap {g:6d} s: " + ", ".join(f"{d:.3f}" for d in study(g)[1]))
# P(recall) after 4 presentations; rows: gap between presentations, columns: test delay
#    gap     |  10 min |   1 day |  7 days | 30 days |  1 year
#    10 s    |   96.7% |   35.2% |   11.8% |    4.6% |    0.9%
#    1 min   |   98.0% |   50.3% |   19.0% |    7.5% |    1.4%
#    10 min  |   98.2% |   68.6% |   34.0% |   15.0% |    2.9%
#    1 h     |   97.4% |   77.8% |   47.0% |   23.8% |    5.0%
#    1 day   |   94.8% |   80.3% |   62.3% |   40.3% |   11.2%
#    3 days  |   93.7% |   76.6% |   62.6% |   44.0% |   13.8%
#    10 days |   92.4% |   70.7% |   58.9% |   45.0% |   16.5%
# best gap for each test delay (search over 1 s to about 300 days):
#    delay 10 min : best gap    0.07 h = 41.8% of the delay
#    delay 1 day  : best gap    7.83 h = 32.6% of the delay
#    delay 7 days : best gap  1.8 days = 26.2% of the delay
#    delay 30 days: best gap  7.3 days = 24.3% of the delay
#    delay 1 year : best gap 73.0 days = 20.0% of the delay
# decay rates of the four traces, massed (10 s) vs spaced (1 day):
#    gap     10 s: 0.180, 0.325, 0.412, 0.467
#    gap  86400 s: 0.180, 0.208, 0.226, 0.238
Recall probability against test delay (log scale) in the ACT-R activation model with illustrative parameters, for four study events spaced 10 seconds, 10 minutes and 1 day apart. At short delays massed study is slightly better; at long delays spaced study is far better, and the curves cross.

The model reproduces several features of the spacing effect. Tested after 10 minutes, massed study 10 seconds apart (96.7 %) does about as well as, even slightly better than, study a day apart (94.8 %); but after a day the former has fallen to 35.2 % and the latter is at 80.3 %; after a month, 4.6 % against 40.3 %. The reason is in the last two lines: with massed study the decay rates of the last three traces climb from 0.18 to about 0.47; with a day between study events, only to about 0.24. The model’s optimal gap, as a share of the test delay, falls from about 42 % for a 10-minute test to about 20 % for a test after a year, in the same direction as Cepeda and colleagues’ data, but much less steeply than the data (5–10 % at a year). A reminder that this simplified version captures the direction of the mechanism, not its magnitudes.

A spaced-repetition scheduler: SM-2

The earliest and best-known tool that turns these principles into practice is the SM-2 algorithm described by Woźniak in 1990 (Woźniak 1990). After each review the learner grades their recall from 0 to 5; the algorithm adjusts the item’s “easiness factor” accordingly and decides how many days until the next review: 1 day the first time, 6 days the second, and thereafter the previous interval multiplied by the easiness factor; if recall fails (a grade below 3), the item starts again from the beginning.

Drive SM-2 with a simulated learner. The learner’s assumptions: each item has a “memory stability”, and the probability of successful recall falls exponentially with time; successful recall raises stability (harder successes raise it more), and seeing the answer after a failure partly rebuilds it. Compare SM-2, reviewing every three days, and cramming eight reviews into the last two days, measuring average recall probability the day after a 60-day study period and on day 90.

Calculation

# SM-2 (Wozniak 1990): EF <- max(1.3, EF + 0.1 - (5-q)(0.08 + 0.02(5-q))); intervals 1, 6,
# then previous * EF; q < 3 restarts. SIMULATED learner (illustrative): R = exp(-t / S);
# success: S *= 1.5 + 4(1 - R); failure then answer: S = 1.3 max(1, S/2).
import math, random

def learner_review(item, t_now, rng):
    R = math.exp(-(t_now - item["last"]) / item["S"])
    ok = rng.random() < R
    item["S"] = item["S"] * (1.5 + 4 * (1 - R)) if ok else 1.3 * max(1.0, item["S"] / 2)
    item["last"] = t_now
    return (5 if R > 0.9 else 4 if R > 0.75 else 3) if ok else 1

def sm2(n, interval, ef, q):
    ef = max(1.3, ef + 0.1 - (5 - q) * (0.08 + 0.02 * (5 - q)))
    if q < 3:
        return 0, 1, ef
    interval = 1 if n == 0 else 6 if n == 1 else round(interval * ef)
    return n + 1, interval, ef

def make_items(rng, k=40):
    return [{"S": rng.uniform(0.5, 2.0), "last": 0.0} for _ in range(k)]

def retention(items, t):
    return sum(math.exp(-(t - it["last"]) / it["S"]) for it in items) / len(items)

def run(policy, seed=11, days=60):
    rng = random.Random(seed)
    items, reviews, trace = make_items(rng), 0, []
    state = [(0, 0, 2.5, 0) for _ in items]                 # n, interval, EF, next due day
    for day in range(1, days + 1):
        for i, it in enumerate(items):
            n, iv, ef, due = state[i]
            if policy == "SM-2" and day >= due:
                q = learner_review(it, day, rng); reviews += 1
                n, iv, ef = sm2(n, iv, ef, q)
                state[i] = (n, iv, ef, day + iv)
                if i == 0:
                    trace.append(f"d{day}:q{q}")
            elif policy == "every 3 days" and day % 3 == 0:
                learner_review(it, day, rng); reviews += 1
            elif policy == "cram: 8 times in last 2 days" and day >= days - 1:
                for _ in range(4):
                    learner_review(it, day, rng); reviews += 1
    return reviews, retention(items, days + 1), retention(items, days + 30), trace

print("40 simulated items, 60 days of study; retention = mean recall probability")
print("policy                       | reviews | at day 61 | at day 90")
for pol in ("SM-2", "every 3 days", "cram: 8 times in last 2 days"):
    rev, r60, r90, tr = run(pol)
    print(f"{pol:28s} | {rev:7d} | {r60:9.1%} | {r90:9.1%}")
tr = run("SM-2")[3]
print("SM-2 review days and grades, item 1:", " ".join(tr[:8]))
print("   ...", " ".join(tr[8:]))
# 40 simulated items, 60 days of study; retention = mean recall probability
# policy                       | reviews | at day 61 | at day 90
# SM-2                         |     418 |     96.5% |     87.9%
# every 3 days                 |     800 |     91.7% |     77.0%
# cram: 8 times in last 2 days |     320 |     95.7% |     34.2%
# SM-2 review days and grades, item 1: d1:q3 d2:q1 d3:q3 d4:q4 d10:q3 d19:q4 d33:q1 d34:q5
#    ... d35:q5 d41:q5 d51:q5

In this simulation SM-2 uses 418 reviews, and average recall probability is 96.5 % the day after the study period and 87.9 % a month later; reviewing every three days takes almost twice as many reviews (800) and gives lower figures on both occasions (91.7 % and 77.0 %); cramming uses only 320 reviews and does almost as well as SM-2 on the next day (95.7 %), but is down to 34.2 % a month later. The review record of the first item shows the scheduler’s logic: after a failure the interval resets to 1 day, then quickly lengthens again.

Note

Simulation is not evidence. The results depend entirely on our assumptions about the simulated learner and show the scheduler’s logic, not its effect on real learners; SM-2 is a 1990s heuristic with many later improvements. Cramming’s good next-day score is a reminder that judging by performance on the day of the test easily misleads.

Chapter summary

Forgetting is fast at first and slower later, and power functions often describe it better than exponentials. Spaced study beats massed study; the optimal gap grows with the time for which material must be retained, but shrinks as a proportion of it. Retrieval practice is worse than rereading at the time and clearly better a week later (Roediger and Karpicke, Experiment 2: 61 % against 40 %); the fluency of rereading leads people to overestimate their memory. The ACT-R activation model explains the spacing effect by “study while fresh, decay faster”; schedulers such as SM-2 turn these principles into a daily review list. The next chapter discusses another practice that is “harder now, better later”: interleaving.

References

Cepeda, Nicholas J., Harold Pashler, Edward Vul, John T. Wixted, and Doug Rohrer. 2006. “Distributed Practice in Verbal Recall Tasks: A Review and Quantitative Synthesis.” Psychological Bulletin 132 (3): 354–80. https://doi.org/10.1037/0033-2909.132.3.354.
Cepeda, Nicholas J., Edward Vul, Doug Rohrer, John T. Wixted, and Harold Pashler. 2008. “Spacing Effects in Learning: A Temporal Ridgeline of Optimal Retention.” Psychological Science 19 (11): 1095–102. https://doi.org/10.1111/j.1467-9280.2008.02209.x.
Dunlosky, John, Katherine A. Rawson, Elizabeth J. Marsh, Mitchell J. Nathan, and Daniel T. Willingham. 2013. “Improving Students’ Learning with Effective Learning Techniques: Promising Directions from Cognitive and Educational Psychology.” Psychological Science in the Public Interest 14 (1): 4–58. https://doi.org/10.1177/1529100612453266.
Ebbinghaus, Hermann. 1885. Über Das Gedächtnis: Untersuchungen Zur Experimentellen Psychologie. Duncker & Humblot.
Karpicke, Jeffrey D., and Janell R. Blunt. 2011. “Retrieval Practice Produces More Learning Than Elaborative Studying with Concept Mapping.” Science 331 (6018): 772–75. https://doi.org/10.1126/science.1199327.
Murre, Jaap M. J., and Joeri Dros. 2015. “Replication and Analysis of Ebbinghaus’ Forgetting Curve.” PLoS ONE 10 (7): e0120644. https://doi.org/10.1371/journal.pone.0120644.
Pavlik, Jr., Philip I., and John R. Anderson. 2005. “Practice and Forgetting Effects on Vocabulary Memory: An Activation-Based Model of the Spacing Effect.” Cognitive Science 29 (4): 559–86. https://doi.org/10.1207/s15516709cog0000_14.
Roediger, III, Henry L., and Jeffrey D. Karpicke. 2006. “Test-Enhanced Learning: Taking Memory Tests Improves Long-Term Retention.” Psychological Science 17 (3): 249–55. https://doi.org/10.1111/j.1467-9280.2006.01693.x.
Rowland, Christopher A. 2014. “The Effect of Testing Versus Restudy on Retention: A Meta-Analytic Review of the Testing Effect.” Psychological Bulletin 140 (6): 1432–63. https://doi.org/10.1037/a0037559.
Wixted, John T., and Ebbe B. Ebbesen. 1991. “On the Form of Forgetting.” Psychological Science 2 (6): 409–15. https://doi.org/10.1111/j.1467-9280.1991.tb00175.x.
Woźniak, Piotr A. 1990. “Optimization of Learning.” Master’s thesis, University of Technology in Poznań.

Fan, Y. (2026). The 85% Rule for Optimal Learning, Myelination Kinetics and Deliberate Practice: From Stochastic Gradient Descent and the Zone of Proximal Development to Spaced Repetition, Read Beside Classical Chinese Learning Theory [学习的85%最优错误率定律、髓鞘化动力学与刻意练习] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23761339 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).