2024. 3. 10. 15:31ㆍ딥러닝 모델: 파이토치
인공신경망이 순전파 과정을 진행하여 예측값과 실제값의 오차를 계산했을 때 어떻게 역전파 과정에서 경사하강법을 사용하여 가중치를 업데이트하는지 직접 계산을 통해 이해해보자.
♣ 인공신경망의 이해(Neural Network Overview)
역전파 이해를 위해 입력층, 은닉층, 출력층 이렇게 3개 층을 가지는 인공신경망을 사용한다.
또한 두 개의 입력과 두 개의 은닉층 뉴런, 두 개의 출력층 뉴런을 사용한다.
은닉층과 출력층의 모든 뉴런은 시그모이드 함수를 활성화 함수로 사용한다.
은닉층과 출력층의 모든 뉴런에서 변수 z가 존재하는데, 이는 이전층의 모든 입력이 각각의 가중치와 곱해진 값들이 모두 더해진 가중합을 의미한다. 이 값은 뉴런에서 아직 시그모이드 함수를 거치지 않은 상태로, 활성화 함수의 입력을 의미한다. z의 우측 | 를 지나서 존재하는 변수 h 또는 o는 z가 시그모이드 함수를 지난 후의 값으로, 각 뉴런의 출력값을 의미한다. 해당 인공신경망은 편향 b는 고려하지 않는다.
♣ 순전파(Forward Propagation)
주어진 값이 위의 그림과 같을 때 순전파를 진행해보자. 소수점 앞의 0은 생략하였다.
파란 숫자는 입력값을 의미하며, 빨간 숫자는 가중치의 값을 의미한다.
각 입력은 입력층에서 은닉층 방향으로 향하면서 각 입력에 해당하는 가중치와 곱해지고, 결과적으로 가중합으로 계산되어 은닉층 뉴런의 시그모이드 함수의 입력값이 된다.
z1과 z2는 각각의 은닉층 뉴런에서 시그모이드 함수를 지나게 되는데, 시그모이드 함수가 리턴하는 결과값은 은닉층 뉴런의 최종 출력값이다. 위의 그림에서는 h1과 h2에 해당한다.
h1과 h2은 다시 출력층의 뉴런으로 향하게 되는데 이때 다시 각각의 값에 해당되는 가중치와 곱해시고, 다시 가중합되어 출력층 뉴런의 시그모이드 함수의 입력값이 된다. 위 그림에서는 각각 z3와 z4에 해당한다.
z3와 z4가 출력층 뉴런에서 시그모이드 함수를 지난 값은 인공신경망이 최종적으로 계산한 출력값이다. 실제값을 예측하기 위한 값으로서 예측값이라고도 부른다.
이제 예측값과 실제값의 오차를 계산하기 위해 오차 함수를 선택하자. 오차(error)를 계산하기 위한 손실함수(Loss function)로는 평균제곱오차 MSE를 사용한다. 실제값을 target, 순전파를 통해서 나온 예측값을 output으로 표현했다.
각 오차를 모두 더하면 전체 오차가 된다.
♣ 역전파 1단계
순전파가 입력층에서 출력층으로 향한다면, 역전파는 반대로 출력층에서 입력층 방향으로 계산하면서 가중치를 업데이트한다. 출력층 바로 이전의 은닉층을 N층이라고 했을 때, 출력층과 N층 사이의 가중치를 업데이트하는 단계를 역전파 1단계, N층과 N층의 이전층 사이의 가중치를 업데이트하는 단계를 역전파 2단계라고 해보자.
역전파 1단계에서 업데이트해야 할 가중치는 W5, 6, 7, 8 로 총 4개이다. 우선 W5에 대해 업데이트를 진행해보자.
경사하강법을 수행하려면 가중치 W5를 업데이트 하기 위해서 아래와 같은 식을 계산해야 한다.
♣ 역전파 2단계
1단계를 완료하였다면 이제 입력층 방향으로 이동하며 계산을 이어간다. 현재 인공신경망은 은닉층이 1개 밖에 없으니 이번 단계가 마지막 단계이다. 은닉층이 더 많은 경우라면 입력층 방향으로 한 단계씩 계속해서 계산해가야 한다.
이번 단계에서 계산할 가중치는 W1, W2, W3, W4이다. 원리 자체는 1단계와 동일하다.
♣ 결과 확인
업데이트된 가중치에 대해서 다시 한 번 순전파를 진행하여 오차가 감소했는지 확인한다.
기존의 전체 오차가 0.02397190이었으므로 역전파로 오차가 감소한 것을 확인할 수 있다.
인공신경망의 학습은 오차를 최소화하는 가중치를 찾는 목적으로 순전파와 역전파를 반복하는 것을 의미한다.
'딥러닝 모델: 파이토치' 카테고리의 다른 글
Pytorch로 시작하는 딥러닝 입문(06-06. 비선형 활성화 함수: Activation function) (0) | 2024.03.12 |
---|---|
Pytorch로 시작하는 딥러닝 입문(06-05. XOR: 다중 퍼셉트론 구현하기) (0) | 2024.03.11 |
Pytorch로 시작하는 딥러닝 입문(06-03. XOR 문제: 단층 퍼셉트론 구현하기 ) (0) | 2024.03.10 |
Pytorch로 시작하는 딥러닝 입문(06-02. 인공신경망: 퍼셉트론) (0) | 2024.03.08 |
Pytorch로 시작하는 딥러닝 입문(06-01. 인공신경망: 머신 러닝 용어 이해하기) (0) | 2024.03.06 |