역전파(Backpropagation)

This entry is part 3 of 9 in the series 딥러닝 핵심 개념

1. 들어가며

Backpropagation(역전파)는 딥러닝을 이루는 핵심 알고리즘들 중 하나입니다. 따라서 반드시 직접 네트워크를 미분해 보며 그 의미를 느껴봐야 합니다. 딥러닝 모델을 연구, 개발할 때 대부분은 PyTorch, TensorFlow 등의 딥러닝 프레임워크를 사용하는데요. 이러한 프레임워크들은 대부분 Backpropagation을 위한 자동 미분 메서드를 제공합니다. 따라서 특별한 경우를 제외하면 Backpropagation을 위한 코드를 직접 짜는 경우는 잘 없습니다.

그런데 왜 굳이 직접 미분을 하며 Backpropagation을 느껴봐야 한다고 하는 걸까요? 먼저 하나의 일화를 소개해드리고 싶습니다. 제가 좋아하던 연구소장님이 해주신 얘기입니다.

본인께서 실무 면접관으로 들어갈 때 제일 많이 물어봤던 질문은 바로 이것이라고 합니다. ‘Backpropagation 수식을 직접 유도해 보세요.’ 왜 그러셨을까요? 기본이 중요하기 때문입니다. 기본이 중요하고, Backpropagation 알고리즘이 중요한 기본기에 속한다는 말에는 대부분 동의하실 겁니다. 하지만 요즘은 프레임워크들이 잘 나와서 직접 미분할 필요가 없기에 너무 옛날 마인드라고 생각했었습니다.

하지만 연구를 직접 해보면서 조금씩 그 이유를 알 수 있었습니다. 딥러닝 프레임워크를 사용하면 우리가 직접 Backpropagation을 위한 코드를 작성할 일은 잘 없습니다. 하지만 직접 미분해 보며 Backpropagation 과정을 느껴보지 않으면, 네트워크의 강점과 약점을 알 수 없습니다. 때문에 새로운 네트워크를 구성하거나 또는 기존 네트워크를 조금씩 수정하는 작업이 어렵습니다. 또한 딥러닝의 많은 연구들이 Backpropagation 과정을 개선하는 방향으로 진행되고 있죠.
따라서 이런 연구 논문들의 철학을 이해하는 것도 어렵습니다. 결국 Backpropagation 알고리즘을 직접 미분해 보며 느껴보지 않으면 수박 겉핥기 수준에 머무를 수밖에 없습니다.

꼭 본인만의 네트워크를 구성해 보고 직접 미분해 보며 Backpropagation 과정을 느껴보시길 바랍니다.

2. 이미지 분류를 위한 네트워크 구성하기

먼저 이번 글에서 미분해 볼 네트워크를 구성해 보겠습니다. 2개의 클래스로 구분하기 위한 이미지 분류 네트워크라고 가정하겠습니다.

이미지 분류 네트워크 구성하기
그림1. 이미지 분류 네트워크 구성하기

네트워크는 다음과 같이 2개의 입력을 받아 fully connected 연산을 한 뒤 2개의 클래스로 분류하는 구조입니다. 중간에 한 번의 활성 함수가 포함되어 있습니다. 이렇게 나온 값은 softmax 함수를 거쳐 최종적으로 cross entropy loss로 오차를 계산하겠습니다. 여기서 우리는 전체 오차에 대한 첫 번째 가중치인 w11의 기울기를 구해보겠습니다.

3. Gradient 구하기

이제 전체 Loss가 줄어드는 방향으로 w11을 업데이트하는 과정을 따라가 보겠습니다.

가중치 업데이트 수식
그림2. 가중치 업데이트하기

위 수식은 w11을 Loss가 줄어드는 방향으로 업데이트하는 방법을 표현하고 있습니다. 위 그림의 파란색에 해당하는 Gradient를 구해보겠습니다. 이때 L은 위의 네트워크 구성 그림을 보면 다음과 같이 연결되어 있는 모습을 알 수 있습니다.

L이 연결된 상태
그림3. L이 연결된 상태

