Ликбез. Как ИИ рисует картинки.
После пяти постов возникает закономерный вопрос: если ИИ все это время продолжает текст, то как он рисует картинки?
В заметке про токены выяснилось, что слова для модели превращаются в машинные кусочки. Похожий фокус проделывается и с изображениями.
Для нас на фотографии кот. Для компьютера - много-много цветных точек. Работать с ними по одной так же разумно, как писать «межконтинентальная» по одной букве. Поэтому картинку дробят на подобие токенов и учат модель работать уже с ними.
Для компьютера картинка начинается как огромная таблица чисел. Каждая точка хранит несколько значений: координаты, сколько в ней красного, зеленого и синего. Условный белый пиксель - 255, 255, 255, черный - 0, 0, 0, красный - 255, 0, 0. Фотография 1000×1000 превращается уже примерно в три миллиона чисел. Никакого «кота» среди них нет: есть только числа, расположенные в определенном порядке. А кот появляется уже из их последовательности - где проходят границы, какие участки похожи по цвету, что образует шерсть, глаз, ухо и в конце концов целую морду.
Процесс обучения тоже выглядет иначе. Берем картинку кота и постепенно портим случайным шумом, пока кот не превращается в хаос. Потом ставим обратную задачу: вот тебе шум, попробуй восстановить картинку. Не получилось - подкрутили. Еще кот. Еще человек. Автомобиль. Дерево. Еда. И так раз за разом, пока модель не научится превращать шум обратно в осмысленные изображения.
Опять же никто ничего не объясняет. Где у нашего в буквального Чеширского кота должны быть уши, как выглядит шерсть, куда падает тень и сколько пальцев обычно бывает у человека, приходится выяснять самостоятельно. С пальцами, как мы знаем, были проблемки.
Но откуда генератор вообще знает, что по слову «кот» нужно вытаскивать из шума кота? При обучении картинки связывают с их текстовыми описаниями. И текст, и изображение машина переводит в наборы чисел и постепенно учится сопоставлять одно с другим. Поэтому «кот» для нее в итоге связан не с конкретной фотографией, а с набором общих признаков всех увиденных котов.
Когда мы просим «нарисуй черного кота на деревянном столе», примерно это она и делает. Берет шум и шаг за шагом превращает его во что-то, все больше похожее на черного кота на деревянном столе. Никакого готового кота она обычно не достает и фотографии между собой не склеивает.
И тут хорошо чувствуется разница в масштабе задачи. Небольшую языковую модель сегодня можно целиком запихнуть в несколько гигабайт памяти и спокойно гонять на ноутбуке. Генератор хороших картинок вместе со всем необходимым хозяйством легко потребует уже под сотню гигабайт. К слову, моему ноуту для генерации картинки по заданным критериям нужно минут 10-15, в процессе которых он в основном генерирует шум, а в конце - фигню.
Генератор картинки снова и снова, несколько десятков раз, перетряхивает будущего кота целиком, пока тот наконец не станет похож на кота.
Но общий принцип все еще тут. Мы даем машине кучу примеров и заставляем найти в них закономерности, а потом она использует найденное, чтобы построить то, чего раньше не было.
С текстом она снова и снова решает, какой кусочек добавить следующим. С картинкой - что изменить в шуме на следующем шаге.
И вот здесь мы должны поправить основной принцип: мы не научили машину писать и не научили ее рисовать, а научили ее выбирать следующее действие.