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



Первый наивный подход - просто пронумеруем каждое уникальное слово. Good = 6, bad = 26, awesome = 27. Выглядит логично, но вот беда: числа 26 и 27 близки друг к другу, поэтому модель подумает, что bad и awesome похожи. В реальности же awesome и good семантически ближе. Вот такой подвох.

Попробовали One Hot Encoding - каждому слову даём вектор размером со весь словарь, где только одна единица указывает на нужное слово, остальное нули. Проблема ранжирования исчезла, но появилась новая: если словарь из 20 тысяч слов, каждый вектор будет 20-тысячемерным. Памяти жрёт огромное количество, да и семантику слов модель не ловит.

Потом пришли Bag of Words и N-граммы - считаем, сколько раз слово встречается в тексте. Добавляет контекст, но опять же - большие разреженные векторы и модель не понимает глубокие связи между словами. Если в предложении "The librarian loves books" слова librarian и book не соседствуют, N-граммы не схватят, что они связаны.

Вот здесь-то и приходит на помощь правильное кодирование через embedding. Идея в том, что похожие слова должны лежать близко друг к другу в векторном пространстве. Представьте двумерную плоскость: на одной оси размер животного, на другой - опасность. Тигр и лев будут рядом (крупные и опасные), а хомяк отдельно (мелкий и безопасный). Вот это и есть embedding - плотный вектор, который хранит смысл слова в n-мерном пространстве.

Самое крутое: с такими векторами можно делать математику. Возьмёте вектор "сына", вычтете "мужчину" и добавите "женщину" - получите вектор близкий к "дочери". Или: Мадрид + Германия - Испания = Берлин. Работает, потому что модель улавливает отношения между понятиями.

Как же обучают такие embedding? Google предложила Word2Vec с двумя подходами. В CBOW вы берёте контекстные слова и предсказываете центральное слово. Skip-Gram делает наоборот - от центрального слова предсказываете соседей. Обе техники хорошо работают для обучения word embedding.

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

Одна маленькая деталь - позиционное кодирование. Трансформер обрабатывает все токены параллельно, в отличие от RNN. Поэтому нужно как-то сказать модели, в каком порядке идут слова. Берут позиционный вектор и добавляют его к embedding вектору. Получается комбо: смысл слова + информация о его позиции в тексте.

После позиционного кодирования embedding поступает в механизм внимания - вот это уже сердце всех больших языковых моделей. Embedding ловит семантику отдельных слов, но контекст понимает именно attention. Поэтому слово "ключ" в разных контекстах получит разные контекстуальные представления.

Вот так, комбинируя простые идеи - токенизацию, подсчёт слов, правильное кодирование через embedding - постепенно приходишь к трансформерам и ChatGPT. Эмбеддинги сейчас везде: в рекомендательных системах, в поиске похожих картинок, в основе всех современных LLM. Если хотите разбираться в NLP по-настоящему, нужно понимать, как работают CBOW, Skip-Gram и вся эта архитектура. Это база, с которой начинается.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • комментарий
  • Репост
  • Поделиться
комментарий
Добавить комментарий
Добавить комментарий
Нет комментариев
  • Закрепить