При предобучении правильный следующий токен берётся из самого текста: разметка почти бесплатна. Но бесплатная разметка не значит нейтральная. Что именно собрано, что повторено, что отфильтровано и в какой пропорции смешано — это и есть скрытая программа поведения модели, и в этом уроке мы её измерим.

Разметка, которой никто не писал

Возьмём реальный корпус — коллекцию SMS-сообщений, ту самую, на которой в уроке 42 мы учили наивный Байес ловить спам. В ней 55745574 документа: 48274827 обычных сообщений и 747747 рекламных. После токенизации в корпусе 106143106\,143 токена. Сколько обучающих примеров можно из него сделать, если ни один человек не поставит ни одной метки?

Документ (x1,,xn)(x_1,\ldots,x_n) раскладывается по цепному правилу вероятностей:

pθ(x1,,xn)=t=1npθ(xtx1,,xt1).p_\theta(x_1,\ldots,x_n)=\prod_{t=1}^{n}p_\theta(x_t\mid x_1,\ldots,x_{t-1}).

Каждый сомножитель — отдельная задача предсказания, и в документе из nn токенов их ровно n1n-1 (первый токен предсказывать не из чего). По всему корпусу:

d=15574(nd1)=1061435574=100569.\sum_{d=1}^{5574}(n_d-1)=106\,143-5574=100\,569 .

Сто тысяч обучающих пар из пяти с половиной тысяч сообщений — и ни одного размеченного примера. Такая цель называется самообучением с учителем внутри данных (self-supervised): структура входа сама порождает target.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева строка входных токенов и под ней та же строка, сдвинутая на одну позицию, — targets; справа треугольная матрица causal mask с единицами на диагонали и ниже
Рис. 78.1. Сдвиг на одну позицию превращает текст в размеченную выборку

Верхняя строка — входные токены реального сообщения, нижняя сдвинута на одну позицию: это и есть targets. Последняя позиция остаётся без цели. Справа — маска внимания: единица означает «эту позицию видно», ноль — «это будущее». Стоит открыть хотя бы одну клетку выше диагонали, и задача становится тривиальной: модель просто спишет ответ. Весь реальный корпус даёт 100569100\,569 обучающих пар при нулевой стоимости разметки.

Что именно оптимизирует следующий токен

Функция потерь — сумма отрицательных логарифмов правильных вероятностей:

L(θ)=t=1n1logpθ(xt+1xt).\mathcal L(\theta)=-\sum_{t=1}^{n-1}\log p_\theta(x_{t+1}\mid x_{\le t}).

Обычно её делят на число позиций, получая средний NLL на токен, и именно эта величина сравнима между корпусами разной длины:

=1Nt(logpθ(xt+1xt)).\ell=\frac{1}{N}\sum_{t}\bigl(-\log p_\theta(x_{t+1}\mid x_{\le t})\bigr).

Это та же кросс-энтропия, что и в уроке 20, и то же максимальное правдоподобие, что и в уроке 45: минимизировать \ell — значит максимизировать tpθ\prod_t p_\theta. Удобная единица измерения — перплексия:

PPL=exp(),\mathrm{PPL}=\exp(\ell),

«эффективное число равновероятных вариантов», между которыми модель колеблется на каждом шаге. Модель с =5,96\ell=5{,}96 ведёт себя так, как если бы честно выбирала из exp(5,96)388\exp(5{,}96)\approx 388 равновероятных токенов.

Шеннон измерял ровно то, что сегодня минимизирует предобучение: насколько предсказуем следующий символ. Он же показал главное ограничение цели. Модель учит орфографию, синтаксис, факты и шаблоны рассуждений ровно настолько, насколько они сокращают описание текста. Отдельной цели «говорить правду» в формуле нет. Если в корпусе устойчиво повторяется ложное утверждение, оно сжимает текст не хуже истинного.

Чем мы всё это измеряли

Все числа этого урока получены на настоящем корпусе и настоящей — пусть и крошечной — языковой моделью. Модель биграммная: вероятность следующего токена зависит только от предыдущего,

pθ(xt+1xt)p(xt+1xt),p_\theta(x_{t+1}\mid x_{\le t})\approx p(x_{t+1}\mid x_t),

а оценивается она сглаженной частотой, как в уроке 48:

p^(ba)=c(a,b)+κc(a)+κV,κ=0,3,\widehat p(b\mid a)=\frac{c(a,b)+\kappa}{c(a)+\kappa V},\qquad \kappa=0{,}3,

