MLOps 부트캠프 by 한경+토스뱅크/Deep Learning

딥러닝 모델 성능 높이기

나니니 2024. 9. 24. 23:16

최적화가 어려운 이유

1. 모델의 비선형성

2. 고차원성과 과적합

3. 그래디언트 소실 문제

4. 하이퍼파라미터의 민감성

하이퍼파라미터란?

하이퍼파라미터란, 모델의 학습 과정에서 사용자가 사전에 설정해야 하는 값으로 모델의 성능 최적화를 위해 중요한 역할을 한다. 

주로 딥러닝 학습 전에 설정되며, 학습 과정을 제어하는데 사용된다.

모델의 학습 속도, 안정성, 최종 성능에 직접적인 영향을 미치며 적절한 하이퍼파라미터의 설정은 과적합 방지, 학습 효율, 모델 성능 최적화에 중요한 열할을 한다. 

하이퍼파라미터의 종류

1. 배치 크기(Batch Size)

한 번의 학습 단계에 사용되는 데이터 샘플의 수이다. 이는 모델이 학습하는 데이터의 양을 결정해서 메모리 사용량과 학습 속도에 큰 영향을 미친다. 

배치 크기가 작으면, 메모리 요구 사항을 줄이고 모델의 매개변수가 더 자주 업데이트되도록 하여 빠른 학습을 가능하게 ㅎ한다. 하지만 너무 작으면 결과의 변동성이 커져 학습 과정이 불안정해질 수 있다. 

반 배치 크기가 크면 메모리 요구량을 늘리고 학습을 비교적 안정적으로 만들지만 과적합 위험을 증가시킬 수 있다.  

따라서 상황에 따른 적절한 배치 크기 조정이 필요하다. 

 

2. 학습률(Learning Rate)

모델의 가중치를 어느 정도로 업데이트 할 지를 결정한다.

역전파 과정에서 계산된 그래디언트에 학습률을 곱해 가중치를 업데이트 한다.

학습률이 너무 낮으면, 학습이 지나치게 느려질 수 있다. 

반면, 학습률이 너무 높으면 손실 함수가 최적값 주변에서 요동치거나 발산할 수 있어 최적화 과정이 실패할 수 있다. 

 

따라서 적절한 학습률을 설정해서 모델이 빠르게 수렴할 수 있도록 해야 한다. 

 

3. 에폭 수(Epoch)

전체 훈련 데이터셋이 네트워크를 통과하는 횟수이며, 에폭 수를 충분히 설정해주어야 모델이 데이터의 패턴을 잘 학습할 수 있다. 그러나 에폭 수가 너무 많으면 학습 시간이 길어지고, 과적합을 초래할 수도 있다. 

적절한 에폭 수의 설정은 모델이 학습 데이터에 과적합 되지 않으면서도 필요한 패턴을 충분히 잘 학습할 수 있도록 돕는다.

 

4. 옵티마이저(Optimizer)

최적화 알고리즘인 옵티마이저는 손실 함수를 최소화하기 위해 모델의 가중치를 어떻게 업데이트할 지 결정하는 역할을 한다. 

예를 들어, 확률적 경사 하강법(SGD) 가장 기본적인 형태라 할 수 있고 모멘텀(Momentum), 아담(Adam) 등이 있다. 

각 알고리즘은 특정 문제에 더 적합할 수 있어 여러 알고리즘을 실행하여 최적의 선택을 하는 것이 좋다. 

하이퍼파라미터를 적절히 설정하는 것은 딥러닝 모델의 성공적인 학습과 성능 최적화에 있어 매우 중요하다. 이런 파라미터들을 잘 관리하고 조정함으로써 모델은 주어진 데이터로부터 최적의 학습 효과를 얻을 수 있다. 

 

다양한 활성화 함수(Activation Function)

활성화 함수는 신경망의 각 뉴런에서 입력 신호의 총합을 받아 이를 출력 신호로 변환하는 역할을 한다. 

주로 비선형 형태로 되어 있어 신경망이 복잡한 문제를 해결하는데 기여하는데, 비선형 활성화 함수 덕분에 딥러닝은 다양한 패턴과 관계를 효과적으로 모델링 할 수 있다.

활성화 함수의 선택은 모델의 학습 능력과 성능에 직접적인 영향을 미친다. 과거부터 지금까지 여러 활성화 함수가 개발되었으며 각각의 함수는 특정 상황에서 장점을 가진다. 

시그모이드 함수

시그모이드 함수

Tanh 함수

ReLU(Rectified Linear Unit) 함수

Leaky ReLU 함수

다양한 경사 하강법

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

전체 학습 데이터셋에 대한 $Error$을 구한 후, 기울기를 한 번만 계산하여 모델의 파라미터를 업데이트 하는 방식이다. 

이 과정을 통해 모든 데이터에 대한 정보를 고려하여 가중치를 업데이트 한다. 그러나 대규모 데이터셋에서는 계산 비용이 매우 높고 빠르게 수렴하는 것이 어려울 수 있다. 

이런 비효율성 문제를 개선하기 위해 확률적 경사 하강법(Stochastic Gradient Descent, SGD)이 등장한다. 

확률적 경사 하강법(Stochastic Gradient Descent, SGD)

각 반복에서 무작위로 선택된 하나의 데이터 샘플을 사용해 기울기를 계산하고 가중치를 업데이트 한다. 

이는 전체 입력 데이터로 가중치와 편향이 업데이트 되는 것이 아닌, 일부 데이터만을 이용한다는 의미다. 

이런 방법은 기본적이지만 많은 문제에서 효과적인데, 무작위성으로 인해 지역 최솟값에서 벗어나 전역 최솟값을 찾을 가능성을 주기도 하고 계산 속도가 배치 경사 하강법에 비해 상대적으로 빠르다는 장점이 있다. 

그러나 경사의 추정이 불안정하여 학습 과정이 매끄럽지 않을 수 있다는 단점도 있다. 

미니배치 경사 하강법(Minibatch Gradient Descent)

현재 최신 딥러닝 기술에서 가장 많이 사용되는 방법으로, 배치 경사 하강법과 확률적 경사 하강법의 절충안이다. 

미니배치 경사 하강법은 전체 데이터셋을 미니 배치 라는 그룹들로 나눈 후, 각 미니 배치에 대해 독립적으로 경사를 계산해 가중치를 업데이트 하는 방식으로 전체 데이터셋이 모두 처리될 때 까지 반복된다. 

예를 들면, 1,000개의 학습 데이터셋에서 배치 사이즈를 100으로 설정하면 총 10개의 미니 배치가 나오게 된다. 100개씩의 미니 배치를 토대로 한 번씩 경사 하강법을 진행하는데, 1 에폭당 총 10번의 경사 하강법을 진행하는 것이다.

미니 배치를 사용하는 주된 장점은, 높은 메모리 효율성과 빠른 계산 속도 때문이다. 

전체 데이터를 한 번에 메모리에 로드 할 필요 없이 작은 배치만 처리하기 때문에 특히 큰 데이터 세트를 다룰 때 효과적이다. 또, 각 배치 처리가 빠르기 때문에 전체 모델 업데이트가 빠르게 이루어지며 이는 학습 과정을 가속화한다. 

미니 배치의 무작위 선택은 모델이 지역 최솟값에 갇히는 것을 방지하는 것에도 도움을 준다.

그러나 배치 크기와 학습률 등의 하이퍼파라미터에 매우 민감하다. 

너무 작은 배치 크기는 모델 업데이트 시 불안정성을 초래할 수 있고, 큰 배치 크기는 계산 효율을 떨어뜨리고 지역 최솟값에서 벗어나기 어렵게 만들 수 있다. 

따라서 적절한 배치 크기와 학습률을 설정하는 것 또한 매우 중요하다. 

 

다양한 최적화 옵티마이저(Optimizer)

최적화 알고리즘은 신경망에서 가중치를 업데이트 하는 방법을 의미한다. 

대부분의 딥러닝 프레임워크는 파이토치, 텐서플로 등의 최적화 알고리즘을 내장하고 있어 사용자는 복잡한 수식을 직접 계산할 필요 없이 간단히 호출 만으로 알고리즘을 사용할 수 있다.

 

모멘텀(Momentum)

모멘텀은 '관성'으로, 어떤 물체가 기존에 움직이던 방향으로 계속 움직이려는 경향을 의미하는 물리학 용어다. 

만약

$x$를 업데이트 해야 할 가중치, $t$를 현재 타임스텝라고 가정할 때 

$x_t$는 현재 업데이트 해야 할 가중치, $x_t-1$은 이전 스텝의 가중치가 된다. 

