Зачем делать свою языковую модель, когда есть ChatGPT

История о том, как поиск готовой модели для одной задачи привёл к своей: маленькой, троичной и работающей на обычном процессоре.

Зачем делать свою языковую модель, когда есть ChatGPT

С чего всё началось: Монстро

У меня есть проект Монстро (monstro.ru) — довольно сложная система, у которой часть работает прямо на серверах клиентов. Для неё понадобилась модель с вполне конкретной работой. Смотреть в код страницы, находить всплывающие окна и самой собирать алгоритм из кубиков: нажать, подождать, закрыть, перейти дальше. Писать правило под каждое окно бесполезно, их тысячи, и каждое в новом месте и новом виде.

Готовые модели не подошли

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

Ничего подходящего не нашлось. Модели, которые справлялись с задачей, были слишком тяжёлыми для процессора. Я пробовал ужимать готовые модели до предела, но даже сжатая большая модель на процессоре думала слишком долго. А готовые маленькие с работой не справлялись.

Так всё свелось к одному вопросу: а можно ли сделать модель меньше, чтобы она работала на процессоре у клиента?

Организм: ум из общества мелких экспертов

В июле я зашёл с другой стороны. Обычная модель — один огромный ком весов, и за каждое слово она платит полную цену, сложный перед ней вопрос или простой. Живой мозг устроен иначе. Идея Организма была в том, чтобы не класть ум в один ком, а вырастить его из общества мелких экспертов. Каждый умеет своё, работают только нужные, а мышление — это петля, где они передают друг другу промежуточный результат, без главного диспетчера.

Сделано было много. Свой троичный формат весов, около двух бит на вес, и своё вычислительное ядро для процессора и видеокарт. В закрытых задачах петля работала там, где слепой перебор сдавался: лабиринт — 100% против 0%. Новое умение можно было добавить, не трогая старых: старый навык держался на 96,7%, а при полном переобучении падал до 86,1%.

Честное сравнение с обычной моделью на 0,8 миллиарда весов показало главное. Там, где задачи покрыты, Организм шёл вровень по качеству, но был в миллионы раз дешевле по вычислениям и в тысячи раз быстрее на процессоре. То есть он был не умнее, а дешевле, быстрее и не забывал. Упёрся он в живой язык: форму речи такие системы перенимали легко, а смысл не давался. Технологий, чтобы довести идею до живой речи, тогда не хватило.

Существо: вырастить ум из клетки

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

Опыты были честными, и многое честно не вышло. Мозг вырастал до семи нейронов, но каждый новый нейрон вдвое сужал существу способы выжить. Оказалось, что мир — плохой учитель: послушание командам держалось на уровне случайного угадывания, 24,9% при случайных 25%. Когда я перешёл к прямому разговору, связка «слово → действие» поднялась до 91,8%. Ткань из миллиона нейронов пришлось списать.

Но именно в Существе родилось то, на чём стоит Тернит сейчас: обучение троичных весов на целочисленных счётчиках, без дробной копии весов. В записях проекта это отмечено как единственная по-настоящему новая вещь.

Тернит

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

Каждый вес в нём — трит: −1, 0 или +1. Обычная модель хранит вес как дробное число в 16 или 32 бита, а трит — меньше двух бит. Ядро Тернита на 1,5 миллиарда весов в тритах занимает меньше гигабайта, а в обычных числах заняло бы почти шесть. И считать с тритами почти не нужно умножать: прибавить, вычесть или пропустить. Для процессора это то, что надо.

Из Организма пришла мысль, что не всё должно работать сразу. У Тернита есть ядро, которое понимает язык, а умения пристраиваются к нему отдельными частями: английский, код, математика. Каждую можно усилить, отключить или заменить, не переучивая остальное. Оттуда же петля: модель пишет промежуточные шаги, например запрос поиска, читает найденное и только потом отвечает.

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

Где должен жить ум

Чем дальше я в это уходил, тем шире становилась задача. Большие ассистенты живут в огромных дата-центрах, и принадлежат они немногим. Каждый вопрос уезжает далеко, к чужим людям. Ассистента выучили один раз, заморозили и раздали всем одинаковым, и у вас он не учится.

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

Почему своя, а не копия

В начале октября у меня была рабочая троичная копия большой чужой модели на 4 миллиарда весов. Быстрый и понятный путь. Я от него отказался.

Причина — новый закон об ИИ. Суверенной модель считается, когда российская компания может воспроизвести весь цикл её создания, включая обучение. Модель, выученная подглядыванием за чужой, на мой взгляд, своей уже не назовёшь. А порог в законе — от одного миллиарда параметров. Так появилось ядро на 1,5 миллиарда весов: своё, выученное у нас.

Знания при этом хранятся отдельно, в банке: Википедия, тексты по темам, поиск в интернете. Модели не нужно помнить всё: ей нужно понять вопрос, найти и ответить по найденному.

Где мы сейчас

  • 14 октября Тернит начал отвечать в MAX и Telegram.
  • 16 октября у него появился постоянный сервер в России.
  • 17 октября он научился сначала искать в банке знаний и только потом отвечать.