본문 바로가기
AI 수학/최적화

역전파 (Backpropagation) 계산

by 깊은대학 2021. 3. 31.

선형 레이어(또는 fully-connected layer, 완전 연결 레이어)는 레이어의 모든 뉴런이 이전 레이어의 모든 뉴런과 연결된 레이어이다.

 

 

 

선형 레이어는 다음과 같이 선형 방정식으로 표현할 수 있다.

 

z(l+1)=W(l)a(l)+b(l)

 

여기서 위첨자 ll번째 은닉(hidden) 레이어를 뜻하고 W(l)은 가중치(weights), b(l)는 바이어스를 나타낸다. 레이어의 출력 z(l+1)은 활성함수(activation function) σ(l+1)를 통과하여 a(l+1)이 된다.

 

a(l+1)=σ(l+1)(z(l+1))

 

a(l+1)은 다시 l+1 번째 은닉(hidden) 레이어의 입력이 된다. 그림에서 x는 입력, y^는 출력, L은 손실함수(loss function)다. 입력 x는 보통 a(0)로 두어서 표기의 일관성을 유지하기도 한다.

 

 

전통적으로 신경망은 위 그림과 같이 뉴런과 연결층으로 표시하지만 활성함수를 분명히 표시하고 수식관계를 간편하게 알아보도록 다음과 같은 그림으로 표시하기도 한다.

 

 

신경망을 학습한다는 것은 손실함수 L이 최소가 되도록 가중치 W(l)와 바이어스 b(l)를 반복적으로 계산한다는 뜻이다. 그러기 위해서는 손실함수에 대한 가중치와 바이어스의 미분이 필요하다.

신경망은 입력 x로 부터 각 레이어의 출력 a(l)을 거쳐 최종 출력 y^가 산출되는 복합함수(composite)이다. 따라서 손실함수에 대한 가중치와 바이어스의 미분은 연쇄법칙(chain rule)로 구할 수 있다.

 

dLdW(l)=dz(l)dW(l)da(l)dz(l)dz(l+1)da(l)dy^dz(last)dLdy^dLdb(l)=dz(l)db(l)da(l)dz(l)dz(l+1)da(l)dy^dz(last)dLdy^

 

비용함수는 항상 스칼라 함수로 주어지므로 위 식에서 dLdW(l) 는 행렬, dLdb(l)dLdy^는 벡터이고, dz(l)dW(l) 의 결과는 3차원 텐서로 나오며, 나머지는 자코비안 행렬이다.

 

 

 

연쇄법칙으로 위 식을 이용하여 미분을 구할 때는 수식의 맨 오른쪽부터 왼쪽으로 이동하며 계산하는 역전파(backpropagation)가 유리하다. 왜냐하면 비용함수가 스칼라이므로 맨 오른쪽 미분의 결과는 벡터이기 때문이다. 왼쪽으로 이동하며 계산하게 되면 항상 행렬과 벡터의 곱인 dzdaδ, dadzδ 의 형태로 미분을 계산할 수 있다.

 

 

선형 레이어는 z=Wa+b의 형태이므로 연쇄법칙 수식에 나오는 구성 성분을 차례로 계산해보자.

먼저 자코비안 항이다.

 

dzda=WTdzdb=I

 

a=σ(z)는 활성함수에 따라 계산이 달라지는데, 만약 활성함수로 ReLU를 사용한다면 다음과 같이 된다.

 

dadz=[dσ1dz100dσkdzk],   dσidzi={1,zi>00,else 

 

만약 sigmoid를 사용한다면 다음과 같이 된다.

 

dadz=[dσ1dz100dσkdzk],   dσidzi=exp(zi)1+exp(zi)σi

 

dzdW는 벡터를 행렬로 미분하는 것으로서 정의에 의해서 k번째 깊이(depth)축의 행렬은 다음과 같이 계산하면 된다.

 

dzkdW=ddW(wk1a1+ww2a2++wknan)=[0aT0]

 

여기서 wij는 행렬 W의 성분이고 zk는 벡터 zk번째 성분이다. 계산 결과 k번째 깊이(depth)축의 행렬은 k번째 행을 제외하고는 모두 0의 값을 갖는다. 따라서 dzdW와 벡터 δ의 곱은 결과가 행렬로 나오며 다음과 같이 계산된다.

 

dzdWδ=[δ1aTδkaTδmaT]=δaT

 

여기서 δ=[δ1    δm]T이다.

3차 텐서와 행렬의 곱이 좀 복잡하게 느껴지겠지만 다음과 같이 생각하면 쉽다.

먼저 벡터와 벡터의 곱은 다음과 같다. 각 벡터의 성분과 성분을 곱한 후 더한다.

 

행렬과 벡터의 곱은 다음과 같다. 행렬의 성분인 열벡터와 벡터의 성분을 곱한 후 더한다.

 

3차 텐서와 벡터의 곱은 다음과 같다. 텐서의 성분인 행렬과 벡터의 성분을 곱한 후 더한다.

 

 

 

 

 

댓글