손실함수는 '예측값과 실제값의 차이를 수치화'하는 함수이다.
손실함수는 패널티로 작용되며, 손실함수가 작을수록 인공지능의 성능은 좋아진다.
따라서 모델이 학습을 하는 과정 손실함수 값을 최소화하기 위한 과정이라고도 할 수 있다.
손실함수로는 평균 제곱오차 MSE 와 교차엔트로피가 있다. (이 책에서는 교차엔트로피만 사용함)
이런 손실함수도 결국에는 '함수' 이므로 당연히 변수를 갖는다.
그렇다면 이 손실'함수'의 변수는 무엇일까?

 


손실함수의 변수

가중치와 편향이 손실함수의 변수이고, 입력 데이터는 손실함수의 계수이다.
cf. 함수에서 변수는 변할 수 있는 수이고, 계수는 변하지 않는 수이다.
ex. f(x) = ax + b 이면 a와 b는 계수, x는 변수
'입력되는 값'이라는 이미지 때문에 손실함수의 변수를 데이터로 착각하기 쉽지만,
입력된 데이터는 우리가 변화시킬 수 없으므로, 가중치와 편향을 조절하여 손실함수의 값을 줄여야 한다.
따라서 머신러닝의 과정은 가중치와 편향을 조절하여 손실함수(loss)를 줄여나가는 과정이라 할 수 있다.

ex. 라벨이 (0,0,1)일때 왼쪽 신경망에 Affine, Softmax, Loss function을 적용해보자.

Affine : (a1, a2, a3)
= (x1w11 + x2w21 + b1, x1w12 + x2w22 + b2, x1w13 + x2w23 + b3)

Softmax : exp(a1)/exp(a1)+exp(a2)+exp(a3) , exp(a2)/exp(a1)+exp(a2)+exp(a3) , exp(a3)/exp(a1)+exp(a2)+exp(a3)

Loss function (cross entropy) : -Σ(0,0,1)log(softmax 값)
= - log(exp(a3)/exp(a1)+exp(a2)+exp(a3))

 

최종 손실함수 값

위 손실함수 값이 작을수록 잘 훈련된 모델이다.
이때 데이터의 값 x는 바꿀 수 없으므로 이 신경망의 손실함수에서
가중치와 편향인 w11, w12, w13, w21, w22, w23와 b1, b2, b3가 변수임을 다시 한번 확인할 수 있다.

 


손실함수의 변수 개수

각 층에 784, 50, 10개의 유닛이 있는 신경망의 경우
w 는 이전 유닛과 이후 유닛을 모두 연결해야 하고(=이전 유닛*이후 유닛), b는 이후 유닛만큼 있으면 되므로
손실함수 변수의 개수는 총 784×50+50+50×10+10=39,760 개이다.
추후 모델을 학습시킬 때 model.summary() 의 출력 중 [ Total params : ] 부분에서 손실함수에서 사용된 변수(가중치 + 편향)의 개수를 알 수 있다.

cf. 입력 유닛이 784개인 이유 : 28*28 크기의 행렬 이미지를 784차원 벡터로 flatten 하므로

 


경사하강법(GD - gradient descent)

 

등장 배경

앞에서 말했다싶이, 머신러닝은 손실함수의 값을 최소화시키는 가중치와 편향을 구하는 과정이다.
수학에서 최소를 구할 때, 가장 일반적인 방법은 n변수 함수를 각각의 변수로 미분하여 n개의 방정식을 푸는 방법이다.
하지만 이 모델에서 우리가 구해야 하는 변수의 개수는 39,760개이므로 최소 39,760개의 미분 방정식을 풀어야 한다.
또한 이런 계산을 n번 반복해야 모델이 '학습'을 할 수 있으므로 모델을 학습시키기 위해서는 굉장히 많은 계산을 해야한다.
이는 매우 비효율적이므로, 머신러닝에서는 손실함수의 함수값이 최소값이 되게하는 변수를 구하기 위해 또 다른 방법을 사용한다.


경사하강법이란?

