Нейронные сети

Эффективные методы реализации моделей ИИ

Constantine Korikov
Константин Кориков
PhD, AI Research Engineer
Разбор контрольной 10 мин
MLP: структура 40 мин
MLP: производительность 20 мин

Разбор контрольной

\(\max(0, \mathbf{x})\) Функция активации ReLU
\(\mathbf{y} = \mathbf{W} \cdot \mathbf{x} + \mathbf{b}\) Линейный слой
Поиск максимума вектора Часть softmax
\(\hat{x}_i = x_i / \sqrt{\frac{1}{n}\sum x_j^2}\) Нормализация RMSNorm
\((\mathbf{q} \cdot \mathbf{k}) / \sqrt{d}\) Механизм внимания
fp16 → fp8 → fp16 Квантизация весов

MLP

Структура

x Σ Σ W b σ σ y x n W m×n b m σ y m
\[\mathbf{y} = \sigma(\mathbf{W}\mathbf{x} + \mathbf{b})\]

\(\mathbf{W} \in \mathbb{R}^{m \times n}\) — матрица весов
\(\mathbf{b} \in \mathbb{R}^{m}\) — смещение
\(\sigma\) — функция активации

x n W₁ m×n b₁ m σ h m W₂ k×m b₂ k σ y k
\[\mathbf{h} = \sigma(\mathbf{W}_1\mathbf{x} + \mathbf{b}_1), \quad \mathbf{y} = \sigma(\mathbf{W}_2\mathbf{h} + \mathbf{b}_2)\]

Нейронная сеть с одним скрытым слоем
достаточной ширины и неполиномиальной активацией
может приблизить любую непрерывную функцию
с любой наперёд заданной точностью

Цыбенко, 1989; Hornik, 1991; Leshno, 1993

x n W₁ m×n b₁ m σ h₁ hᵢ₋₁ Wᵢ k×p bᵢ k y k

На практике глубина (число слоёв) эффективнее ширины (размер слоя)

Регрессия

\[\mathcal{L} = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_i)^2\]

Предсказание числа: температура, цена, координата

Классификация

\[\mathcal{L} = -\sum_{k=1}^{K} y_k \log \hat{p}_k\]

Предсказание вероятностей классов через softmax

MLP

Производительность

Скалярное произведение

\(\texttt{FHA} \leftarrow b_j + \displaystyle\sum_{i=0}^{C-1} w_{ji} \cdot x_i\)

FMADD — fused multiply-add:
одна инструкция вместо MUL + ADD

После вызова A указывает на следующую строку матрицы — удобно для цикла по нейронам

Функция активации

\(h_j = \text{ReLU}(z_j) = \max(0, z_j)\)

Всего 4 инструкции:
сравнение, условный переход, обнуление, возврат

Самая популярная активация в глубоких сетях — именно из-за простоты

Прямой проход

\(h_j = \text{ReLU}\!\bigl(\sum_{i} w^{(h)}_{ji} x_i + b^{(h)}_j\bigr)\)
\(y_k = \sum_{j} w^{(o)}_{kj} h_j + b^{(o)}_k\)

Каждый нейрон — один вызов dot_bias.
A автоматически переходит к следующей строке W

hidden0 и hidden1 расположены подряд в памяти — выходной слой читает их как вектор h[2]

Сколько операций и памяти
стоит один forward pass MLP?
Как сделать быстрее?