이 글은 사이토 고키의 'Deep Learning from Scratch' 중 5단원인 오차역전파법를 요약한 글입니다. 이 글에선 오차역전파에 대해 최대한 쉽게 요약하고 필요하다면 저의 부가적인 코멘트도 덧붙여 설명할 예정입니다. 다만 이 글을 읽으시기 전 신경망의 학습이 어떻게 이루어지는지(가중치, 편미분, 배치 등)를 이해하셔야 편하게 글을 읽으실 수 있습니다.
0. 오차역전파?
저는 예전부터 어떤 개념을 배울 때 그 용어의 뜻을 파헤치는 게 이해에 도움이 됐습니다. 그렇기 때문에 용어에 의미가 담겨있는 과학, 수학을 좋아했고, 영어 단어처럼 의미가 없는 것을 외우는 것은 상당히 힘들어했던 기억이 있습니다. 사설은 여기서 그만 접고, 오차역전파라의 의미를 파헤쳐보고자 합니다.
오차역전파라는 단어는 오차/역전파로 나눌 수 있습니다. 직접적으로 해석을 한다면 오차를 반대(역) 방향으로 전파한다는 의미가 됩니다. 번역을 하는 입장에서 조금 의역하자면, 더 나은 성능의 인공신경망을 만들기 위해 가중치를 수정하는 과정에서, 가중치를 어느 방향(양, 음)으로, 어느 정도 수정해야 할지 구하는 과정이라고 할 수 있습니다. 즉, 결괏값의 오차를 줄이기 위해 역으로 전파하며 가중치를 수정하는 것이 오차역전파라고 할 수 있습니다.
사실 공학적으로 인공지능에 대해 공부하고, 더 나은 성능의 모델을 만드는데 집중하시는 분들이라면 아래 나오는 추가적인 내용을 이해할 필요 없이 위의 내용만 이해해도 충분한 학습이라고 할 수 있습니다. 하지만 학문적으로 공부하시는 분들은 조금 더 공부해보도록 합시다.
1. 계산 그래프
오차역전파를 이해하는 방법에는 크게 2가지가 있습니다. 수식을 이용하는 방법과 계산 그래프를 이용하는 방법인데, 수식을 통해 이해한다면 정확하고 간결하며 일반적인 방법이라고 할 수 있습니다. 다만 대부분의 사람들에게 어려운 방식입니다. 제가 서론에서 내용을 쉽게 설명한다고 언급했듯이, 이 글에선 계산 그래프를 이용해 설명할 것입니다.
그럼 계산 그래프가 무엇인지 먼저 알아야겠지요.
위의 그림과 같은 그래프를 계산 그래프라고 합니다. 어느 날, 엄마가 마트에 가서 사과 2개, 귤 3개를 사 오라고 했다고 가정합시다. 마트에서는 사과를 개당 100원에, 귤은 개당 150에 팔고 있고, 최종 금액에 10%의 소비세가 붙는다고 합니다. 이때, 당신은 엄마에게 얼마를 달라고 해야 할까요? 정규 교육과정을 무사히 마치신 분이라면 암산으로도 쉽게 해결 가능한 수준의 문제입니다. 이 문제를 계산 그래프로 표현하고자 하면 위의 그림과 같은 형태가 됩니다. 각 노드(원)에 있는 기호는 그 노드에서 수행하는 연산의 종류를 의미하고 노드의 왼쪽에서 들어오는 값은 피연산자, 노드의 오른쪽으로 나가는 값은 연산 결과의 값입니다. 전체적으로는 왼쪽에서 오른쪽으로 진행되며 총금액의 값을 구해내는 과정으로 수행됩니다. 이렇게 왼쪽에서 오른쪽으로 수행되는 과정을 순전파라고 합니다. 그렇다면 오른쪽에서 왼쪽으로 수행되는 과정은 역전파라는 것을 추론할 수 있겠네요.
왜 굳이 이런 계산 그래프라는 새로운 개념을 도입해서 문제를 해결하는 것일까요? 계산 그래프에는 장점이 몇 가지 있습니다. 그 장점 중 하나인 국소적 계산이란, 전체 과정에서 어떠한 일이 벌어지든, 각 노드에서는 자신과 관계된 정보, 즉 자신에게 들어온 입력과 나에게 들어온 입력을 어떻게 처리해야 하는지만 집중한다는 것입니다. 위의 계산 그래프에서도 보이듯이 곱셈을 하는 과정에서 앞의 과정에 무엇이 있고, 뒤의 과정에 무엇이 있던지 해당 노드에서는 주어진 입력(650, 1.1)을 가지고 주어진 처리(곱셈)를 하기만 하면 됩니다. 또한 계산 그래프에서는 각 과정에서의 결괏값을 저장할 수 있습니다. 그중에서도 가장 큰 장점은 역전파를 통해 미분을 효율적으로 계산할 수 있는 점에 있습니다.
만약 사과의 금액이 x원 증가했을 때, 최종 금액이 얼마나 증가할지 구해본다고 합시다. 그렇다면 각 노드에서의 국소적 미분을 전달해 최종적인 미분 값을 구합니다. 결국 사과 값이 x원 증가했다면 최종 금액은 2.2x원 증가한다는 것을 알 수 있습니다. 사과의 금액 변동에 대한 최종 금액뿐만 아니라 사과의 개수, 소비세의 경우에서도 역전파를 통해 각 변수와 최종값 사이의 미분을 알아낼 수 있습니다.
그렇다면, 각 노드의 역전파에서 전달되는 값은 어떻게 정해질까요? 기본적으로 들어왔던 신호 E에 x에 대한 y의 국소적 미분값을 곱해 전달합니다. 여기서 국소적 미분이란 순전파 때의 y = f(x) 에 대한 미분을 말합니다. 자 그럼 이 개념을 가지고 다음 단계로 넘어가 봅시다.
2. 연쇄법칙
연쇄법칙이란 '합성 함수의 미분은 함성 함수를 구성하는 각 함수의 미분의 곱으로 나타낼 수 있다.'입니다. 이 말만 들으면 이해가 안되는게 당연합니다. 아래와 같은 식이 있다고 합시다.
위의 z에 관한 식을 아래와 같이 나눌 수 있습니다. 이렇게 두 개 이상의 식으로 구성된 함수를 함성 함수라고 합니다.
이제 이 합성함수의 미분을 구해봅시다.
x에 관한 z의 미분은 t에 관한 z의 미분과 x에 관한 t의 미분으로 나눌 수 있고, t애 관한 z의 미분과 x에 관한 t의 미분은 쉽게 구할 수 있습니다. 따라서 x에 관한 z의 미분이 구해지는 것입니다. 이렇게 합성함수의 미분을 합성 함수를 구성하는 각 함수의 미분의 곱으로 표현하는 것을 연쇄 법칙이라고 합니다.
위의 합성함수를 계산 그래프로 표현하면 위와 같습니다. 결국 계산그래프의 역전파가 하는 일은 연쇄법칙과 같이 각 노드에서의 미분값을 곱해 다음으로 넘겨주는 것입니다.
3. 역전파
지금까지의 내용을 잘 이해했다고 하더라도 아직 역전파에 대해 조금 뜬구름 잡는 느낌이실 수 있습니다. 저도 책에서 해당 부분까지의 내용을 읽었을 때 마찬가지였구요. 그래서 제가 조금더 역전파에 대해 직접적으로 이해할 수 있도록 하나의 예시를 준비했습니다.
위와 같은 인공신경망이 있다고 합시다. 이 인공신경망이 저희가 지금까지 보았던 계산 그래프와 다른 점이 무엇일까요? 각 노드에서는 입력과 가중치를 곱하고, 특정 활성화 함수를 이용한다는 것까지 모두 계산 그래프로 표현 가능할 것입니다. 따라서 정답과 예상값의 차이가 발생할 때, 우리는 그 차이(손실함수)를 줄이려 할 것이고 오차역전파에 의해 각 과정에서 가중치를 어느 방향으로, 어느 정도 조정해야 할 지 차례로 알 수 있는 것입니다. 각 곱셈과 활성화 함수의 미분이 무엇인지 하나하나 설명하지 않아도 이 예시를 이해하는 데에는 문제 없을 것이라 생각합니다.
지금까지 오차역전파에 대해 알아보았습니다. 제 글이 여러분들의 실력 향상에 도움이 되었길 바랍니다. 혹시 잘못된 내용이 있다면 댓글로 수정해주시면 감사하겠습니다.
'Machine Learning' 카테고리의 다른 글
[Deep Learning from Scratch] 8. 딥러닝 (0) | 2020.01.09 |
---|---|
[Deep Learning from Scratch] 6장. 학습 관련 기술들 (0) | 2020.01.08 |
[Deep Learning from Scratch] 4장. 신경망 학습 (0) | 2020.01.08 |
[Deep Learning from Scratch] 3장. 신경망 - 구현 (0) | 2020.01.08 |
[Deep Learning from Scratch] 3장. 신경망 - 이론 (0) | 2020.01.08 |