где c(a,b)c(a,b) — сколько раз пара встретилась в обучающем потоке, VV — размер словаря. Без сглаживания любая невиданная пара дала бы log0=-\log 0=\infty, и сравнивать корпуса было бы нельзя.

Такая модель — не трансформер, и абсолютные значения loss у неё скромные. Но все четыре эффекта урока — обмен между доменами, эффективные эпохи, запоминание при повторе и рост метрики от утечки — свойства данных, а не архитектуры, и потому воспроизводятся уже здесь. Полезное свойство биграмм: эксперимент занимает секунды, поэтому его можно повторить в классе и проверить каждое число самому.

Средний loss полезно разложить: если истинное распределение текста pp, а модель даёт qq, то

=H(p)неустранимо+DKL(pq)наше незнание.\ell=\underbrace{H(p)}_{\text{неустранимо}}+\underbrace{D_{\mathrm{KL}}(p\|q)}_{\text{наше незнание}} .

Первое слагаемое — энтропия языка, его не убрать никаким корпусом. Улучшать данные значит уменьшать второе. Именно поэтому «сделать loss нулевым» невозможно, а «сделать его нулевым на конкретных документах» — очень даже, и дальше мы увидим, чем это оборачивается.

От сырого веба к обучающей смеси

Между «страницей в интернете» и «токеном в обучающем потоке» лежит конвейер: снимок страниц, извлечение основного текста, определение языка, отсев спама и навигации, дедупликация, оценка качества, исключение чувствительных данных, смешивание источников с весами, токенизация и упаковка в последовательности фиксированной длины.

Каждый шаг конвейера — это решение, чей текст не попадёт в модель. Проведём такой конвейер на нашем реальном корпусе. Точная дедупликация убирает 95929592 токена, порог near-duplicate J0,7J\geq0{,}7 — ещё около трёх тысяч, фильтр длины и фильтр доли букв — по мелочи. До обучения доживает 9341593\,415 токенов, то есть 88,0%88{,}0\% исходного корпуса.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Горизонтальные полосы: сырой корпус 100 процентов, после точного dedup 91 процент, после near-dup 88,3 процента, после фильтра длины 88,0 процента, после фильтра доли букв 88,0 процента
Рис. 78.2. Каскад фильтров: сколько токенов доживает до обучения

Реальный SMS-корпус, фильтры применены каскадом, каждый следующий — к тому, что осталось. Точный dedup стоит 9%9\% токенов, near-duplicate с порогом J0,7J\geq0{,}7 — ещё 2,7%2{,}7\%, фильтр длины и фильтр доли букв почти ничего не меняют по объёму. Важно не только «сколько осталось», но и «кого не стало»: последние два фильтра, дешёвые по токенам, выкидывают документы непропорционально из одного жанра.

Фильтр — это редакторское решение

Классификатор «качественного текста», обученный на энциклопедиях, будет предпочитать энциклопедический стиль и вычищать разговорную речь. Фильтр токсичности непропорционально удаляет документы, обсуждающие дискриминацию — именно потому, что в них часто цитируются оскорбления. Фильтр по доле букв убивает таблицы и код. Формально каждое правило — одна строка, содержательно каждое — редакционная политика.

Полезно записывать эффект фильтра как две разные величины:

retained tokens=dKnddnd,genre recallg=KGgGg,\text{retained tokens}=\frac{\sum_{d\in K}n_d}{\sum_{d}n_d}, \qquad \text{genre recall}_g=\frac{|K\cap G_g|}{|G_g|},

где KK — оставленные документы, GgG_g — документы жанра gg. Первая величина почти всегда выглядит успокаивающе, вторая — вскрывает перекос. На нашем корпусе фильтр длины сохранил 88,0%88{,}0\% токенов, но удалил 9090 разговорных сообщений против 22 рекламных.

Повтор не равен новому свидетельству

Веб полон зеркал, цитат, шаблонов и копий. Loss складывает вклад позиций, а значит, документ, встреченный mm раз, получает вес mm:

L=dmdtlogpθ(xt+1(d)xt(d)).\mathcal L=-\sum_{d}m_d\sum_{t}\log p_\theta(x^{(d)}_{t+1}\mid x^{(d)}_{\le t}).

