Лекция 03

Многослойный перцептрон и прямой ход

Слои многослойного перцептрона
Вход, скрытые слои и выход. Каждая стрелка — свой вес.

Многослойный перцептрон (MLP) — башня аффинных преобразований и поэлементных активаций. Для слоя \(\ell\):

$$\mathbf{z}^{(\ell)} = W^{(\ell)}\mathbf{a}^{(\ell-1)} + \mathbf{b}^{(\ell)}, \qquad \mathbf{a}^{(\ell)} = \sigma^{(\ell)}(\mathbf{z}^{(\ell)})$$

На входе \(\mathbf{a}^{(0)}=\mathbf{x}\). На выходе \(\mathbf{a}^{(L)}=\hat{\mathbf{y}}\). Если обрабатывают сразу пакет из \(n\) примеров, те же формулы пишут матрицами:

$$Z^{(\ell)} = A^{(\ell-1)} W^{(\ell)\top} + \mathbf{1}\,\mathbf{b}^{(\ell)\top}$$

Здесь \(A\in\mathbb{R}^{n\times d}\) — строки-примеры. Векторизация важна не для красоты: современные ускорители умеют именно плотные матричные произведения.

Теорема об универсальном приближении

Даже сеть с одним скрытым слоем достаточной ширины может приблизить любую непрерывную функцию на компакте с любой точностью. Формально: для непрерывной \(f:K\to\mathbb{R}\) и \(\varepsilon>0\) найдутся \(m\), веса и смещения такие, что

$$\sup_{\mathbf{x}\in K} \left| f(\mathbf{x}) - \sum_{j=1}^{m} v_j\,\sigma(\mathbf{w}_j^\top\mathbf{x}+b_j) \right| < \varepsilon$$

Теорема не говорит, как найти эти веса и сколько нейронов нужно на практике. Глубина часто выгоднее ширины: она задаёт иерархию признаков.

Нормализация пакета

Чтобы сигнал не «уплывал» по масштабу, между слоями ставят batch normalization. Для активации \(h\) в мини-пакете:

$$\hat{h} = \frac{h-\mu_B}{\sqrt{\sigma_B^2+\varepsilon}}, \qquad y = \gamma\hat{h}+\beta$$

\(\mu_B,\sigma_B^2\) считают по текущему пакету, \(\gamma,\beta\) обучаются. Layer norm делает то же по признакам одного примера — так удобнее в NLP.

Инициализация

Если веса брать слишком большими, активации взрываются; слишком маленькими — затухают. Схема Xavier / Glorot для симметричных активаций:

$$W_{ij} \sim \mathcal{U}\!\left(-\sqrt{\frac{6}{n_{\mathrm{in}}+n_{\mathrm{out}}}}, \sqrt{\frac{6}{n_{\mathrm{in}}+n_{\mathrm{out}}}}\right)$$

Для ReLU чаще берут He-инициализацию: дисперсия \(2/n_{\mathrm{in}}\).

Прямой ход — это просто вычисление \(\hat{y}=f_\theta(x)\). Всё обучение живёт в обратном ходе: как изменить \(\theta\), чтобы \(\hat{y}\) стало ближе к истине.