Важность базы

А зачем вообще учить трансформер счёту и арифметике? Почему
просто не дать ему скидывать подобные вопросы обычной программе,
что в разы проще? Зачем скармливать SQL и Java, если нам требуется,
например, только чистый диалог? Учили бы тогда сразу бота на
распечатках чатов, выгоднее же.
Собственно, так и делали. Применение нейросетей до самого
последнего времени подразумевало тренировку с нуля под задачу.
Основная проблема заключалась в подборе архитектуры и размера: мало
параметров — сеть не сможет запомнить все нужные закономерности,
много — начинаются проблемы и с переобучением, и с созданием
достаточно большого и качественного набора обучающих данных. А
данных нужно с горкой: где-то на порядок больше, чем параметров.
Набрать хороших для небольшой задачи не всегда возможно, в ход идут
трюки. Это одна из причин, по которой действительно большие модели
раньше не создавали: считалось (и доказывалось графиками) что
чересчур раздутая будет работать так же плохо, как слишком
маленькая.
В 2018 году, вслед за первыми успехами языковых трансформеров,
появилась идея «базовой модели»: вместо создания
небольшой специализированной сетки под каждое применение, мы делаем
одну супер большую сеть «генералиста». Чем больше, тем лучше. Да,
она хочет кушать соответственно огромные объёмы данных при
обучении. Но и цель перед ней ставится максимально общая: создавать
любые изображения, генерировать любые тексты на море языков,
классифицировать всё что только можно сразу по куче признаков.
Создать качественный набор под такую широкую задачу намного проще.
Тем более, что обучение идёт «без учителя», т.е. данные не
размечаются.
С одной стороны, такая гигантская нейросеть умеет много всего, т.к.
многому училась. Умножать и делить, решать уравнения, писать код,
сочинять стихи и научные статьи: всё это было во входных данных. У
неё в силу размеров возникает дополнительное сложное поведения
(работает «AI Scaling Hypothesis», которая и не гипотеза уже): она
начинает объяснять анекдоты про колобка исправлять ошибки и
пользоваться подсказками. С другой, она всё это делает довольно
плохо. Переводит хуже, чем сравнительно небольшая сеть переводчик,
считает посредственно, код генерирует с ошибками. В чём тогда
смысл?
Тонкая настройка. Это вторая часть идеи. Что получится, если начать
обучать подобную сеть для узкого применения, например только для
генерации кода на одном новом языке программирования? Будет
«магия»: она начнёт становиться эффективнее, но не с нуля, а сразу
с неплохого уровня, заметно обгоняя специализированную. Этот эффект
«transfer learning» объясняется тем, что модель использует
полученные знания из других областей, часто не связанных с задачей.
Он тем заметнее, чем меньше обучающий датасет. Можно его
представить как мультипликатор датасета и измерить. Вот здесь для конкретной сетки и генерации кода
Python он получился около 1000. Т.е. сети специалисту требуется на
три порядка больше обучающих данных, чтобы сравниться с
эффективностью дообученной базовой модели. Работает до малых чисел:
базовая, получив даже пару десятков примеров совершенно новой
задачи уже способна выдать что-то вразумительное, а только для
старта обучения с нуля нужны сотни тысяч!
В рамках этой концепции, после создания хорошей (и дорогой)
базы, все частные задачи требуют только небольшой адаптации. Для
простых случаев её (в отличие от полноценного обучения) можно даже
делать на пользовательском уровне и железе!
И обучение языковой сети арифметике это ещё цветочки
мультимодальности. В статье DeepMind описывает Gato: "Сеть,
которая с одинаковыми весами может играть в Atari, создавать
подписи к изображениям, общаться в чате, складывать блоки, управляя
механическим манипулятором, и многое другое, решая на основе
контекста, выводить ли текст, крутящие моменты суставов, нажатия
кнопок или другие необходимые в задаче токены."
Параллели с обучением людей на поверхности: мы сначала даём
хорошее, крепкое базовое образование. Общее, поверхностное, но в
куче областей: от математики до музыки. И уже на этой базе пытаемся
научить хорошего специалиста.
|
</> |