[Deep learning] Optimization for Training Deep Models (1)

Do ·2024년 8월 13일

Deep learning

목록 보기
4/4
post-thumbnail

이번 시리즈는 Ian Goodfellow, Yoshua Bengio와 같은 세계적인 석학들이 집필하신 Deep learning(2017, MIT)를 읽어보며, 이를 기록하고자 시작하게 되었습니다. 부족한 점이 많더라도 양해를 구합니다.

[Point]

딥러닝은 Cost function을 최소화하는 방향으로 가중치를 업데이트함으로써 학습합니다. 단순히 2차, 3차 다항식이면 미분을 통해서 최적점을 구해줄 수 있지만 딥러닝의 Cost function은 파라미터가 여러 개가 되고 고차 함수식이 되는 등 최적점을 구하기가 어려울 수 있습니다.

그럼 딥러닝 모델은 어떤 방식을 사용하여 비용함수를 최소화할까요?

이번 글이 그에 대한 답, 최적화(Optimization)입니다.

이번 글은 단 하나의 문제를 해결하기 위한 방법입니다. Deep learning에선 최적화 문제를 다음과 같이 정의합니다.

"finding the parameters θ\theta of a neural network that significantly reduce a cost function J(θJ(\theta)"'

따라서 비용함수를 최소화함으로써 모델의 최적 파라미터를 찾아주는 것이 딥러닝에서 "최적화"의 개념이고, 앞으로 다룰 방식들로 딥러닝에서 학습이 이뤄집니다.

[How Learning Differs from Pure Optimization]

그럼 학습과 최적화는 같은 것을 의미하는 걸까? 위 질문에 대한 답은 "비슷하지만 다르다."이다.

"학습"은 일반적인 최적화와 다른 차이점을 보입니다.

학습

  • 테스트셋에 대해 정의되고 다소 다루기 어려울 수 있는 성능 평가 PP에 대해 신경을 씀
  • 우리는 PP를 오직 간접적으로만 최적화 우리가 그렇게 함으로써 PP가 개선될거라고 생각하며 다른 cost function J(θ)cost \ function \ J(θ)를 감소시킴

일반적인 최적화

  • JJ를 최소화하는 것 자체가 목표
  • 딥 모델을 학습시키는 최적화 알고리즘은 머신러닝의 목적 함수의 특정 구조에 대한 몇몇 전문 지식을 포함

즉, 최적화는 보다 직접적인 방식이고, 학습은 간접적인 방식으로 관심있는 지표(최적화-Cost function, 학습-성능평가지표[ex) MSE, MAE ..])에 맞춰 성능을 개선하는 것입니다.

따라서, 딥러닝 모델에선 학습이라는 최적화를 통해 딥러닝 모델이 이뤄지는 것입니다.

[Optimization for Machine Learning]

신경망 네트워크에서 최적화를 알아보기 전, 기존의 머신러닝 모델에서는 어떤 방식으로 학습이 이뤄지는지 살펴보겠습니다.

일반적으로 비용함수는 다음과 같은 식으로 정의됩니다.

J(θ)=E(x,y)  p^dataL(f(x;θ),y)J(\theta) = E_{(x,y) \ \sim \ \hat{p}_{data}}L(f(x;\theta), y)

여기서, LL은 데이터 당 손실함수, f(x;θ)f(x;\theta)xx라는 input에 대한 output, 또한 p^data\hat{p}_{data}는 데이터의 경험적 분포이다.

만약, 지도학습이면 yy는 종속변수가 되고, 종속변수가 없는 비지도 학습인 경우는 위 식에서 yy가 제외된다.

위에서 학습 데이터셋에 대한 목적함수를 정의했다.

즉 위의 식을 통해 최적화를 해서 우리는 우리가 관심지표인 아래 식에 맞게 "학습"하는 것을 원한다. 즉 Test data와 Train data 전반에 거치는 기댓값에 대한 목적함수를 최소화하는 걸 선호한다.

해당 식을 다음과 같이 나타낸다.

J(θ)=E(x,y)  pdataL(f(x;θ),y)(equation 2)J^*(\theta) = E_{(x,y) \ \sim \ p_{data}}L(f(x;\theta), y) \quad \cdots \quad (equation \ 2)