Никакой отдельной «настройки важности» здесь нет: важность создаётся самим фактом повтора. В нашем реальном корпусе 55745574 документа, но лишь 51545154 различных: 420420 документов (7,5%7{,}5\%) — дословные копии. Чемпион — фраза sorry, i'll call later, встречающаяся 3030 раз. По токенам копии весят 95929592, то есть 9,0%9{,}0\% корпуса.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева горизонтальные столбики шести самых частых дословных сообщений, максимум тридцать повторов; справа кривая: при пороге Jaccard 0,5 находится 1485 пар, при пороге 1,0 — 959 пар
Рис. 78.3. Дословные копии и зависимость числа «почти копий» от порога

Слева — шесть самых частых дословных документов реального корпуса; верхнее сообщение повторено 3030 раз и получает в loss тридцатикратный вес. Справа — сколько пар документов считаются «почти копиями» при разных порогах Jaccard по трёхграммам: 14851485 пар при пороге 0,50{,}5 и 959959 при пороге 1,01{,}0. Между этими числами нет объективной границы — есть выбор, который делает инженер.

Формально близость документов измеряют через множества kk-грамм S(D)S(D):

J(D1,D2)=S(D1)S(D2)S(D1)S(D2).J(D_1,D_2)=\frac{|S(D_1)\cap S(D_2)|}{|S(D_1)\cup S(D_2)|}.

Сравнивать все пары дорого:

(N2)=N(N1)2=557455732=15531951\binom{N}{2}=\frac{N(N-1)}{2}=\frac{5574\cdot5573}{2}=15\,531\,951

пар только на нашем маленьком корпусе; при миллиарде документов это число становится астрономическим. Поэтому используют MinHash: для случайной перестановки хэшей выполняется

Pr[minh(S(D1))=minh(S(D2))]=J(D1,D2),\Pr\bigl[\min h(S(D_1))=\min h(S(D_2))\bigr]=J(D_1,D_2),

и JJ оценивается долей совпавших минимумов по rr независимым хэшам:

J^=1ri=1r1[minhi(S1)=minhi(S2)],sd(J^)=J(1J)r12r.\widehat J=\frac{1}{r}\sum_{i=1}^{r}\mathbb 1\bigl[\min h_i(S_1)=\min h_i(S_2)\bigr], \qquad \mathrm{sd}(\widehat J)=\sqrt{\frac{J(1-J)}{r}}\le\frac{1}{2\sqrt r}.

При r=128r=128 ошибка оценки не превышает 0,0450{,}045 — этого хватает, чтобы отличить порог 0,70{,}7 от 0,90{,}9, но не хватает, чтобы спорить о третьем знаке.

Смесь как оптимизационный выбор

Пусть источник jj содержит DjD_j токенов, а в потоке ему отведён вес wjw_j при общем бюджете DtrainD_{\mathrm{train}} токенов. Тогда эффективное число проходов по источнику:

EjwjDtrainDj,jwj=1.E_j\approx\frac{w_jD_{\mathrm{train}}}{D_j},\qquad \sum_j w_j=1 .

Это самая полезная формула урока. Она объясняет, почему один и тот же вес означает совершенно разные вещи для большого и маленького источника. В нашем эксперименте пул разговорных сообщений — 8200882\,008 токенов, пул рекламных — 1881418\,814, бюджет обучения 6000060\,000 токенов. При w=0,2w=0{,}2 рекламный источник проходится E=0,64E=0{,}64 раза, то есть даже не целиком; при w=1w=1E=3,19E=3{,}19 раза, и каждое сообщение модель видит трижды.

Если мы хотим ограничить число проходов сверху величиной EmaxE_{\max}, формула сразу даёт потолок веса:

EjEmaxwjEmaxDjDtrain.E_j\le E_{\max} \quad\Longleftrightarrow\quad w_j\le\frac{E_{\max}D_j}{D_{\mathrm{train}}} .

Маленький источник просто не может получить большой вес, не начав повторяться: это не вопрос вкуса, а арифметика. И ещё одно следствие: доля источника в обновлениях градиента равна не доле его документов, а доле его токенов,

доля обновленийj=wjDtrainDtrain=wj,доля документовj=wjDtrainnˉj/iwiDtrainnˉi,\text{доля обновлений}_j=\frac{w_jD_{\mathrm{train}}}{D_{\mathrm{train}}}=w_j, \qquad \text{доля документов}_j=\frac{w_jD_{\mathrm{train}}}{\bar n_j}\Big/\sum_i\frac{w_iD_{\mathrm{train}}}{\bar n_i},

где nˉj\bar n_j — средняя длина документа источника. Источник с длинными текстами при одинаковом весе даёт меньше документов, но столько же обновлений.

Итоговый loss — взвешенная сумма доменных:

