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

Знание как вероятность

Классическая ошибка — пытаться напрямую определить, знает ли ученик тему. Это невозможно: умение — внутри головы, мы видим только результат (правильно / неправильно).

В BKT мы сдаёмся на это и говорим:

Состояние ученика — это скрытая переменная. Мы её не знаем точно. Но мы можем оценивать вероятность того, что ученик ею владеет.

Эта вероятность — главное число всей модели:

P(L)=P(ученик овладел навыком),P(L)[0,1]P(L) = \mathbb{P}\big(\text{ученик овладел навыком}\big), \quad P(L) \in [0, 1]

L — от learned. Это просто число от 0 до 1.

  • P(L)=0.0P(L) = 0.0 — мы уверены, что не знает.
  • P(L)=0.5P(L) = 0.5 — «понятия не имеем».
  • P(L)=1.0P(L) = 1.0 — уверены, что знает.

В реальности P(L)P(L) почти никогда не бывает строго 0 или 1 — модель оставляет себе сомнение. Это правильно: один правильный ответ — не доказательство, одна ошибка — не приговор.

Когда ученик впервые встречается с навыком, мы ставим априорную вероятность P(L0)P(L_0) — нашу догадку до любых наблюдений.

Литературный дефолт — P(L0)=0.2P(L_0) = 0.2:

«Скорее не знает, но чуть-чуть, может быть, что-то слышал.»

Если у тебя по теме отличные показатели на других навыках, можно поднять. Если тема свежая — оставить 0.2. Этот параметр потом подгонится автоматически на реальных данных (см. Notebook 3 — EM fitting).

Простыми словами:

  1. Правильный ответP(L)P(L) растёт.
  2. Неправильный ответP(L)P(L) падает.
  3. Но не на «целое» — а на величину, которая зависит от того, насколько уверена модель до наблюдения, и от параметров slip/guess (см. главу 4).

Главное: P(L)P(L) движется плавно. Это спасает модель от двух распространённых ошибок:

  • Паника при одной ошибке («ученик ничего не знает!»).
  • Эйфория при одном правильном ответе («гений!»).
Шкала уверенности модели:
0 ────────●────────────────────────────────── 1
не знает P(L)=0.2 (старт) знает
После одной правильной задачи:
0 ─────────────────────●───────────────────── 1
P(L)=0.58
После двух правильных:
0 ─────────────────────────────────●───────── 1
P(L)=0.87

Цифры — реальные результаты обновления BKT с дефолтными параметрами. Численный пример разбирает их в деталях.

Важный нюанс: мы не храним один P(L)P(L) на ученика. Мы храним вектор:

Иван:
раскрытие_скобок: 0.42
распределительный_закон: 0.81
знаки: 0.66
перенос_через_равно: 0.55
...

То есть каждый навык — отдельная история. Иван может быть силён в арифметике и слаб в скобках одновременно, и модель это видит.

Ниже — реальный BKT-симулятор. Жми ✓ или ✗ и смотри, как P(L)P(L) ползёт вверх (правильные ответы) или вниз (ошибки), а P(solve)P(\text{solve}) автоматически тянется за ним.

Параметры BKT
Шаг
0
P(L)
0.200
P(solve)
0.340
ZPD?
✗ нет

Заметь:

  • P(L)P(L) никогда не достигает 0 или 1 строго — в BKT всегда есть остаток сомнения;
  • после правильного ответа P(L)P(L) подскакивает, после ошибки — падает, но не симметрично;
  • P(solve)P(\text{solve}) всегда «сжатее» — между P(G)P(G) и 1P(S)1 - P(S), потому что включает шум угадывания и слипа.

Зачем мы храним вектор P(L)P(L) для каждого навыка, и почему один общий «уровень математики» — плохая идея, в следующей главе.