Введение в нейронные сети
В данной главе рассматриваются основы построения и обучения нейронных сетей. Мы изучим математическую модель нейрона, роль функций активации, архитектуру многослойных сетей и метод обратного распространения ошибки (backpropagation). Также будут рассмотрены методы оптимизации (SGD, Adam, RMSProp), техники нормализации данных и весов, а также методы регуляризации для борьбы с переобучением.
1. Нейрон и функции активации
Математический нейрон
Математический нейрон концептуально похож на биологический. Он принимает входные сигналы, умножает их на веса и пропускает через функцию активации.
Рассмотрим пример задачи: предсказать, сдаст ли студент экзамен исходя из следующих признаков:
- $X_1$ — Задавал вопросы на парах (1/0).
- $X_2$ — Попал к лектору на экзамене (1/0).
- $X_3$ — Сдал лабы (1/0).
Логика задачи может быть следующей:
- Если студент попал к лектору, то он сдаст экзамен только если задавал вопросы и сдал лабы.
- Если студент не попал к лектору, то для сдачи достаточно или задавать вопросы, или сдать лабы.
Модель нейрона вычисляет взвешенную сумму входов: $$S = W_1X_1 + W_2X_2 + W_3X_3$$
Выход нейрона $Y$ определяется пороговой функцией активации: $$f(x) = \begin{cases} 1, & x \ge 0.5 \ 0, & x < 0.5 \end{cases}$$
Пример весов для простой логики: $W_1 = 0.5, W_2 = -0.5, W_3 = 0.5$. Для входа $(1, 1, 1)$: $0.5 \cdot 1 - 0.5 \cdot 1 + 0.5 \cdot 1 = 0.5 \ge 0.5 \rightarrow$ сдал (1).
Проблема одного слоя
Однослойная модель (персептрон) не может решить задачи, где ответ зависит от сложной комбинации пар признаков (например, если лектор не любит студентов, которые задавали вопросы, но сданные лабы повышают шанс). Для таких задач сложно подобрать веса в модели с одним слоем.
Скрытые слои
Решением является добавление скрытых слоев. Скрытые слои ($Z$) формируют новое признаковое пространство, в котором задача решается проще. $$Z_1 = f(W_{11,1}X_1 + W_{12,1}X_2 + \dots)$$ $$Y_1 = f(W_{21,1}Z_1 + W_{22,1}Z_2 + \dots)$$
Функции активации
Для обучения сети методом градиентного спуска функции активации должны быть дифференцируемы.
- Пороговая функция: Используется в биологических моделях, но не дифференцируема в точке порога.
- Сигмоида: Дифференцируемая функция. $$f(x) = \frac{1}{1 + e^{-x}}$$ Производная сигмоиды: $$\frac{d\sigma(x)}{dx} = \sigma(x)(1 - \sigma(x))$$
2. Обучение нейронной сети
Обучение одного нейрона
Обучение одного нейрона с сигмоидальной функцией активации аналогично обучению логистической регрессии. Обучаемыми параметрами являются веса $W$.
Метод обратного распространения ошибки (Backpropagation)
Для пересчета весов в многослойной сети необходимо знать ошибку для каждого нейрона. Ошибка для выходного слоя $Y_1$ считается легко, но для скрытых слоев $Z$ требуется метод обратного распространения.
Цепное правило (Chain Rule): $$\frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx}$$
Пример вычисления градиента: Пусть есть функция $f(x, y, z) = (x + y)z$.
- $q = x + y$. Производные: $\frac{dq}{dx} = 1, \frac{dq}{dy} = 1$.
- $f = zq$. Производные: $\frac{df}{dq} = z, \frac{df}{dz} = q$.
- Итоговые градиенты: $\frac{df}{dx} = \frac{df}{dq} \cdot \frac{dq}{dx} = z \cdot 1$.
Обновление весов: Ошибка вычисляется как разность между_actual_ и expected. $$err = actual - expected$$ Для сигмоиды градиент веса включает производную функции активации: $$weights_delta = err \cdot \sigma(x) \cdot (1 - \sigma(x))$$ Обновление веса с learning rate ($lr$): $$weight_{new} = weight_{old} - output \cdot weights_delta \cdot lr$$
Ошибка для скрытых слоев распределяется пропорционально весам, связывающим их с последующим слоем: $$err_{hidden} = weight \cdot weights_delta$$
Проблемы сигмоиды
- Маленькие градиенты на концах функции (проблема затухающего градиента).
- Всегда положительная.
- Дорого считать экспоненту.
3. Оптимизаторы
Для минимизации функции потерь используются различные варианты градиентного спуска.
SGD (Stochastic Gradient Descent)
Базовый метод: $$x_{t+1} = x_t - \alpha f'(x_t)$$ где $\alpha$ — learning rate.
SGD with Momentum
Накапливает инерцию движения, чтобы сглаживать колебания: $$v_{t+1} = \rho v_t + \alpha f'(x_t)$$ $$x_{t+1} = x_t - v_{t+1}$$
Nesterov Momentum
Улучшенная версия momentum, которая «смотрит вперед» перед вычислением градиента. Меньше «заносит на поворотах»: $$v_{t+1} = \rho v_t - \alpha f'(x_t + \rho v_t)$$ $$x_{t+1} = x_t + v_{t+1}$$
Adagrad (Adaptive Gradient)
Адаптирует learning rate для каждого параметра индивидуально. Веса, которые менялись сильно, меняются меньше: $$cache_{t+1} = cache_t + f'(x_t)^2$$ $$x_{t+1} = x_t - \frac{\alpha f'(x_t)}{\sqrt{cache_{t+1}} + \epsilon}$$ Проблема: $cache \to \infty$, что может остановить обучение.
RMSProp
Сглаживает изменения кэша, забывая старые значения (экспоненциальное скользящее среднее): $$cache_{t+1} = \beta cache_t + (1 - \beta) f'(x_t)^2, \quad \beta \in [0, 1]$$ $$x_{t+1} = x_t - \frac{\alpha f'(x_t)}{\sqrt{cache_{t+1}} + \epsilon}$$
Adam
Комбинация RMSProp и Momentum: $$v_{t+1} = \gamma v_t + (1 - \gamma) f'(x_t)$$ $$cache_{t+1} = \beta cache_t + (1 - \beta) f'(x_t)^2$$ $$x_{t+1} = x_t - \frac{\alpha v_{t+1}}{\sqrt{cache_{t+1}} + \epsilon}$$ В качестве бэйзлайна рекомендуется использовать Adam или Nesterov.
4. Нормализация и инициализация
Нормализация данных
Необходима по следующим причинам:
- Технические ограничения точности дробных чисел.
- Без нормализации страдают L1 и L2 регуляризация.
- Ускоряет обучение. В нейронных сетях это критично, так как каждый слой отображает данные в новое пространство признаков, и при изменении весов меняется распределение новых признаков.
Инициализация весов
- Нули: Сеть не обучается (все нейроны одинаковы).
- Константа: Сеть вырождается в один нейрон.
- Случайные значения: Необходимо сохранять дисперсию данных после прохождения через слой.
Для сохранения дисперсии (например, для ReLU): $$D(s) = D\left(\sum_{i}^{N} w_i x_i\right) = \sum_{i}^{N} D(w_i x_i) = n D(w) D(x)$$ Чтобы $D(s) = D(x)$, необходимо: $$D(w) = \frac{1}{n}$$ Берем случайные значения и умножаем на $\frac{1}{\sqrt{n}}$ (или используем распределение с дисперсией $1/n$).
Batch Normalization
Позволяет преобразовывать данные после прохождения функции активации в пределах одного батча, чтобы бороться с изменением распределения признаков (Internal Covariate Shift).
Формула нормализации: $$\hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2}}$$ где $\mu$ и $\sigma^2$ — матожидание и дисперсия в батче.
Далее применяется масштабирующее преобразование с обучаемыми параметрами $\gamma, \beta$: $$y_i = \gamma \hat{x}_i + \beta$$
Для инференса используются скользящие средние статистики: $$\mu_{t+1} = \alpha \times \mu_{batch} + (1 - \alpha) \mu_t$$ $$\sigma^2_{t+1} = \alpha \times \sigma^2_{batch} + (1 - \alpha) \sigma^2_t$$
Batch normalization позволяет ускорить сходимость сети и использовать больший learning rate.
5. Регуляризация
L1 и L2 регуляризация
Штраф за большие веса позволяет бороться с переобучением:
- L2: $|W|_2^2 = \sum w^2$
- L1: $|W|_1 = \sum |w|$
- Elastic Net: Комбинация L1 и L2.
Dropout
Случайным образом «выключает» некоторые нейроны в процессе обучения. На каждой итерации выключаются разные нейроны.
- Интерпретация: Уменьшение количества признаков.
- Инференс: Когда в продакшене включаем все нейроны, необходимо нормировать выходы на долю нейронов, которые мы отключали во время обучения, чтобы сохранить распределение.
Residual Connection (Остаточные связи)
В очень глубоких сетях градиент может не доходить до нижних слоёв (становиться очень маленьким). С помощью сложения фичей в обход нескольких слоёв (skip connection) получается «проталкивать» градиент до нижних слоёв.
Аугментация
Искусственное расширение данных (например, для изображений). Улучшает работу сети в реальной жизни и позволяет получить лучший скор на test выборке.
6. Заключение
В данной главе были рассмотрены фундаментальные принципы построения нейронных сетей: от модели нейрона до современных методов оптимизации и регуляризации. Понимание процессов обратного распространения, нормализации и выбора оптимизатора критически важно для успешного обучения глубоких моделей.
В следующих лекциях планируется рассмотрение задач компьютерного зрения (Computer Vision)?