Forward/Back Propagation개념에 대해 알아보자.
Neural Network는 여러 뉴런들이 하나의 레이어(Layer)를 구성하고, 여러 레이어가 모여 모델을 구성한다. 모델을 만든다는 건, 특정 입력값에 대해서 출력값을 구하는 매니커즘이 구현되어 있다는 의미이다. 예컨대, wx + b라는 간단한 선형 모델을 사용하면, x값에 대한 예측값은 wx + b 연산 결과가 되는 것이다.
(Neural Network에 대한 기본 설명은 다음의 블로그 포스트를 참고하기 바란다.)
Neural Network의 각 뉴런은 데이터를 받아서 특정 값은 반환한다. 반환된 값은 다음 Layer의 입력값으로 사용된다. 가장 마지막 레이어인 출력 레이어(Output Layer)에서 반환된 값은 최초에 입력한 X 값에 대한 예측값을 의미한다.
예컨대, 아파트 가격을 결정하는 다양한 특징들이 있다고 가정해 보자. 이를테면 아파트 위치, 가격, 학군, 초품아 여부 등이 있을 수 있다. 이를 Feature라고 부른다. 이러한 Feature들의 정보와 함께 실제 아파트의 가격에 대한 정보를 가지고, 우리는 아파트 가격을 예측하는 모델을 만들려고 한다. 그러면 초기에 들어가는 입력값(Input)은 Feature들의 값(=X)이 될 것이다. X 값은 레이어의 뉴런들에 골고루(혹은 중복해서) 들어간다. 각 뉴런은 자신이 가지고 있는 Weight 값을 가지고, 활성화 함수를 수행한다.
활성화 함수(Activation Function)는 신경망의 각 노드(또는 뉴런)에서 입력 신호의 총합을 출력 신호로 변환하는 비선형 함수이다. 활성화 함수는 신경망이 복잡한 문제를 해결하고, 비선형 문제를 학습할 수 있게 해주는 핵심 요소이다. 활성화 함수 없이는 신경망이 선형 모델과 다를 바 없게 되어, 복잡한 패턴을 모델링하는 데 제한적이다.
다시 말하면, 각 뉴런은 입력 신호를 자신의 가중치(w)와 편향(b) 값을 활용해 출력값을 반환한다. 해당 출력값이 높으면 해당 뉴런에서 중요하게 판단하는 값이 높게 평가되었다는 의미이다. 이렇게 특정 레이어에서 구해진 모든 출력값들은 그다음 레이어의 입력값이 된다. 이렇게 이전에 계산된 결과가 그다음 레이어로 전달되어 연산하는 방식을 Forward Propagation이라고 한다.
Forward Propagation(순전파)은 Neural Network에서 입력 데이터가 네트워크의 각 층을 순차적으로 거치면서 최종 출력까지 전달되는 과정을 말한다. 이 과정에서 각 층의 뉴런은 입력 데이터에 가중치를 곱하고, 편향을 더한 후 활성화 함수를 적용하여 다음 층으로의 입력값을 생성한다. 이를 통해 최종적으로 네트워크의 출력층에 도달하며, 이 출력은 문제에 따라 분류나 회귀 등의 예측으로 해석된다.
예컨대, 아래는 손글씨로 작성한 이미지를 보고, 해당 숫자를 분류하는 Neural Network 모델이다. 출력층의 뉴런 개수가 10개이고, 각 뉴런의 최종 출력값이 손글씨 사진이 0부터 9까지의 숫자와 얼마나 유사한지를 나타낸다. 만약 세 번째 출력값이 가장 크다면, 해당 모델은 이미지의 숫자가 2라고 인식한 것이다.
이러한 예측이 매번 맞는 것은 아니다. 모델을 얼마나 정교하게 학습시키느냐에 따라 제대로 분류할 확률이 늘어난다. 모델을 정교하게 학습시킨다는 의미는 수학적으로 모델이 가지고 있는 비용(J)을 최소화한다는 의미이다. 비용을 계산하는 방식은 경우에 따라 달라질 수 있지만, 평균 제곱 오차(Mean Squared Error, MSE) 방식을 사용한 수식은 다음과 같다.
이 수식에서 n은 전체 입력값의 크기를 의미한다. 즉, 모든 입력값에 대해 모델을 통한 예측값과 실제 값의 차이를 제곱하여 더한 후, 전체 크기로 나눠주는 것을 의미한다. Neural Network에서 적용한다면, 모든 초기 입력값 X에 대해서, Hidden 레이어를 지나 마지막 Output 레이어에서 나온 값(y hat)을 실제 값(y)에서 빼고, 이를 제곱하여 더한다. 그 후에 1/2n으로 나눠주면 J를 구할 수 있다. (참고로, 1/n이 아니라 1/2n으로 나눈 이유는 미분할 때 1/2가 사라지도록 하기 위함이다.)
앞서 언급했듯이, 학습의 목적은 J 값을 최소로 만드는 것이다. J 값을 줄이기 위해서는 최종 예측값(y hat)을 실제 y 값과 유사하도록 만들어야 한다. 이때 최종 예측값은 Hidden 레이어에서 연산된 값을 토대로 계산된다. 즉, Neural Network를 구성하는 모든 뉴런의 가중치와 편향이 반영되어 있다고 볼 수 있다. 따라서, 비용을 줄이기 위해서는 각 뉴런에서 사용하는 가중치와 편향을 최적화할 필요가 있다.
그러면 각 뉴런의 가중치와 편향 값은 어떻게 조정할까?
여기서 필요한 알고리즘이 바로 Back Propagation이다.
역전파(Back Propagation)는 신경망을 훈련시키는 데 사용되는 기본적인 알고리즘 중 하나이다. 이 알고리즘의 핵심 목적은 신경망의 가중치를 조정하여, 실제 출력이 목표 출력에 가능한 한 가까워지도록 하는 것이다. 역전 파는 신경망의 오류를 줄이는 방향으로 가중치를 업데이트하는 경사 하강법(Gradient Descent)을 기반으로 한다.
역전파 과정은 크게 두 단계로 나뉜다.
첫째는 신경망을 통해 입력 데이터를 전파하여 출력을 얻는 과정이다. 앞서 언급했던 Forward Propagation 방식을 사용해서 최종 예측값을 구하는 것이다. 예측값을 구하게 되면, 실제 y 값과의 오차를 계산할 수 있다.
둘째는 계산된 오차를 바탕으로 신경망을 거꾸로 거슬러 올라가며 각 층의 가중치를 조정하는 과정이다. 이 과정이 바로 역전파 과정이다. 역전파에서는 오차를 각 가중치에 대한 함수로 보고, 오차의 변화량에 대해 각 가중치의 기울기(미분값)를 계산한다. 즉, 다시 말해 특정 가중치가 변했을 때, 최종적으로 오차가 얼마나 변하는지에 대한 값을 계산한다.
가중치에 따른 오차의 변화량을 구할 수 있는 이유는 바로 미분 체인룰(Chain Rule) 덕이다.
z값을 이전 레이어의 출력값에 현재 레이어의 가중치와 편향을 적용한 값이라고 해보자.
a 값은 z로부터 나온 결과에 활성화 함수를 적용한 값이다.
그러면 다음과 같은 미분 체인룰을 적용할 수 있다.
원래 J의 값은 마지막 레이어의 a 값에 영향을 받는다. 즉, J를 a로 미분한 값은 맨 마지막 레이어에서 계산이 가능하다. 그런데, a의 값은 z의 값과 연관되어 있어, a를 z로 미분한 값을 구할 수 있다. 마지막으로 z 값은 w값으로 미분이 가능하다. 이를 연결하면, w로 미분했을 때 최종 J 값이 얼마나 변하는지를 알 수 있다.
이 미분값, 즉 기울기는 가중치를 조정해야 할 방향과 크기를 나타낸다. 만약 음수가 나온다면, w값이 증가할 때 J는 감소한다는 의미이고, 양수가 나온다면 그 반대가 된다. Neural Network는 경사 하강법(Gradient Descent)을 사용하여 모든 뉴런의 가중치를 업데이트한다. 경사하강법을 통해 각 가중치에 대한 오차를 줄여나가면, 전체적인 비용은 자연스럽게 낮아지게 된다.
이러한 과정을 지속적으로 반복하여 J가 최소가 되는 시점의 가중치와 편향을 구하고 나면, 해당 Neural Network에서 발생하는 오차는 줄어들 것이다. 새롭게 학습 데이터를 구한다면, 해당 케이스를 학습시켜 더 적합한 가중치와 편향을 구할 수도 있다.
요컨대, Neural Network는 여러 뉴런들과 레이어로 구성되어 있으며, 각 뉴런마다 가중치와 편향을 가지고 있다. Neural Network를 학습하면서 오차에 따른 비용을 최소화하는 방향으로 각 뉴런의 가중치와 편향이 업데이트된다. 출력값(최종 예측값)을 구할 때는 Forward Propagation 방식을 사용하고, 출력값을 통해 나온 오차를 가지고 뉴런의 가중치와 편향을 업데이트할 때는 Back Propagation을 사용한다.
잘못된 내용은 댓글로 남겨주시면 빠르게 정정하겠습니다. 많은 가르침 부탁드립니다.
이메일로 블로그 받아보기: https://growthminder.substack.com/subscribe