CUDA сообщает индексы документов
Тренер CUDA знает, какой документ он выбрал
Каждый шаг обучения извлекает последовательность из бинарного файла .btok, который упаковывает множество документов подряд. CUDA записывает индекс документа вместе с потерей: step 47213, source=gutenberg, doc=128407, loss=2.81. Прокси собирает эти отчеты и поддерживает множество уникальных индексов документов, увиденных для каждого источника.
От счетчиков к покрытию
Покрытие источника = unique_docs_seen / n_docs. Несколько примеров:
| Источник | n_docs | unique seen | покрытие |
|---|---|---|---|
| gutenberg | 512,000 | 154,000 | 30.1% |
| hermes3-general | 67,395 | 47,176 | 70.0% |
| dictionary | 88,000 | 88,000 | 100.0% |
| synthetic-chat | 1,400 | 1,400 | 100.0% |
Маленькие источники быстро насыщаются. Большие источники опускаются ниже 50% на недели. Бонус за покрытие награждает бандита за посещение документов, которые он ещё не семплировал в источнике.
Формула бонуса
Бонус за покрытие линейно масштабируется от 1.3x при 0% покрытии до 1.0x при 50% покрытии, затем остаётся плоским на 1.0x выше 50%:
if coverage < 0.5:
bonus = 1.0 + 0.3 * (1.0 - coverage / 0.5)
else:
bonus = 1.0
Источник с покрытием 0% получает 1.3x; источник с 25% — 1.15x; источник с 50% снижается до 1.0x. Выше 50% бонус не применяется.
Вычислить бонус
Два различных сигнала свежести
Одна цель, разная детализация
У ANDREA есть два механизма, которые предотвращают переобучение на одном источнике. Они звучат похоже; измеряют разные вещи.
Штраф за эпоху. Отслеживает общее перевытягивание. Когда lifetime_pulls / n_docs > 1.0, источник теоретически обошёл каждый документ хотя бы раз. Штраф = 1 / (1 + epochs). Источник synthetic-chat с 1.4K документов при 5,600 lifetime pulls (epochs = 4) получает штраф 1/5 = 0.2x. Счётчики эпох сохраняются при перезапусках; они никогда не уменьшаются.
Бонус за покрытие. Отслеживает свежесть по документам внутри источника. CUDA сообщает индексы документов; прокси поддерживает множество на источник. Источники с покрытием менее 50% уникальных документов получают до 1.3x. Покрытие поощряет исследование хвоста источника; штраф за эпоху наказывает за его исчерпание.
Почему оба важны
| Сигнал | Отслеживает | Направление | Кап | Сохраняется при перезапусках |
|---|---|---|---|---|
| Штраф эпохи | агрегированный перебор | снижает | 1/(1+e) | да |
| Бонус покрытия | свежесть по документам | повышает | 1.3x | да |
Источник gutenberg из 500K документов может оставаться ниже 50% покрытия на протяжении всего обучения в 200K, не приближаясь к эпохе=1. Штраф эпохи его игнорирует; бонус покрытия активно тянет бандита к неизведанному 70% хвосту gutenberg.
Напротив, синтетический источник чата из 1.4K быстро насыщает покрытие (100%) за несколько тысяч тяг; бонус покрытия остается на 1.0x, в то время как штраф эпохи растет.
Различите их
Что дает бонус за покрытие ANDREA
Режим отказа, который он предотвращает
Без отслеживания на уровне документа бандит, выбирающий по вознаграждению за шаг, жадно выбирает последовательности .btok. Корпус Gutenberg из 500K документов содержит несколько тысяч последовательностей с низкой кросс-энтропией (согласованная проза, распространённый словарь). Бандит только по вознаграждению возвращается к этим последовательностям неоднократно, потому что они продолжают производить сильные сигналы вознаграждения.
Результат: корпус из 500K документов семплируется по примерно 2K-5K различным последовательностям за 200K шагов обучения. Модель запоминает эти последовательности, никогда не видя остальное. Ёмкость потрачена впустую; покрытие застревает ниже 1%.
Что даёт бонус покрытия
1.3x при 0% покрытии, снижается до 1.0x при 50%. Это подталкивание распространяется через выбор UCB1: руки с низким покрытием остаются конкурентоспособными, даже когда их вознаграждение за вытягивание падает. Бандит исследует хвост по дизайну, а не случайно.
За 200K-шаговый запуск на корпусе Gutenberg из 500K документов бонус покрытия обычно повышает наблюдаемое покрытие с ~3% (без бонуса) до ~25-30% (с бонусом). Те же вычисления, в восемь-десять раз больше затронутых документов.
Где хранится отслеживание
| Компонент | Ответственность |
|---|---|
microgpt_cuda.cu | Отчет о индексе документа на каждый шаг обучения |
training_proxy.py | Поддерживает множество seen_docs для каждого источника |
training_proxy.py | Вычисляет покрытие, применяет бонус к вознаграждению бандита |
training_proxy.py | Сохраняет seen_docs в .state.json между перезапусками |