При предобучении правильный следующий токен берётся из самого текста: разметка
почти бесплатна. Но бесплатная разметка не значит нейтральная. Что именно
собрано, что повторено, что отфильтровано и в какой пропорции смешано — это и
есть скрытая программа поведения модели, и в этом уроке мы её измерим.
Разметка, которой никто не писал
Возьмём реальный корпус — коллекцию SMS-сообщений, ту самую, на которой в
уроке 42 мы учили наивный Байес ловить спам. В ней 5574
документа: 4827 обычных сообщений и 747 рекламных. После токенизации
в корпусе 106143 токена. Сколько обучающих примеров можно из него сделать,
если ни один человек не поставит ни одной метки?
Документ (x1,…,xn) раскладывается по цепному правилу вероятностей:
pθ(x1,…,xn)=t=1∏npθ(xt∣x1,…,xt−1).
Каждый сомножитель — отдельная задача предсказания, и в документе из n токенов
их ровно n−1 (первый токен предсказывать не из чего). По всему корпусу:
d=1∑5574(nd−1)=106143−5574=100569.
Сто тысяч обучающих пар из пяти с половиной тысяч сообщений — и ни одного
размеченного примера. Такая цель называется самообучением с учителем внутри
данных (self-supervised): структура входа сама порождает target.
Рис. 78.1. Сдвиг на одну позицию превращает текст в размеченную выборку
Верхняя строка — входные токены реального сообщения, нижняя сдвинута на одну
позицию: это и есть targets. Последняя позиция остаётся без цели. Справа —
маска внимания: единица означает «эту позицию видно», ноль — «это будущее».
Стоит открыть хотя бы одну клетку выше диагонали, и задача становится
тривиальной: модель просто спишет ответ. Весь реальный корпус даёт
100569 обучающих пар при нулевой стоимости разметки.
Что именно оптимизирует следующий токен
Функция потерь — сумма отрицательных логарифмов правильных вероятностей:
L(θ)=−t=1∑n−1logpθ(xt+1∣x≤t).
Обычно её делят на число позиций, получая средний NLL на токен, и именно эта
величина сравнима между корпусами разной длины:
ℓ=N1t∑(−logpθ(xt+1∣x≤t)).
Это та же кросс-энтропия, что и в уроке 20, и то же
максимальное правдоподобие, что и в уроке 45: минимизировать
ℓ — значит максимизировать ∏tpθ. Удобная единица измерения —
перплексия:
PPL=exp(ℓ),
«эффективное число равновероятных вариантов», между которыми модель колеблется
на каждом шаге. Модель с ℓ=5,96 ведёт себя так, как если бы честно
выбирала из exp(5,96)≈388 равновероятных токенов.
Шеннон измерял ровно то, что сегодня минимизирует предобучение: насколько
предсказуем следующий символ. Он же показал главное ограничение цели. Модель
учит орфографию, синтаксис, факты и шаблоны рассуждений ровно настолько,
насколько они сокращают описание текста. Отдельной цели «говорить правду» в
формуле нет. Если в корпусе устойчиво повторяется ложное утверждение, оно
сжимает текст не хуже истинного.
Чем мы всё это измеряли
Все числа этого урока получены на настоящем корпусе и настоящей — пусть и
крошечной — языковой моделью. Модель биграммная: вероятность следующего токена
зависит только от предыдущего,
pθ(xt+1∣x≤t)≈p(xt+1∣xt),
а оценивается она сглаженной частотой, как в уроке 48:
p(b∣a)=c(a)+κVc(a,b)+κ,κ=0,3,
где c(a,b) — сколько раз пара встретилась в обучающем потоке, V — размер
словаря. Без сглаживания любая невиданная пара дала бы −log0=∞, и
сравнивать корпуса было бы нельзя.
Такая модель — не трансформер, и абсолютные значения loss у неё скромные. Но
все четыре эффекта урока — обмен между доменами, эффективные эпохи,
запоминание при повторе и рост метрики от утечки — свойства данных, а не
архитектуры, и потому воспроизводятся уже здесь. Полезное свойство биграмм:
эксперимент занимает секунды, поэтому его можно повторить в классе и проверить
каждое число самому.
Средний loss полезно разложить: если истинное распределение текста p, а
модель даёт q, то
ℓ=неустранимоH(p)+нашенезнаниеDKL(p∥q).
Первое слагаемое — энтропия языка, его не убрать никаким корпусом. Улучшать
данные значит уменьшать второе. Именно поэтому «сделать loss нулевым»
невозможно, а «сделать его нулевым на конкретных документах» — очень даже, и
дальше мы увидим, чем это оборачивается.
От сырого веба к обучающей смеси
Между «страницей в интернете» и «токеном в обучающем потоке» лежит конвейер:
снимок страниц, извлечение основного текста, определение языка, отсев спама и
навигации, дедупликация, оценка качества, исключение чувствительных данных,
смешивание источников с весами, токенизация и упаковка в последовательности
фиксированной длины.
Каждый шаг конвейера — это решение, чей текст не попадёт в модель. Проведём
такой конвейер на нашем реальном корпусе. Точная дедупликация убирает 9592
токена, порог near-duplicate J≥0,7 — ещё около трёх тысяч, фильтр
длины и фильтр доли букв — по мелочи. До обучения доживает 93415 токенов,
то есть 88,0% исходного корпуса.
Рис. 78.2. Каскад фильтров: сколько токенов доживает до обучения
Реальный SMS-корпус, фильтры применены каскадом, каждый следующий — к тому, что
осталось. Точный dedup стоит 9% токенов, near-duplicate с порогом
J≥0,7 — ещё 2,7%, фильтр длины и фильтр доли букв почти ничего не
меняют по объёму. Важно не только «сколько осталось», но и «кого не стало»:
последние два фильтра, дешёвые по токенам, выкидывают документы
непропорционально из одного жанра.
Фильтр — это редакторское решение
Классификатор «качественного текста», обученный на энциклопедиях, будет
предпочитать энциклопедический стиль и вычищать разговорную речь. Фильтр
токсичности непропорционально удаляет документы, обсуждающие дискриминацию —
именно потому, что в них часто цитируются оскорбления. Фильтр по доле букв
убивает таблицы и код. Формально каждое правило — одна строка, содержательно
каждое — редакционная политика.
Полезно записывать эффект фильтра как две разные величины:
где K — оставленные документы, Gg — документы жанра g. Первая величина
почти всегда выглядит успокаивающе, вторая — вскрывает перекос. На нашем
корпусе фильтр длины сохранил 88,0% токенов, но удалил 90 разговорных
сообщений против 2 рекламных.
Повтор не равен новому свидетельству
Веб полон зеркал, цитат, шаблонов и копий. Loss складывает вклад позиций, а
значит, документ, встреченный m раз, получает вес m:
L=−d∑mdt∑logpθ(xt+1(d)∣x≤t(d)).
Никакой отдельной «настройки важности» здесь нет: важность создаётся самим
фактом повтора. В нашем реальном корпусе 5574 документа, но лишь 5154
различных: 420 документов (7,5%) — дословные копии. Чемпион — фраза
sorry, i'll call later, встречающаяся 30 раз. По токенам копии весят
9592, то есть 9,0% корпуса.
Рис. 78.3. Дословные копии и зависимость числа «почти копий» от порога
Слева — шесть самых частых дословных документов реального корпуса; верхнее
сообщение повторено 30 раз и получает в loss тридцатикратный вес. Справа —
сколько пар документов считаются «почти копиями» при разных порогах Jaccard по
трёхграммам: 1485 пар при пороге 0,5 и 959 при пороге 1,0. Между
этими числами нет объективной границы — есть выбор, который делает инженер.
Формально близость документов измеряют через множества k-грамм S(D):
J(D1,D2)=∣S(D1)∪S(D2)∣∣S(D1)∩S(D2)∣.
Сравнивать все пары дорого:
(2N)=2N(N−1)=25574⋅5573=15531951
пар только на нашем маленьком корпусе; при миллиарде документов это число
становится астрономическим. Поэтому используют MinHash: для случайной
перестановки хэшей выполняется
Pr[minh(S(D1))=minh(S(D2))]=J(D1,D2),
и J оценивается долей совпавших минимумов по r независимым хэшам:
При r=128 ошибка оценки не превышает 0,045 — этого хватает, чтобы
отличить порог 0,7 от 0,9, но не хватает, чтобы спорить о третьем
знаке.
Смесь как оптимизационный выбор
Пусть источник j содержит Dj токенов, а в потоке ему отведён вес wj
при общем бюджете Dtrain токенов. Тогда эффективное число
проходов по источнику:
Ej≈DjwjDtrain,j∑wj=1.
Это самая полезная формула урока. Она объясняет, почему один и тот же вес
означает совершенно разные вещи для большого и маленького источника. В нашем
эксперименте пул разговорных сообщений — 82008 токенов, пул рекламных —
18814, бюджет обучения 60000 токенов. При w=0,2 рекламный источник
проходится E=0,64 раза, то есть даже не целиком; при w=1 — E=3,19
раза, и каждое сообщение модель видит трижды.
Если мы хотим ограничить число проходов сверху величиной Emax, формула
сразу даёт потолок веса:
Ej≤Emax⟺wj≤DtrainEmaxDj.
Маленький источник просто не может получить большой вес, не начав повторяться:
это не вопрос вкуса, а арифметика. И ещё одно следствие: доля источника в
обновлениях градиента равна не доле его документов, а доле его токенов,
где nˉj — средняя длина документа источника. Источник с длинными
текстами при одинаковом весе даёт меньше документов, но столько же обновлений.
Итоговый loss — взвешенная сумма доменных:
Lсмесь(w)=j∑αjℓj(w),
где ℓj(w) — отложенный loss на домене j, а αj — веса, с
которыми мы оцениваем важность доменов. Обратите внимание: w и α —
разные вещи. Первое определяет, чем кормить модель, второе — чей результат нам
дорог. Ошибка «взять α из w» превращает выбор смеси в самооправдание.
Среднее скрывает обмен
Проведём честный эксперимент. Обучаем биграммную модель со сглаживанием на
потоке в 60000 токенов, меняя долю рекламных сообщений w от 0 до 1,
и каждый раз измеряем отложенный NLL отдельно по двум доменам.
Рис. 78.4. Смесь — это обмен: один домен выигрывает ровно там, где второй теряет
Синяя кривая (разговорные SMS) растёт от 5,96 до 7,33, красная
(рекламные) падает от 7,37 до 5,25. Они пересекаются около w=0,23.
Зелёная штриховая — среднее с равными весами доменов, её минимум при
w=0,6; золотая пунктирная — среднее с весами 80/20, минимум при
w=0,25. Одни и те же измерения, разные α — вдвое разные ответы про
«правильный процент рекламы в корпусе».
Три вывода, которые видно прямо на графике. Во-первых, ни одна точка не
улучшает оба домена: кривые монотонны и направлены навстречу. Во-вторых,
«оптимальная смесь» — не свойство данных, а свойство выбранных α: при
равных весах оптимум 0,6, при весах 80/20 — 0,25. В-третьих, крайние
точки дороги: при w=0 модель не видела рекламы и платит 7,37 вместо
5,25, то есть перплексия хуже вчетверо.
Лаборатория смеси
Веса источников, повтор и утечка benchmark
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Внутри виджета обучается настоящая биграммная модель со сглаживанием — та же
арифметика, что в фигурах урока, только на трёх модельных источниках («код»,
«диалоги», «статьи») с фиксированным seed, чтобы результат был воспроизводим.
Бюджет потока постоянен: увеличивая вес одного источника, вы физически
отнимаете токены у других.
Сначала поставьте вес «кода» в ноль: его отложенный loss подскакивает — навык,
которому не учили, не появляется. Верните вес и доводите его до единицы:
собственный loss «кода» почти перестаёт улучшаться (пул мал, начинается
повтор), а два других домена уверенно портятся. Это и есть та самая
асимметрия, которую не видно в одном усреднённом числе.
Затем включите повтор документов «кода». Loss на самом обучающем потоке —
цифра, которую видит оптимизатор, — падает, а отложенный loss того же домена
растёт. И наконец, включите утечку benchmark: NLL на benchmark резко
улучшается, а все три доменных столбика не двигаются с места.
Повтор и запоминание
Теперь измерим цену повтора количественно. Берём фиксированный бюджет
60000 токенов, выделяем «премиальный» набор из 150 документов
(3386 токенов) и повторяем его k раз, добирая остаток бюджета обычными
документами. Растёт k — растёт доля премиального набора в потоке: при
k=16 он занимает 90,3% обучающих токенов.
Рис. 78.5. Повтор снижает loss там, где смотрит оптимизатор, и повышает там, где важно
Красная кривая — loss на самих повторённых документах: он падает с 5,59 до
4,14. Синяя — loss на отложенных документах, которых модель не видела
никогда: он растёт с 5,99 до 6,64. Обе кривые монотонны и расходятся.
Бюджет всё это время постоянен: повтор не добавляет знания, он вытесняет
разнообразие.
Механизм прозрачен. При фиксированном бюджете каждая лишняя копия занимает
место, куда мог попасть новый документ:
Модель уточняет статистику ста пятидесяти текстов вместо того, чтобы увидеть
тысячи. В маленькой биграммной модели это выглядит как обострение условных
распределений, в большой — как дословное воспроизведение фрагментов, то есть
memorization. Связь с переобучением из урока 32 прямая, но
причина здесь не в избыточной ёмкости, а в составе данных.
Утечка benchmark
Самая дорогая ошибка предобучения — не плохой фильтр, а испорченная оценка.
Если вопросы теста или их пересказы были в обучении, высокая точность измеряет
память, а не перенос.
Проверим это честно. Benchmark — 400 отложенных документов; половину из них
(«утёкшую») мы подмешиваем в обучение в трёх копиях, вторая половина остаётся
чистой. Метрика — доля верно угаданных следующих токенов.
Рис. 78.6. Утечка поднимает метрику, не меняя навыка
Красная кривая: чем больше тестовых документов попало в обучение, тем лучше
модель предсказывает именно их — с 19,4% до 36,2%. Синяя: на чистой
половине benchmark ничего не происходит, 19,1% против 18,8% — навык
не изменился. Фиолетовая: средняя по всему benchmark цифра, которую и
публикуют, вырастает до 27,9%. Золотая: даже если в обучение попали не
точные копии, а тексты с выброшенной третью токенов, метрика всё равно
поднимается до 30,1%.
Разложение измеряемой метрики объясняет картину без всякой мистики. Пусть доля
загрязнённых документов p, точность на них aleak, на чистых —
aclean:
a=paleak+(1−p)aclean.
Отчётная метрика линейна по доле загрязнения, и производная равна разрыву:
dpda=aleak−aclean.
При aclean=0,188 и aleak=0,362 каждая десятая доля
загрязнения добавляет к отчётной цифре около 1,7 процентного пункта. Сам
разрыв
Δ=aleak−aclean=36,2%−18,8%=17,4п.п.
и есть диагностический сигнал: у честной модели он статистически неотличим от
нуля.
Фраза Джелинека обычно цитируется как гимн статистике против правил. Но у неё
есть вторая, менее удобная половина: если качество определяется данными, то и
ответственность за качество переезжает из грамматик в корпус. Уволить
лингвиста легко, уволить корпус нельзя — он и есть модель.
Ближние копии проходят сквозь любой фильтр
Золотая кривая на рис. 78.6 — самое неприятное наблюдение урока. В обучение
попадали не копии, а тексты, из которых случайно выброшена треть токенов; ни
один хэш такого не поймает. Тем не менее метрика выросла до 30,1% —
это около двух третей эффекта точной утечки:
36,2−19,430,1−19,4≈0,64.
Отсюда практическая иерархия методов и их слепых зон:
exact hash⊂shingle/MinHash⊂embedding search,
где каждый следующий ловит больше и ошибается чаще. Перевод, пересказ и смена
чисел проходят сквозь первые два уровня почти без потерь.
К этому добавляется временная ось. У каждой страницы есть дата публикации и
дата снимка. Текст, обновлённый после выхода benchmark, может содержать его
ответы, хотя URL старый и дата публикации невинна. Дедупликация по URL этого
не видит: нужен хэш конкретного содержимого вместе со временем.
Правило разделения выборок из урока 32 здесь масштабируется: в
одну часть должны идти не отдельные документы, а целые семейства — версии
страницы, зеркала, переводы и весь сайт целиком. Иначе почти-копия пересечёт
границу и заберёт с собой ваш оптимизм.
Частотные словари: русская линия
Мысль «корпус — это программа» появилась задолго до нейросетей, и в
отечественной науке у неё есть точный адрес. В 1960-е годы в Ленинграде
Роман Гершевич Пиотровский создал школу инженерной лингвистики и группу
«Статистика речи» — объединение исследователей из десятков городов, которое
десятилетиями занималось ровно тем, что сегодня называют работой с корпусом:
считало частоты, измеряло избыточность текста, оценивало покрытие словаря и
строило на этих измерениях системы машинного перевода. Из этой школы вышли
разработчики отечественных переводческих систем, а её методологический тезис
звучит совершенно современно: свойства текстового массива определяют
возможности любой автоматической обработки.
Второй сюжет — «Частотный словарь русского языка» под редакцией
Л. Н. Засориной (1977). Он построен на корпусе примерно в миллион
словоупотреблений, и — вот важная деталь — этот миллион был собран не как
попало, а из четырёх жанров примерно равными долями: художественная проза,
драматургия, научно-публицистические тексты и газетно-журнальные материалы.
Это в точности проектирование обучающей смеси: составители заранее решили, с
какими весами языковые регистры войдут в итоговую статистику, и понимали, что
от этого решения зависит порядок слов в словаре.
Разница с нашим временем количественная, а не качественная. Там миллион
словоупотреблений и четыре жанра, здесь триллионы токенов и сотни источников;
там результат — печатная таблица частот, здесь — веса модели. Вопрос один и
тот же: чьи тексты и в какой пропорции определят, что система считает
нормальным языком.
Персональные данные, происхождение, лицензии
Веб содержит телефоны, адреса, медицинские сведения и ключи из репозиториев.
Регулярные выражения ловят очевидные шаблоны, распознавание именованных
сущностей — часть имён, специальные сканеры — секреты. Ни один фильтр не
идеален, и ошибки здесь несимметричны: пропущенный ключ доступа — инцидент,
удалённый абзац — небольшая потеря токенов.
Документировать нужно минимум следующее: происхождение и лицензию каждого
источника; дату снимка; правила исключения; долю удалённого; механизм запроса
на удаление; тесты на воспроизведение обучающих текстов; ограничения на
дальнейшее использование. Техническая доступность страницы не равна разрешению
на обучение, и это вопрос не препроцессинга, а управления.
Что переносится дальше
Предобученный трансформер даёт две вещи: универсальные
представления и вероятностную модель текста. Дообучение (fine-tuning) меняет
параметры на меньшем наборе инструкций или на целевой области, retrieval
добавляет внешние документы, не переписывая знания.
Перенос работает, когда признаки предобучения полезны дальше. Но сдвиг
распределения никуда не девается: модель, видевшая научные статьи, не умеет
безопасно отвечать как врач. Дообучение малым корпусом вызывает
катастрофическое забывание; лечится оно подмешиванием replay-данных и малым
шагом обучения — тем же приёмом, что и в задаче о смеси:
Lft=ℓноваязадача+λℓстараясмесь.
Наконец, размер корпуса связан с размером модели: как именно — тема
урока 79. Забегая вперёд, скажем главное для этого урока: при
фиксированном вычислительном бюджете токены и параметры надо наращивать
согласованно, а повторный проход по одному и тому же тексту засчитывается в
бюджет, но не засчитывается в разнообразие.
Корпус становится поведением
Самообучение снимает стоимость разметки, но не снимает ответственности за
данные. Мы измерили это на реальном корпусе: 100569 бесплатных обучающих
пар — и одновременно 9,0% токенов-копий, фильтр длины, выбивающий один
жанр в сорок пять раз чаще другого, смесь, где выигрыш одного домена в точности
оплачен проигрышем другого, повтор, роняющий видимый loss с 5,59 до
4,14 при росте настоящего с 5,99 до 6,64, и утечка, поднимающая
метрику на 17,4 п.п. без единого нового навыка.
Извлечение, фильтрация, дедупликация и смесь определяют, какие ошибки модель
будет считать дорогими. Загрязнение benchmark превращает оценку в проверку
памяти. Поэтому корпус стоит читать как экспериментальную установку: с
паспортом, с измеримыми потерями на каждом этапе и с честным списком того, что
мы решили не включать.