여기서 $x_t$를 업데이트 하기 위해서는 $x$의 이동 벡터인 $v_t$를 계산해야 하는데 이는 모멘텀이 적용된 그래디언트 벡터라고 볼 수 있다. 

 

$v_t$는 위의 우측과 같이 구할 수 있는데, 

이전 타임스텝에서의 이동 벡터 $v_t-1$과 관성 계수값 감마를 곱한 후에 학습률 에타와 $t-1$번째 $x$의 그래디언트 값의 곱을 더하면 된다. 

참고로 관성 계수는 1보다 조금 작은 0.9 정도의 값으로 설정하는 경우가 많다. 

 

Adagrad(Adaptive Gradient)

움직이는 스텝 사이즈, 즉 학습률을 조절하는 것에 초점을 맞추는 최적화 방법론들도 있는데 대표적으로 Adagrad가 있다. 

자주 업데이트 되는 매개변수의 학습률을 점차 감소시키고, 드물게 업데이트 되는 매개변수의 학습률을 상대적으로 높게 유지하여 각 매개변수가 적절한 속도로 학습되도록 돕는다. 

즉, 자주 업데이트 되는 가중치는 잦은 업데이트로 최적값에 얼추 가까워졌다고 보고 학습률을 점차 감소시켜 최적값을 잘 찾을 수 있도록 하고, 드물게 업데이트 되는 가중치의 경우 최적값을 더 적극적으로 찾을 수 있도록 학습률을 높게 유지한다. 

이런 방법은 각 매개변수가 적절한 속도로 학습되도록 돕는다. 

 $t-1$ 스텝에서의 가중치 $x_t-1$을 기반으로 현재 $t$스텝에서의 가중치 $x_t$로 업데이트 하는 상황을 가정해보자. 

이때, Adagrad는 가중치를 동적으로 업데이트 하기 위해 $g_t$라는 값을 사용하는데 이는 t번째 time step까지의 기울기를 누적한 값이다. 

이런 수식을 기반으로 학습률이 그때 그때  적절히 조정되어 더 균형있는 학습이 가능해진다. \

 

하지만 학습이 지속되며 점점 가중치 갱신량이 0이 되는 문제가 발생할 수 있는데

이를 개선하기 위해 과거의 기울기는 조금만 반영하고, 최신의 기울기를 많이 반영하는 RMSProp 이 등장했다. 

$t$번째 time step까지의 누적 기울기 $g_t$를 이용하는데, 이때 $g_t$를 계산하는 값은 Adagrad와 조금 다르다. 

여기서 감마는 지수이동평균 계수라고 하는데, Adagrad에서 가중치 업데이트가 되지 않는 문제를 보완하는 역할을 한다.

참고로 감마값이 높을 수록 과거 데이터를 더 높은 비중으로 고려하는 효과가 있다. 

아담(Adam)

Adam은 모멘텀과 학습률을 조절하는 방법을 절충하여 만든 것으로 현재 가장 흔하게 사용되는 옵티마이저이다. 

모멘텀 방식과 유사하게 이전 그래디언트의 방향과 크기를 기억하여 현재 업데이트에 사용하는데, 보다 안정적이고 일관된 업데이트를 가능하게 한다. 

또, RMSProp알고리즘과 유사한 방식으로 각 가중치에 대해 그래디언트의 변화율을 고려하여 학습률을 개별적으로 조절할 수 있도록 하는데 크게 변하는 그래디언트에 대해서는 학습률을 낮추고, 작게 변하는 그래디언트에 대해서는 상대적으로 높은 학습률을 유지하게 함으로써 학습 과정에서의 안정성을 증가시키고 더 빠르고 효율적으로 최적점에 도달할 수 도록 돕는다. 

위 수식을 살펴보면

모멘텀과 RMSProp에서 계했던 수식과 비슷하게 $v_t$와 $g_t$를 계산한다. 

$v_t$는 모멘텀에서 계산했던 t번째 step의 이동 벡터로 보통 1차 모멘텀이라고 부르고

$g_t$는 RMSProp에서 사용했던 t번째 step까지의 누적 기울기 크기로 흔히 2차 모멘텀이라고 부른다. 

베타값들은 지수이동평균계수를 나타내며 모델 학습 과정에서 학습되는 하이퍼파라미터인데 이 값들도 과거 그래디언트를 얼마나 반영할 지에 영향을 준다.  

 

다음은 아래처럼 편향을 고정하는 방법을 거친다. 

