CLIP: текстовый энкодер

Урок объясняет, как текст промпта вообще попадает в модель — через текстовый энкодер CLIP.

Текстовый энкодер CLIP — сеть, которая превращает слова промпта в набор числовых векторов (эмбеддингов), понятных U-Net.

Почему нужен «переводчик» текста

U-Net работает с числами, а промпт — это слова. Кто-то должен перевести «рыжий кот на подоконнике» в числовую форму, отражающую смысл. Это делает текстовый энкодер CLIP. Он обучен так, что описание и подходящая картинка получают близкие представления — поэтому его эмбеддинги «знают», как слова связаны с визуальными понятиями.

От слов к токенам и эмбеддингам

Сначала промпт режется на токены (примерно кусочки слов), затем каждый токен превращается в вектор, и сеть обрабатывает всю последовательность, учитывая контекст. На выходе — таблица эмбеддингов: по вектору на токен. Эту таблицу U-Net и читает через cross-attention.

# Грубая имитация токенизации промпта (не настоящий CLIP)
prompt = "рыжий кот на подоконнике"
tokens = prompt.split()
for i, t in enumerate(tokens):
    print("токен", i, "->", t)
print("Всего токенов:", len(tokens))

Вывод:

токен 0 -> рыжий
токен 1 -> кот
токен 2 -> на
токен 3 -> подоконнике
Всего токенов: 4

Ограничение длины

У текстового энкодера есть лимит на число токенов (классически — 77). Если промпт слишком длинный, лишнее обрезается или обрабатывается частями. Поэтому важные слова лучше ставить ближе к началу — это практическое следствие, которое пригодится в разделе про промпт-инжиниринг.

Как работает под капотом

CLIP обучали на огромном наборе пар «картинка — подпись», сближая их представления. В результате текстовый энкодер выучил «визуальный смысл» слов: что «закат» связан с тёплыми цветами, а «киберпанк» — с неоном. Stable Diffusion берёт уже обученный текстовый энкодер CLIP и пользуется его эмбеддингами как условием для U-Net. Качество понимания промпта во многом определяется именно этим энкодером.

Частые ошибки

  • Думать, что модель «читает» промпт как человек. Она оперирует токенами и векторами; редкие слова и опечатки могут пониматься неточно.
  • Не учитывать лимит токенов. Сверхдлинные промпты частично теряются — лучше быть лаконичным и расставлять важное вперёд.
  • Путать текстовый энкодер с U-Net. CLIP только кодирует текст; рисует (предсказывает шум) U-Net.

Почему модель «не понимает» некоторые слова

CLIP выучил визуальный смысл слов из того, что встречал в обучающих подписях. Если понятие в данных было редким (узкий технический термин, имя малоизвестного объекта, слово на другом языке), эмбеддинг получится размытым, и модель нарисует нечто приблизительное. Это объясняет частое разочарование: одни промпты «магически» работают, другие словно игнорируются. Дело не в капризе модели, а в том, насколько хорошо понятие было представлено в обучающих подписях.

Отсюда практический навык: если слово не срабатывает, замените его на более частое и наглядное описание. Вместо редкого термина опишите то, что он означает, простыми словами — «светящиеся неоновые вывески ночью» вместо узкого жаргонизма. Так вы попадаете в ту область эмбеддингов, которую модель знает уверенно, и получаете предсказуемый результат.

Итог

  • Текстовый энкодер CLIP превращает промпт в эмбеддинги, понятные U-Net.
  • Промпт делится на токены (классический лимит — 77), каждый получает вектор смысла.
  • Качество понимания запроса во многом определяет именно текстовый энкодер.
Проверьте себя
1. Какую задачу решает текстовый энкодер CLIP?
AСжимает картинку в латент
BПревращает слова промпта в числовые эмбеддинги для U-Net
CУбирает шум на последнем шаге
DВыбирает seed
2. Почему важные слова промпта лучше ставить ближе к началу?
AТак быстрее печатать
BУ энкодера есть лимит токенов (классически 77), и лишнее в конце может обрезаться
CНачало промпта всегда красным цветом
DПорядок слов вообще не имеет значения