L은 y1으로 표현되는 함수고, y1은 h1으로 표현되는 함수며, h1은 z1의 함수고 z1은 w11로 표현되는 함수입니다. 따라서 L에 대한 gradient를 구성 요소에 따라 전부 분리하면 다음과 같이 분리할 수 있습니다.

gradient 분리하기
그림4. gradient 분리하기

이렇게 표현할 수 있는 이유는 미분의 chain rule 때문이고, 이에 대한 설명은 Chain Rule에 대한 설명을 참조 바랍니다. L의 gradient를 구성하고 있는 요소들이 의미하는 바는 다음과 같습니다.

gradient의 요소별 의미
그림5. gradient의 요소별 의미

이제 하나씩 미분해 보며 구해보겠습니다.

3-1. Fully connected 함수 gradient 구하기

Fully connected 연산의 결괏값인 z1에 대한 w11의 gradient는 다음과 같이 간단하게 구할 수 있습니다.

z의 gradient
그림6. z의 gradient

미분 결과를 보면 Fully connected 함수의 Gradient는 입력값인 x1과 같음을 알 수 있습니다.

3-2. Activation 함수 Gradient 구하기

다음은 Activation 함수의 Gradient를 구해보겠습니다. 여기서 Activation은 Sigmoid 함수를 사용했습니다. 따라서 Sigmoid 함수를 미분해 보면 되겠죠. 하지만 우리의 목표는 미분식을 구해보는 그 자체가 아닌 역전파 과정을 느껴보는 것입니다. 때문에 sigmoid 함수의 기울기가 어떤 모습으로 생겼는지만 확인하고 일단 넘어가겠습니다. Sigmoid 함수와 그 기울기의 모습은 다음과 같습니다.

sigmoid 함수와 그 기울기
그림7. sigmoid 함수와 그 기울기

이때 중요한 건 Sigmoid는 0 근처의 입력값에서 급격하게 값이 변하고 이후에는 평평한 함수라는 것입니다. 따라서 기울기는 0 근처의 입력값을 제외하고는 0에 수렴하는 모습을 볼 수 있습니다.

3-3. Softmax, Cross Entropy 함수 Gradient 구하기

이번에는 Softmax와 Cross Entropy 함수의 Gradient를 구해보겠습니다. 이 둘은 각각 구하는 것보다 한 번에 구하면 간단한 수식으로 정리됩니다.

softmax와 cross entropy의 기울기
그림8. softmax와 cross entropy의 기울기

먼저 L을 cross entropy 함수로 표현하면 다음과 같습니다.

cross entropy 함수 수식
그림9. cross entropy 함수

여기서 t는 target의 약자로, 정답을 의미합니다. (여기서는 이미지 분류 문제이므로 t값은 0 또는 1을 갖습니다.) 그리고 y를 softmax 함수로 표현하면 다음과 같습니다.

softmax 함수 수식
그림10. softmax 함수

따라서 L에 y를 대입해 전개하면 다음과 같이 정리됩니다.

L의 전개식
그림11. L의 전개식

이제 L을 h1으로 미분하면 다음과 같이 간단한 식으로 정리됩니다.

L의 h1에 대한 기울기
그림12. L의 h1에 대한 기울기

4. Backpropagation 느끼기

이제 위에서 구한 세 개의 gradient를 종합해 보겠습니다. 최종적으로 우리가 구하고자 하는 w11에 대한 Loss의 gradient는 다음과 같습니다

gradient 종합
그림13. gradient 종합

위 식에서 우리는 세 가지 교훈을 생각해 볼 수 있습니다.

4-1. 첫 번째 교훈

첫 번째 교훈은 ‘학습량’은 입력값 x1에 비례한다는 것입니다.

역전파의 첫 번째 교훈
그림14. 첫 번째 교훈

따라서 입력값이 커지면 학습량도 커지고, 입력값이 작아지면 학습량도 작아집니다.

4-2. 두 번째 교훈

두 번째 교훈은 ‘학습량’은 활성 함수의 기울기에 비례한다는 것입니다.

역전파의 두번째 교훈
그림15. 두 번째 교훈

이번 경우 활성 함수로 Sigmoid 함수를 사용했으므로, Sigmoid 함수의 기울기를 다시 한번 생각해 보겠습니다.

