Линейная алгебра

Практика блока

Линейная регрессия двумя способами, PCA, сжатие и cosine similarity

Шаг 22 из 117 · ~40 мин

Блок закрывается кодом. Ниже — что реализовать и какая теория за каждым пунктом стоит. Проверки внизу закрывают два из этих пунктов; остальные стоит сделать в своём репозитории.

1. Линейная регрессия через нормальное уравнение

Задача: найти w\mathbf{w}, минимизирующую Xwy2\|X\mathbf{w} - \mathbf{y}\|^2.

Решение целиком выводится из урока про проекции. Мы ищем ближайшую к y\mathbf{y} точку в образе XX — то есть проекцию. Остаток обязан быть ортогонален всем столбцам XX:

X(yXw)=0X^\top(\mathbf{y} - X\mathbf{w}) = \mathbf{0}

Раскрываем — и получается нормальное уравнение:

XXw=Xy\htmlData{k=gram}{X^\top X}\,\htmlData{k=w}{\mathbf{w}} = \htmlData{k=corr}{X^\top \mathbf{y}}

симметрична и неотрицательно определена — значит для неё работает спектральная теорема. Если столбцы XX независимы, она обратима, и w=(XX)1Xy\mathbf{w} = (X^\top X)^{-1}X^\top\mathbf{y}. Сравните с формулой проекционной матрицы из урока про ортогональность: это она и есть.

2. То же через SVD, и сравнение устойчивости

Подставив X=UΣVX = U\Sigma V^\top, получаем w=X+y\mathbf{w} = X^{+}\mathbf{y} — псевдообратная из прошлого урока.

Ключевая разница не в ответе, а в устойчивости. Число обусловленности XXX^\top X равно квадрату числа обусловленности XX:

κ(XX)=κ(X)2\kappa(X^\top X) = \kappa(X)^2

Если κ(X)=106\kappa(X) = 10^{6} — совершенно обычное дело для сырых признаков в разных единицах, — то κ(XX)=1012\kappa(X^\top X) = 10^{12}, и при двойной точности от ответа остаётся три-четыре значащих цифры.

Что реализовать: сгенерируйте плохо обусловленную XX (например, два почти коллинеарных столбца), решите обоими способами и сравните с истинным w\mathbf{w}. Разница будет наглядной. Это, кстати, объяснение того, почему np.linalg.lstsq предпочтителен inv(X.T @ X) @ X.T @ y.

3. PCA с нуля

Алгоритм в четыре строки, и каждая уже разобрана:

  1. Центрировать данные: вычесть среднее по каждому признаку.
  2. Взять ковариационную матрицу C=1n1XXC = \frac{1}{n-1}X^\top X — симметричную и неотрицательно определённую.
  3. Найти её собственные векторы (спектральная теорема гарантирует ортонормированный базис).
  4. Спроецировать данные на первые kk векторов — это смена базиса с усечением.

Эквивалентно: взять SVD центрированной XX и оставить первые kk правых сингулярных векторов. Собственные значения CC связаны с сингулярными значениями XX как λi=σi2/(n1)\lambda_i = \sigma_i^2/(n-1).

Центрирование пропускать нельзя. Без него первая главная компонента укажет в сторону среднего, а не в сторону максимальной изменчивости.

4. Сжатие изображения низкоранговым SVD

Прямое применение Эккарта–Янга: загрузите изображение в градациях серого, посчитайте SVD, оставьте kk слагаемых. Постройте график зависимости ошибки от kk и посмотрите, где картинка становится «достаточно похожей».

Тот же эксперимент в миниатюре — здесь. Сравните, как спад спектра зависит от структуры:

исходная

приближение · k = 2

ранг k 2

спектр

ошибка
3.831
хранимых чисел
82 / 400

Ранг 6 против единицы у соседних картинок: резкая граница не разделяется на функцию от строки и функцию от столбца. Для 95% энергии хватает четырёх слагаемых — приближение работает, но экономия куда скромнее.

Круг против полос — это и есть ответ на вопрос, что сжимается: не «простое» и не «гладкое», а разделимое. У полос и у гауссова бугра ранг равен единице, потому что каждый распадается в произведение функции от строки на функцию от столбца. У круга такого разложения нет, и спектр спадает заметно медленнее — хотя описывается круг такой же одной строкой кода.

5. Cosine similarity на эмбеддингах

cos_sim(a,b)=a,bab\operatorname{cos\_sim}(\mathbf{a}, \mathbf{b}) = \frac{\langle \mathbf{a}, \mathbf{b}\rangle}{\|\mathbf{a}\|\,\|\mathbf{b}\|}

Проверьте поведение при масштабировании: умножьте один вектор на 100 — значение не изменится. Умножьте на 1-1 — сменит знак. Это то, за что её и выбирают: она измеряет направление и сознательно игнорирует длину.

Заодно посмотрите, что происходит с обычным скалярным произведением в том же эксперименте, и почему в attention нормировки на длину нет — там она заменена делением на d\sqrt{d} по совсем другой причине, дисперсионной. Разберём в блоке 6.

ab
скалярное произведение
7.5
норма a
2.24
норма b
3.35
косинус
1
угол

Векторы выставлены коллинеарно. Потяните любой из них вдоль той же прямой: скалярное произведение поедет, косинус останется единицей.

Экзамен блока

Возьмите статью про LoRA и прочитайте раздел с методом. К этому моменту в формулах не должно остаться незнакомых объектов: низкоранговая поправка BABA, ранг rr, инициализация, масштабный множитель. Если формулы читаются — блок закрыт.

Источники

Проверки

0 из 2
  1. Почему нормальное уравнение хуже SVD

    Столбцы матрицы признаков XX почти коллинеарны, κ(X)106\kappa(X) \approx 10^{6}. Отметьте все верные утверждения.

  2. Наименьшие квадраты для прямой

    Реализуйте fit_line(xs, ys) — подгонку прямой y=ax+by = ax + b методом наименьших квадратов. Верните список [a, b].

    Это нормальное уравнение для XX из двух столбцов — самого xx и столбца единиц. Раскрыв 2×22 \times 2 систему, получаем закрытые формулы:

    a=nxiyixiyinxi2(xi)2,b=yiaxina = \frac{n\sum x_i y_i - \sum x_i \sum y_i}{n\sum x_i^2 - \left(\sum x_i\right)^2}, \qquad b = \frac{\sum y_i - a\sum x_i}{n}

    Знаменатель обращается в нуль, когда все xix_i равны: столбцы XX становятся пропорциональными, ранг падает, и прямая не определена однозначно. В этом случае верните null (в Python None).

    Стоит заметить, что знаменатель — это nn, умноженное на дисперсию xx. Ровно поэтому предсказуемость страдает, когда признак почти не меняется: делить приходится на почти ноль. Это тот же разговор про обусловленность, только для самой маленькой из возможных задач.

    функция fit_line

    Загрузка редактора…

    Ctrl/⌘ + Enter