Lсмесь(w)=jαjj(w),\mathcal L_{\text{смесь}}(w)=\sum_j \alpha_j\,\ell_j(w),

где j(w)\ell_j(w) — отложенный loss на домене jj, а αj\alpha_j — веса, с которыми мы оцениваем важность доменов. Обратите внимание: ww и α\alpha — разные вещи. Первое определяет, чем кормить модель, второе — чей результат нам дорог. Ошибка «взять α\alpha из ww» превращает выбор смеси в самооправдание.

Среднее скрывает обмен

Проведём честный эксперимент. Обучаем биграммную модель со сглаживанием на потоке в 6000060\,000 токенов, меняя долю рекламных сообщений ww от 00 до 11, и каждый раз измеряем отложенный NLL отдельно по двум доменам.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Синяя кривая loss на разговорных сообщениях растёт с долей рекламы, красная кривая loss на рекламе падает, две усреднённые кривые имеют минимумы в разных точках 0,25 и 0,6
Рис. 78.4. Смесь — это обмен: один домен выигрывает ровно там, где второй теряет

Синяя кривая (разговорные SMS) растёт от 5,965{,}96 до 7,337{,}33, красная (рекламные) падает от 7,377{,}37 до 5,255{,}25. Они пересекаются около w=0,23w=0{,}23. Зелёная штриховая — среднее с равными весами доменов, её минимум при w=0,6w=0{,}6; золотая пунктирная — среднее с весами 80/2080/20, минимум при w=0,25w=0{,}25. Одни и те же измерения, разные α\alpha — вдвое разные ответы про «правильный процент рекламы в корпусе».

Три вывода, которые видно прямо на графике. Во-первых, ни одна точка не улучшает оба домена: кривые монотонны и направлены навстречу. Во-вторых, «оптимальная смесь» — не свойство данных, а свойство выбранных α\alpha: при равных весах оптимум 0,60{,}6, при весах 80/2080/200,250{,}25. В-третьих, крайние точки дороги: при w=0w=0 модель не видела рекламы и платит 7,377{,}37 вместо 5,255{,}25, то есть перплексия хуже вчетверо.

Лаборатория смеси

Веса источников, повтор и утечка benchmark

Загружается живая иллюстрация…

Внутри виджета обучается настоящая биграммная модель со сглаживанием — та же арифметика, что в фигурах урока, только на трёх модельных источниках («код», «диалоги», «статьи») с фиксированным seed, чтобы результат был воспроизводим. Бюджет потока постоянен: увеличивая вес одного источника, вы физически отнимаете токены у других.

Сначала поставьте вес «кода» в ноль: его отложенный loss подскакивает — навык, которому не учили, не появляется. Верните вес и доводите его до единицы: собственный loss «кода» почти перестаёт улучшаться (пул мал, начинается повтор), а два других домена уверенно портятся. Это и есть та самая асимметрия, которую не видно в одном усреднённом числе.

Затем включите повтор документов «кода». Loss на самом обучающем потоке — цифра, которую видит оптимизатор, — падает, а отложенный loss того же домена растёт. И наконец, включите утечку benchmark: NLL на benchmark резко улучшается, а все три доменных столбика не двигаются с места.

Повтор и запоминание

Теперь измерим цену повтора количественно. Берём фиксированный бюджет 6000060\,000 токенов, выделяем «премиальный» набор из 150150 документов (33863386 токенов) и повторяем его kk раз, добирая остаток бюджета обычными документами. Растёт kk — растёт доля премиального набора в потоке: при k=16k=16 он занимает 90,3%90{,}3\% обучающих токенов.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Две кривые по оси повторов 1, 2, 4, 8, 16: красная (loss на повторённых документах) падает с 5,59 до 4,14, синяя (loss на отложенных) растёт с 5,99 до 6,64
Рис. 78.5. Повтор снижает loss там, где смотрит оптимизатор, и повышает там, где важно

Красная кривая — loss на самих повторённых документах: он падает с 5,595{,}59 до 4,144{,}14. Синяя — loss на отложенных документах, которых модель не видела никогда: он растёт с 5,995{,}99 до 6,646{,}64. Обе кривые монотонны и расходятся. Бюджет всё это время постоянен: повтор не добавляет знания, он вытесняет разнообразие.

Механизм прозрачен. При фиксированном бюджете каждая лишняя копия занимает место, куда мог попасть новый документ:

kDпремповторы+Dновоеразнообразие=Dtrain=const.\underbrace{k\cdot D_{\text{прем}}}_{\text{повторы}} +\underbrace{D_{\text{новое}}}_{\text{разнообразие}} =D_{\mathrm{train}}=\mathrm{const}.

Модель уточняет статистику ста пятидесяти текстов вместо того, чтобы увидеть тысячи. В маленькой биграммной модели это выглядит как обострение условных распределений, в большой — как дословное воспроизведение фрагментов, то есть memorization. Связь с переобучением из урока 32 прямая, но причина здесь не в избыточной ёмкости, а в составе данных.

Утечка benchmark

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

Проверим это честно. Benchmark — 400400 отложенных документов; половину из них («утёкшую») мы подмешиваем в обучение в трёх копиях, вторая половина остаётся чистой. Метрика — доля верно угаданных следующих токенов.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Четыре кривые по доле утечки: красная (точные копии) растёт с 19,4 до 36,2 процента, золотая (почти копии) до 30,1, фиолетовая (среднее по benchmark) до 27,9, синяя (чистая половина) остаётся около 19 процентов
Рис. 78.6. Утечка поднимает метрику, не меняя навыка

Красная кривая: чем больше тестовых документов попало в обучение, тем лучше модель предсказывает именно их — с 19,4%19{,}4\% до 36,2%36{,}2\%. Синяя: на чистой половине benchmark ничего не происходит, 19,1%19{,}1\% против 18,8%18{,}8\% — навык не изменился. Фиолетовая: средняя по всему benchmark цифра, которую и публикуют, вырастает до 27,9%27{,}9\%. Золотая: даже если в обучение попали не точные копии, а тексты с выброшенной третью токенов, метрика всё равно поднимается до 30,1%30{,}1\%.

Разложение измеряемой метрики объясняет картину без всякой мистики. Пусть доля загрязнённых документов pp, точность на них aleaka_{\text{leak}}, на чистых — acleana_{\text{clean}}:

a^=paleak+(1p)aclean.\widehat a = p\,a_{\text{leak}} + (1-p)\,a_{\text{clean}} .

Отчётная метрика линейна по доле загрязнения, и производная равна разрыву:

da^dp=aleakaclean.\frac{d\widehat a}{dp}=a_{\text{leak}}-a_{\text{clean}} .

При aclean=0,188a_{\text{clean}}=0{,}188 и aleak=0,362a_{\text{leak}}=0{,}362 каждая десятая доля загрязнения добавляет к отчётной цифре около 1,71{,}7 процентного пункта. Сам разрыв

Δ=aleakaclean=36,2%18,8%=17,4 п.п.\Delta = a_{\text{leak}} - a_{\text{clean}} = 36{,}2\% - 18{,}8\% = 17{,}4\ \text{п.п.}

и есть диагностический сигнал: у честной модели он статистически неотличим от нуля.

Фраза Джелинека обычно цитируется как гимн статистике против правил. Но у неё есть вторая, менее удобная половина: если качество определяется данными, то и ответственность за качество переезжает из грамматик в корпус. Уволить лингвиста легко, уволить корпус нельзя — он и есть модель.

Ближние копии проходят сквозь любой фильтр

Золотая кривая на рис. 78.6 — самое неприятное наблюдение урока. В обучение попадали не копии, а тексты, из которых случайно выброшена треть токенов; ни один хэш такого не поймает. Тем не менее метрика выросла до 30,1%30{,}1\% — это около двух третей эффекта точной утечки:

30,119,436,219,40,64.\frac{30{,}1-19{,}4}{36{,}2-19{,}4}\approx0{,}64 .

Отсюда практическая иерархия методов и их слепых зон:

exact hash  shingle/MinHash  embedding search,\text{exact hash}\ \subset\ \text{shingle/MinHash}\ \subset\ \text{embedding search},

где каждый следующий ловит больше и ошибается чаще. Перевод, пересказ и смена чисел проходят сквозь первые два уровня почти без потерь.

К этому добавляется временная ось. У каждой страницы есть дата публикации и дата снимка. Текст, обновлённый после выхода benchmark, может содержать его ответы, хотя URL старый и дата публикации невинна. Дедупликация по URL этого не видит: нужен хэш конкретного содержимого вместе со временем.

ключ дедупликации=hash(нормализованный текст)  дата снимка.\text{ключ дедупликации} = \mathrm{hash}(\text{нормализованный текст})\ \|\ \text{дата снимка}.

Правило разделения выборок из урока 32 здесь масштабируется: в одну часть должны идти не отдельные документы, а целые семейства — версии страницы, зеркала, переводы и весь сайт целиком. Иначе почти-копия пересечёт границу и заберёт с собой ваш оптимизм.

Частотные словари: русская линия

Мысль «корпус — это программа» появилась задолго до нейросетей, и в отечественной науке у неё есть точный адрес. В 1960-е годы в Ленинграде Роман Гершевич Пиотровский создал школу инженерной лингвистики и группу «Статистика речи» — объединение исследователей из десятков городов, которое десятилетиями занималось ровно тем, что сегодня называют работой с корпусом: считало частоты, измеряло избыточность текста, оценивало покрытие словаря и строило на этих измерениях системы машинного перевода. Из этой школы вышли разработчики отечественных переводческих систем, а её методологический тезис звучит совершенно современно: свойства текстового массива определяют возможности любой автоматической обработки.

Второй сюжет — «Частотный словарь русского языка» под редакцией Л. Н. Засориной (1977). Он построен на корпусе примерно в миллион словоупотреблений, и — вот важная деталь — этот миллион был собран не как попало, а из четырёх жанров примерно равными долями: художественная проза, драматургия, научно-публицистические тексты и газетно-журнальные материалы. Это в точности проектирование обучающей смеси: составители заранее решили, с какими весами языковые регистры войдут в итоговую статистику, и понимали, что от этого решения зависит порядок слов в словаре.

Разница с нашим временем количественная, а не качественная. Там миллион словоупотреблений и четыре жанра, здесь триллионы токенов и сотни источников; там результат — печатная таблица частот, здесь — веса модели. Вопрос один и тот же: чьи тексты и в какой пропорции определят, что система считает нормальным языком.

Персональные данные, происхождение, лицензии

Веб содержит телефоны, адреса, медицинские сведения и ключи из репозиториев. Регулярные выражения ловят очевидные шаблоны, распознавание именованных сущностей — часть имён, специальные сканеры — секреты. Ни один фильтр не идеален, и ошибки здесь несимметричны: пропущенный ключ доступа — инцидент, удалённый абзац — небольшая потеря токенов.

Документировать нужно минимум следующее: происхождение и лицензию каждого источника; дату снимка; правила исключения; долю удалённого; механизм запроса на удаление; тесты на воспроизведение обучающих текстов; ограничения на дальнейшее использование. Техническая доступность страницы не равна разрешению на обучение, и это вопрос не препроцессинга, а управления.

Что переносится дальше

Предобученный трансформер даёт две вещи: универсальные представления и вероятностную модель текста. Дообучение (fine-tuning) меняет параметры на меньшем наборе инструкций или на целевой области, retrieval добавляет внешние документы, не переписывая знания.

Перенос работает, когда признаки предобучения полезны дальше. Но сдвиг распределения никуда не девается: модель, видевшая научные статьи, не умеет безопасно отвечать как врач. Дообучение малым корпусом вызывает катастрофическое забывание; лечится оно подмешиванием replay-данных и малым шагом обучения — тем же приёмом, что и в задаче о смеси:

Lft=новая задача+λстарая смесь.\mathcal L_{\text{ft}}=\ell_{\text{новая задача}}+\lambda\,\ell_{\text{старая смесь}} .

Наконец, размер корпуса связан с размером модели: как именно — тема урока 79. Забегая вперёд, скажем главное для этого урока: при фиксированном вычислительном бюджете токены и параметры надо наращивать согласованно, а повторный проход по одному и тому же тексту засчитывается в бюджет, но не засчитывается в разнообразие.

Корпус становится поведением

Самообучение снимает стоимость разметки, но не снимает ответственности за данные. Мы измерили это на реальном корпусе: 100569100\,569 бесплатных обучающих пар — и одновременно 9,0%9{,}0\% токенов-копий, фильтр длины, выбивающий один жанр в сорок пять раз чаще другого, смесь, где выигрыш одного домена в точности оплачен проигрышем другого, повтор, роняющий видимый loss с 5,595{,}59 до 4,144{,}14 при росте настоящего с 5,995{,}99 до 6,646{,}64, и утечка, поднимающая метрику на 17,417{,}4 п.п. без единого нового навыка.

Извлечение, фильтрация, дедупликация и смесь определяют, какие ошибки модель будет считать дорогими. Загрязнение benchmark превращает оценку в проверку памяти. Поэтому корпус стоит читать как экспериментальную установку: с паспортом, с измеримыми потерями на каждом этапе и с честным списком того, что мы решили не включать.

Задачи