sigmoid 함수와 그 기울기
그림7. sigmoid 함수와 그 기울기

Sigmoid 함수는 입력값이 0 근처 일 때를 제외하고는 0에 수렴하는 기울기를 갖고 있습니다. ‘학습량’은 활성 함수의 기울기에 비례하죠. 따라서 활성 함수의 입력값이 (여기서는 fully connected 연산의 결괏값이) 0에서 벗어날수록 ‘학습량’이 0에 가까워지게 됩니다. ‘학습량’이 0에 가까워진다는 말은 학습이 진행이 안 된다는 의미입니다. 이것이 바로 활성 함수로 Sigmoid를 사용했을 때 Gradient Vanishing 현상이 발생하여 학습이 잘 안 되었던 이유입니다. 또한 2012년 AlexNet이 활성화 함수로 ReLU 함수를 사용하며 성능을 크게 향상한 원인이기도 하죠. ReLU 함수는 다음과 같이 생겼습니다.

ReLU 함수
그림16. ReLU 함수

입력값이 0보다 큰 구간에서는 기울기가 1로 일정한 모습입니다. 따라서 입력값이 0보다 클 때는 학습을 위한 정보가 잘 전파되어 학습이 잘 진행될 것으로 예상할 수 있습니다. 그럼 0보다 작은 구간에서는 sigmoid와 마찬가지로 기울기가 0이 되어 학습 정보가 소실되어 버립니다. 이를 개선할 수는 없을까요? 그래서 나온 활성 함수가 Leaky ReLU입니다.

Leaky ReLU 함수
그림17. Leaky ReLU 함수

Leaky ReLU는 입력값이 0보다 작은 구간에서도 작은 기울기를 갖도록 구성된 함수입니다.

4-3. 세 번째 교훈

세 번째 교훈은 ‘학습량’은 네트워크의 ‘정답 정도’에 비례한다는 것입니다. Softmax 함수와 cross entropy 함수가 L에 미치는 기울기는 다음과 같습니다.

역전파의 세번째 교훈
그림18. 세 번째 교훈

이 의미를 생각해 보겠습니다.

먼저 t값은 정답을 의미하므로 0 또는 1을 갖습니다. y값은 softmax 함수의 결괏값이므로 0~1 사이 값을 가지며 네트워크의 입력값에 대한 예측값에 해당합니다.
만약 정답이 1이었고 예측값도 1이었다고 생각해 보겠습니다. 그럼 기울기 값은 0이 됩니다. 또는 정답이 0이었고 예측값도 0이었다고 생각해 보겠습니다. 마찬가지로 기울기 값은 0이 됩니다.
이번엔 반대로, 정답은 0이고 예측값은 1, 또는 정답은 1이고 예측값은 0이라고 생각해 보겠습니다. 그럼 기울기 값은 1과 -1이 됩니다.
즉 예측값이 정답과 멀어질수록 그에 비례해서 기울기 값이 커지는 모습을 볼 수 있습니다. 이 말은 정답에 가깝게 맞출수록 ‘학습량’은 적고, 오답에 가까울수록 ‘학습량’이 많다고 표현할 수 있습니다.

5. 마무리

이번 글에서는 Backpropagation에 대해 살펴봤습니다. 가상의 이미지 분류 네트워크를 만들어 직접 미분하며 Backpropagation의 의미를 느낄 수 있었습니다.

Series Navigation<< Accuracy Precision Recall F1-Score AUROCChain Rule >>
5 2 votes
Article Rating
Subscribe
Notify of
guest

6 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
질문입니다
질문입니다
8 months ago

혹시 그림 11에서 2번째 줄에서 3번째 줄 넘어갈 때, 뒤에 term이 맞게 전개된 건가요??
sigma(t_i * lse) 아닌가 싶어서 여쭤봅니다

질문입니다
질문입니다
8 months ago
Reply to  Ffightingseok

그림11 3번째 줄 뒷부분 log sum exponential 말씀드렸습니다!

aaaa
aaaa
2 months ago

오차가 크면 기울기가 커지고 기울기가 커지면 학습량도 많아진다

6
0
Would love your thoughts, please comment.x
()
x
Scroll to Top