Перейти к содержимому

P(solve) и зона ближайшего развития

Имея P(L)P(L) для каждого микро-навыка, мы можем предсказать, с какой вероятностью ученик решит конкретную задачу прямо сейчас — и подобрать ту, что ему сейчас в самый раз.

Для одного навыка задачи:

P(solve)=P(L)(1P(S))+(1P(L))P(G)P(\text{solve}) = P(L) \cdot (1 - P(S)) + (1 - P(L)) \cdot P(G)

Это «знает И не оплошает» плюс «не знает, но угадает».

Численно:

P(L)P(L)P(solve)P(\text{solve})
0.00.20
0.20.34
0.50.55
0.70.69
0.90.83
1.00.90

То есть P(solve) всегда между P(G)=0.20P(G) = 0.20 и 1P(S)=0.901 - P(S) = 0.90 — расчёт никогда не опускается до 0 (всегда есть шанс угадать) и не поднимается до 1 (всегда есть шанс ошибиться).

Лев Выготский, советский психолог, в 1930-х сформулировал ключевую идею для всей педагогики:

Ученик растёт быстрее всего на задачах, которые немного выше его текущего уровня — не на тех, что уже умеет (скучно, нет роста), и не на тех, что слишком далеки (фрустрация, бросит).

Это и есть Zone of Proximal Development (ZPD).

Численно: «немного выше» в исследованиях обычно соответствует P(solve)0.7P(\text{solve}) \approx 0.7 — задача, где ученик примерно в 70% случаев справляется. Не слишком близко к гарантированному успеху, не слишком далеко.

Алгоритм выбора задачи:

  1. Для каждой задачи в базе — посчитать P(solve)P(\text{solve}) ученика.
  2. Найти ту, у которой P(solve)0.7|P(\text{solve}) - 0.7| минимально.
  3. Эту задачу и предложить.

В коде это делается через гауссиану — функция «близости к цели»:

closeness(p)=exp((p0.7)20.03)\text{closeness}(p) = \exp\left(-\frac{(p - 0.7)^2}{0.03}\right)
// Closeness to target — Gaussian-ish, peaks at target=0.7
const closeness = Math.exp(-Math.pow(pSolveJoint - target, 2) / 0.03);

Чем ближе P(solve)P(\text{solve}) к 0.7, тем выше closeness; пик ровно в 0.7.

closeness
1.0 ┤ ●
0.8 ┤ ● ● ●
0.6 ┤ ● ●
0.4 ┤ ● ●
0.2 ┤ ● ●
0.0 ┤●● ●●
0.0 0.3 0.7 0.9 1.0
P(solve)

Почему именно гауссиана, а не «модуль разности»

Заголовок раздела «Почему именно гауссиана, а не «модуль разности»»

Гауссиана:

  • симметрична вокруг 0.7;
  • быстро штрафует задачи, далёкие от цели;
  • гладкая — нет острых углов, что даёт стабильное поведение селектора.

Параметр 0.03 в знаменателе — это «ширина» допуска:

  • 0.030.03 ⇒ задачи в диапазоне [0.55,0.85][0.55, 0.85] имеют closeness > 0.5;
  • 0.010.01 — слишком жёстко: «строго 0.7 ± 0.05»;
  • 0.100.10 — слишком мягко: «всё, что между 0.4 и 1.0, одинаково хорошо».

Это число можно подгонять, но 0.03 даёт хороший разброс на практике.

Учительский кейс: у Ивана арифметика на 0.85, скобки на 0.40. Какую задачу дать?

Если просто искать «P(solve)0.7P(\text{solve}) \approx 0.7» — мы можем случайно выбрать задачу на арифметику (которая ему относительно сложна по причине комбинации с другими микро-навыками) и так и не коснуться скобок.

Поэтому селектор добавляет rare-skill bonus:

// Rarity bonus: how many of this task's skills are below 0.4?
const undertrained = task.microskills.filter(
(s) => (state.mastery[s] ?? params.pInit) < 0.4
).length;
const rarity = undertrained / task.microskills.length;
const score = closeness + rareBonus * rarity;

Перевод: если у задачи большая доля «недотренированных» навыков (те, у которых P(L)<0.4P(L) < 0.4), мы её слегка «приподнимаем» в рейтинге. Это исследовательский компонент — модель не зависает в зоне комфорта.

Двигай target и σ². Видно, как меняется «окно» ZPD: уже σ² — острее пик, селектор станет педантичнее по отношению к target.

closeness = exp(−(p−target)²/σ²). Выше у пика, быстро падает к краям. Чем меньше σ², тем уже «ZPD-окно».

Возвращаясь к Ивану после 6 задач (см. предыдущую главу):

  • P(L)=0.166P(L) = 0.166 для скобок.
  • P(solve)P(\text{solve}) задачи только на скобки = 0.1660.9+0.8340.2=0.3170.166 \cdot 0.9 + 0.834 \cdot 0.2 = 0.317.

Эта задача слишком сложна — closeness ≈ 0.0, селектор её не выберет. Лучше:

  • задача с двумя навыками (скобки + знакомая арифметика);
  • так P(solve)0.550.65P(\text{solve}) \approx 0.55-0.65 — ближе к ZPD;
  • модель тренирует слабое место без полной фрустрации.

См. главу о multi-skill задачах.