Входная производная NN в функции потерь в PyTorch ⇐ Python
-
Anonymous
Входная производная NN в функции потерь в PyTorch
Я пытаюсь аппроксимировать нелинейную функцию $V(x):\mathbb{R}^n\до \mathbb{R}_+$ с помощью MLP в PyTorch, например. V_x = модель(x).
Доступно только $N$ образцов $\nabla V^T(x) = \frac{\partial V(x)}{\partial x}$. Таким образом, у меня есть матрица S размерности $N\times n$, содержащая все выборки.
Потери должны быть среднеквадратической ошибкой между S и $\frac{\partial}{\partial x}$ V_x.
Моя проблема в том, что я не знаю, как вычислить $\frac{\partial}{\partial x}$ V_x в PyTorch, чтобы он не потерял зависимость от весов сети.
Я добавил минимальный пример, который показывает, что потери не уменьшаются из-за отсутствия зависимости.
импортировать numpy как np импортный фонарь импортировать torch.nn как nn импортировать torch.optim как optim модель = nn.Sequential( nn.Линейный(2, 10), nn.ReLU(), nn.Линейный(10, 10), nn.ReLU(), nn.Линейный(10, 1) ) модель.float() loss_fn = nn.MSELoss() оптимизатор = optim.Adam(model.parameters(), lr=0.1) # Генерация образцов # V(x) = x^T P x # град V(x) = 2Px P = np.matrix([[20.1892, -26.6218],[-26.6218, 38.0375]]) Н_С = 10 N = N_S**2 # количество выборок x_1 = np.linspace(-3,3,N_S) x_2 = np.linspace(-3,3,N_S) x = np.array([(a,b) для a в x_1 для b в x_2]) S = np.zeros((N,2)) для меня в диапазоне (N): S[i,:]=2*P@x[i,:] # обучение эпоха = 1 пока эпоха
Я пытаюсь аппроксимировать нелинейную функцию $V(x):\mathbb{R}^n\до \mathbb{R}_+$ с помощью MLP в PyTorch, например. V_x = модель(x).
Доступно только $N$ образцов $\nabla V^T(x) = \frac{\partial V(x)}{\partial x}$. Таким образом, у меня есть матрица S размерности $N\times n$, содержащая все выборки.
Потери должны быть среднеквадратической ошибкой между S и $\frac{\partial}{\partial x}$ V_x.
Моя проблема в том, что я не знаю, как вычислить $\frac{\partial}{\partial x}$ V_x в PyTorch, чтобы он не потерял зависимость от весов сети.
Я добавил минимальный пример, который показывает, что потери не уменьшаются из-за отсутствия зависимости.
импортировать numpy как np импортный фонарь импортировать torch.nn как nn импортировать torch.optim как optim модель = nn.Sequential( nn.Линейный(2, 10), nn.ReLU(), nn.Линейный(10, 10), nn.ReLU(), nn.Линейный(10, 1) ) модель.float() loss_fn = nn.MSELoss() оптимизатор = optim.Adam(model.parameters(), lr=0.1) # Генерация образцов # V(x) = x^T P x # град V(x) = 2Px P = np.matrix([[20.1892, -26.6218],[-26.6218, 38.0375]]) Н_С = 10 N = N_S**2 # количество выборок x_1 = np.linspace(-3,3,N_S) x_2 = np.linspace(-3,3,N_S) x = np.array([(a,b) для a в x_1 для b в x_2]) S = np.zeros((N,2)) для меня в диапазоне (N): S[i,:]=2*P@x[i,:] # обучение эпоха = 1 пока эпоха