여기서 pdatap_{data}the data generating distribution이라고 한다.

[Empirical Risk Minimization]

The goal of a machine learning algorithm is to reduce the expected generalization error given by (equation 2)

가장 쉬운 방법은 Deep learning의 위 문장처럼 equation 2를 활용하여 바로 학습 데이터셋에 대한 expected loss를 최소화하는 것이다.

이는 true distribution p(x,y)p(x,y)를 학습 데이터셋으로 정의된 경험적 분포 p^(x,y)\hat{p}(x,y)로 교체하는 것을 의미한다.

쉽게 말하면! 학습 데이터써서 예측값이랑 종속변수의 차이를 정의한 함수인 LL(ex. mse, mae)을 통해 그 평균을 최소화하여 최적화한다는 것이다.

식은 다음과 같이 정의된다.

E(x,y)  pdata[L(f(x;θ),y)]=1mi=1mL(f(x(i);θ),y(i))E_{(x,y) \ \sim \ p_{data}}[L(f(x;\theta), y)] = \frac{1}{m}\sum^m_{i=1} L(f(x^{(i)};\theta),y^{(i)})

여기서 mm은 학습 데이터의 개수이다.

평균 학습 에러를 최소화하는 것을 기반으로 하는 학습 과정을 empirical risk minimization이라고 한다. 바로 위험을 최적화하는 것이 아니라, 우리는 위험이 같이 크게 감소하길 바라면서 학습 데이터를 통한 경험적 위험을 최적화한다.

하지만 이 방식은 자주 사용되지 않는데, 아래 두 가지 단점 때문이다.

1. 과적합

훈련 데이터에서 평균 학습 에러를 최소화하는 거니깐 당연히 Test dataset에선 맞지 않을 수 있다.

2. 실현 가능성이 낮음

가장 효과적인 현대 최적화 알고리즘은 그래디언트 디센트를 기반으로 한 것이지만 많은 유용한 손실 함수들은 유용한 도함수를 가지고 있지 않다.(도함수가 0이거나 정의되지 않음)

따라서, 딥러닝 모델에서 empirical risk minimization는 사용되지 않는다.

[ Surrogate Loss Function and Early Stopping]

가끔, 우리가 신경쓰는 손실 함수는 효과적으로 최적화되지 않는다.
예를 들어, 이항 분류 문제와 같이 0-1 손실 기댓값을 정확히 최소화 하는 것은 처리하기 어렵다.

모델의 예측값과 실제 종속변수 값이 같으면 0, 다르면 1을 출력하여 정확도를 평가할 수는 있어도, 현재 가장 많이 쓰이는 Gradient-based 최적화 방식에서 어느 방향으로 가중치를 수정해야하는지 알기는 어렵기 때문이다.

이런 상황에선 대신 surrogate loss function을 최적화한다.
surrogate loss function 즉, 대체 비용함수를 사용하는 것이다.

예를 들어, correct class의 negative log-likelihood function은 0-1 손실의 대체재로 사용할 수 있다. 해당 식은 다음과 같다.

L(y)=log(y)L(y) = -log(y)

위 식은 다음과 같은 그래프를 가진다.

즉, 0의 input이 주어지면 무한대로 가고, 1의 input이 주어지면 0으로 간다.

이때 정답 Class의 확률 값만 더하기 때문에 정답 클래스의 확률값이 높으면 높을수록 0에 가까워지고 낮으면 무한대로 높아진다는 것이다.

따라서, surrogate loss function은 실제로 더 학습할 수 있게 한다.

하지만 empirical risk minimization 대신 surrogate loss function를 사용하더라도 과적합 문제가 있을 수 있다.

