본문 바로가기
Data Science

역전파(back propagation) 알고리즘이란? +미분 수식까지

by Lora Baek 2023. 4. 5.
300x250

한 번 더 정리하자면, 신경망이 '배운다'는 것은 오차함수를 최소화시키는 가중치와 편향을 구하는 것이다.

(이전 포스팅들과 이어집니다)

1. 딥러닝 인공 신경망과 뉴런의 구조 원리 개념 짚기

2. 경사하강법 비용함수(cost) 이해하기

 

'오차'에 관해서 학습데이터를 살펴보자.

신경망이 출력한 것과, 구하기를 원했던 것의 차이를 구해 계산한 다음(cost) 이를 수천 가지 학습 데이터에 수행하고 평균을 얻으면 우리는 신경망의 모든 오차를 구할 수 있다.

 

우리는 이 '오차 함수(cost 함수)의 음의 기울기'를 찾고자 한다. 모든 weight, bias, connections를 어떻게 변경해야 하는지를 알려주기 때문이다.

 

역전파는 그 많고 복잡한 기울기를 계산하기 위한 알고리즘이다.

기울기 벡터를 13000차원으로 생각하기 위해,

각 오차는 오차함수가 각 가중치 및 편차에 얼마나 민감한지를 나타낸다고 생각해 보자.

 

a라는 가중치에 대한 기울기는 4.3이고 b라는 가중치에 대한 기울기는 0.1이라고 하면

오차함수의 출력은 a가 b보다 43배 더 민감할 것이다.

그러니 a를 조정하는 게 b를 조정하는 것보다 43배 더 효율적일 것이다.

 

2라는 예제에 집중해 보기

현재는 무작위로 형성된 신경망이라 상태가 좋지 않다고 가정하고, 2라는 예제 하나에만 집중해 보자.

우리는 이 중에서 2라는 출력층의 값은 높이고, 나머지는 낮춰야 할 것이다.

조정의 크기는 각 값이 목표 값에서 얼마나 떨어져 있는지에 따라 다르다. 현재 2는 0.2고 8은 0.2니까 2를 활성화시키는 데 집중해야 한다.

 

1. 2로 향하는 이전 층 뉴런들의 편향 증가

2. 2로 향하는 이전 층 뉴런들의 가중치 증가

3. 2로 향하는 이전 층 뉴런들의 활성치 자체를 증가

 

이 중 가중치 조정에 초첨을 맞춰보자. 이전 층 뉴런들 중에서 가장 밝은 값이 가장 큰 영향을 미칠 것이다.

그러니 그중 하나의 가중치를 높이는 건 어두운 값의 가중치를 높이는 것보다 더 큰 영향을 미친다.

 

우리는 오차함수의 값을 줄이는 것에 관심이 있다.

가장 큰 가중치 증가, 가장 큰 연결 강화, 가장 활동적인 뉴런 -> 우리는 지금 이것들이 더 활성화되기를 바란다.

 

 

3번, 이전 층의 활성치 자체를 증가시키는 방법을 생각해 보자.

2와 연결된 뉴런들 중에서 양의 가중치와 관련된 신경은 더 밝게, 음의 가중치와 관련된 신경은 더 어둡게 만든다면 2는 더 활성화될 것이다. 

그리고 해당 가중치에의 크기에 비례하는 변경 사항을 찾으면 될 것이다.

 

물론 우리가 활성화에 직접적인 영향은 못 미치지만 우리는 가중치와 편향을 제어할 수 있음을 기억하자.

 

확장해서 생각하기

그런데 지금 살펴본 내용은 2를 활성화시키는 것뿐이고, 출력증의 다른 뉴런, 즉 다른 출력값들을 덜 활성화되도록 해야 한다.

이 마지막 은닉층에서 출력층으로 넘어가기 위한, 각각의 가중치, 얼마나 각 신경세포가 변화해야 하는지 모든 걸 기록해 둔다고 생각하자. 

이 모든 효과를 합치면 근본적으로 2번째 층에서 출력층, 반대로 첫 번째에서 두 번째, 이렇게 반대로 올라가는 것이 역전파의 아이디어다.

각 출력층의 값에 이 모든 과정(동일한 back-prop routine)을 반복하면 된다.

 

모든 훈련 데이터(13000건)에 대한 평균과 bias에 대해서 평균을 낸다는 것은,

cost 함수의 음의 기울기 혹은 그에 비례하는 어떤 것이라고 생각할 수 있다.

그런데 이 과정은 컴퓨터에서 매우 오랜 시간이 걸린다.

 

미니 배치(mini-batches)

그래서 학습 데이터를 무작위로 섞고, 이를 미니 배치로 나누어 각각 100개의 훈련 데이터를 가지고 있다고 하자.

이게 cost 함수의 정확한 값이 될 수는 없지만 괜찮은 근삿값을 제공하며, 무엇보다 굉장히 빠르다.

이 방법을 Stochastic gradient descent(확률적 경사하강법)이라고 한다.

 

역전파 back propogation 요약

요약하자면, 역전파는 하나의 알고리즘이다.