경사하강법을 비유하자면, 최단시간에 눈을 감고 산을 내려가는 것과 비슷하다.
눈을 감고 최단시간에 산을 내려가기 위해서는 현 위치에서 내려가는 경사가 가장 심한 쪽을 찾고,
한 바자국 이동하고, 다시 그 위치에서 경사가 가장 심한 쪽을 찾고, 이동하고,.. 하는 과정을 반복하면 된다.
이를 수학적으로 나타내보자.
앞서 우리는 방향미분 값이 최소가 되는 방향 즉, 함수값이 가장 빨리 감소하는 방향 gradient의 반대 방향이라는 것을 배웠다.
따라서 변수를 gradient 반대방향으로 이동시키며 이를 계속 갱신시키면 된다.


경사하강법의 문제점 1 - 이동폭

이동 폭이 너무 크면 무질서하게 움직이고, 이동 폭이 너무 작으면 목적지까지 여러번 움직여야 한다는 문제점이 발생한다.


경사하강법의 문제점 2 - 극소점, 안장점

앞서 말했듯이 경사하강법은 산을 '눈감고' 내려가는 것과 비슷하다.
39,760개의 변수를 갖는 함수는 39,760 차원에 그려질텐데, 우리는 이 모양을 상상할 수 없기 때문이다.
따라서 변수의 보정폭이 적은 ( = gradient가 0에 가까운 ) 부분이 최소점인지, 극소점인지, 안장점인지 알 수 없다.
그저 gradient가 작은 쪽으로 향하다보면 최소점이 아닌 다른 점에 안착할 수 있다는 문제점이 있다.


경사하강법의 문제점 3 - 시간

손실함수의 값을 구하기 위해선, 하나의 데이터를 손실함수에 대입해야 한다.
하지만 모델을 학습시킬 때는 하나의 데이터가 아닌 '데이터셋'을 입력해야 한다.
경사하강법을 그대로 적용한다면 데이터셋의 크기만큼 변수 업데이트를 실행해야 하는데, 이는 굉장히 비효율적이다.
예를들어, MNIST의 경우 데이터셋에 6만개의 테스트 데이터가 담겨있다.
한번 변수를 업데이트 할 때마다 6만개의 데이터를 다 대입해야 하는데, 미분을 통해 업데이트까지 반복해야하므로, 실행에 굉장히 오래 걸린다.
이 문제를 해결하기 위해 Stochastic Gradient Descent(SGD) 방법을 사용한다.


경사하강법의 문제점 4 - 등위면과 gradient는 수직

앞서 배운 것 처럼 gradient와 등위면(선)은 항상 수직이다.
따라서 gradient의 반대 방향으로 움직인다는 것은 곧 등위면(선)과 수직으로 움직인다는 것을 의미한다.
등위면에 수직으로 움직이게 되면 목적 지점까지 지그재그로 진동하며 움직이게 되는데 이러한 과정은 매우 비효율적이다.

 


Stochastic Gradient Descent

한번의 최적화에 전체 데이터셋을 넣는 경사하강법과 달리 SGD는 적은 양의 데이터를 나누어 입력한다. (mini batch)
전체 데이터를 입력하는게 아니므로 정확도는 떨어지지만, 한번 시행에 걸리는 시간은 줄어든다.
결과적으로, 빨라진 시간을 이용해 여러번 최적화 할 수 있으므로 더 효율적으로 오차를 줄일 수 있다.

 


Optimizer

머신러닝에서 오차가 줄어들도록 변수를 최적화하는 방법을 옵티마이저라고 한다.
'시간이 오래 걸린다'는 경사하강법의 문제를 해결하기 위해 SGD가 나온 것 처럼,
경사하강법의 원리를 바탕으로하여 훨씬 개선된 옵티마이저들이 개발되어왔다.
아래 옵티마이저들의 모든 원리를 다룰순 없지만, 모두 손실함수의 변수인 가중치와 편차를 최적화하기 위해 사용된다는 점은 기억해두자!!

1. 최적화에서의 중요한 Concepts:

최적화Optimization)란 손실 함수(Loss Function) 값을 최소화하는 파라미터를 구하는 과정

 

1-1. Generalization

- 일반화 성능

- 일반적으로 iteration 진행됨에 따라 training error는 줄어들게 됨