따라서 머신러닝 알고리즘은 보통 surrogate loss function을 최소화하지만 early stopping을 기반으로 한 수렴 기준을 만족하면 알고리즘을 멈춘다.
(early stopping 참고 글: https://velog.io/@withs-study/Deep-learning)

[Batch and Minibatch Algorithms]

머신러닝에서 최적화 알고리즘은 보통 전체 비용 함수의 일부 항들만을 사용하여 추정된 비용 함수의 기댓값을 기반으로 파라미터를 업데이트한다.

예를 들어, 최적 파라미터를 찾기 위해 통계적 방법의 식인 MLE문제로 해결하기 위해 log-likelihood 식으로 나타내면 다음과 같다.

θML=argmaxθi=1mlogpmodel(x(i),y(i);θ)\theta_{ML} = argmax_\theta \sum^m_{i=1} logp_{model}(x^{(i)}, y^{(i)} ; \theta)

이 합을 최대화 하는 것은 학습 데이터셋에 정의된 경험적 분포에 대한 기댓값을 최대로 하는 것과 같다. 이때 위 식에서 한 가지 주의할 점은 여태까지의 방식은 각 데이터 마다 적용하는 거지만 지금은 Model에 대한 것이라는 점이다. 즉, 딥러닝 모델에서 가중치를 조절하는 것을 의미한다.

J(θ)=Ex,y  p^datalogPmodel(x,y;θ)J(\theta) = E_{x,y \ \sim \ \hat{p}_{data}}logP_{model}(x, y;\theta)

최적화 알고리즘에서 사용되는 목적함수 J의 대부분의 특성은 학습 데이터셋에 대한 기댓값이다. 예를 들어, 가장 흔히 사용되는 특성은 그래디언트이다

θJ(θ)=Ex,y  p^dataθlogPmodel(x,y;θ)\nabla_\theta J(\theta) = E_{x,y \ \sim \ \hat{p}_{data}}\nabla_\theta logP_{model}(x, y;\theta)

전체 데이터셋에서 모든 데이터에 대해 모델을 평가해야하기 때문에, 이 기댓값을 정확히 계산하는 것은 매우 비싸다. 실제로, 우리는 데이터셋에서 몇 개의 데이터를 랜덤하게 샘플링하고, 이 데이터들에 대한 평균을 구함으로써 기댓값을 계산할 수 있다.

n개의 샘플에서 추정된 평균의 표준 오차가 σn\frac{\sigma}{\sqrt{n}}이므로 n이 100일 때와 10000일 때를 비교해보면, 기댓값을 계산하는 계산량은 100배 차이나지만 평균의 표본 오차는 10배 감소한다.

따라서, 대부분의 최적화 알고리즘은 실제 그래디언트를 느리게 계산하는 것보다 유사한 추정값을 빨리 계산할 때 훨씬 빨리 수렴한다.

그리고 이때 등장하는 개념이 바로 "batch"이다.

배치의 사전적 의미는 일괄적으로 처리되는 집단이라는 뜻으로, 한번에 여러개의 데이터를 묶어서 입력하는 것인데, GPU 의 병렬 연산 기능을 최대한 효율적으로 사용하기 위해 쓰는 방법이다.

배치는 Iteration 1회당 사용되는 training data set의 묶음이며, Iteration은 정해진 batch size를 사용하여 학습을 반복하는 횟수를 말한다.

이 Batch를 활용하면 GPU의 병렬연산 기능을 최대한 활용해서 학습 속도를 줄일 수 있다.

예를 들어,(1, 784) → (784, 100) → (100, 50) → (50, 10) → (10, 1)와 같이 28 x 28 픽셀의 1개의 MNIST 데이터를 학습하는 경우 위와 같은 방식으로 100개의 데이터를 학습시키려면 100번 반복해야하지만, 신경망 계산의 경우 행렬 연산이 사용되기 때문에 행렬의 크기를 늘려 (100, 784) → (784, 100) → (100, 50) → (50, 10) → (10, 100)와 같은 방식으로 계산하면 100개 데이터에 대한 출력을 한번에 얻을 수 있다.

이 batch 개념은 최적화에서 아래 알고리즘 등을 통해 사용된다.

[batch gradient descent(BGD)]

batch gradient descent는 전체 데이터 셋에 대한 에러를 구한 뒤 기울기를 한번만 계산하여 모델의 parameter를 업데이트 하는 방법을 의미한다.

이름에 들어가는 Batch때문에 혼동스러울 수도 있는데, 여기서 말하는 batch는 말 그대로 total training dataset 을 의미한다. 데이터를 분할해서 다룰 때 사용하는 'batch' 라는 단어는 엄밀히 'mini-batch'를 의미하지만 편의상 batch와 혼용해서 사용한다.

위 방법은 가중치 ww에 대해 편미분하여 gradient를 계산하는 방식이다.

BGD의 장점은 1) 전체 데이터에 대해 업데이트가 한번에 이루어지기 때문에 후술할 SGD보다 업데이트 횟수가 적다. 따라서 전체적인 계산 횟수는 적고, 2) 전체 데이터에 대해 error gradient를 계산하기 때문에 optimal로의 수렴이 안정적으로 진행되며, 3) 병렬 처리에 유리하다는 것이다.

