앞서 설명했던 SGD와 같은 것을 우리는 수치 미분이라고 한다. 수치 미분을 사용하는 이유는 오차를 줄여나가 신경망의 최적의 매개변수(가중치,편향)를 찾아가기 위해서이며, 더 자세하게 설명하자면 가중치의 매개변수에 대한 손실 함수의 기울기를 구하기 위해서이다.

 

수치 미분은 구현은 단순하지만 계산이 오래걸린다는 단점이 있다. 신경망은 수만개의 데이터를 수십개의 은닉층으로 학습시키기 때문에 계산이 빨라야 한다. 따라서 우리는 가중치 매개변수의 기울기를 효율적으로 계산하는 방법이 필요하다.

 

 

 

계산 그래프

딥러닝 학습서의 바이블 <밑바닥부터 시작하는 딥러닝>의 '오차역전파법'의 내용을 완벽하게 알려주는 블로그의 링크를 기재했으니 참고하길 바란다. 책이 너무 완벽해서 구입을 추천하지만 오차역전파법 자체만을 공부하고 싶다면 블로그에 기재된 내용만으로도 충분하며, 보충 설명이 필요할 경우 유튜브를 참고하길 바란다.

 

저자는 오차역전파법에 대해 설명할 때 수식보다는 계산 그래프를 활용한다. 그 이유는 우선 계산 그래프가 수식에 비해 상당히 직관적으로 받아들여지고 국소적 계산을 볼 수 있기 때문이다. 국소적 계산이란 뭘까?

 

 

이건 짧은 수식이니까 그나마 낫지만 오차역전파는 미분이기 때문에 수식보단 계산 그래프가 더 직관적이다.

 

계산 그래프 / 연산 : 노드(node) , 직선 : 엣지(edge)

 

 

 

국소적 계산

국소적 계산은 계산 전체에서 어떤 일이 벌어지든 상관없이 자신과 관련된 정보만으로 결과를 출력한다. 즉, 매우 복잡한 수식도 까보면 수많은 연산들의 합과 곱이며, 이 수많은 연산들을 하나씩만 놓고 보면 사실 별거없다. 라는게 국소적 계산의 뜻이다. 또한 국소적 계산은 연산 하나하나들의 결과를 보관할 수 있다. 따라서 우리는 전체로 향하는 과정을 간결하면서도 전부 볼 수 있게 된다. 이러한 국소적 계산의 효과 덕에 우리는 효율적으로 역전파를 구할 수 있다. 여기서 역전파란, 위의 계산 그래프를 볼 때 진행 방향(왼쪽에서 오른쪽)의 반대 방향(오른쪽에서 왼쪽)을 의미하며 순전파(→)의 역방향(←)으로 미분 값을 전달한다.

 

가령 우리가 사과값이 오를 때, 최종 금액이 얼마나 변화하는지를 알고 싶을 때 우리는 미분을 사용한다. 미분의 정의는 순간적인 변화량이기 때문이다. 따라서 역전파는 국소적 미분을 전달하며 각 변수의 미분을 효율적으로 구할 수 있게 도와준다.

 

 

 

연쇄법칙

z = (x+y)^2

위의 수식은 합성 함수를 보이기 위한 수식이다.

합성 함수란, 여러 함수로 구성된 함수이며 연쇄법칙은 합성 함수의 미분에 대한 성질이다.

 

연쇄 법칙이란 합성 함수의 미분은 합성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다는 것이다.

 

연쇄 법칙

 

이과생이라면 위의 수식이 익숙할 것이다. 기억에는 고등학교때 수학도 가끔은 이렇게 풀었던 것 같다. 어쨌든, 위의 수식을 풀어 말하자면 여러개의 변수로 이루어진 함수에서 몇몇 변수를 하나의 변수로 새롭게 생성해 각각을 미분하여 곱하는게 원래의 함수를 미분하는 것과 같다는 말이다. 이 연쇄 법칙이 계산 그래프를 활용하여 역전파를 이해하는 중요한 키워드가 될 것이기 때문에 최소한 위의 수식에 대해서는 확실히 이해하고 넘어가길 바란다. 복잡해 보이는 것에 비해 의외로 별 내용이 없다.

 

 

 

일반 연산(덧셈, 곳셈) 노드의 역전파

왼쪽 : 순전파 / 오른쪽 : 역전파

 

덧셈 노드의 역전파는 입력 값을 그대로 흘려보낸다.

 

왼쪽 : 순전파 / 오른쪽 : 역전파

 

곱셈 노드의 역전파는 순전파 때의 입력신호들을 서로 바꿔 곱해 흘려보낸다.

 

 

화살표 밑에 숫자를 넣어보길 바란다.

더보기

 

 

 

 

 

 

 

 

 

 

 

활성화 함수 역전파

ReLU 계층

ReLU의 역전파는 순전파의 입력인 x가 0보다 크면 상류값을 그대로 하류로 흘려보내고 x가 0보다 작으면 0을 보낸다.

 