초기에는 loss의 그래디언트가 너무 작고, $v_t, g_t$값이 모두 0으로 시작하므로 초기값이 0으로 가까워지는 문제가 있을 수 있다.

이를 방지하기 위해 편향 보정 과정을 사용한다. 

 

정규화(Normalization)

정규화는 데이터의 범위를 일정하게 조정하거나 데이터 분포를 표준화하는 과정으로 모델의 학습 속도를 빠르게 하고 과적합을 방지하는 데 큰 도움이 된다. 

정규화는 입력 데이터에 대해 데이터 전처리 단계 또는 신경망의 내부 중간층에 적용된다. 

정규화를 적용하지 않은 상태에선 모델이 최적화 과정에서 전체 데이터를 잘 파악하지 못하고

지역 최저점에 갇혀 전역 최저점을 찾지 못하는 경우가 발생할 수 있다. 

이때, 정규화를 적용하면 이러한 문제를 완화할 수 있다. 

정규화의 목적

입력 데이터의 특성이 서로 다른 범위를 가지고 있을 때 이를 동일한 범위로 조정하여 모델이 학습하기 더 쉽게 만들 수 있다. 예를 들어, 모든 데이터 값을 0~1 또는 -1~1로 조정하는 Scailing을 통해 모델이 여러 특성들을 동등하게 취급할 수 있도록 할 수 있다.

더 나아가서 신경망 내부에서 중간층의 활성화 함수에 입력되는 값을 정규화함으로써 학습을 더 안정적이고 빠르게 진행되도록 할 수 있다. 특히 깊은 네트워크에서 입려그이 분포가 각 층을 지날 때마다 일정하게 유지되도록 하여 효율적인 학습을 촉진한다. 

이를 위해 배치 정규화(Batch Normalization) 기법이 주로 사용되는데, 네트워크의 각 층에서 활성화 함수가 입력 받는 값을 정규화하는 것이다. 

이 과정은 평균과 분산의 조정을 통해 이루어지며, 이 조정 과정은 신경망의 일부로써 직접적으로 학습 과정에 포함된다. 

즉, 각 배치별로 평균과 분산을 이용해 정규화를 수행하는 별도의 레이어를 신경망 내부에 배치하여

입력값에 변형된 분포가 나타나지 않도록 한다. 

이는 각 레이어를 통과하는 데이터가 일정한 통계적 특성을 유지하도록 함으로써 내부 공변량 변화를 최소화하고 전체 학습 과정을 보다 안정적으로 만든다. 

 

내부 공변량 변화(Internal Covariate Shift)

내부 공변량 변화란,

네트워크의 각 층을 통과하면서 입력 데이터의 분포가 변하는 현상을 의미하는데, 

각 층의 가중치가 학습과정에서 계속 업데이트 되기 때문에 네트워크의 초기 층에서 사용된 데이터의 분포와 나중 층에서 사용된 데이터의 분포가 달라질 수 있다. 

이런 분포의 변화는 학습을 더 어렵게 만들고, 특히 네트워크가 깊어질 수록 그 효과가 커질 수 있으므로 정규화 과정을 통해 이를 방지하고자 한다. 

 

배치 정규화 과정은 아래의 수식으로 나타나며 몇가지 단계로 이루어진다. 

먼저, 각 미니 배치에 대해 입력값의 평균과 분산을 계산하고, 

평균과 분산값을 가지고 각 입력값을 정규화한다. 

이 정규화 과정은 각 입력값을 표준화하여 평균:0, 분산:1이 되도록 저장한다. 

마지막으로 파라미터값들을 곱하고 더해서 계산하는데, 이 파라미터값들은 계산을 통해 최적의 값들을 찾게 된다. 

 

배치 정규화의 효과

  • 각 레이어를 거치며 발생할 수 있는 입력값의 변동을 효과적으로 제어
  • 결과적으로 학습 속도를 높이며 더 안정적인 학습이 가능
  • 특히 그래디언트 소실, 폭발 문제를 완화하는데 효과적
  • 과적합 방지에도 도움을 줄 수 있음

규제화(Regularization)

규제화는 과적합을 방지하고, 모델의 일반화 능력을 향상시키는데 중요한 역할을 한다. 

과적합은 모델이 훈련 데이터에 너무 잘 맞춰저서 새로운 데이터 또는 테스트 데이터에 대한 성능이 저하되는 현상을 의미한다. 

