ML

딥 러닝의 학습 방법

지미닝 2024. 6. 5. 16:08

1. 손실함수(Loss function)

손실 함수는 실제값과 예측값의 차이를 수치화해주는 함수다. 오차가 클 수록 손실함수의 값은 크고 오차가 작을 수록 손실함수의 값은 작아진다.
회귀에서는 평균 제곱 오차, 분류에서는 크로스 엔트로피를 주로 손실함수로 사용한다.
손실 함수의 값을 최소화하는 두 개의 매개변수인 가중치와 편향을 찾는 것이 딥러닝의 학습 과정이므로 손실함수 선정은 매우 중요하다.

손실 함수를 정리해보도록 하자.

1) MSE(Mean Squared Error, MSE)

평균 제곱 오차는 선형회귀를 학습할 때 배웠던 손실 함수이다. 연속형 변수를 예측할 때 사용된다.

아래와 같이 compiled의 loss에 문자열 'mse'라고 기재하여 사용할 수 있다.

compile의 loss는 tf.keras.losses.Loss 인스턴스를 호출하므로 위 코드는 아래와 같이 사용할 수도 있다.

딥 러닝 자연어 처리는 대부분 분류 문제이므로 평균 제곱 오차보다는 아래의 크로스 엔트로피 함수들을 주로 사용한다.

2) 이진 크로스 엔트로피(Binary Cross-Entropy)

이항 교차 엔트로피라고도 부르는 손실함수이다. 출력층에서 시그모이드 함수를 사용하는 이진 분류를 사용한다. compile의 loss에 문자열로 'binary_crossentropy'를 기재해주면 된다. (로지스틱 회귀에서도 사용했던 손실 함수이다.)

compile의 loss는 tf.keras.losses.Loss 인스턴스를 호출하므로 위 코드는 아래와 같이 사용할 수도 있다.

3) 카테고리칼 크로스 엔트로피(Categorical Cross-Entropy)

범주형 교차 엔트로피라고도 부르는 손실 함수이다. 출력층에서 소프트맥스 함수를 사용하는 다중 클래스 분류일 경우 categorical_crossentropy를 사용한다. compile의 loss에 문자열로 'categorical_crossentropy'를 기재해주면 된다. (소프트맥스 회귀에서 사용했던 손실함수이다.)

compile의 loss는 tf.keras.losses.Loss 인스턴스를 호출하므로 위 코드는 아래와 같이 사용할 수도 있다.

만약 레이블에 대해서 윈-핫 인코딩 과정을 생략하고, 정수값을 가진 레이블에 대해서 다중 클래스 분류를 수행하고 싶다면 다음과 같이 'sparse_categorical_crossentropy' 를 사용한다.

위 코드는 아래와 같이 사용할 수도 있다.

4) 그 외에 다양한 손실 함수들

텐서 플로우 공식 문서 링크에서 다양한 손실 함수들을 확인할 수 있다.
위 compile 코드에서 optimizer = 'adam' 이라는 부분에 주목해야하는데, 이는 아담이라는 옵티마이저를 사용했다는 의미이다. 손실 함수의 선정만큼이나 옵티마이저의 선정 또한 중요하다.

2. 배치 크기(Batch Size)에 따른 경사 하강법


손실 함수 값을 줄여나가면서 학습하는 방법은 어떤 옵티마이저를 사용하느냐에 따라 달라진다. 여기서 배치(Batch) 라는 개념에 대한 이해가 필요하다.
배치는 가중치 등의 매개 변수 값을 조정하기 위해 사용하는 데이터의 양을 말한다. 전체 데이터를 가지고 매개 변수 값을 조정할 수도 있고, 정해준 양의 데이터만 가지고도 매개 변수의 값을 조정할 수 있다.

1) 배치 경사 하강법(Batch Gradient Descent)

가장 기본적인 경사 하강법이다.배치 경사 하강법은 옵티마이저 중 하나로 오차(loss)를 구할 때 전체 데이터를 고려한다. 배치 경사 하강법은 한 번의 에포크에 모든 매개변수 업데이트를 단 한 번 수행한다.

에포크: 전체 데이터에 대한 한 번의 훈련 횟수

배치 경사 하강법은 전체 데이터를 고려해서 학습하므로 한 번의 매개 변수 업데이트에 시간이 오래 걸리며 메모리를 크게 요구한다는 단점이 있다.

2) 배치 크기가 1인 확률적 경사 하강법(Stochastic Gradient Descent, SGD)

기존의 배치 경사 하강법은 전체 데이터에 대해서 계산을 하다보니 시간이 너무 오래 걸린다는 단점이 있다. 배치 크기가 1인 확률적 경사 하강법은 매개변수 값을 조정 시 전체 데이터가 아니라 랜덤으로 선택한 하나의 데이터에 대해서만 계산하는 방법이다. 더 적은 데이터를 사용하므로 더 빠르게 계산할 수 있다.

좌측은 배치 경사 하강법, 우측은 배치 크기가 1인 확률적 경사 하강법이 최적 해를 찾아가는 모습을 보여주고 있다. 확률 경사 하강법은 매개변수의 변경폭이 불안정하고, 때로는 배치 경사 하강법보다 정확도가 낮을 수도 있지만 하나의 데이터에 대해서만 메모리에 저장하면 되므로 자원이 적은 컴퓨터에서도 쉽게 사용가능하다는 장점이 있다. 케라스에서는 아래와 같이 사용한다.

3) 미니 배치 경사 하강법(Mini-Batch Gradient Descent)

전체 데이터도, 1개의 데이터도 아닐 때, 배치 크기를 지정하여 해당 데이터 개수만큼에 대해서 계산하여 매개 변수의 값을 조정하는 경사 하강법을 미니 배치 경사 하강법이라고 한다. 미니 배치 경사 하강법은 전체 데이터를 계싼하는 것보다 빠르며, SGD보다 안정적이라는 장점이 있다.
가장 많이 사용되는 경사 하강법으로, 배치 크기를 128로 지정했을 경우 아래와 같다.

배치 크기는 일반적으로 2의 n제곱에 해당하는 숫자로 선택하는 것이 보편적이다. 만약, model.fit()에서 배치 크기를 별도로 지정해주지 않을 경우에 기본값은 2의 5제곱인 수로 설정된다.

3. 옵티마이저(Optimizer)

1) 모멘텀(Momentum)

관성이라는 물리학의 법칙을 응용한 방법이다. 모멘텀 경사 하강법에 관성을 더해준다. 모멘텀은 경사 하강법에서 계산된 접선의 기울기에 한 시점 전의 접선의 기울기값을 일정한 비율만큼 반영한다. 이렇게 하면 마치 언덕에서 공이 내려올 때, 중간에 작은 웅덩이에 빠지더라도 관성의 힘으로 넘어서는 효과를 줄 수 있다.

로컬 미니멈에 도달하였을 때 글로벌 미니멈으로 잘못 인식하여 탈출하지 못하였을 상황에서 관성의 힘을 빌리면 값이 조절되면서 현재의 로컬 미니멈에서 탈출하고 글로벌 미니멈 내지는 더 낮은 로컬 미니멈으로 갈 수 있는 효과를 얻을 수 있다.

2) 아다그라드(Adagrad)

각 매개변수에 서로 다른 학습률을 적용시키는 방법이다. 이때 변화가 많은 매개변수는 학습률이 작게 설정되고 변화가 적은 매개변수는 학습률을 높게 설정시킨다.

3) 알엠에스프롭(RMSprop)

아다그라드는 학습을 계속 진행한 경우 나중에는 학습률이 지나치게 떨어진다는 단점이 있어 이를 다른 수식으로 대체하여 단점을 개선하였다.

4) 아담(Adam)

알엠에스드롭과 모멘텀 두 가지를 합친 듯한 방법으로, 방향과 학습률 두 가지를 모두 잡기 위한 방법이다.

5) 사용 방법

각 옵티마이저 인스턴스는 compile의 optimizer에서 호출한다. 예를 들어 아담(Adam)은 다음과 같은 코드를 작성한다.

하지만 다음과 같이 단순히 문자열로 'adam'으로 작성하더라도 동장한다.

이건 다른 옵티마이저도 마찬가지이다. optimizer='sgd', optimizer='rmsprop'와 같이 각 옵티마이저를 문자열로 호출할 수 있다. 케라스의 옵티마이저 사용법은 텐서플로우 문서에서도 더 상세히 알 수 있다.

4. 역전파(BackPropagation)

5. 에포크와 배치 크기와 이터레이션(Epochs and Batch size and Iteration)

기계는 실제값과 예측값의 오차로부터 옵티마이저를 통해서 가중치를 업데이트한다. 머신 러닝에서는 이 과정을 학습이라고 한다.

위 그림을 통해서 에포크와 배치 크기와 이터레이션의 차이를 알 수 있있다.

1) 에포크(Epoch)

에포크란 인공 신경망에서 전체 데이터에 대해서 순전파와 역전파가 끝난 상태를 말한다.
문제지의 모든 문제를 끝까지 다 풀고, 정답지로 채점을 하여 문제지에 대한 공부를 한 번 끝낸 상태

만약 에포크가 50이라고 하면, 전체 데이터 단위로는 총 50번 학습한다. 즉 문제지를 50번 푼 셈이다. 이 에포크 횟숙가 지나치거나 너무 적으면 앞서 배운 과적합과 과소적합이 발생할 수 있다.

2) 배치 크기(Batch size)

배치 크기는 몇 개의 데이터 단위로 매개변수를 업데이트 하는지를 말한다.
몇 개씩 문제를 풀고나서 정답지를 확인하느냐의 문제이다. 문제를 풀고 정답을 보는 순간 부족했던 점을 깨달으며 지식이 업데이트 된다고 한다. 기계는 실제값과 예측값으로부터 오차를 계산하고 옵티마이저가 매개변수를 업데이트한다. 업데이트가 시작되는 시점이 정답지/실제값을 확인하는 시점이다

문제가 2000문제라고 하면 배치크기가 200ㅇ이면 200개의 샘플 단위로 가중치를 업데이트한다.

주의할 점은 배치 크기배치의 수는 다른 개념이다. 전체 데이터가 2000개일 때 배치의 크기를 200으로 준다면 배치의 수는 10이다. 이는 에포크에서 배치 크기를 나눠준 값이기도 하다. 이때 배치의 수를 이터레이션이라고 한다.

3) 이터레이션(Iteration) 또는 스텝(Step)

이터레이션이란 한 번의 에포크를 끝내기 위해서 필요한 배치의 수를 말한다. 또는 한 번의 에포크 내에서 이루어지는 매개변수의 업데이트 횟수이기도 하다.
전체 데이터가 2000일 때 배치의 크기를 200이라고 한다면 이터레이션의 수는 총 10이다. 이는 한 번의 에포크 당 매개변수 업데이트가 10번 이루어진다는 것을 의미한다.

배치 크기가 1인 확률적 경사 하강법을 이 개념을 가지고 다시 설명하면 배치 크기가 1이므로 모든 이터레이션마다 하나의 데이터를 선택하여 경사 하강법을 수행한다. 이터레이션스탭(Step)이라고 부르기도 한다.