Tensorflow`tf.train.Optimizer`는 어떻게 그라디언트를 계산합니까? tf.train.Optimizer.minimize(특히 tf.train.GradientDescentOptimizer)를 사용합니다 . 그라디언트를 정의하기 위해

Tensorflow mnist 튜토리얼 ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py )을 따르고 있습니다 .

튜토리얼은 tf.train.Optimizer.minimize(특히 tf.train.GradientDescentOptimizer)를 사용합니다 . 그라디언트를 정의하기 위해 인수가 전달되는 곳이 없습니다.

텐서 흐름은 기본적으로 수치 미분을 사용합니까?

당신이 할 수있는 것처럼 그라디언트를 전달하는 방법이 scipy.optimize.minimize있습니까?



답변

그것은 수치 적 분화가 아니라 자동 분화 입니다. 이것은 tensorflow가 존재하는 주된 이유 중 하나입니다. tensorflow 그래프에서 작업을 지정하면 ( Tensors 등의 작업 등 ) 그래프를 통해 연쇄 규칙을 자동으로 따를 수 있으며, 각 개별 작업의 미분을 알고 있으므로 지정하면 자동으로 결합 할 수 있습니다.

어떤 이유로 든 그 조각을 무시하려면을 사용하여 가능합니다 gradient_override_map.


답변

자동 차별화를 사용합니다. 그래디언트를 할당하는 그래프에서 체인 규칙을 사용하고 백 워드를 사용하는 위치.

우리가 텐서 C를 가지고 있다고 가정 해 봅시다.이 텐서 C는 일련의 연산 후에 만들어졌습니다.

따라서이 C가 Xk라는 텐서 세트에 의존하는 경우 그라디언트를 가져와야합니다.

Tensorflow는 항상 작업 경로를 추적합니다. 노드의 순차적 동작과 노드 간 데이터 흐름 방법을 의미합니다. 그것은 그래프에 의해 이루어집니다

우리가 비용 wrt X 입력의 파생물을 얻을 필요가 있다면 이것이 먼저 할 일은 그래프를 확장하여 x 입력에서 비용으로 경로를로드하는 것입니다.

그런 다음 강 순서로 시작합니다. 그런 다음 체인 규칙으로 그라디언트를 배포하십시오. (역전 파와 동일)

어떤 방식 으로든 소스 코드가 tf.gradients ()에 속하면 tensorflow가이 그라디언트 분포 부분을 훌륭하게 수행 한 것을 알 수 있습니다.

백 트래킹 tf가 graph와 상호 작용하는 동안 백 워드 패스에서 TF는 다른 노드를 만날 것입니다이 노드 안에 우리는 (op) matmal, softmax, relu, batch_normalization 등의 작업이 있습니다. 그래프

이 새로운 노드는 부분적으로 파생 된 작업을 구성합니다. get_gradient ()

새로 추가 된 노드에 대해 조금 이야기 해 봅시다

이 노드들 내에서 우리는 2 가지를 더합니다. 1. 미분을 계산했습니다.

체인 규칙에 따라

이것은 백 워드 API와 동일합니다.

따라서 tensorflow는 자동 차별화를 수행하기 위해 항상 그래프 순서를 생각합니다.

그래디언트를 계산하기 위해 순방향 변수가 필요하다는 것을 알기 때문에 텐서에도 불합리한 값을 저장해야합니다. 이는 메모리를 줄일 수 있습니다.