이로 인해 훈련 데이터에는 매우 높은 성능을 보이나 테스트 데이터나 실제 상황에서는 성능이 크게 떨어질 수 있다. 

이러한 문제를 해결하기 위해 다양한 Regularization기법을 통해 모델이 훈련 데이터에 과도하게 의존하지 않도록 돕고 보다 일반적인 패턴을 학습할 수 있게 만들 수 있다. 

규제화 방법 종류

L1 정규화(Lasso)

L1 정규화(Lasso)

L2 정규화 (Ridge)

L2 정규화(Ridge)

 

드롭아웃(Dropout)

Dropout

예를 들어, Dropout 비율을 0.5로 설정했다면 랜덤으로 전체 뉴런 중, 반을 제외시키게 된다. 

조기 종료(Early Stopping)

모델이 불필요하게 오래 훈련되어 과적합이 발생하는 것을 막아주는 효과가 있다. 

딥러닝 모델을 학습시키다 보면 일정 시간이 지나면 검증 세트에 대한 손실값이 오히려 증가하는 양상을 보이는 경우가 많다. 이에 성능이 더 이상 개선되지 않는 것으로 보이면 학습을 중간에 멈추어 과적합을 방지한다. 

데이터 증강(Data Augmentation)

이미지 데이터에 효과적인 기법으로, 원본 데이터에 여러가지 변형을 가해 데이터의 양을 인위적으로 늘리는 방법이다. 

이는 모델이 다양한 변형을 경험하게 함으로써 일반화 능력을 강화시키는데, 특히 이미지 데이터에서 널리 사용되며 회전, 이동, 확대, 축소 등의 변형을 적용하여 모델의 일반화 능력을 향상시킨다. 

데이터 증강 기법 알아보기

실제로 모델을 학습시키려고 할 때 충분한 데이터를 수집하기 어려울 때가 많다. 이때 데이터 증강을 통해 제한된 데이터만으로도 다양한 훈련 샘플을 생성하여 학습의 효율을 높일 수 있다. 

데이터 불균형 문제 해결

일부 클래스에 대한 데이터가 부족하다면 해당 클래스의 데이터를 인위적으로 늘려 모델이 모든 클래스를 공평하게 학습할 수 있도록 돕는다. 

실제 환경의 변화를 반영하여 모델을 더욱 견고하게 만들수 있다. 예를 들어 빛의 변화나 노이즈 같은 요소들을 의도적으로 데이터에 추가함으로써 모델이 다양한 상황에서도 일관된 성능을 보일 수 있도록 한다. 

궁극적으로 데이터 증강은 훈련 데이터의 다양성을 늘려 모델이 주요 특징을 학습하도록 유도하고, 과적합의 위험을 줄인다. 

 

데이터 증강 기법

이미지 회전 (Image Rotation)은 이미지를 다양한 각도로 회전시켜 새로운 데이터를 생성한다. 이를 통해 모델이 회전된 객체도 정확하게 인식할 수 있도록 한다. 

이미지 확대/축소 (Image Scaling)는 이미지를 확대하거나 축소하면서 다양한 객체를 인식하도록 만든다. 

이미지 크롭 (Image Crop)은 이미지의 일부분을 잘라내어 사용하는데, 이를 통해 모델이 이미지의 일부만 보고도 객체를 정확히 인식할 수 있도록 한다. 

 

이 외에도 이미지의 밝기, 대비, 채도를 변경하여 다양한 조명 조건 하에서도 객체를 인식할 수 있도록 하며 모델이 노이즈가 있는 환경에서도 정확하게 객체를 인식할 수 있도록 이미지에 랜덤한 노이즈를 추가하기도 한다.  

위의 데이터 증강 테크닉을 종합적으로 적용한 예시는 아래와 같은데, 원본 이미지보다 다양한 이미지가 생성된 것을 확인할 수 있다. 

이렇게 준비된 데이터를 가지고 모델을 학습하여 좀 더 향상된 성능의 모델을 만들 수 있다. 

이미지 외 다른 데이터에도 데이터 증강 기법을 적용할 수 있는데, 

예를 들어 텍스트 데이터에 데이터 증강 기법을 적용한다고 하면 아래 이미지와 같이 문장에서 특정 단어를 '유의어'로 대체하여 문맥은 유지하되 변형된 버전의 문장을 여러개 만들 수 있다. 

또, 임의의 단어를 삽입하거나 삭제하는 방법도 있다.