코딩일기

[Deep Learning] 3. 역전파와 경사하강법 본문

Code/딥러닝(NL)

[Deep Learning] 3. 역전파와 경사하강법

daje 2021. 5. 3. 15:39
728x90
반응형

 

 

안녕하십니까 다제입니다. 

 

오늘은 역전파와 경사하강법에 대해서 알아보도록 하겠습니다. 

 

아래와 같이 간단하게 설명만 해주면 좋을텐데 많은 글들과 강의에서는 어렵게 말을 해놓는다. 

 

나는 정말 간단하게 이게 무엇인지 정도만 알고 코드가 어떻게 작동되는지 정도만 알고 싶은데..

 

그래서 제가 간단하게 정리를 해보았습니다. 

 


 

1. 역전파를 이해하기 위해 알아야할 개념

  -. 편미분

   * 일반적으로 해당 공식에서 $f(x) = y^3 + 5x$ 미분을 하게 되면 x, y에 대해 미분을 진행하게 된다. 

   * 그러나, 편미분에서는 x, y 중 1개에 대해서만 미분을 진행하게 된다. 

   * 그럼 x에 대해 편미분을 진행하면 y는 어떻게 될까? 상수처럼 취급되어 사라지게 된다. 

   * 예제를 통해서 알아보도록 하겠습니다. 

     1) $f(x) = y^3 + 5x$를 x에 대해 편미분을 구하세요. 5

     2) $f(x) = y^3 + 5x$를 y에 대해 편미분을 구하세요. $3y^2$

     3) $f(x) = x^2 + 5x$를 x에 대해서 편미분을 구하세요. $2x^1 + 5$

     4) $y = x^2 + 1$, $f = 3y^2$ 에 대한 함수 $f(x)$의 미분을 구하세요. $12xy$

 

  -. 체인룰(chain rule)

   * 체인 룰이라 불리는 법칙은 사실은 합성 함수 미분의 원리를 말하는 것입니다. 

   * 좀 더 쉽게 말하자면, 딥러닝에서 체인룰이란 어떤 특정 값을 계산하기 위해 연속적으로 미분을 진행하는 것입니다. 

   * 체인룰도 예제를 통해서 알아보도록 하겠습니다. 

     1) $f(x)=2z^2-z+2$, $z=y^2$, $y=2x+3$을 x에 대한 함수 f의 미분을 구하세요. $4y(4z-1)$

 

수학적인 증명은 아래 블로그에서 엄청 잘 정리되어 있기 때문에 본 글에서는 추가적으로 설명드리진 않겠습니다. 

위에 설명드린 편미분과 체인룰(chain rule)에 대해서 이해가 되셨다면 해당 글을 읽으시는데 큰 어려움은 없으실 겁니다. ( 편미분 수학적 설명 : 참조링크1, 참조링크2 )

 

 

2. 역전파(Backpropagation)는 왜 하는가?

  -. 순전파모델의 가중치는 랜덤하게 설정해주기 때문에 실제값과 예측값의 오차가 발생될 수 밖에 없는 구조를 가집니다.

  -. 오차가 있는 경우, ML(머신러닝)에서는 L1, L2를 이용하여 학습횟수를 늘려주는 방법을 사용하였습니다.

  -. 딥러닝에서도 이러한 방법으로 학습을 시키면 성능이 좋아지지 않을까? 생각하실 수 있습니다.

  -. 그러나, 딥러닝에서는 노드 수가 너무 많고→연산량이 많아지고과적합 문제도 발생될 수 있습니다. 

  -. 이에, 이러한 문제를 해결하기 위해 역전파라는 학습 방법이 나오게 되었습니다. 

 

 

3. 역전파(Backpropagation)의 정의 

  -. 정방향 학습 후 역방향으로 재학습을 시켜 랜덤하게 설정된 가중치 값들을 업데이트 해주는 방식입니다. 

 


 

이렇게 역전파를 진행을 하는데, 엄청 많은 노드를 이렇게 계산해야하기 때문에 연산량이 엄청나게 많아집니다. 

순전파에서도 이러한 문제가 있었던거 기억이 나시죠? 

 

역전파의 궁극적인 목적은 실제값과 예측값의 오차를 최소화하는 것입니다. 

우리가 앞에서 배웠던 내용 중에 이런 역할을 하는 녀석이 있었습니다. 네! 바로 경사하강법입니다. 

 

딥러닝에서는 다양한 경사하강법이 존재합니다. 

기초적인 경사하강법을 살펴보고 종류별도 특징을 살펴보고자 합니다. 

 


 

