관심있는 사람을 위해 여기에 자체 포함 된 게시물에 답할 것이라고 생각했습니다. 여기에 설명 된 표기법을 사용합니다 .
소개
역 전파의 기본 개념은 네트워크를 훈련시키는 데 사용하는 일련의 "훈련 예제"를 갖는 것입니다. 이들 각각에는 알려진 대답이 있으므로 신경망에 연결하여 얼마나 잘못되었는지 확인할 수 있습니다.
예를 들어, 필기 인식을 사용하면 실제 문자와 함께 필기 문자가 많이 있습니다. 신경망은 역 전파 (backpropagation)를 통해 각 기호를 인식하는 방법을 "학습"하기 위해 학습 될 수 있으므로 나중에 알려지지 않은 필기 문자가 표시 될 때 그것이 무엇인지 정확하게 식별 할 수 있습니다.
구체적으로, 우리는 신경망에 훈련 샘플을 입력하고, 그것이 얼마나 잘되었는지를 확인한 다음, "뒤로 족쇄"하여 더 나은 결과를 얻기 위해 각 노드의 가중치와 바이어스를 얼마나 많이 변경할 수 있는지를 찾은 다음 그에 따라 조정합니다. 이 작업을 계속하면 네트워크가 "학습"합니다.
교육 과정에 포함될 수있는 다른 단계 (예 : 드롭 아웃)도 있지만이 질문에 대한 내용이기 때문에 주로 역 전파에 중점을 둘 것입니다.
부분 파생 상품
편미분 는어떤 변수에 대한f의 도함수입니다∂에프∂엑스에프 입니다.엑스
예를 들어, 이면 ∂ ff(x,y)=x2+y2때문에Y(2)에 대하여 일정한 단순히X가. 마찬가지로∂f∂에프∂엑스= 2 x와이2엑스,x2는 단순히y에대해 상수이기 때문에∂에프∂와이= 2 년엑스2와이 .
∇ f로 지정된 함수의 기울기∇ f 모든 변수에 대한 부분 미분을 포함하는 함수입니다. 구체적으로 특별히:
,
∇f(v1,v2,...,vn)=∂f∂v1e1+⋯+∂f∂vnen
여기서 는 변수 v 1 방향을 가리키는 단위 벡터 입니다.eiv1
이제, 우리가 계산 한 후 일부 기능에 대한 F를 우리가 위치에있을 경우 ( V 1 , V 2 , . . . , V의 N ) , 우리가 할 수있는 "미끄러" F 방향으로 이동하여 - ∇ F ( V 1 , V 2 , . . . , V의 N ) .∇ff(v1,v2,...,vn)f−∇f(v1,v2,...,vn)
우리의 예에서는 상기 단위 벡터가 예 1 = ( 1 , 0 ) 및 E (2) = ( 0 , 1 ) 로 인해 V 1 = X 및 V 2 = Y , 그 벡터들은 x 와 y 축의 방향을 가리 킵니다 . 따라서 ∇ f ( xf(x,y)=x2+y2e1=(1,0)e2=(0,1)v1=xv2=yxy .∇f(x,y)=2x(1,0)+2y(0,1)
이제, "슬라이드 아래로"우리의 기능에 ,하자 우리가 지점에서 말하는 ( - 2 , 4 ) . 그럼 방향으로 이동해야 - ∇ F ( - 2 , - 4 ) = - ( 2 ⋅ - 2 ⋅ ( 1 , 0 ) + 2 ⋅ 4 ⋅ ( 0 , 1 ) ) = - ( ( - 4 , 0 ) +f(−2,4).−∇f(−2,−4)=−(2⋅−2⋅(1,0)+2⋅4⋅(0,1))=−((−4,0)+(0,8))=(4,−8)
이 벡터의 크기는 언덕이 얼마나 가파른 지 알려줍니다 (값이 높을수록 언덕이 가파르다는 것을 의미합니다). 이 경우에는 .42+(−8)2−−−−−−−−−√≈8.944
하다 마드 제품
두 행렬의하다 마드 곱 A,B∈Rn×m 행렬을 요소 단위로 추가하는 대신 요소 단위로 곱하는 것을 제외하고는 행렬 추가와 같습니다.
매트릭스 첨가 동안 공식적 + B = C 여기서 C ∈ R N은 × 해요 그러한A+B=CC∈Rn×m
,
Cij=Aij+Bij
마드 제품 ⊙ B = C , C ∈ R n은 × 해요 그러한A⊙B=CC∈Rn×m
Cij=Aij⋅Bij
그라디언트 계산
(이 부분의 대부분은 닐슨의 책에서 나온 것입니다 ).
우리는 훈련 샘플 세트 를 가지고 있는데, 여기서 S r 은 단일 입력 훈련 샘플이고 E r 은 해당 훈련 샘플의 예상 출력값입니다. 우리는 또한 바이어스 W 와 가중치 B 로 구성된 신경망을 가지고 있습니다 . r 은 피드 포워드 네트워크의 정의에 사용 된 i , j 및 k의 혼동을 막기 위해 사용됩니다 .(S,E)SrErWBrijk
다음으로 비용 함수 C(W,B,Sr,Er) 는 신경망과 단일 훈련 예를 취하는 를 정의하고 얼마나 좋은지 출력합니다.
일반적으로 사용되는 것은 2 차 비용이며
C(W,B,Sr,Er)=0.5∑j(aLj−Erj)2
여기서 L은 입력 샘플 주어진 우리 신경망의 출력 인 S의 RaLSr
그런 다음 ∂ C 를 찾고 싶습니다 와∂C∂C∂wij피드 포워드 신경망의 각 노드에 대해 ∂ b i j .∂C∂bij
우리는이 그라데이션 호출 할 수 있습니다 우리가 생각하기 때문에 각각의 신경 세포에 S의 R 및 E의 R 상수 등을 우리가 배울하려고 할 때 우리가 그들을 변경할 수 없기 때문에. 우리가 한 방향으로 상대적으로 이동할 -이 말이 W 및 B 를 최소화하는 것이 비용과 관련하여 기울기의 음의 방향으로 이동 W 및 B하면 이렇게된다.CSrErWBWB
이를 위해 우리는 δ i j = ∂ C를 정의합니다.층i의 뉴런j의 오차로서 ∂ z i j .δij=∂C∂zijji
우리는 계산을 시작 L을 연결하여 S의 연구를 우리의 신경 네트워크에.aLSr
그리고 우리는 우리의 출력 층의 오류 계산 통해,δL
.
δLj=∂C∂aLjσ′(zLj)
어느 것으로도 쓸 수 있습니다
δL=∇aC⊙σ′(zL)
.
다음으로, 우리는 오류를 찾을 다음 계층에서 오류의 측면에서 δ I + 1 을 통해δiδi+1
δi=((Wi+1)Tδi+1)⊙σ′(zi)
이제 신경망의 각 노드에 오류가 있으므로 가중치와 바이어스에 대한 기울기를 계산하는 것이 쉽습니다.
∂C∂wijk=δijai−1k=δi(ai−1)T
∂C∂bij=δij
출력 레이어의 오차에 대한 방정식은 비용 함수에 의존하는 유일한 방정식이므로 비용 함수에 관계없이 마지막 세 방정식은 동일합니다.
예를 들어 2 차 비용으로
δL=(aL−Er)⊙σ′(zL)
for the error of the output layer. and then this equation can be plugged into the second equation to get the error of the L−1th layer:
δL−1=((WL)TδL)⊙σ′(zL−1)
=((WL)T((aL−Er)⊙σ′(zL)))⊙σ′(zL−1)
which we can repeat this process to find the error of any layer with respect to C, which then allows us to compute the gradient of any node's weights and bias with respect to C.
I could write up an explanation and proof of these equations if desired, though one can also find proofs of them here. I'd encourage anyone that is reading this to prove these themselves though, beginning with the definition δij=∂C∂zij and applying the chain rule liberally.
For some more examples, I made a list of some cost functions alongside their gradients here.
Gradient Descent
Now that we have these gradients, we need to use them learn. In the previous section, we found how to move to "slide down" the curve with respect to some point. In this case, because it's a gradient of some node with respect to weights and a bias of that node, our "coordinate" is the current weights and bias of that node. Since we've already found the gradients with respect to those coordinates, those values are already how much we need to change.
We don't want to slide down the slope at a very fast speed, otherwise we risk sliding past the minimum. To prevent this, we want some "step size" η.
Then, find the how much we should modify each weight and bias by, because we have already computed the gradient with respect to the current we have
Δwijk=−η∂C∂wijk
Δbij=−η∂C∂bij
Thus, our new weights and biases are
wijk=wijk+Δwijk
bij=bij+Δbij
Using this process on a neural network with only an input layer and an output layer is called the Delta Rule.
Stochastic Gradient Descent
Now that we know how to perform backpropagation for a single sample, we need some way of using this process to "learn" our entire training set.
One option is simply performing backpropagation for each sample in our training data, one at a time. This is pretty inefficient though.
A better approach is Stochastic Gradient Descent. Instead of performing backpropagation for each sample, we pick a small random sample (called a batch) of our training set, then perform backpropagation for each sample in that batch. The hope is that by doing this, we capture the "intent" of the data set, without having to compute the gradient of every sample.
For example, if we had 1000 samples, we could pick a batch of size 50, then run backpropagation for each sample in this batch. The hope is that we were given a large enough training set that it represents the distribution of the actual data we are trying to learn well enough that picking a small random sample is sufficient to capture this information.
However, doing backpropagation for each training example in our mini-batch isn't ideal, because we can end up "wiggling around" where training samples modify weights and biases in such a way that they cancel each other out and prevent them from getting to the minimum we are trying to get to.
To prevent this, we want to go to the "average minimum," because the hope is that, on average, the samples' gradients are pointing down the slope. So, after choosing our batch randomly, we create a mini-batch which is a small random sample of our batch. Then, given a mini-batch with n training samples, and only update the weights and biases after averaging the gradients of each sample in the mini-batch.
Formally, we do
Δwijk=1n∑rΔwrijk
and
Δbij=1n∑rΔbrij
where Δwrijk is the computed change in weight for sample r, and Δbrij is the computed change in bias for sample r.
Then, like before, we can update the weights and biases via:
wijk=wijk+Δwijk
bij=bij+Δbij
This gives us some flexibility in how we want to perform gradient descent. If we have a function we are trying to learn with lots of local minima, this "wiggling around" behavior is actually desirable, because it means that we're much less likely to get "stuck" in one local minima, and more likely to "jump out" of one local minima and hopefully fall in another that is closer to the global minima. Thus we want small mini-batches.
On the other hand, if we know that there are very few local minima, and generally gradient descent goes towards the global minima, we want larger mini-batches, because this "wiggling around" behavior will prevent us from going down the slope as fast as we would like. See here.
One option is to pick the largest mini-batch possible, considering the entire batch as one mini-batch. This is called Batch Gradient Descent, since we are simply averaging the gradients of the batch. This is almost never used in practice, however, because it is very inefficient.