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

В чём парадокс
Возьмите сеть из нескольких полносвязных слоёв и уберите все функции активации: ReLU, сигмоиды, tanh — ничего. Каждый слой умножает вход на матрицу весов. Композиция матричных умножений — это снова матричное умножение. Значит, сеть из ста таких слоёв математически эквивалентна одной матрице W = W_n · ... · W_1, и на выходе вы получаете строго линейную функцию входа: y = Wx.
Отсюда стандартный вывод из учебника: глубина без нелинейности бесполезна, потому что выразительная мощность такой сети не выше, чем у одного слоя. Вывод верен для множества функций, которые сеть способна представить. Но он ничего не говорит о том, как сеть эти функции находит и в каком порядке. А именно тут прячется нелинейное поведение, которое годами изучают на глубоких линейных сетях как на упрощённой модели глубокого обучения.
Функция линейна, а обучение — нет
Ключевое различие: линейность отображения вход→выход и линейность динамики обучения параметров. Даже если итоговое отображение всегда останется линейным, траектория, по которой параметры к нему сходятся под градиентным спуском, описывается системой связанных нелинейных дифференциальных уравнений.
Причина в том, что параметров не один слой, а несколько, и градиент функции потерь по весам одного слоя зависит от произведения весов всех остальных. Возьмём простейший случай: скалярный вход, скалярный выход, два слоя с весами a и b. Сеть считает y = b·a·x. Итоговый коэффициент — произведение p = a·b, и по x это линейно. Но потери зависят от p, а p — билинейно от a и b. Градиентный спуск по (a, b) не движется по прямой к оптимуму: он идёт по кривой, потому что производная p по a равна b, и наоборот.
Множество представимых функций у линейной сети — плоскость. Ландшафт потерь над параметрами этой сети — искривлённая поверхность с сёдлами и плато. Обучение живёт на второй, а не на первой.
Сигмоидальные кривые обучения
Самое известное следствие изучили на глубоких линейных сетях аналитически. Если разложить целевое отображение по сингулярным числам (SVD), то каждая мода — независимое направление «сигнал-корреляция» — обучается почти независимо от других. И каждая мода выходит на своё значение не плавно-экспоненциально, как в одном линейном слое, а по S-образной, сигмоидальной кривой во времени.
Мода проводит долгое время у нуля (плато), затем за короткий промежуток резко «включается» и выходит на плато у целевого значения. Сильные моды с большими сингулярными числами включаются раньше, слабые — позже. Визуально кривая обучения выглядит как серия ступенек, а не гладкий спуск. Это чисто нелинейный эффект динамики, которого в однослойной линейной регрессии нет: там всё сходится монотонной экспонентой.
Почему это важно для практики
Глубокая линейная сеть — не игрушка ради математической красоты. Это лабораторная модель, на которой можно доказывать то, что в настоящих нелинейных сетях только наблюдается эмпирически:
- Плато и фазовые переходы. Ступенчатые кривые обучения, когда лосс долго стоит на месте, а потом обваливается, объясняются последовательным включением сингулярных мод.
- Влияние глубины на скорость. Больше слоёв не меняет множество представимых функций, но меняет динамику: при правильной инициализации глубина ускоряет сходимость по сравнению с одним слоем — эффект, который называют неявной предобусловленностью.
- Неявная регуляризация. Из бесконечного числа матриц W, идеально подгоняющих данные, градиентный спуск на факторизованных весах систематически выбирает решения с низким рангом или малой нормой. Никто это не задаёт явно — это следствие траектории.
- Роль инициализации. Старт из очень малых весов даёт «богатый» режим с последовательным обучением мод; старт из больших — «ленивый» режим, ближе к линейной регрессии в фиксированных признаках.
Линейная функция, нелинейная зависимость от данных
Есть и второй смысл слова «нелинейный». Итоговая матрица W как функция обучающих данных нелинейна. Поменяйте распределение входов или добавьте примеры — и решение, к которому придёт градиентный спуск, изменится не пропорционально изменению данных, потому что оно определяется структурой сингулярного разложения корреляционной матрицы, а не линейно от неё. Так линейная по входу сеть демонстрирует нетривиальные обобщающие свойства.
Мини-эксперимент, который можно повторить
Проверить ступенчатые кривые обучения можно на десятке строк. Возьмите два линейных слоя без активаций, инициализируйте малыми весами и обучайте на задаче, где у целевой матрицы разнесены сингулярные числа.
import torch, torch.nn as nn
torch.manual_seed(0)
d = 8
# целевое отображение с разнесёнными сингулярными числами
U, _ = torch.linalg.qr(torch.randn(d, d))
V, _ = torch.linalg.qr(torch.randn(d, d))
S = torch.diag(torch.tensor([9., 6., 3., 1., .5, .3, .2, .1]))
W_true = U @ S @ V.T
X = torch.randn(4096, d)
Y = X @ W_true.T
net = nn.Sequential(
nn.Linear(d, d, bias=False),
nn.Linear(d, d, bias=False),
)
for p in net.parameters():
nn.init.normal_(p, std=1e-3) # малая инициализация = богатый режим
opt = torch.optim.SGD(net.parameters(), lr=0.05)
for step in range(4000):
opt.zero_grad()
loss = ((net(X) - Y) ** 2).mean()
loss.backward()
opt.step()
if step % 500 == 0:
# эффективная матрица сети
W = net[1].weight @ net[0].weight
modes = torch.linalg.svdvals(W)[:4]
print(step, round(loss.item(), 4), [round(m.item(), 2) for m in modes])
Если вы напечатаете сингулярные числа эффективной матрицы W = W_2·W_1 по ходу обучения, то увидите, что они выходят на значения 9, 6, 3, 1 не одновременно: сначала фиксируется самая сильная мода, потом следующая. Это и есть последовательное, ступенчатое обучение. Замените малую инициализацию на std=1 — и ступеньки исчезнут, сеть свалится в ленивый режим и всё выучит почти сразу и одновременно.
Границы аналогии
Не стоит переносить выводы напрямую. Глубокая линейная сеть не решает задачи, требующие нелинейной границы: XOR ей недоступен, представимое множество остаётся плоскостью. Всё, что описано выше, — про динамику и индуктивные смещения оптимизации, а не про выразительность. Ценность модели в том, что для неё многое выводится точно, тогда как в сетях с ReLU те же явления приходится ловить экспериментально.
Практический смысл: когда ваша настоящая сеть застревает на плато, а потом внезапно проваливает лосс, или когда меняете инициализацию и получаете другое качество обобщения при том же финальном лоссе на трейне — это не случайность и не баг. Это те самые нелинейные эффекты обучения, которые в чистом виде видны уже на линейной сети.
Prompt-инженер: Идеальные запросы для Midjourney, ChatGPT и других моделей.
Спросить за 15 ₽Источники: Saxe, McClelland, Ganguli. Exact solutions to the nonlinear dynamics of learning in deep linear neural networks, Arora et al. Implicit Regularization in Deep Matrix Factorization
Частые вопросы
Если сеть всё равно вычисляет линейную функцию, зачем вообще делать её глубокой?
Что означают сигмоидальные кривые обучения?
Чем богатый режим обучения отличается от ленивого?
Можно ли на линейной сети решить XOR или другую нелинейно разделимую задачу?
Как самому увидеть ступенчатое обучение?
Почему малая инициализация так сильно влияет на результат?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.