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-крокового запуску на 500K-документному gutenberg бонус покриття зазвичай підвищує спостережуване покриття з ~3% (без бонусу) до ~25-30% (з бонусом). Той самий обчислювальний ресурс, у 8-10 разів більше документов охоплено.
Де зберігається відстеження
| Компонент | Відповідальність |
|---|---|
microgpt_cuda.cu | Звітує індекс документа на кожен крок тренування |
training_proxy.py | Підтримує набір seen_docs для кожного джерела |
training_proxy.py | Обчислює покриття, застосовує бонус до винагороди бандита |
training_proxy.py | Зберігає seen_docs у .state.json між перезапусками |