Теперь рассказ про
Omnilingual SONAR. Статья, на самом деле — «комплексный обед» из минимум пяти разных проектов, но я поведаю только про парочку из них.
Напомню, что
SONAR (оригинальная версия) — это текстовый энкодер предложений (1 предложение => 1 вектор) в общее пространство для 200 языков, и декодер, восстанавливающий предложения из этого пространства. В паре они могут работать как переводчик, плюс сходство пары эмбеддингов хорошо коррелирует со сходством соответствующей предложений по смыслу: полезно для семантического поиска и для оценки качества перевода или параллельных обучающих данных.
Идея впихнуть в пространство SONAR побольше языков (обучив новый, более мультиязычный энкодер для того же пространства) была у меня давно — статья про
CharSONAR была ранней попыткой, и её хотелось масштабировать на максимальное число языков (используя те же параллельные данные, что я собирал для OMT-LLaMA). В целом, дело нехитрое: обучить энкодер-ученик, используя MSE loss относительно энкодера-учителя, как мы уже делали и знали, что оно работает.
Параллельно с этим, коллеги решили переделать само пространство SONAR. Ещё за год до этого, в проекте
LCM, мы поняли, что оно далеко от идеала: соседним эмбеддингам часто соответствуют сильно разные по смыслу предложения, разные по смыслу но похожие по форме предложения различаются недостаточно чётко, представления для кода и математических выражений так себе. В результате наши LCM вышли так себе качеству (проблемы SONAR были не единственной причиной, но наверное основной), и мы даже не стали релизить их веса (хотя тогда ещё была возможность это делать).
Новый SONAR (для всё тех же 200 языков, унаследованных от NLLB) строили с учётом всех этих проблем:
a) Добавили в обучающие данные примеры «неестественных» языков: фрагменты программного кода на 7 языках и математических формул, спаренные с их описаниями на английском.
b) В качестве базовой модели взяли не NLLB, а Llama3 1B: расширили ей словарь токенами из 200 языков, и инициализировали этим и энкодер, и декодер.
c) Поменяли пулинг в энкодере с mean на cls, чтобы сделать эмбеддинги менее буквальными и более семантическими. Для этого же выкинули задачу denoised autoencoding (задачу перевода оставили).
d) Заменили MSE loss на contrastive loss (с софтмаксом, как для энкодеров типа LaBSE). Отрицательные примеры брали как из других предложений в батче, так и из адверсариально сгенерированных парафраз на английском, отличающихся небольшими, но важными деталями. Причём для этих двух видов примеров считали два разных софтмакса, с разной температурой и отступами.
Всё это улучшило структуру пространства эмбеддингов: похожие по смыслу примеры стали ближе, а непохожие — дальше. Модель стала лучше искать соответствие смысла по тексту (и научилась искать по коду), стала переводить между 200 языками лучше чем NLLB-200, и сильно поднялась по сравнению с оригинальным SONAR в прикладных задачах из MTEB (типа классификации текстов).
Параллельно с этими экспериментами, мы потренировались «натягивать» пространство старого энкодера SONAR на энкодер-ученик, обучаемый на параллельных данных для «всех» языков, собранных нами для OMT-Llama. Разных кодов языков там было больше 4200, но большинство из них были представлены ничтожным числом примеров, плюс один и тот же язык часто обозначался более чем одним кодом (несмотря на мои старания их унифицировать), так что сколько языков модель видела точно, мы не знаем. В любом случае, обучался энкодер хорошо: на нашем библейском тестовом датасете мы видели, что он нормально понимает практически все 1560 языков оттуда. В
посте Янниса, который в основном занимался этим омниязычным расширением, есть ещё любопытные детали.
(1/2,
продолжение)