---
title: "OptNet: Differentiable Optimization as a Layer in Neural Networks"
title_ru: "OptNet / CvxpyLayers: Дифференцируемые выпуклые оптимизационные слои"
authors: [Amos, Kolter]
year: 2017
venue: "ICML"
venue_tier: "A*"
doi: "1703.00443"
tags: [differentiable_optimization, convex, qp_layer, constraint, inductive_bias]
relevance_to_smartrep: 2
direction: "🅲"
---

# OptNet / CvxpyLayers: Дифференцируемые слои выпуклой оптимизации

## TL;DR (≤3 предложения)

OptNet встраивает решение задачи квадратичного программирования (QP) как дифференцируемый слой нейросети: $\hat{z} = \arg\min_z \frac{1}{2} z^T Q z + q^T z$ subject to $Az = b, Gz \le h$. Градиенты через решатель вычисляются аналитически через KKT условия — без backprop через итерации. CvxpyLayers (2019) обобщает до произвольных дисциплинированных выпуклых программ. Для SmartRep: differentiable projection layer для биомеханических ограничений (joint limits, bone lengths) как plug-in слой.

## Проблема

Задачи с явными ограничениями (joint limits, biomechanical constraints) плохо встраиваются в нейросети — нет дифференцируемого механизма проекции на допустимое множество. Ручная постобработка (clip joint angles) не дифференцируема и не обучаема.

## Гипотеза / вклад

- **QP как слой:** решение QP — дифференцируемая функция параметров $(Q, q, A, b, G, h)$.
- **KKT градиенты:** оптимальность по KKT даёт аналитический gradient без развёртки итераций.
- **CvxpyLayers:** декларативный API через CVXPY — произвольная выпуклая программа → differentiable layer.

## Метод

Слой OptNet: $\hat{z}^* = \arg\min_{z} \frac{1}{2} z^T Q(x) z + q(x)^T z$ s.t. $A(x)z = b(x)$, $G(x)z \le h(x)$

Параметры $Q, q, A, b, G, h$ — выходы предыдущих слоёв сети.

Градиент через KKT (система линейных уравнений):

$$\begin{pmatrix} Q & G^T D & A^T \\ DG & D\text{diag}(\lambda) & 0 \\ A & 0 & 0 \end{pmatrix} \begin{pmatrix} dz \\ d\lambda \\ d\nu \end{pmatrix} = \begin{pmatrix} dL/dz \\ 0 \\ 0 \end{pmatrix}$$

где $D = \text{diag}(\lambda / (Gz - h))$ — диагональная матрица из dual variables.

### Архитектура (Mermaid)

```
Input x → Neural network layers → (Q, q, G, h, A, b)
                                           ↓
                                  QP Solver: ẑ* = argmin QP
                                           ↓
                                  Output ẑ* (feasible, satisfies constraints)
                                  Backward: analytic KKT gradients
```

## Датасеты

| Задача | Метрика | OptNet | Без constraints |
|---|---|---|---|
| Sudoku solving | Accuracy | 96.8% | 70.1% |
| 2D game prediction | MSE | 0.12 | 0.31 |
| Portfolio optimization | Sharpe ratio | +15% | baseline |

## Сравнение с SOTA

Первый differentiable QP layer в нейросетевом контексте. CvxpyLayers (Agrawal et al., 2019) — более широкое обобщение. Конкуренты: SATNet (differentiable SAT), Differentiable MPC.

## Ограничения / слабости

- QP solver медленный при большом числе переменных ($O(n^3)$).
- Только выпуклые ограничения — биомеханические joint limits выпуклы, но некоторые кинематические цепи — нет.
- CvxpyLayers не поддерживает GPU нативно без дополнительных усилий.
- Gradient conditioning плохой при near-degenerate constraints.

## Релевантность SmartRep

- **Biomechanical Constraint Layer 🅲:** joint limits $\theta_i \in [\theta_i^{min}, \theta_i^{max}]$ как QP: $\min_\theta \|\theta - \hat\theta\|^2$ s.t. $\theta_{min} \le \theta \le \theta_{max}$ — differentiable projection слой поверх pose estimator.
- **Bone length constraints:** $\|p_i - p_j\| = l_{ij}^{ref}$ как equality constraints в QP — гарантирует анатомическую корректность скелета.
- **Training signal:** QP-layer позволяет обучать pose estimator с constraints в loop — gradient проходит через проекцию.

## Gap для нас

OptNet/CvxpyLayers не применялись для биомеханических ограничений в real-time pose estimation. **Ниша SmartRep:** Learnable Biomechanical QP Layer — QP с обучаемыми параметрами ($\theta^{min}_i, \theta^{max}_i$ как learnable) через forward pass. Обучение: supervised на размеченных упражнениях → слой обучает персонализированные joint limits конкретного пользователя. Differentiable → end-to-end training.

## Код / данные

- OptNet repo: github.com/locuslab/optnet
- CvxpyLayers: github.com/cvxgrp/cvxpylayers
- Pretrained: нет (задачеспецифично)

## Цитата (BibTeX)

```bibtex
@inproceedings{amos2017optnet,
  title={OptNet: Differentiable Optimization as a Layer in Neural Networks},
  author={Amos, Brandon and Kolter, J Zico},
  booktitle={International Conference on Machine Learning},
  year={2017}
}
```