- training error가 줄어든다고 항상 좋은 모델은 아님

- Generalization Gap = test error - training error

 

1-2. Under-fitting, Over-fitting

- 오버피팅 : 학습데이터에서 잘 동작을 하지만 실제데이터에서 잘 동작하지 않는 경우(과적합)

- 언더피팅 : 네트워크가 너무 간단하거나 training을 너무 조금해서 학습데이터도 잘 맞추지 못하는 경우

 

1-3. Cross-validation

- 학습과 검증의 적정 비율은???

- k-fold validation

- 크로스 밸리데이션을 해서 최적의 하이퍼파라미터를 찾고  고정된 파라미터를 가지고 모든 데이터를 학습

 

1-4. Bias and Variance

- variance : 출력이 얼마나 일정하게 나오는지

- bias : 평균적으로 봤을때 true target에 가까운지

- bias and variance trade off

- bias 와 variance를 둘 다 줄이는 것은 힘듬 

 

1-5. Bootstrapping

- 원래의 데이터 셋으로부터 랜덤 샘플링을 통해 학습데이터(Training Data)를 늘리는 방법

 

1-6. Bagging vs Boosting

- Bagging : 학습데이터를 여러개 만들어서(Bootstrapping) 여러 모델을 만들고, 모델의 output을 voting

- Boosting : weak 모델들을 순차적으로 합쳐서 하나의 모델을 만드는 방법

 

2. Gradient Descent Methods

- Stochastic gradient descent

Update with the gradient computed from a single sample.

- Mini-batch gradient descent

Update with the gradient computed from a subset of data.

- Batch gradient descent

Update with the gradient computed from the whole data.

 

 Batch-size matters

- 전체 데이터를 쓰는 것은 비효율적

- 배치 사이즈가 너무 크면(512,1024) sharp minimizers에 도달, small-batch는 falt minimizers에 도달

- 배치 사이즈를 줄이게 되면 Generalization performance가 향상

 

2-1. Stochastic gradient descent

- Wt+1 Wt - ⌘gt 

- learning rate 설정하는 것이 중요함

 

2-2. Momentum

L : loss function value

W : weights

η : learning rate

α : 가속도 역할을 하는 hyper parameter 0.9등 1 이하의 값을 취함

v : 일종의 속도와 같은 개념으로 생각하는 것이 이해에 도움, v의 영향으로 인해 가중치가 감소하던(or 증가하던) 방향으로 더 많이 변화하게 되는 것. 최초의 v는 0으로 초기화 

 

2-3. Nesterov accelerated gradient

 

2-4. Adagrad

신경망 학습에서는 학습률(수식에서는 η) 값이 중요하다. 이 값이 너무 작으면 학습 시간이 너무 길어지고, 반대로 너무 크면 발산하여 학습이 제대로 이뤄지지 않음

 

이 학습률을 정하는 효과적 기술로 학습률 감소(learning rate decay)가 있다. 이는 학습을 진행하면서 학습률을 점차 줄여가는 방식이다. 학습률을 서서히 낮추는 가장 간단한 방법은 매개변수 '전체'의 학습률 값을 일괄적으로 낮추는 것이다. 이를 더욱 발전시킨 것이 AdaGrad이다. AdaGrad는 '각각의' 매개변수에 '맞춤형' 값을 만들어 준다!

AdaGrad는 개별 매개변수에 적응적으로(adaptive) 학습률을 조정하면서 학습을 진행한다. AdaGrad의 갱신 방법은 수식으로는 다음과 같다.

마찬가지로 W는 갱신할 가중치 매개변수, dL/dW는 W에 대한 손실 함수의 기울기, η는 학습률이다. 여기에서는 새로 h라는 변수가 등장한다. h는 위 식에서 보듯 기존 기울기 값을 제곱하여 계속 더해준다(동그라미 기호는 행렬의 원소별 곱셈을 의미한다). 그리고 매개변수를 갱신할 때 1/sqrt(h)를 곱해 학습률을 조정한다. 매개변수의 원소 중에서 많이 움직인(크게 갱신괸) 원소는 학습률이 낮아진다는 뜻인데, 다시 말해 학습률 감소가 매개변수의 원소마다 다르게 적용됨을 뜻한다.

 

