Линейная алгебра
Низкоранговое приближение и псевдообратная
Оставить первые k сингулярных значений — это наилучшее приближение, какое существует
Матрица как сумма рангов-один
Перепишем SVD не как произведение трёх матриц, а как сумму:
Каждое слагаемое —
Отбросим хвост, оставив первые :
Теорема Эккарта–Янга
Среди всех матриц ранга не выше матрица ближе всего к — и в норме Фробениуса, и в операторной. Ошибка равна в точности отброшенному хвосту:
Это сильное утверждение. Не «хорошее приближение», а оптимальное: никакой другой алгоритм, никакая хитрая конструкция ранга не подберётся ближе. Доказательство мы пропускаем — важно уметь пользоваться формулировкой.
Потяните ранг и посмотрите на ошибку и на счётчик хранимых чисел. Обратите внимание, как быстро спадает спектр у гладких картинок и как медленно — у шума:
исходная
приближение · k = 1
спектр сингулярных значений
- ошибка по Фробениусу
- 2.695
- хранимых чисел
- 33 / 256
Настоящий ранг всего 3: произведение синуса от i на косинус от j — это ранг 1, а синус от суммы раскладывается в два слагаемых. Уже при k = 3 ошибка обращается в нуль.
Шахматная картинка стоит отдельного взгляда: она выглядит самой «сложной», а ранг у неё равен единице. Ранг измеряет не изменчивость, а число независимых направлений.
Экономия
Матрица — это чисел. Её ранг- приближение хранится как столбцов , столбцов и чисел:
При и это 20 тысяч чисел против миллиона — в пятьдесят раз меньше. Здесь же и ответ на вопрос, почему LoRA работает: поправка к матрице весов ищется в виде с маленьким внутренним размером, то есть низкоранговой. Обучаемых параметров становится вместо , и это ровно та же арифметика.
Псевдообратная матрица
Что делать, если необратима, а решить надо? Псевдообратная (Мура–Пенроуза) определяется через SVD:
где получается из обращением ненулевых элементов: , а нули остаются нулями. Последнее и есть весь фокус — деления на ноль не происходит, соответствующие направления просто игнорируются.
Что даёт :
- если решение существует и единственно — это оно;
- если решений много — из них выбирается с наименьшей нормой;
- если решений нет — выдаётся , минимизирующая , то есть решение задачи наименьших квадратов.
Одна операция закрывает все три случая из урока про ранг. Именно поэтому
lstsq есть в каждой библиотеке, а inv использовать почти никогда не нужно.
Отсекать малые сингулярные значения при построении — стандартная практика (
rcondв numpy). Причина в числе обусловленности: при крошечном усиливает шум до бессмыслицы. Приближение с отсечением честнее «точного» ответа, состоящего из шума.
След и определитель — рабочий минимум
Две скалярные характеристики, которые понадобятся дальше.
След — сумма диагональных элементов, и она же сумма собственных значений. Главное свойство:
Отсюда цикличность: . Этим приёмом переставляют множители в выводах градиентов по матрицам — весь блок 2 будет им пользоваться. Ещё удобная запись: .
Определитель — коэффициент изменения объёма и произведение собственных значений. Через SVD: . Отрицательный определитель означает смену ориентации. Больше про определители в этом плане не нужно — миноры, правило Крамера и теория перестановок сознательно пропущены.
Источники
- Deisenroth, Faisal, Ong — Mathematics for Machine Learning, гл. 4.6 — Matrix approximation, теорема Эккарта–Янга
- Trefethen, Bau — Numerical Linear Algebra, лекция 5 — Низкоранговые приближения, псевдообратная матрица
Проверки
0 из 2Ошибка усечения
У матрицы сингулярные значения .
Чему равна — ошибка наилучшего приближения матрицей ранга 2, измеренная в норме Фробениуса?
Ответ округлите до трёх знаков после запятой.
Сборка ранг-k приближения
Реализуйте
truncate(u, s, v, k)— восстановите матрицу из первыхkслагаемых SVD:Формат аргументов:
u— матрица , задана списком строк; -й левый сингулярный вектор это -й столбец;s— список из сингулярных значений;v— матрица , тоже списком строк; -й правый сингулярный вектор — её -й столбец;k— сколько слагаемых оставить,0 ≤ k ≤ r.
Верните матрицу списком строк. При
k = 0это матрица из нулей.Главная ловушка здесь — та же, что в уроке про смену базиса: сингулярные векторы лежат в столбцах, а на вход приходят строки.
Загрузка редактора…
Ctrl/⌘ + Enter