4. 경사하강법

 -. 손실값에 대한 미분값을 사용하여 최저의 손실값을 가지는 매개변수(가중치)를 찾는 방법입니다. 

 -. 즉, w,b를 움직여서 최저점에 있는 J를 찾는 과정입니다. 

 -. 그 외 경사하강법에 대한 개념적인 부분은 이전포스터를 참고해주세요 

 


 

4-1. 경사하강법의 종류 

고급 경사 하강법 개요 효과 케라스 사용법
SGD
(확률적 경사 하강법)
랜덤하게 추출한 일부 데이터를 사용해 더 빨리, 자주 업데이트를 하게 하는 것 속도 개선 keras.optimizers.SGD(lr=0.1)
Momentum
(모멘텀)
관성의 방향을 고려해 진동과 폭을 줄이는 효과 정확도
개선
keras.optimizers.SGD(lr=0.1,momentum=0.9)
NAG
(네스테로프 모멘텀)
Momentum이 이동시킬 방향으로 미리 이동해서 gradient를 계산, 불필요한 이동을 줄이는 효과 정확도
개선
keras.optimizers.SGD(lr=0.1,momentum=0.9, nesterov = True)
Adagrad
(아다그라드)
변수의 업데이트가 잦으면 학습률을 적게하여 이동 보폭을 조절하는 방법 보폭 크기 개선 keras.optimizers.Adagrad(lr=0.01, epsilon = 1e-6
RMSProp Adagrad의 보폭 민감도를 보완한 방법 보폭 크기 개선 keras.optimizers.RMSProp(lr=0.001, rho=0.9, epsilon = 1e-08, decay=0.0)
Adam
(아담)
Momentum과 RMSProp 방법을 합친 방법 정확도와 보폭 크기 개선 keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon = 1e-08, decay=0.0)

※ 표 출처 : 모두의 딥러닝

 

4-2. 실습코드

# import fashion_minst 
from tensorflow.keras.datasets import fashion_mnist

# 데이터 불러오기
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
print(X_train.shape, X_test.shape)

# 입력 데이터 x를 255로 나누는 이유는 픽셀값을 0~1의 값으로 정규화하는 작업입니다.
# 이미지가 255*255로 구성되어 있으니 255로 나누어주면 픽셀값이 당연히 정규화 되겠죠?
X_train = X_train / 255.
X_test = X_test /255.

# 모델생성
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten

# 케라스에서는 Sequential 모델은 레이어를 선형으로 연결하여 구성합니다
model = Sequential() 

# 선형으로 들어가야하기 때문에 28*28 = 784 특성 벡터로 펼쳐 변환해 Dense 층으로 들어갑니다
# input_shape를 알려주고, 선형으로 만들어주는 Flatten을 사용합니다. 
model.add(Flatten(input_shape=(28, 28))) 

# 추가적으로 Dense층을 더해줄 수 있으며, 활성화함수를 추가할 수 있다. 
# 여기서는 softmax를 사용하였는데, 다른 뉴런의 출력값과 상대적인 비교를 통해 최종 출력값이 결정된다. 
# 즉, 1,2,3이 출력이 된다면, 0.33, 0.33, 0.33이런식으로 출력이 된다는 의미있다. 
# 이에 대한 설명은 코드 하단에 추가적으로 기재해놓았으니 참고 바랍니다. 
model.add(Dense(10, activation='softmax'))

# 위에서 층을 설정해주었고, 최적화, loss_function, metrics를 설정하여 모델을 완성한다. 
model.compile(optimizer='adam'
             , loss='sparse_categorical_crossentropy'
             , metrics=['accuracy'])

# 총 7850 parameters (10 bias)
model.summary()
# 모델 학습
# epochs은 총 학습을 진행하는 횟수 : 위에 있는 코드를 10번 학습을 한다. 
model.fit(X_train, y_train, epochs=10, validation_data=(X_test,y_test))

# 테스트 데이터 예측 정확도
test_loss, test_acc = model.evaluate(X_test,  y_test, verbose=2)

 SoftMax를 사용하는 이유

 -. SoftMax는 모든 뉴런의 출력값들의 합이 1이 되게 하기 때문에 평활화 하는 효과가 있으며, 

 -. 해당 값이 나올 확률을 알 수 있기 때문에 가장 큰 값이 나오는 쪽으로 분류가 진행되는 것을 알 수 있다. 

 -. 이와 더불어 최종 출력에 어떤 영향을 주었는지도 바로 확인할 수 있는 효과가 있어서 사용한다. 

 


 

5. 참고자료


 

지금까지 역전파와 경사하강법, 그리고 역전파 실습 코드까지 살펴보았습니다. 

 

혹시 모르시거나 궁금하신 사항은 언제든 댓글 부탁드립니다. 

 

오늘도 글을 읽어주셔서 감사합니다. 

 

 

 

 

 

 

728x90
반응형
Comments