Эффективные методы реализации моделей ИИ
Структура
\(\mathbf{W} \in \mathbb{R}^{m \times n}\) — матрица весов
\(\mathbf{b} \in \mathbb{R}^{m}\) — смещение
\(\sigma\) — функция активации
Нейронная сеть с одним скрытым слоем
достаточной ширины и неполиномиальной активацией
может приблизить любую непрерывную функцию
с любой наперёд заданной точностью
Цыбенко, 1989; Hornik, 1991; Leshno, 1993
На практике глубина (число слоёв) эффективнее ширины (размер слоя)
Регрессия
\[\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
Производительность
Скалярное произведение
\(\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]