TensorFlow / PyTorch: градиент потерь, который измеряется внешне - PullRequest
1 голос
/ 16 января 2020

Я относительно новичок в машинном обучении и Python.

У меня есть система, которая состоит из NN, выход которого подается в неизвестную нелинейную функцию F, например, в некоторые аппаратные средства. Идея состоит в том, чтобы приучить NN быть обратной F ^ (- 1) этой неизвестной нелинейной функции F. Это означает, что потери L рассчитываются на выходе F. Однако обратное распространение не может быть использовано прямым способом для вычисления градиенты и обновление весов NN, потому что градиент F также не известен.

Есть ли способ, как использовать функцию потерь L, которая не связана напрямую с NN, для вычисления градиентов в TensorFlow или PyTorch? Или взять убыток, полученный с помощью любого другого программного обеспечения (Matlab, C, et c.), Использовать его для обратного распространения?

  • Насколько я знаю, Keras keras.backend. Градиенты позволяют только вычислять градиенты по отношению к связанным весам, в противном случае градиент либо равен нулю, либо NoneType.
  • Я читал о функции stop_gradient () в TensorFlow. Но я не уверен, что это то, что я ищу. Это позволяет не вычислять градиент относительно некоторых переменных при обратном распространении. Но я думаю, что операция F в любом случае не интерпретируется как переменная.
  • Могу ли я определить любую произвольную функцию потерь (включая измерение аппаратных средств) и использовать ее для обратного распространения в TensorFlow или ее необходимо подключить к графику а также?

Пожалуйста, дайте мне знать, если мой вопрос недостаточно конкретизирован c.

1 Ответ

2 голосов
/ 16 января 2020

AFAIK, все современные пакеты глубокого обучения (, , et c.) Работают на градиентном спуске (и его множество вариантов) для обучения сетей.
Как следует из названия, вы не можете сделать градиентный спуск без градиентов.

Однако вы можете обойти "недифференцируемость" Ваша «данная» функция F, если взглянуть на проблему с несколько иной точки зрения:
Вы пытаетесь изучить модель M, которая «противодействует» эффекту F. Таким образом, у вас есть доступ к F (но не к его градиентам) и набор репрезентативных входных данных X={x_0, x_1, ... x_n}.
Для каждого примера x_i вы можете вычислить y_i = F(x_i), и ваша конечная цель - получить модель M при заданном y_i будет выводиться x_i.
Следовательно, вы можете рассматривать y_i как входные данные вашей модели и вычислять потери между M(y_i) и x_i, которые ее породили. Таким образом, вам не нужно вычислять градиенты через «черный ящик» F.

Псевдокод будет выглядеть примерно так:

for x in examples:
  y = F(x)  # applying F on x - getting only output WITHOUT any gradients
  pred = M(y)  # apply the trainable model M to the output of F
  loss = ||x - pred||  # loss will propagate gradients through M and stop at F
  loss.backward()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...