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

Низкоранговое приближение и псевдообратная

Оставить первые k сингулярных значений — это наилучшее приближение, какое существует

Шаг 20 из 117 · ~30 мин

Матрица как сумма рангов-один

Перепишем SVD не как произведение трёх матриц, а как сумму:

A=i=1rσiuiviA = \sum_{i=1}^{r} \htmlData{k=sig}{\sigma_i}\, \htmlData{k=outer}{\mathbf{u}_i \mathbf{v}_i^\top}

Каждое слагаемое — , матрица ранга один, взятая с σi\sigma_i. Поскольку сингулярные значения упорядочены по убыванию, слагаемые идут от самого важного к самому незначительному.

Отбросим хвост, оставив первые kk:

Ak=i=1kσiuiviA_k = \sum_{i=1}^{k} \sigma_i \mathbf{u}_i \mathbf{v}_i^\top

Теорема Эккарта–Янга

Среди всех матриц ранга не выше kk матрица AkA_k ближе всего к AA — и в норме Фробениуса, и в операторной. Ошибка равна в точности отброшенному хвосту:

AAkF2=i>kσi2,AAk2=σk+1\|A - A_k\|_F^2 = \sum_{i>k} \sigma_i^2, \qquad \|A - A_k\|_2 = \sigma_{k+1}

Это сильное утверждение. Не «хорошее приближение», а оптимальное: никакой другой алгоритм, никакая хитрая конструкция ранга kk не подберётся ближе. Доказательство мы пропускаем — важно уметь пользоваться формулировкой.

Потяните ранг и посмотрите на ошибку и на счётчик хранимых чисел. Обратите внимание, как быстро спадает спектр у гладких картинок и как медленно — у шума:

исходная

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

ранг k 1

спектр сингулярных значений

ошибка по Фробениусу
2.695
хранимых чисел
33 / 256

Настоящий ранг всего 3: произведение синуса от i на косинус от j — это ранг 1, а синус от суммы раскладывается в два слагаемых. Уже при k = 3 ошибка обращается в нуль.

Шахматная картинка стоит отдельного взгляда: она выглядит самой «сложной», а ранг у неё равен единице. Ранг измеряет не изменчивость, а число независимых направлений.

Экономия

Матрица m×nm \times n — это mnmn чисел. Её ранг-kk приближение хранится как kk столбцов UU, kk столбцов VV и kk чисел:

k(m+n+1) против mnk(m + n + 1) \ \text{против}\ mn

При m=n=1000m = n = 1000 и k=10k = 10 это 20 тысяч чисел против миллиона — в пятьдесят раз меньше. Здесь же и ответ на вопрос, почему LoRA работает: поправка к матрице весов ищется в виде BABA с маленьким внутренним размером, то есть низкоранговой. Обучаемых параметров становится k(m+n)k(m+n) вместо mnmn, и это ровно та же арифметика.

Псевдообратная матрица

Что делать, если AA необратима, а решить Ax=bA\mathbf{x} = \mathbf{b} надо? Псевдообратная (Мура–Пенроуза) определяется через SVD:

A+=VΣ+UA^{+} = V\Sigma^{+}U^\top

где Σ+\Sigma^{+} получается из Σ\Sigma обращением ненулевых элементов: σi1/σi\sigma_i \mapsto 1/\sigma_i, а нули остаются нулями. Последнее и есть весь фокус — деления на ноль не происходит, соответствующие направления просто игнорируются.

Что даёт x=A+b\mathbf{x} = A^{+}\mathbf{b}:

  • если решение существует и единственно — это оно;
  • если решений много — из них выбирается с наименьшей нормой;
  • если решений нет — выдаётся x\mathbf{x}, минимизирующая Axb\|A\mathbf{x} - \mathbf{b}\|, то есть решение задачи наименьших квадратов.

Одна операция закрывает все три случая из урока про ранг. Именно поэтому lstsq есть в каждой библиотеке, а inv использовать почти никогда не нужно.

Отсекать малые сингулярные значения при построении Σ+\Sigma^{+} — стандартная практика (rcond в numpy). Причина в числе обусловленности: 1/σ1/\sigma при крошечном σ\sigma усиливает шум до бессмыслицы. Приближение с отсечением честнее «точного» ответа, состоящего из шума.

След и определитель — рабочий минимум

Две скалярные характеристики, которые понадобятся дальше.

След — сумма диагональных элементов, и она же сумма собственных значений. Главное свойство:

tr(AB)=tr(BA)\operatorname{tr}(AB) = \operatorname{tr}(BA)

Отсюда цикличность: tr(ABC)=tr(CAB)\operatorname{tr}(ABC) = \operatorname{tr}(CAB). Этим приёмом переставляют множители в выводах градиентов по матрицам — весь блок 2 будет им пользоваться. Ещё удобная запись: AF2=tr(AA)=iσi2\|A\|_F^2 = \operatorname{tr}(A^\top A) = \sum_i \sigma_i^2.

Определитель — коэффициент изменения объёма и произведение собственных значений. Через SVD: detA=iσi|\det A| = \prod_i \sigma_i. Отрицательный определитель означает смену ориентации. Больше про определители в этом плане не нужно — миноры, правило Крамера и теория перестановок сознательно пропущены.

Источники

Проверки

0 из 2
  1. Ошибка усечения

    У матрицы AA сингулярные значения 5,4,3,2,15, 4, 3, 2, 1.

    Чему равна AA2F\|A - A_2\|_F — ошибка наилучшего приближения матрицей ранга 2, измеренная в норме Фробениуса?

    Ответ округлите до трёх знаков после запятой.

  2. Сборка ранг-k приближения

    Реализуйте truncate(u, s, v, k) — восстановите матрицу из первых k слагаемых SVD:

    Ak=t=0k1stutvtA_k = \sum_{t=0}^{k-1} s_t\, \mathbf{u}_t \mathbf{v}_t^\top

    Формат аргументов:

    • u — матрица m×rm \times r, задана списком строк; tt-й левый сингулярный вектор это ttстолбец;
    • s — список из rr сингулярных значений;
    • v — матрица n×rn \times r, тоже списком строк; tt-й правый сингулярный вектор — её tt-й столбец;
    • k — сколько слагаемых оставить, 0 ≤ k ≤ r.

    Верните матрицу m×nm \times n списком строк. При k = 0 это матрица из нулей.

    Главная ловушка здесь — та же, что в уроке про смену базиса: сингулярные векторы лежат в столбцах, а на вход приходят строки.

    функция truncate

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

    Ctrl/⌘ + Enter