AdaGrad는 과거의 기울기를 제곱하여 계속 더해간다. 그래서 학습을 진행할수록 갱신 강도가 약해진다. 실제로 무한히 계속 학습한다면 어느 순간 갱신량이 0이 되어 전혀 갱신되지 않게 된다. 이 문제를 개선한 기법으로서 RMSProp이라는 방법이 있다. RMSProp은 과거의 모든 기울기를 균일하게 더해가는 것이 아니라, 먼 과거의 기울기는 서서히 잊고 새로운 기울기 정보를 크게 반영한다. 이를 지수이동평균(Exponential Moving Average, EMA)라고 하여, 과거 기울기의 반영 규모를 기하급수적으로 감소시킨다.

 

2-5. Adadelta

 

2-6. RMSprop

 

2-7. Adam

 

3. Regularization

- Generalization이 잘되도록 규제를 거는 것(학습을 방해하는 것, 테스트데이터에도 잘 적용되도록)

 

3-1. Early stopping

- 학습을 조기에 종료하는 것

- loss를 보고 loss가 커지는 시점부터 종료하는 것

 

3-2. Parameter Norm Penalty

- 함수의 공간 속에서 함수를 최대한 부드러운 함수로 보기 위함

 

3-3. Data Augmentation

- More data are always welcomed

- 주어진 데이터에 변형을 가해 데이터셋의 크기를 늘리는 것(label이 바뀌지 않는 한도내에세 변형)

 

3-4. Noise Robustness

- Add random noises inputs or weights

 

3-5. Label Smoothing

- Mixup, Cutout, Cutmix

- 레이블을 깎아서(스무딩) 모델 일반화 성능을 꾀함

- 성능이 올라가는 이유는 불분명, 작동 원리 등에 대해서는 거의 밝혀진 바가 없음

 

3-6. Dropout

- in each forward pass, randomly set some neurons to zero

 

3-7 Batch Normalization

- 배치 정규화를 설명하기에 앞서서 gradient descent 방법에 대하여 한번 생각해 보도록 하겠습니다.

- 먼저 위와 같이 일반적인 gradient descent에서는 gradient를 한번 업데이트 하기 위하여 모든 학습 데이터를 사용합니다

- 즉, 학습 데이터 전부를 넣어서 gradient를 다 구하고 그 모든 gradient를 평균해서 한번에 모델 업데이트를 합니다.

- 이런 방식으로 하면 대용량의 데이터를 한번에 처리하지 못하기 때문에 데이터를 batch 단위로 나눠서 학습을 하는 방법을 사용하는 것이 일반적입니다.

 

- 그래서 사용하는 것이 stochastic gradient descent 방법입니다.

- SGD에서는 gradient를 한번 업데이트 하기 위하여 일부의 데이터만을 사용합니다. 즉, batch size 만큼만 사용하는 것이지요.

- 위 gradient descent의 식을 보면  j=Bi가 있는데 B batch의 크기가 됩니다.

- 한 번 업데이트 하는 데 B개의 데이터를 사용하였기 때문에 평균을 낼 때에도 B로 나누어 주고 있습니다.

 

  • batch normalization은 학습 과정에서 각 배치 단위 별로 데이터가 다양한 분포를 가지더라도 각 배치별로 평균과 분산을 이용해 정규화하는 것을 뜻합니다.
  • 위 그림을 보면 batch 단위나 layer에 따라서 입력 값의 분포가 모두 다르지만 정규화를 통하여 분포를 zero mean gaussian 형태로 만듭니다.
  • 그러면 평균은 0, 표준 편차는 1로 데이터의 분포를 조정할 수 있습니다.
  • 여기서 중요한 것은 Batch Normalization은 학습 단계와 추론 단계에서 조금 다르게 적용되어야 합니다.

'딥러닝 이론' 카테고리의 다른 글

Meta Learning  (0) 2022.08.22
*NAS(neural architecture search)  (0) 2022.07.28
*Transformer  (0) 2022.07.06
RNN & LSTM  (0) 2022.07.06
CNN  (0) 2022.06.30

+ Recent posts