1. Математический фундамент: линейная алгебра для ML
Математический фундамент: линейная алгебра для ML
Почему одна и та же фотография может быть представлена как массив чисел, сжата почти без заметной потери качества и одновременно стать входом для нейросети, которая распознаёт на ней кошку? Ответ не в «магии ИИ», а в том, что почти весь современный Machine Learning опирается на язык линейной алгебры. Если вы видите в модели веса, эмбеддинги, признаки, батчи, проекции или attention-матрицы, то на самом деле вы видите разные формы работы с векторами и матрицами.
Вы наверняка уже сталкивались с таблицами чисел в Excel или с координатами точки на плоскости. Линейная алгебра делает следующий шаг: она учит воспринимать такие наборы чисел как объекты, над которыми можно выполнять содержательные преобразования. Именно поэтому она нужна в ML не как формальная математика «для галочки», а как рабочий инструмент. Когда модель умножает входной вектор на матрицу весов, она не просто считает числа — она меняет представление данных так, чтобы важные закономерности стали видимыми.
Векторы как носители признаков
Вектор — это упорядоченный набор чисел, который удобно интерпретировать как один объект. В ML это почти всегда набор признаков одного наблюдения. Если у вас есть клиент интернет-магазина, его можно представить вектором: возраст, число покупок, средний чек, время с последнего визита. Это не просто четыре числа рядом, а компактная запись состояния объекта.
Важно понимать, зачем это нужно. Как только данные представлены векторами, мы можем вычислять между ними расстояния, сравнивать направления, искать похожие объекты и строить модели, которые работают сразу с целыми группами признаков. Нейросеть не «понимает» текст или изображение напрямую — она получает числовой вектор и далее действует уже в пространстве этих представлений.
Микропример: слово в модели можно представить как вектор из сотен чисел. Два слова вроде «король» и «королева» оказываются не рядом по буквам, а рядом по смыслу, потому что их векторы близки в пространстве признаков.
Когда мы собираем несколько объектов вместе, появляется матрица — прямоугольная таблица чисел, где строки часто соответствуют объектам, а столбцы — признакам. Если в датасете 10 000 клиентов и у каждого 50 признаков, перед вами матрица размера 10 000 на 50. Это базовая форма данных почти для всех алгоритмов классического ML.
Но матрица в ML — не только способ хранения. Это ещё и способ преобразования. Если умножить вектор признаков на матрицу весов, мы получим новый вектор — другое представление тех же данных. Именно так работает линейный слой в нейросети: он берёт вход, смешивает признаки с разными коэффициентами и создаёт новую систему координат, в которой следующему слою проще найти закономерность.
Линейные преобразования как язык моделей
Вы наверняка замечали, что одну и ту же карту города можно растянуть по ширине или повернуть — объекты на ней изменят положение, но сохранят структуру связей. Линейное преобразование делает нечто похожее с пространством данных: растягивает, сжимает, отражает или поворачивает его по определённым правилам.
Формально матрица задаёт преобразование одного вектора в другой. Но полезнее держать в голове образ: матрица — это машина, которая берёт точки из одного пространства и переносит их в другое. В ML эта «машина» может усиливать важные признаки и подавлять шумные. Например, если один столбец данных почти не связан с целевой переменной, модель со временем присвоит ему малый вес.
Микропример: если у вас два признака — площадь квартиры и число комнат, то модель может преобразовать их в новые признаки вроде «общая вместимость жилья» и «плотность планировки». Эти новые признаки напрямую в данных не лежат, но матричное преобразование может их создать.
!Как матрица меняет пространство признаков
Проблема в том, что одно и то же преобразование можно понимать поверхностно — как набор арифметических операций, — а можно глубоко: как изменение геометрии данных. Для ML второй взгляд важнее. Если после преобразования точки двух классов легче разделить прямой, значит матрица помогла модели сделать данные более «удобными» для классификации.
Здесь появляется важное понятие базиса — набора направлений, через которые мы описываем пространство. В обычной двумерной плоскости это оси и . Но в признаковом пространстве базис можно менять. И иногда именно смена базиса делает задачу простой. Многие методы снижения размерности и факторизации по сути ищут такой базис, в котором структура данных проявляется яснее.
Микропример: если точки на плоскости вытянуты по диагонали, оси «вправо-вверх» и «вправо-вниз» опишут их лучше, чем стандартные горизонтальная и вертикальная оси. Данные те же, а картина понятнее.
Скалярное произведение, длина и сходство
Вам уже знакома идея «похожести» объектов. В ML её часто выражают через скалярное произведение — операцию, которая показывает, насколько два вектора направлены в одну сторону. Если говорить просто, это способ измерить согласованность двух наборов признаков.
Зачем это знать? Потому что огромное число моделей сравнивает объекты именно так. Поисковые системы, рекомендательные модели, эмбеддинги слов и документов, attention-механизм в трансформерах — все они так или иначе используют скалярные произведения или их нормализованные варианты.
Если два вектора направлены похоже, их скалярное произведение велико. Если они почти ортогональны, оно близко к нулю. Ортогональность здесь означает независимость направлений: один вектор почти ничего не говорит о другом. Для ML это ценно, потому что независимые признаки уменьшают дублирование информации.
Микропример: если один признак — рост человека в сантиметрах, а второй — тот же рост в метрах, они почти полностью дублируют друг друга. А вот рост и любимый жанр музыки могут быть почти независимыми.
Из скалярного произведения вырастают понятия длины вектора и угла между векторами. Длина важна, когда модель чувствительна к масштабу признаков. Именно поэтому нормализация данных так часто улучшает обучение: она не даёт одному признаку «перекричать» остальные только из-за больших чисел.
Собственные значения и собственные векторы
Представьте лист бумаги с нарисованной сеткой. Большинство преобразований повернёт линии, растянет их, смешает направления. Но иногда существуют особые направления, которые после преобразования не меняют своей оси — только растягиваются или сжимаются. Это и есть собственные векторы, а коэффициенты растяжения — собственные значения.
На первый взгляд это слишком абстрактно, но в ML это один из самых полезных сюжетов линейной алгебры. Собственные векторы показывают естественные направления структуры данных или преобразования. Собственные значения говорят, насколько эти направления важны. Если значение велико, вдоль этого направления происходит сильное изменение. Если мало — направление второстепенно.
Микропример: представьте облако точек в форме сигары. Его главный «длинный» наклон — это фактически направление наибольшего разброса. Оно очень похоже на главный собственный вектор матрицы ковариации.
!Собственные направления и растяжение пространства
Это особенно важно для анализа матриц ковариации, графов, динамических систем и методов снижения размерности. Например, в PCA главные компоненты находятся именно через собственные векторы ковариационной матрицы данных. То есть мы ищем направления, вдоль которых данные меняются сильнее всего.
На практике полезно помнить не определение, а смысловую интерпретацию:
Но здесь есть ловушка. Наличие большого собственного значения не всегда означает «полезный признак» в прикладном смысле. Иногда это просто направление шума с крупным масштабом. Поэтому линейная алгебра почти всегда работает вместе со статистическим смыслом данных, а не отдельно от него.
SVD как универсальный инструмент разложения
Если собственные значения — это особый случай для квадратных матриц, то сингулярное разложение или SVD работает гораздо шире. Любую матрицу данных можно представить как последовательность трёх шагов: поворот, растяжение, ещё один поворот. Это делает SVD одним из самых универсальных инструментов в ML.
Интуитивно SVD отвечает на вопрос: какие независимые направления вариации скрыты в данных, и насколько каждое из них важно? Матрица раскладывается на три части, где одна задаёт новые направления во входном пространстве, другая — силы растяжения, третья — направления в выходном пространстве.
Микропример: если у вас есть матрица «пользователь × фильм», SVD может выявить скрытые факторы вроде «любовь к боевикам», «интерес к авторскому кино», «предпочтение семейных фильмов», даже если эти категории не были явно заданы.
!SVD как поворот, растяжение и новый поворот
Зачем это нужно practically:
На уровне интуиции сингулярные значения похожи на «уровни значимости» направлений в данных. Чем больше значение, тем больше информации теряется, если этот компонент выбросить. Поэтому SVD часто используют как способ ответить на вопрос: «Сколько измерений нам реально нужно?»
Но здесь возникает практическая тонкость. Линейная алгебра говорит, какие направления сильны по структуре матрицы, но не гарантирует, что эти направления оптимальны для конкретной целевой задачи. Для сжатия изображения это может быть отлично, а для классификации редкого класса — не всегда.
PCA как способ увидеть структуру в данных
Вы наверняка видели рассеяние точек, вытянутое не вдоль осей, а под углом. Если смотреть на такие данные в неудобной системе координат, структура скрыта. Метод главных компонент, или PCA, ищет новые оси так, чтобы первая объясняла максимум разброса данных, вторая — следующий максимум, и так далее.
Проще говоря, PCA ищет наиболее информативные направления. Это полезно, когда признаков много, а часть из них избыточна или шумна. Метод не использует целевую переменную — он смотрит только на внутреннюю геометрию данных.
Микропример: если у вас 300 признаков текста после векторизации, часть из них может описывать почти одни и те же различия между документами. PCA позволяет сжать пространство, сохранив основную форму облака точек.
Главная практическая выгода PCA:
| Что делает PCA | Что это значит в жизни ML | |---|---| | Снижает размерность | Меньше памяти и быстрее обучение | | Убирает коррелированные направления | Меньше дублирования признаков | | Помогает визуализировать данные | Можно увидеть кластеры в 2D или 3D | | Иногда подавляет шум | Модель становится устойчивее |
Важно не перепутать: PCA сохраняет направления с максимальным разбросом, а не обязательно с максимальной полезностью для предсказания. Если редкий, но важный сигнал имеет малую дисперсию, PCA может его ослабить. Это частый источник ошибок у начинающих.
Разобранный пример: от матрицы признаков к понижению размерности
Представим задачу: у нас есть датасет клиентов банка с 20 признаками — доход, возраст, число транзакций, доля онлайн-покупок, средний баланс, число просрочек и так далее. Мы хотим предсказывать, откликнется ли клиент на маркетинговое предложение, но сначала замечаем, что признаки частично дублируют друг друга.
Шаг 1. Мы собираем данные в матрицу объектов и признаков. Почему так: модели удобнее работать, когда весь датасет имеет единую форму, а операции можно применять сразу ко всем строкам.
Шаг 2. Центрируем признаки, вычитая среднее по каждому столбцу. Почему так: PCA ищет направления разброса относительно центра данных. Если этого не сделать, средние значения будут искажать геометрию.
Шаг 3. Строим ковариационную матрицу. Почему так: она показывает, какие признаки меняются вместе. Если два признака часто растут и падают одновременно, ковариация велика.
Шаг 4. Находим собственные векторы и собственные значения этой матрицы. Почему так: собственные векторы задают новые оси, а собственные значения говорят, сколько разброса объясняет каждая ось.
Шаг 5. Сортируем компоненты по убыванию значимости и оставляем первые несколько. Почему так: слабые компоненты часто несут мало новой информации по сравнению с уже выбранными.
Шаг 6. Проецируем исходные данные на новые оси. Почему так: теперь каждый клиент описывается не 20 исходными признаками, а, например, 5 главными компонентами.
Предположим, что первые 5 компонент объясняют 92% общей вариации. Это означает, что мы сократили размерность в четыре раза, почти не потеряв структуру данных. Модель логистической регрессии после этого обучается быстрее, а мультиколлинеарность снижается.
Микропример: это похоже на упаковку большого чемодана в компактный вакуумный пакет. Форма меняется, объём уменьшается, но содержимое в основном сохраняется.
Но здесь скрыта важная тонкость. После PCA признаки становятся менее интерпретируемыми. Вместо «возраст» или «средний чек» вы получаете линейные комбинации признаков. Для соревнования на Kaggle это часто приемлемо, а для банковской модели с требованиями объяснимости — уже не всегда.
Где линейная алгебра встречается в современных моделях
Когда вы дойдёте до глубоких нейросетей, линейная алгебра станет буквально повсюду. Каждый линейный слой — это матричное умножение. Каждый эмбеддинг — это вектор в обучаемом пространстве. Каждый attention score — результат скалярного произведения или его модификации. Даже нормализация и инициализация весов зависят от размерностей матриц.
В трансформерах это особенно заметно. Последовательность токенов превращается в матрицу эмбеддингов, затем умножается на матрицы весов для получения запросов, ключей и значений. Потом снова возникают матричные операции, проекции, суммирования и разложения по подпространствам. Без уверенного понимания линейной алгебры всё это выглядит как набор формул; с пониманием — как единая геометрическая история о преобразовании представлений.
Есть и ещё одна ловушка: многие разработчики умеют использовать библиотечные функции, но не чувствуют размерности объектов. А именно ошибки размерностей чаще всего ломают реализацию. Если вы не понимаете, почему матрица размера batch × features умножается именно на features × hidden, вы будете постоянно исправлять баги вслепую.
Частые заблуждения и практические ориентиры
Часто думают, что линейная алгебра в ML нужна только для «математиков» и чтения статей. На самом деле она нужна для трёх куда более приземлённых вещей:
Ещё одно заблуждение: если библиотека всё считает сама, можно не разбираться в разложениях и собственных значениях. Но на практике именно эти идеи помогают выбрать число компонент, интерпретировать эмбеддинги, понять нестабильность обучения и принять архитектурные решения.
Если из этой главы запомнить только три вещи — это: