Граф вычислений
Материал из MachineLearning.
| | Статья написана с использованием LLM gemini 3.1 pro и проверена участником Oleg Aleksandrov 02:23, 14 июля 2026 (MSD) |
Граф вычислений (англ. computational graph) — математическая абстракция, представляющая собой Ориентированный ациклический граф (англ. directed acyclic graph, DAG), в котором узлы (вершины) соответствуют математическим операциям или переменным, а направленные рёбра задают поток данных (как правило, Тензоров, англ. tensors) между ними.
В глубоком обучении графы вычислений служат алгоритмической базой для реализации автоматического дифференцирования (англ. automatic differentiation) и алгоритма обратного распространения ошибки (англ. backpropagation).
Содержание |
Математическая формулировка
Граф вычислений определяется как ориентированный ациклический граф . Процесс вычисления функции
задаётся последовательностью промежуточных переменных
:
- Базовые переменные (входы графа):
для
. В задачах ML это батчи входных данных, обучаемые веса модели и гиперпараметры.
- Промежуточные узлы:
для
, где
— элементарная дифференцируемая операция, а
— множество узлов-родителей.
- Выходной узел:
. При обучении моделей это скалярная функция потерь (англ. loss function).
Прямой и обратный проходы
Прямой проход (Forward Pass) оценивает значения узлов в топологическом порядке от входов к выходу. Асимптотическая сложность прямого прохода составляет
.
Обратный проход (Backward Pass) вычисляет производные целевой переменной по каждому узлу графа. Вводится сопряженная переменная (англ. adjoint)
. Известно, что для выхода
. Далее применяется многомерное Цепное правило (англ. chain rule) в обратном топологическом порядке:
где
— дочерние узлы
, а
— Якобиан локальной операции.
Применение в архитектурах машинного обучения
Графы вычислений используются не только для базового обновления весов в сетях прямого распространения, но и определяют логику работы сложных архитектур:
- Генеративно-состязательные сети (GAN): Требуют поддержки двух взаимодействующих графов — генератора и дискриминатора. При обновлении весов генератора градиенты протекают через граф дискриминатора, веса которого в этот момент аппаратно «заморожены» (например, через флаг `requires_grad=False`).
- Мета-обучение (MAML): Алгоритмы Model-Agnostic Meta-Learning включают сам шаг градиентного спуска в граф вычислений. Это требует дифференцирования процесса обучения и вычисления производных высших порядков. Современные AD-системы строят вторичный граф поверх обратного прохода, вычисляя произведения Гессиана на вектор (Hessian-vector products) без явного формирования полной матрицы Гессе.
- Мультиагентное обучение с подкреплением (MARL): В моделях с дифференцируемой коммуникацией агенты обмениваются непрерывными векторами сообщений. Ошибка от действий одного агента распространяется сквозь общий граф коммуникации, напрямую обновляя веса других агентов.
- Модели диффузии (Diffusion Models): Граф описывает марковский процесс добавления и удаления шума, разворачивающийся на сотни временных шагов (time steps), что требует интеграции специализированных решателей SDE/ODE в систему автоматического дифференцирования.
Ограничения и вычислительная сложность
Практическое применение обратного режима AD сталкивается с аппаратными и математическими ограничениями.
Пространственная сложность и чекпоинтинг
Для вычисления производной обратный проход обращается к промежуточным активациям, сохранённым во время прямого прохода. Следовательно, потребление памяти растёт линейно с глубиной графа . В больших языковых моделях (LLM) это вызывает исчерпание памяти ускорителей.
Проблема решается методом контрольных точек градиента (англ. gradient checkpointing). В памяти фиксируются только ключевые узлы графа; промежуточные активации удаляются и перевычисляются «на лету» при обратном проходе. Это снижает затраты памяти до
за счёт увеличения времени вычислений примерно на 20–30%.
Вычислительная неустойчивость
В глубоких или развёрнутых во времени рекуррентных сетях последовательное умножение матриц Якоби приводит к затуханию (vanishing) или взрыву (exploding) градиентов. Для стабилизации графа применяются сквозные связи (skip connections, как в ResNet и Transformer), создающие короткие пути для градиентов в обход нелинейностей, а также усечение градиентов (gradient clipping) для предотвращения числового переполнения.
Альтернативы и сравнение подходов
Построение графа вычислений в машинном обучении (Reverse-mode AD) принято сравнивать с тремя другими методами вычисления производных.
| Метод | Принцип | Преимущества | Ограничения в ML |
|---|---|---|---|
| Символьное дифференцирование | Алгебраическая манипуляция формулами (SymPy, Mathematica) для получения аналитического выражения. | Отсутствие ошибок округления. | Проблема экспоненциального разбухания (expression swell). Формула производной для глубокой сети не поместится в оперативную память. Сложность работы с ветвлениями. |
| Численное дифференцирование | Метод конечных разностей: | Тривиальная реализация, используется для верификации (gradient checking). | Требует |
| Прямой режим AD | Распространение производных вместе со значениями от входов к выходам через дуальные числа. | Константное потребление памяти (не требует сохранения активаций). | Вычисляет градиент только по одному входу за проход. Для функции потерь |
| Обратный режим AD (Графы вычислений) | Прямой проход для вычисления активаций, обратный проход для вычисления градиентов. | Оценивает градиенты по всем | Требует |
Оптимизация: статические и динамические графы
Исторически библиотеки глубокого обучения разделялись на использующие статические графы (Define-and-Run, например, TensorFlow 1.x, Theano) и динамические (Define-by-Run, например, PyTorch, Chainer). Современные фреймворки объединяют эти подходы: разработчик пишет код в императивном динамическом стиле, а JIT-компиляция (например, `torch.compile` или XLA) транслирует его в оптимизированный статический граф перед выполнением.
Ключевые методы низкоуровневой оптимизации графа:
- Слияние операторов (Operator Fusion): Если в графе последовательно расположены узлы умножения матриц, сложения с вектором смещения и функции активации ReLU, компилятор объединяет их в одно специализированное ядро (kernel) для GPU. Это исключает накладные расходы на чтение и запись промежуточных тензоров в медленную глобальную память ускорителя (HBM).
- Удаление мертвого кода (Dead Code Elimination): Топологический анализ графа выявляет подграфы, которые не влияют на целевую функцию потерь, и исключает их из вычислений.
- Оптимизация пулов памяти (Memory Pooling): Анализируя жизненный цикл переменных в статическом графе, планировщик фреймворка переиспользует одни и те же адреса памяти для тензоров, не пересекающихся во времени.
Литература
- Linnainmaa, S. Taylor expansion of the accumulated rounding error // BIT Numerical Mathematics. — 1976. — Т. 16. — № 2. — С. 146—160.
- Rumelhart, D. E., Hinton, G. E., Williams, R. J. Learning representations by back-propagating errors // Nature. — 1986. — Т. 323. — С. 533—536.
- Goodfellow, I., Bengio, Y., Courville, A. Deep Learning. — MIT Press, 2016. — ISBN 978-0262035613
- Griewank, A., Walther, A. Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation, Second Edition. — SIAM, 2008. — ISBN 978-0-89871-659-7
- Baydin, A. G., Pearlmutter, B. A., Radul, A. A., Siskind, J. M. Automatic Differentiation in Machine Learning: a Survey // Journal of Machine Learning Research. — 2018. — Т. 18. — № 153. — С. 1—43.
- Abadi, M. et al. TensorFlow: A System for Large-Scale Machine Learning // 12th USENIX Symposium on Operating Systems Design and Implementation (OSDI 16). — 2016. — С. 265—283.
- Paszke, A. et al. PyTorch: An Imperative Style, High-Performance Deep Learning Library // Advances in Neural Information Processing Systems 32 (NeurIPS). — 2019. — С. 8024—8035.