하지만, 1) 한 스텝에 모든 학습 데이터 셋을 사용하므로 학습이 오래 걸리며 2) 전체 학습 데이터에 대한 error 를 모델의 업데이트가 이루어지기 전까지 축적해야 하므로 더 많은 메모리가 필요하다. 마지막으로 3) local optimal 상태가 되면 빠져나오기 힘들다.

따라서 학습 시간 등의 문제로 다음 알고리즘이 떠올랐다.

[Stochastic Gradient Descent, SGD]

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

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

[Mini-Batch Gradient Descent]

하지만 위의 SGD를 사용할 경우 위 그림에서처럼 매개변수의 변경 폭이 불안정하고, 정확도가 낮을 수 있다. 이에 대한 해결책으로 등장한 것이 바로 미니배치 경사하강법이다.

배치 크기를 지정하여 해당 데이터 개수만큼에 대해서 계산하여 매개 변수의 값을 조정하는 경사 하강법을 미니 배치 경사 하강법이라고 한다. 미니 배치 경사 하강법은 전체 데이터를 계산하는 것보다 빠르며, SGD보다 안정적이라는 장점이 있다.

가장 많이 사용되는 경사 하강법으로, 배치 크기는 일반적으로 2의 n제곱에 해당하는 숫자로 선택하는 것이 보편적이다.(이는 GPU의 가성비를 높이기 위한 방안 (엔비디아 GPU의 계산단위가 32))

용어들의 헷갈림을 방지하기 위해 위에서 사용되는 용어를 정리하면 다음과 같다.

배치사이즈(batch_size) : 전체 데이터셋을 쪼갠, 모델이 한 번에 처리하는 데이터 샘플의 개수. 이때, batch size는 일반적으로 2의 거듭제곱(2, 4, 8, 16, 32, ...) 등을 사용한다.
에폭(epoch) : 전체 학습 데이터셋을 모델이 한 번 학습한 것.
iteration: weight update 횟수
-> N = 10000, batch_size = 100, -> 1 epoch = 100 iterations(weight update)

하지만 위 방식들은 딥러닝 모델에서 사용하기에 여러가지 어려움이 있을 수 있다.

[Challenges in Neural Network Optimization]

위에서처럼 머신러닝은 최적화 문제를 convex하기 위한 목적 함수와 제약조건을 설계하면서 일반적인 최적화의 어려움을 피해왔다. 하지만 신경망 네트워크 학습할 때, 우리는 non-convex 문제에 직면하게 된다. 이번 단원에서는 딥 모델을 학습시킬 떄 사용하는 최적화에 포함된 여러 유명한 문제들을 살펴보려고 한다.

[Ill-Conditioning]

수치해석 분야에서 함수의 조건수(condition number)는 argument에서의 작은 변화의 비율에 대해 함수가 얼마나 변화할 수 있는지에 대한 argument measure이다.

이를 딥러닝 문제에 적용해보면, "데이터의 작은 변화에 대해 딥러닝 모델의 가중치 ww가 얼마나 크게 변하는가"에 대한 것이다. 즉, 데이터 변화에 따른 모델의 가중치 변화의 민감도를 의미하는 것이다.

이때 Ill-Conditioning은 그런 민감도 즉, 조건수가 커서 생기는 문제이다. 조그마한 데이터의 변화에도 모델의 가중치가 크게 변한다는 의미이다.