이 알고리즘의 목적은 하나의 훈련 예시가 가중치와 편향을 얼마나 조정해야 하는지, 높여야 하는지 낮춰야 하는지, 그리고 그 변화가 cost를 가장 빠르게 감소시키는지를 결정하기 위한 것이다.

원래는 수천, 수만 건의 훈련 데이터에 이 작업을 해서 평균을 계산해야 하지만, 너무 오래 걸리므로

이를 미니 배치(mini-batches)로 나누어 각각 역전파 작업을 수행한다.

각각 모든 미니 배치를 이렇게 계산(compute gradient descent step - using bakcprop)해서 나온 결괏값은 cost의 local minimum 값로 수렴하게 된다.

 

이 신경망을 구성하는 그 자체보다도 가장 주요한 건, 많은 훈련 데이터가 필요하다는 것이다.

 

역전파와 미적분학

이제 미적분학으로 다시 접근해보자.

입력층 1, 은닉층 2, 출력층 1이 존재하는 신경망에서,  각 층에 하나의 뉴런만 존재한다고 가정해보자.

어떤 값이 cost함수에 가장 영향을 많이 주는지 알아보자.

마지막 층의 활성화 정도를 a의 위첨자로 어느 층인지 L을 붙여 표현하기로 하자. a^(L)

그럼 그 전 뉴런의 활성화 정도는 a^(L-1)

마지막 활성화 정도가 y가 되기를 바란다고 가정하자.(y=1 or 0)

그러면 이 네트워크의 cost는 (a^(L)-y)^2 =C_0라고 표기하자.

 

a^(L) = w^(L)a^(L-1) + b^(L)로도 표기할 수 있을텐데, 이 수식을 시그모이드나 ReLU에 집어넣는다고 생각해보자.

이 가중합에 z^(L)같은 이름을 붙여주자.

그러면 w^(L)a^(L-1) + b^(L) 이 z^(L)을 만들고,

이 z^(L)에 함수를 씌운 것이 a^(L),

a^(L)-y에 제곱을 하면 C_0가 된다는 cost함수의 식을 이해할 수 있게 된다.

 

Chain Rule(연쇄법칙)

이 중에서  w^(L)의의 변화에 C_0가 얼마나 민감하게 반응하는지,

즉 C_0의 w^(L)에 대한 미분값이 무엇인지를 계산하는 게 우리가 원하는 것이다.

∂w^(L)은 w에 가해진 아주 작은 변화 정도로 생각하고, ∂C_0은 그 결과로 비용이 바뀌는 정도라고 생각해, 그 비율을 알고 싶은 것이다.

 

이제 한 단계씩 생각해보면, w에 z가 얼마나 민감한지, z에 a가 얼마나 민감한지, a에 c가 얼마나 민감한지.

이 세 비율을 곱해서 결국 w->z->a->c 를 거쳐 w->c, 즉 w에 c가 얼마나 민감한지를 알 수 있게 되는 것이다.

 

이제 각 함수를 미분하는데, 마지막 층에 집중해서 보면 이렇게 이해할 수 있다.

'이 가중치에 생긴 작은 변화가 마지막 층에 미치는 영향은 이전 뉴런이 얼마나 강한지에 달려있다.'

 

전체 cost 함수는 수많은 예제의 cost를 전부 평균을 낸 것이므로, 이 식들을 모든 훈련 데이터에 적용하고 평균을 내야 한다.

여기까지가 weight에 대한 계산이고,

bias에 대해서 계산하기 위해서는 w를 b로 바꾸기만 하면 된다.(b의 도함수는 1이니 미분 식이 약간은 달라질 것)

 

이제 '역으로 전파한다'는 개념이 여기 적용돼서,

cost 함수가 이전 층의 활성화 정도에 얼마나 민감한지 알 수 있다.

 

이 연쇄법칙을 거꾸로 진행해나가면서 계속 cost 함수가 이전 층의 활성화 정도에 얼마나 민감한지를 파악한다.

 

뉴런이 여러 개가 있는 신경망으로 확장하기

이제 뉴런이 여러 개가 있다고 가정한다면, 비어 있던 아래 첨자에 "몇 번째 뉴런인지"를 표시해주면 된다.

출력층의 j번째 a와 이전 층의 k번째 a를 연결해주는 가중치가 w_jk^(L)임을 기억하자.

이렇게 확장하는 경우, a_k^(L-1) 뉴런이 "비용 함수에 여러 경로를 통해 영향을 준다."

즉 cost 함수에 한 역할을 갖고 있는 a_j^(L) 뿐만 아니라 a_j+1^(L)에도 영향을 준다는 것이다.

그리고 이걸 다 더하기만 하면 끝이다.

 

cost 함수가 이 두 번째와 마지막 층 사이의 활성화 정도에 얼마나 민감한지 알게 된다면, 

그 층에 들어가는 모든 가중치와 편향에 이 과정을 반복하면 된다.

 

이런 연쇄 법칙의 표현으로 gradient의 각 구성 요소를 결정하는 도함수를 구할 수 있다.

즉 네트워크의 비용을 최소화하는데 도움을 준다.

 

댓글