Showing

역전파(backpropagation) 본문

컴퓨터 공학, 전산학/인공지능,딥러닝

역전파(backpropagation)

RabbitCode 2024. 10. 4. 20:23

딥러닝에서 역전파는 모델을 학습시키는 데 아주 중요한 역할을 한다.

마치 학생이 시험을 보고 틀린 문제를 분석하여 다음 시험을 더 잘 보기 위해 공부하는 것처럼, 신경망도 역전파를 통해 자신의 오류를 수정하고 성능을 향상한다.

 

신경망의 학습 과정

  • 신경망의 학습 과정: 신경망은 입력 데이터를 받아 특정 값을 예측하는 모델이다. 이 과정에서 가중치라는 것이 있는데, 이 가중치 값에 따라 예측 결과가 달라진다.
  • 오차 발생: 신경망이 예측한 값과 실제 값 사이에는 오차가 발생
  • 오차 역전파: 이 오차를 줄이기 위해 신경망은 오차를 역으로 전파하며 각 가중치를 조금씩 수정한다. 즉, 오차에 가장 큰 영향을 미친 가중치를 더 많이 수정하는 방식으로 학습한다.

역전파의 과정

  1. 순전파: 입력 데이터가 신경망을 거쳐 출력 값이 생성되는 과정
  2. 오차 계산: 예측 값과 실제 값의 차이를 계산하여 오차를 구한다.
  3. 역전파: 오차를 각 층으로 역전파하며, 각 층의 가중치를 수정한다.
  4. 가중치 업데이트: 계산된 값을 이용하여 가중치를 업데이트한다.
  5. 반복: 위 과정을 여러 번 반복하며 오차를 줄여 나간다.

왜 역전파가 중요한가.

  • 신경망 학습의 핵심: 신경망이 스스로 학습하고 발전할 수 있도록 하는 핵심적인 알고리즘이다.
  • 모델 성능 향상: 역전파를 통해 모델은 더 정확한 예측을 할 수 있도록 발전한다.
  • 다양한 문제 해결: 이미지 인식, 자연어 처리, 음성 인식 등 다양한 분야에서 사용되는 딥러닝 모델의 기반이 된다.

 

1. 역전파(backpropagation)란?

역전파는 딥러닝에서 모델의 가중치를 업데이트하기 위해 기울기를 계산하는 과정이다. 딥러닝 모델은 입력 데이터에서 예측을 만들고, 그 예측이 얼마나 맞았는지 평가하는데, 이때 사용하는 것이 손실 함수이다.

역전파의 목적은 손실 함수의 값을 줄이기 위해 기울기(gradient)를 이용해 모델의 가중치(weight)를 업데이트하는 것이다.

2. 역전파의 과정

  1. 예측 단계 (순전파, forward pass):
    • 입력 데이터를 모델에 넣으면, 모델이 출력값을 만듭니다.
    • 이 출력값과 실제 값(정답) 사이의 차이를 손실(loss)이라고 한다. 이 차이를 손실 함수로 계산한다.
  2. 손실 계산:
    • 모델의 예측이 틀리면 손실 값이 커진다. 손실 함수는 예측과 실제 값 사이의 차이를 정량적으로 계산한다.
  3. 역전파 (backward pass):
    • 역전파는 모델의 출력에서 입력으로 거꾸로 이동하며, 각 가중치가 손실에 얼마나 영향을 주었는지 계산한다.
    • 이를 통해 기울기(gradient)를 구한다. 기울기는 가중치를 얼마나 조정해야 손실이 줄어들지를 알려주는 정보이다.
  4. 가중치 업데이트:
    • 역전파를 통해 계산된 기울기를 사용하여, 가중치를 업데이트한다. 이때 경사 하강법(gradient descent)이라는 알고리즘을 사용합니다.
    • 가중치를 조정하여 손실이 줄어들도록 모델을 개선한다.

3. 비유로 설명

비유로 설명해보면, 역전파는 역전파는 안개가 낀 밤에 산을 내려가는 과정이라고 생각할 수 있다.

핵심 개념 연결: 손실 함수를 산의 높이, 기울기를 경사에 비유하여 역전파의 목표와 과정을 명확히 설명할 수 있다.

  • 출발점: 우리는 산의 아무 곳에서나 시작할 수 있다. 이는 모델의 초기 가중치를 임의로 설정하는 것과 같다.
  • 목표: 산의 가장 낮은 지점(손실이 최소인 지점)을 찾는 것이 목표
  • 손실 함수: 산의 높이(손실)는 모델이 예측할 때 얼마나 틀렸는지를 나타낸다.
  • 기울기(gradient): 산의 경사(기울기)는 현재 위치에서 어느 방향으로 내려가야 손실을 줄일 수 있는지를 알려준다
  • 역전파: 이 경사를 따라 내려가면서, 가중치(모델의 파라미터)를 조정해 손실을 줄이는 것이 역전파 과정이다.
 

 

  • 탐색: 산의 경사를 따라 가장 낮은 지점을 찾기 위해 여러 방향으로 이동해야 한다. 이는 모델의 가중치를 조금씩 변경하며 손실 함수 값을 계산하는 과정과 같다.
  • 지역 최솟값: 가장 낮은 지점이라고 생각했던 곳이 실제로는 더 낮은 지점이 있는 골짜기의 한 부분일 수 있다. 이는 모델이 지역 최솟값에 빠져 전역 최솟값을 찾지 못하는 경우와 비슷하다.
  • 학습률: 한 번에 얼마나 큰 걸음으로 내려갈지를 결정하는 것이 학습률. 학습률이 너무 크면 목표 지점을 넘어설 수 있고, 너무 작으면 학습이 너무 느려질 수 있다.
  • 복잡성: 다차원 공간, 비선형성, 확률적 요소 등 역전파의 복잡성
  • 불확실성: 최적의 해를 찾는 과정에서의 불확실성
  • 탐색: 다양한 방향으로 탐색하며 최적해를 찾는 과정