[Local minima]

다음 문제는 Local minima에 대한 것이다. 우리는 비용함수의 Global mininmum을 찾는 게 목표지만 최적화 과정에서 우리는 local minima에 갇혀버릴 수 있다.

그럼 결과적으로 모델이 완전한 최적화가 이뤄지지 않았다는 것을 의미한다.

하지만 local minima가 모두 나쁜 것은 아니다.

어떤 any local minimum은 global minimum이 보장된다. 몇몇 convex함수는 하나의 global minimum보단 바닥에서 평평한 지역을 갖는다. 이때, 평평한 지역에 속하는 어느 점이든 이용가능한 답이 된다.

즉, 신경망 및 동등하게 파라미터화된 여러 잠재 변수가 있는 모든 모델은 model identifiability으로 인해 여러 local minimum을 가진다고 한다.

잠재 변수가 있는 모델은 서로 잠재 변수를 교환하여 동등한 모델을 얻을 수 있기 때문에 무엇이 최적값인지 식별할 수 없는 경우가 많다.

하지만, local minima이 global minimum에 비해 높은 비용을 가질 때 문제가 된다.

실제로 높은 비용을 갖는 local minima가 많은지, 최적화 알고리즘이 이를 직면하는지는 아직 연구되고 있다. 수년 동안, 대부분의 연구자들은 local minima을 신경망 네트워크 최적화에서 성가신 흔한 문제로 여겨왔다.

하지만, 오늘날엔 전문가들은 이제 충분히 큰 신경망의 경우 대부분 local minimum이 낮은 비용 함수 값을 가지고, global minimum을 찾는 것이 중요하지 않다고 한다.

[Plateaus, Saddle Points and Other Flat Regions]

안장점(Saddle Points)이란 극대/극소값은 아니지만, 미분값이 0이면서도 극값을 이루지 않는 점으로, 이 점에서 한 변수 방향에서는 극대값을 이루지만, 다른 변수 방향에서는 극소값을 이룬다.

이러한 안장점 주변 몇몇 값들은 더 높은 비용을 가지지만, 다른 점들은 또 낮은 값을 갖는다. 안장점에서, 헤시안 행렬은 양수 고유값과 음수 고유값을 모두 갖는다. 양수 고유값과 관련된 고유벡터를 따라 놓여있는 점들은 안장점보다 더 큰 비용을 가지고, 반면에 음수 고유값과 관련된 고유벡터를 따라 놓여있는 점들은 더 작은 비용을 갖는다.

따라서, 우리는 안장점을 local minimum과 local maximum이 교차하는 지점으로 볼 수 있다.

이때 랜덤 함수들의 대부분의 클래스는 다음 행동을 보인다고 한다.
1) 저차원의 공간에서, local minima는 흔하다.
2) 고차원의 공간에서, local minima는 드물고 saddle point가 더 흔하다.

이때 Gradient descent 같은 1차 최적화는 saddle point를 잘 넘어가지만 뉴턴 method 같은 2차 최적화는 상대적으로 saddle에 빠질 확률이 크다. 이는 단순히 함수가 내려가는 방향으로 설계된 gradient descent와 다르게 뉴턴 method는 기울기가 0인점을 명시적으로 구하게 설계 되었기 때문이다.

그리고 이러한 이유 때문에 뉴턴 method는 잘 사용되지 않는다고 합니다.

[Cliffs and Exploding Gradients]

큰 가중치들이 반복해서 곱해지는 깊은 비선형 신경망은(특히 RNN) cost 함수 공간에 급한 비선형구간(아래 그림같은 절벽)이 존재하는 경우가 많다. 절벽에 가까워지면 gradient descent 갱신 단계에서 파라미터가 급격히 변해(gradient가 갑자기 커지므로) 이때까지의 최적화 결과가 무의미해지는 문제가 있다.

따라서 이를 해결하고자 등장한 게 gradient clipping이다.

최적화에서 구하는 gradient가 최적의 "크기"를 나타내는 것이 아니라 아주 극소량의 영역 안에서 최적의 "방향"을 나타내기 때문에 전통적인 경사 하강법 알고리즘에 update step을 조절하는 방식이다.