왼쪽 : ReLU 수식 / 오른쪽 : ReLU 수식 미분

 

ReLU 계층의 역전파

 

 

 

Sigmoid 계층

Sigmoid같은 경우는 설명이 복잡하므로 유튜브를 참고하길 바란다.

결론적으로 Sigmoid의 역전파는 순전파의 출력 y만으로 계산할 수 있다.

 

Sigmoid 계층의 역전파

 

 

 

 

 

 

 

 

Affine 계층

Affine Transformation, 어파인 변환은 행렬의 곱을 의미한다. 신경망은 입력층에서 은닉층으로 데이터를 옮길 때 데이터와 가중치, 편향에 대해 행렬곱을 진행하였는데 이러한 처리를 Affine 계층이라고 한다. Affine 계층은 결론적으로 행렬의 곱을 진행하기 위해서 행렬의 차원을 일치시키는게 핵심이다.

 

Affine 계층의 역전파

 

Affine 계층이 이제껏 설명했던 역전파들과 다른 점은 '스칼라 값'이 아닌 '행렬 값'이라는 것이다. 따라서 Affine 계층의 역전파는 전치행렬과 미분된 행렬의 행렬곱이다. 여기서 왜 전치행렬을 곱하는지에 대한 이유자코비안 미분을 알아야한다. 어쨌든 역전파된 행렬곱을 하기 위해서는 전치행렬과 미분된 행렬의 위치를 잘 배치해야 한다.

 

 

 

배치(Batch)용 Affine 계층

이번에는 데이터를 N개 묶어 순전파하는 배치용 Affine 계층에 대해 생각해보자.

 

배치용 Affine 계층의 역전파

 

Batch는 데이터가 기존에 1x2 의 형상을 한 행렬이었다면 Nx2의 형상을 한 행렬로 변환됐을 뿐, 기존의 Affine 계층과 방식은 똑같다.

 

 

 

 

기존의 신경망을 Affine 계층과 활성화 함수 계층으로 나타내는 그림

 

 

 

 

 

 

 

 

 

 

 

출력층 활성화 함수의 역전파

Softmax

Softmax 계층 또한 수식 자체는 아주 많이 매우 복잡하다. 이에 대한 자세한 부분은 여기를 참고하길 바란다. 여기서는 결론만 말할건데 결국 Softmax의 역전파는 신경망의 출력값과 정답 레이블의 오차를 앞 계층에 전달한다는 것이다. 신경망 학습의 목적은 신경망의 출력(Softmax의 출력)이 정답 레이블과 가까워지도록 가중치 매개변수의 값을 조정하는 것(최적화 : Optimization)이다. 따라서 신경망의 출력과 정답 레이블의 오차를 효율적으로 앞 계층에 전달해야 한다.

 

간소화한 Softmax-with-Loss 계층의 계산 그래프

 

예를 들어보겠다. 정답 레이블이 [0 1 0]이고 Softmax 계층이 [0.3 0.2 0.5]를 출력했다고 하자. 이 Softmax의 출력값은 3번째 인덱스를 가장 높은 확률로 잡고 정답 레이블의 인덱스는 0.2로 예측하기 때문에 매우 나쁜 학습률을 보이고 있다. 이 때 Softmax의 역전파는 [0.3 -0.8 0.5]를 앞 계층에 전달한다. 그 결과 앞 계층들은 큰 오차를 통해 크게 재학습된다.

 

만약 정답 레이블이 [0 1 0]이고 Softmax 계층이 [0.01 0.99 0]일 경우 오차는 [0.01 -0.01 0]이다. 따라서 이런 경우는 오차가 매우 적으므로(학습을 잘 했으므로) 역전파를 통해 새롭게 학습하는 정도도 작아진다.

 

여기서 Softmax 함수(분류)의 손실 함수로 교차 엔트로피 오차를 사용하는 이유와, 항등 함수(회귀)의 손실 함수로 오차제곱합을 사용하는 이유가 나타난다. 각각의 함수에 손실 함수를 맞춰준 이유는 이 손실 함수들을 쓰면 각각의 함수들의 역전파 값이 예측값 - 정답 레이블로 말끔하게 떨어지기 때문이다.

 

 

 

 


 

 

 

지금까지 설명한 오차역전파법은 가중치 매개변수의 기울기를 구하는데 이용된다. 수치 미분으로 가중치 매개변수의 기울기를 구현할 수 있지만 수치 미분의 계산이 오래 걸리기 때문에 그보다 효율적인 오차역전파법을 사용했다. 만약 본인이 직접 오차역전파를 구현한다면 수치 미분의 결과와 오차역전파의 결과를 비교하여 검증하면 된다. 컴퓨터의 계산이 아주 정밀하진 않아서 두 값이 완벽하게 일치하긴 어렵지만 오차가 거의 0에 가까우면 잘 구현한 것이고, 차이가 너무 크다면 잘못 구현한 것이니 눈물을 머금고 잘 만들길 바란다.

 

 

 

 

+ Recent posts