Happy-LLM, глава 1: основы NLP
Конспект первой главы книги Datawhale «Строим большую модель с нуля»: что такое обработка естественного языка, как она развивалась, какие у неё классические задачи и как текст превращали в числа до Transformer.
Первая глава книги «Строим большую модель с нуля» (проект Happy-LLM) — обзорная. В ней нет кода и почти нет формул: авторы коротко объясняют, что такое обработка естественного языка, перечисляют её классические задачи и показывают, как менялись способы превращать текст в числа — от разреженных векторов до ELMo. Это мостик к главе 2 про Transformer.
Ниже — конспект своими словами: структура следует оригиналу, а примеры, числа и код — наши.
Коротко
Заголовок раздела «Коротко»- NLP (natural language processing) — область, которая учит компьютер понимать, анализировать и порождать человеческий язык. Трудности — многозначность, контекст, ирония, метафоры.
- История в пять ступеней: правила и словари → статистика → нейросети (RNN, LSTM, Word2Vec) → предобученные модели (BERT, GPT) → большие языковые модели.
- Классические задачи: сегментация китайского текста, деление на подслова, разметка частей речи, классификация, распознавание именованных сущностей, извлечение отношений, суммаризация, машинный перевод, вопросно-ответные системы.
- Представление текста прошло путь от разреженных векторов (one-hot, TF-IDF) через n-граммные модели к плотным векторам Word2Vec и, наконец, к контекстным векторам ELMo, где впервые появилась идея «сначала предобучить, потом использовать в задаче».
Как читать вместе с курсом
Заголовок раздела «Как читать вместе с курсом»- Читайте перед уроком 4.1.1 «Что такое языковая модель» или сразу после него: глава даёт карту местности, а курс потом разбирает каждую тему руками.
- Раздел про n-граммы (1.4.2) — это теория к уроку 4.1.2 «Биграммная модель».
- Раздел про подслова (1.3.2) — к модулю 4.2 «Токенизация», раздел про Word2Vec (1.4.3) — к модулю 4.3 «Эмбеддинги».
- Новичку раздел 1.2 (история) можно пробежать глазами: он нужен для общей картины, а не для практики.
1.1 Что такое NLP
Заголовок раздела «1.1 Что такое NLP»Авторы определяют NLP как технологию, с помощью которой компьютер понимает, интерпретирует и порождает человеческий язык. Это стык нескольких наук: информатики, искусственного интеллекта, лингвистики и психологии. Цель — убрать барьер между языком людей и языком машин.
Важная мысль главы: распознать «поверхность» текста (слова, знаки препинания) мало. Нужно понимать смысл, контекст, эмоции и даже культурные отсылки. Глубокое обучение сильно продвинуло эту область — на ряде задач модели догнали людей, — но нерешённых проблем остаётся много: двусмысленность, абстрактные понятия, сарказм.
Пример двусмысленности, которого нет в книге, но который хорошо показывает проблему: «Я видел девушку в саду с биноклем». Бинокль у меня или у девушки? Человек решает такие вопросы по контексту, модели приходится этому учиться.
1.2 Как развивалась NLP
Заголовок раздела «1.2 Как развивалась NLP»flowchart LR A["1940–60-е<br/>правила, словари,<br/>тест Тьюринга"] --> B["1970–90-е<br/>символьный подход<br/>и статистика"] B --> C["2000-е<br/>машинное обучение,<br/>RNN, LSTM"] C --> D["2013<br/>Word2Vec"] D --> E["2018<br/>BERT, GPT:<br/>предобучение"] E --> F["2020-е<br/>GPT-3, ChatGPT:<br/>большие модели"]
Ранний период (1940–1960-е). После Второй мировой войны всерьёз задумались об автоматическом переводе. В 1950 году Алан Тьюринг предложил свой знаменитый тест: если в переписке машину нельзя отличить от человека, её можно считать мыслящей. Ноам Хомский в эти годы построил теорию порождающих грамматик, которая повлияла на понимание того, как вообще может работать перевод. Сами системы перевода были примитивными: подстановка по словарю плюс несколько правил порядка слов. Результаты разочаровали.
Символьный и статистический подходы (1970–1990-е). Исследователи разделились на два лагеря. Одни писали формальные грамматики и логические правила вручную. Другие считали частоты и вероятности по текстам. К 1980-м, когда выросли вычислительные мощности и появились алгоритмы машинного обучения, статистические модели начали вытеснять рукописные правила.
Машинное и глубокое обучение (2000-е — наши дни). В NLP пришли рекуррентные сети (RNN), сети с долгой краткосрочной памятью (LSTM) и механизм внимания (attention). Вехи, которые называет глава: Word2Vec (2013) открыл эпоху плотных векторов слов, BERT (2018) — эпоху предобученных моделей, а модели на основе Transformer вроде GPT-3 научились писать тексты, которые иногда трудно отличить от человеческих.
1.3 Классические задачи NLP
Заголовок раздела «1.3 Классические задачи NLP»Глава перечисляет девять задач. Сведём их в таблицу, а ниже разберём каждую на своих примерах.
| Задача | Вход → выход |
|---|---|
| Сегментация китайского текста | строка иероглифов → список слов |
| Деление на подслова | слово → части слова |
| Разметка частей речи | слово → метка (сущ., глаг., …) |
| Классификация текста | текст → класс |
| Распознавание именованных сущностей | текст → список (фрагмент, тип) |
| Извлечение отношений | текст → тройки (объект, отношение, объект) |
| Суммаризация | длинный текст → короткий |
| Машинный перевод | текст на языке A → текст на языке B |
| Вопросно-ответные системы | вопрос (+ источник) → ответ |
Сегментация китайского текста
Заголовок раздела «Сегментация китайского текста»В китайском письме нет пробелов между словами, поэтому первым шагом обработки часто становится сегментация (Chinese Word Segmentation, CWS): разрезать сплошную строку на осмысленные слова. Ошибка здесь тянется дальше — в разметку частей речи, поиск сущностей, синтаксический разбор.
Представьте, что из русского текста пропали пробелы. Строку «упаласосна» можно разрезать двумя способами:
- «упала | сосна» — упало дерево;
- «упала | со | сна» — кто-то упал спросонья.
Китайский сегментатор решает такую задачу в каждом предложении. Классический учебный пример (его нет в книге) — название «Нанкинский мост через Янцзы». Правильная нарезка — «город Нанкин | мост через Янцзы», а неправильная выделяет из тех же иероглифов слова «Нанкин | мэр | Цзян Дацяо», как будто речь о мэре по имени Цзян Дацяо.
Обе нарезки состоят из настоящих слов, но смысл разный. Именно поэтому сегментатору нужен контекст и словарь, а не только правило «режь по два иероглифа».
Деление на подслова
Заголовок раздела «Деление на подслова»Подслова (subword) решают проблему редких и новых слов: если модель не видела слово целиком, она может собрать его из знакомых кусочков. Особенно это важно для языков с длинными составными словами (немецкий, русский) и для предобученных моделей вроде BERT и GPT. Самые известные алгоритмы — BPE, WordPiece, Unigram и библиотека SentencePiece; их подробно разбирают глава 5 книги и наш модуль 4.2.
Пример на русском: слово «непредсказуемость» токенизатор может разрезать на «не», «пред», «сказ», «уем», «ость». Даже если всё слово встречалось редко, части знакомы: «не» — отрицание, «ость» — суффикс состояния. Конкретная нарезка зависит от словаря, который токенизатор выучил на своих данных.
Разметка частей речи
Заголовок раздела «Разметка частей речи»Разметка частей речи (Part-of-Speech tagging, POS) приписывает каждому слову метку из заранее заданного набора: существительное, глагол, прилагательное, предлог и т. д. Она нужна для синтаксического разбора и задач, которые на нём строятся. Глава упоминает классические модели: скрытые марковские модели (HMM), условные случайные поля (CRF), а затем RNN и LSTM. Все они учатся на размеченных вручную корпусах.
Пример: «Мама мыла раму» → «Мама» (сущ.), «мыла» (глаг.), «раму» (сущ.). Заметьте ловушку: в предложении «Купи мыла» то же слово «мыла» — уже существительное. Без контекста метку не поставить.
Классификация текста
Заголовок раздела «Классификация текста»Классификация относит текст к одному или нескольким заранее заданным классам. Примеры применений из главы: анализ тональности, фильтр спама, рубрикация новостей, определение темы. Успех зависит от трёх вещей: как представлен текст (признаки), какой выбран алгоритм и насколько хороши обучающие данные. Сегодня это почти всегда нейросети.
Пример: «Сборная выиграла финал в серии пенальти» → «спорт»; «Центробанк сохранил ключевую ставку» → «экономика».
Распознавание именованных сущностей
Заголовок раздела «Распознавание именованных сущностей»Распознавание именованных сущностей (Named Entity Recognition, NER) находит в тексте имена людей, названия мест и организаций, даты и т. п. и указывает тип каждой. Это основа для извлечения информации, графов знаний, вопросно-ответных и рекомендательных систем.
Пример: «Анна и Пётр из Казани поедут в Пекин 7 апреля 2026 года» → (Анна, человек), (Пётр, человек), (Казань, место), (Пекин, место), (7 апреля 2026 года, дата).
Извлечение отношений
Заголовок раздела «Извлечение отношений»Извлечение отношений (relation extraction) ищет смысловые связи между сущностями: «основатель», «находится в», «родственник», «причина». Результат удобно записывать тройками — так строят графы знаний.
Пример: «Компанию DeepSeek основал Лян Вэньфэн» → (Лян Вэньфэн, основатель, DeepSeek).
Суммаризация
Заголовок раздела «Суммаризация»Суммаризация (text summarization) сжимает текст до краткого изложения. Глава различает два вида:
- Экстрактивная — выбирает из оригинала ключевые предложения и склеивает их. Плюс: ничего не выдумано. Минус: склейка бывает нескладной.
- Абстрактивная — пересказывает своими словами, может породить новые фразы. Это труднее, нужна модель, которая понимает смысл; классический выбор до LLM — модели «последовательность в последовательность» (Seq2Seq) с вниманием.
Книга иллюстрирует это новостью о посадке китайского марсохода «Тяньвэнь-1» в 2021 году: экстрактивный вариант дословно берёт одно предложение из заметки, абстрактивный пересказывает тот же смысл другими словами.
Машинный перевод
Заголовок раздела «Машинный перевод»Машинный перевод (machine translation, MT) переводит текст с исходного языка на целевой. Переставить слова по словарю мало: нужно сохранить смысл, стиль и культурный контекст. Глава называет основные инструменты нейросетевой эпохи — модели Seq2Seq и Transformer, которые учат сложное соответствие между языками.
Пример: короткую китайскую фразу (дословно «сегодня погода очень хорошая») система переводит как «Сегодня хорошая погода». Короткие фразы переводятся легко; с длинными и сложными текстами трудности растут.
Вопросно-ответные системы
Заголовок раздела «Вопросно-ответные системы»Вопросно-ответная система (question answering, QA) понимает вопрос на естественном языке и даёт точный ответ по доступным источникам. Внутри — сразу несколько подзадач: поиск, понимание текста, представление знаний, рассуждение. Глава выделяет три вида:
| Вид | Откуда берётся ответ |
|---|---|
| Поисковый | из большой коллекции текстов через поисковик |
| По базе знаний | из структурированной базы знаний (графа, таблиц) |
| Общественный | из вопросов и ответов пользователей на форумах и Q&A-сайтах |
Современный RAG (глава 7 книги, наш урок 8.2) — прямой потомок поискового QA: сначала найти документы, потом сгенерировать ответ по ним.
1.4 Как текст превращали в числа
Заголовок раздела «1.4 Как текст превращали в числа»Компьютер работает с числами, поэтому любой NLP-системе нужно представление текста: правило, по которому слова, фразы и документы становятся векторами или матрицами. Хорошее представление сохраняет смысл и при этом экономно по памяти и вычислениям. Глава прослеживает четыре шага.
flowchart LR A["Модель векторного пространства<br/>one-hot, TF-IDF<br/>разреженные векторы"] --> B["n-граммы<br/>вероятность следующего слова<br/>по n−1 предыдущим"] B --> C["Word2Vec<br/>плотные статические векторы"] C --> D["ELMo<br/>контекстные векторы,<br/>предобучение"]
1.4.1 Модель векторного пространства
Заголовок раздела «1.4.1 Модель векторного пространства»Модель векторного пространства (Vector Space Model, VSM) предложил Джерард Салтон (Гарвард). Текст любого размера — слово, предложение, документ — превращается в вектор, где каждая координата отвечает одному признаку (слову, иероглифу, словосочетанию), а значение — его вес. Вес считают по формулам вроде частоты слова (TF) или TF-IDF. На таких векторах легко считать сходство текстов, классифицировать и искать документы. Улучшить их можно матричными методами, например сингулярным разложением (SVD).
Главные недостатки, которые называет глава:
- Разреженность и «проклятие размерности». Размер вектора равен размеру словаря, а почти все координаты нулевые.
- Независимость признаков. Модель не видит порядок слов и контекст: «собака укусила человека» и «человек укусил собаку» дают один и тот же вектор.
- Выбор признаков и весов — отдельная непростая задача.
Посчитаем разреженность на своих числах. Пусть словарь — 10 000 слов, а в предложении «кот спит на тёплом диване» 5 разных слов. В векторе 10 000 координат, единиц — 5, остальные нули:
Читается так: из каждых 10 000 чисел в векторе 9995 — пустое место. Книга приводит такой же расчёт для словаря из 16 384 слов и получает ≈99,97%.
import numpy as np
vocab_size = 10_000 # размер словаряword_ids = [17, 352, 9, 4810, 2203] # номера пяти слов предложения в словаре (условные)
vector = np.zeros(vocab_size) # вектор из одних нулейvector[word_ids] = 1 # ставим единицы на позиции слов предложения
print(int(vector.sum())) # 5 — ненулевых координатprint(f"{1 - vector.sum() / vocab_size:.2%}") # 99.95% — доля нулейИсследователи пытались лечить эти болезни двумя путями: улучшать сами признаки (выделять ключевые слова через графы и тематические модели) и придумывать более точные формулы весов.
1.4.2 Языковые модели на n-граммах
Заголовок раздела «1.4.2 Языковые модели на n-граммах»N-граммная модель — статистическая языковая модель. Её применяли в распознавании речи и рукописного текста, исправлении опечаток, машинном переводе и поисковиках. Ключевое допущение — марковское: вероятность слова зависит только от предыдущих слов. При это униграммы (слова независимы), при — биграммы (смотрим на одно предыдущее слово), при — триграммы.
Вероятность всего предложения раскладывается по цепному правилу и упрощается марковским допущением. Для биграмм:
Что здесь написано: вероятность предложения — это произведение вероятностей «следующее слово при условии предыдущего», а каждую такую вероятность оцениваем частотами: сколько раз пара встретилась, делённое на то, сколько раз встретилось первое слово пары.
Пример на крошечном корпусе из трёх предложений:
from collections import Counter
# Крошечный корпус: три предложения, <s> и </s> — метки начала и концаcorpus = [ "<s> кот спит на диване </s>", "<s> кот ест рыбу </s>", "<s> пёс спит на полу </s>",]
unigrams = Counter() # сколько раз встретилось каждое словоbigrams = Counter() # сколько раз встретилась каждая пара соседних словfor line in corpus: words = line.split() unigrams.update(words) bigrams.update(zip(words, words[1:]))
def p(next_word, prev_word): """Оценка P(next | prev) = count(prev, next) / count(prev).""" return bigrams[(prev_word, next_word)] / unigrams[prev_word]
sentence = "<s> кот спит на полу </s>".split()prob = 1.0for prev, nxt in zip(sentence, sentence[1:]): print(f"P({nxt} | {prev}) = {p(nxt, prev):.3f}") prob *= p(nxt, prev)print(f"P(предложения) = {prob:.4f}")print("P(рыбу | спит) =", p("рыбу", "спит"))Вывод:
P(кот | <s>) = 0.667P(спит | кот) = 0.500P(на | спит) = 1.000P(полу | на) = 0.500P(</s> | полу) = 1.000P(предложения) = 0.1667P(рыбу | спит) = 0.0Фразы «кот спит на полу» в корпусе не было, но модель всё равно дала ей вероятность , потому что каждая пара соседних слов встречалась. А вот пары «спит рыбу» не было ни разу — вероятность ноль.
Это и есть слабые места, о которых пишет глава:
- Разреженность данных. Чем больше , тем больше возможных n-грамм и тем реже каждая из них встречается. Большинство комбинаций модель не видела, обобщает она плохо.
- Короткая память. Модель не видит зависимостей дальше слов и не улавливает структуру и смысл предложения.
Несмотря на это, n-граммы до сих пор используют там, где важны простота и скорость, а иногда комбинируют с нейросетями.
1.4.3 Word2Vec
Заголовок раздела «1.4.3 Word2Vec»Word2Vec (Томаш Миколов и соавторы, 2013) — метод построения эмбеддингов (word embedding): каждое слово получает плотный вектор из нескольких сотен чисел. Метод вырос из нейросетевых языковых моделей (NNLM). Идея: слова, которые встречаются в похожих контекстах, получают близкие векторы.
Две архитектуры:
| Архитектура | Что предсказываем | Когда лучше (по главе) |
|---|---|---|
| CBOW (Continuous Bag of Words) | центральное слово по векторам окружающих | небольшие корпуса |
| Skip-gram | окружающие слова по вектору центрального | большие корпуса |
Плюсы по сравнению с one-hot: размерность в сотни, а не десятки тысяч; векторы ловят смысловые связи — у «короля» и «королевы» векторы близки, потому что слова встречаются в похожих окружениях. Знаменитый пример (не из книги): .
Минусы: окно контекста маленькое, поэтому дальние зависимости теряются. И главное — вектор у слова один на все случаи жизни. «Ключ» от двери и «ключ» как родник получат одинаковый вектор. Это ограничение и снимает следующий шаг.
1.4.4 ELMo
Заголовок раздела «1.4.4 ELMo»ELMo (Embeddings from Language Models, 2018) сделал переход от статических векторов к динамическим: вектор слова теперь зависит от предложения, в котором оно стоит. Внутри — двунаправленная LSTM, обученная как языковая модель на большом корпусе.
Схема в два этапа, которую позже унаследуют BERT и GPT:
- Предобучение — языковая модель учится на огромном корпусе текста.
- Использование в задаче — для каждого слова берут векторы из предобученной сети и добавляют их как новые признаки в модель конкретной задачи (по желанию дообучая).
Пример: в «коса до пояса», «наточил косу» и «песчаная коса» слово «коса» получит три разных вектора — ровно то, чего не умел Word2Vec.
Минусы, по главе: модель сложная, LSTM учится долго и требует много вычислений, а качество извлечения признаков упирается в саму рекуррентную архитектуру. Следующий шаг — заменить LSTM на Transformer, о чём и рассказывает глава 2.
Что сделать руками
Заголовок раздела «Что сделать руками»- Запустите код с биграммами выше. Добавьте в корпус предложение «пёс ест кость» и пересчитайте . Должно получиться 0,5: «пёс» встречается дважды, из них один раз перед «ест».
- Посчитайте долю нулей в one-hot-векторе для словаря GPT-2 (50 257 токенов) и предложения из 8 разных токенов. Ответ: около 99,98%.
- Придумайте три предложения со словом «лук» (оружие, овощ, образ). Объясните, почему Word2Vec даст им один вектор, а ELMo — разные.
- Если читаете по-китайски, попробуйте сегментатор
jiebaна китайской записи названия «Нанкинский мост через Янцзы» и посмотрите, какую нарезку он выберет. - Переходите к уроку 4.1.2 — там биграммная модель строится на настоящем корпусе.
Словарик
Заголовок раздела «Словарик»| English | Русский |
|---|---|
| natural language processing, NLP | обработка естественного языка |
| Chinese word segmentation, CWS | сегментация китайского текста |
| subword segmentation | деление на подслова |
| part-of-speech tagging | разметка частей речи |
| text classification | классификация текста |
| named entity recognition, NER | распознавание именованных сущностей |
| relation extraction | извлечение отношений |
| text summarization | суммаризация |
| extractive / abstractive summarization | экстрактивная / абстрактивная суммаризация |
| machine translation | машинный перевод |
| question answering | вопросно-ответная система |
| text representation | представление текста |
| vector space model | модель векторного пространства |
| one-hot encoding | one-hot кодирование |
| language model | языковая модель |
| Markov assumption | марковское допущение |
| word embedding | эмбеддинг слова, вектор слова |
| pre-training | предобучение |