그래디언트 클리핑은 역전파가 될 때, 일정 임계값을 넘어서지 못하도록 기울기 값을 잘라서, 근사적으로 cliff를 한 번에 벗어날 가능성이 줄어들게 만들었다.

[Long-Term Dependencies]

계산 그래프가 극도로 깊어질 때, 발생하는 어려움 중 하나이다. 주로, 층이 많은 순방향 신경망, 순환 신경망(RNN) 등에서 나타나는 문제이다.

예를 들어, 행렬 WW를 거듭 곱하는 연산으로 이뤄진 경로가 계산 그래프에 있을 때 t번의 단계가 지나면 이는 WtW^t를 곱하는 것과 같게 된다. 이 때, WW의 고윳값 분해가 W=Vdiag(λ)V1W=Vdiag(λ)V^{−1}라고 하면 다음과 같은 식이 성립한다.

Wt=(Vdiad(λ)V1)t=Vdiag(λ)tV1W^t = (Vdiad(\lambda)V^{-1})^t = Vdiag(\lambda)^tV^{-1}

위 식에 따르면, 크기가 1과 가깝지 않은 임의의 고윳값 λi\lambda_i는, 1보다 크면 발산하고, 1보다 작으면 소실한다.

이 문제를 vanishing and exploding gradient problem라 한다.

기울기 소실 문제가 발생하면, 비용함수를 개선하기 위해 파라미터가 움직여야할 방향을 알기가 어려워지고, 기울기 폭발이 발생하면 학습이 불안정해진다. (앞서 나온 cliff도 기울기 폭발 현상의 한 예)

[Inexact Gradients]

대부분의 최적화 알고리즘은 우리가 정확한 그래디언트나 헤시안 행렬에 접근할 수 있다는 가정을 두고 설계된다. 하지만 실제 응용에선 거의 모든 심층 학습 알고리즘은 미니 배치를 이용해서 기울기를 계산하는 형태이기 때문에 이들이 잡음 섞인 근삿값 또는 편향된 추정량으로만 주어질 때가 많다.

[Poor Correspondence between Local and Global Structure]

지금까지 살펴본 문제점은 주어진 한 점에서 손실함수가 갖는 불리한 특성들(cliff, saddle point ..)에서 기반한 것이었다.

하지만 이런 문제 외에도 훈련 시간 내지 비용이 많이 걸린다는 문제도 있다.

위 그림을 보면 파란색 선의 대부분이 산 모양의 구조를 멀리 돌아가고 있다는 것을 알 수 있다. 즉, 훈련에 걸리는 시간의 대부분이 solution에 도달하는 데 필요한 궤적의 길이가 길기 때문에 불필요한 훈련 비용이 많아질 수 있다.

[Theoretical Limits of Optimization]

연구에 따르면, 신경망 학습을 위해 설계할 수 있는 모든 최적화 알고리즘의 성능에는 일정한 한계가 존재한다고 한다.

하지만 이러한 한계가 신경망의 실제 응용에서 미치는 영향은 미비하다.

1) 일부 이론적 결과들은 신경망의 unit이 이산 값들을 출력할 때만 적용됨.
=> 하지만 대부분의 신경망 unit은 연속 값을 출력. local search을 통한 최적화 가능
2) 처리 불가능한 종류의 문제들이 존재한다는 이론적 결과도 있음.
=> 구체적인 문제가 이 부류에 해당하는지 판정하기는 어려움
3) 주어진 크기의 신경망에 대한 해를 찾는게 처리 불가능하다는 연구 결과도 있음.
=> 하지만 실제에선 더 큰 신경망을 이용해 쉽게 해를 구할 수 있음.
=> 학습에서 필요한건 정확한 최적의 해가 아니라 일반화 오차가 좋아지기만 하면 됨.

여기까지 일반적인 기초적인 최적화 알고리즘 및 신경망 모델 최적화의 문제점을 알아보았다. 이어서는 위 문제들을 해결하기 위해 등장한 최적화 알고리즘에 대해 다뤄보도록 하겠다.

profile
공부하는 사람

0개의 댓글