손실 함수는 안개 속에서의 높이를 나타내고, 기울기는 현재 위치에서 가장 빠르게 내려갈 수 있는 방향을 알려준다. 우리는 나침반(기울기)을 이용하여 안개 속을 헤매며 가장 낮은 지점(최소 손실)을 찾아간다. 하지만 안개가 짙어서 항상 정확한 길을 찾을 수 있는 것은 아니고, 때로는 국지적인 웅덩이에 빠질 수도 있다.

 

4. PyTorch에서의 역전파

PyTorch에서는 backward() 함수를 통해 역전파를 수행하고 기울기를 자동으로 계산할 수 있다.

 

import torch

# requires_grad=True로 설정된 텐서
x = torch.tensor([2.0, 3.0], requires_grad=True)

# 연산 수행
y = x * 2   # y = [4.0, 6.0]
z = y.mean()  # z = 평균 = (4.0 + 6.0) / 2 = 5.0

# 역전파 수행 (기울기 계산)
z.backward()

# x에 대한 기울기 출력
print(x.grad)  # tensor([1., 1.])

 

  • 순전파: y = x * 2, z = y.mean()은 모델의 예측을 나타내며, 그 결과 z는 5가 된다.
  • 역전파: z.backward()를 호출하면 PyTorch는 출력(z)에서 입력(x)로 거꾸로 이동하면서, x에 대한 기울기를 계산한다.
  • 기울기 계산 결과: x.grad는 [1., 1.]입니다. 이는 x가 1씩 변할 때 손실이 1만큼 변한다는 것을 의미한다.

 

5. 핵심 요점

  • 역전파는 출력에서 입력으로 거꾸로 이동하면서 기울기를 계산하는 과정이다.
  • 기울기는 모델의 가중치가 손실에 미치는 영향을 측정하며, 이를 사용해 가중치를 업데이트해 모델을 학습시킨다.
  • PyTorch는 이 과정을 자동으로 처리해주며, 사용자는 requires_grad=True로 설정한 텐서와 backward() 함수만 사용하면 기울기를 쉽게 계산할 수 있다.
 
 

6. 경사하강법(Gradient Descent)

경사하강법은 역전파 과정의 일부로 사용되며, 역전파(backpropagation)를 통해 계산된 기울기(gradient)를 바탕으로 가중치를 업데이트하는 데 사용된다.

  1. 역전파로 기울기 계산: 역전파 과정에서 신경망의 각 가중치가 손실에 얼마나 영향을 미치는지를 계산하여 기울기(gradient)를 얻는다. 이때 기울기는 손실 함수가 최소가 되도록 가중치를 어떻게 변경해야 하는지 방향과 크기를 알려준다.
  2. 가중치 업데이트: 경사하강법은 이 기울기를 사용하여 가중치를 조정한다. 기울기의 반대 방향으로 가중치를 조금씩 이동시키는 방식으로 손실을 줄이려는 것이다.

즉, 역전파 과정에서 경사하강법을 통해 가중치를 업데이트하면서 손실을 줄이도록 학습을 진행한다.

과정 설명 예시

  • 역전파는 기울기를 계산하는 과정
  • 경사하강법은 그 계산된 기울기를 사용하여 가중치를 조정하는 최적화 과정

 

7. Tensorflow에서의 역전파

import tensorflow as tf
# 딥러닝을 구동하는 데 필요한 케라스 함수를 불러옵니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 필요한 라이브러리를 불러옵니다.
import numpy as np
import tensorflow as tf

# 실행할 때마다 같은 결과를 출력하기 위해 설정하는 부분입니다.
np.random.seed(3)
tf.random.set_seed(3)

# 준비된 수술 환자 데이터를 불러들입니다.
Data_set = np.loadtxt("ThoraricSurgery.csv", delimiter=",")

# 환자의 기록과 수술 결과를 X와 Y로 구분하여 저장합니다.
X = Data_set[:,0:17]
Y = Data_set[:,17]

# 딥러닝 구조를 결정합니다(모델을 설정하고 실행하는 부분입니다).
model = Sequential()
model.add(Dense(30, input_dim=17, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# 딥러닝을 실행합니다.
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=100, batch_size=10)

이 코드에도 역전파가 포함되어 있다.

  • Keras의 fit 함수는 모델을 학습할 때 내부적으로 역전파(backpropagation)를 수행하여 기울기(gradient)를 계산하고, 그 기울기를 바탕으로 경사하강법(여기서는 Adam 최적화 알고리즘)을 사용해 가중치를 업데이트한다.
  • model.compile에서 optimizer='adam'을 지정한 부분이 바로 최적화 과정을 의미하며, Keras가 자동으로 역전파와 경사하강법을 수행해 모델의 가중치를 조정하도록 한다.

학습 과정

  1. 순전파: model.fit(X, Y, epochs=100, batch_size=10)에서 입력 데이터 X를 통해 예측값을 계산하고, 실제값 Y와의 오차를 측정
  2. 역전파: 오차를 바탕으로 각 층의 가중치에 대한 기울기를 계산
  3. 경사하강법(Adam): 역전파에서 계산된 기울기를 사용해 가중치를 업데이트
  4. 반복: 이 과정을 지정된 에포크(epochs=100) 동안 반복

따라서, Keras의 fit 함수는 자동으로 역전파를 수행하고, 사용자는 별도로 역전파를 신경 쓸 필요 없이 fit만 호출하면 된다.