티스토리 뷰

CNN에서 Network Training을 할 때 사용되는 option에 대해 알아보자

 

 

일단 대략적인 순서는 다음과 같다

 

1. 학습 데이터를 Train Set, Test Set, Validation Set 세 가지로 나눈다

 

Training Data - 가중치 학습에 사용되는 데이터

Validation Data - "학습 중" 성능 평가에 사용되는 데이터

Test Data - "학습 모두 끝난 후" 성능 평가에 사용되는 데이터

 

[trainData, valData, testData] = splitEachLabel(DataSet, 0.8, 0.1, 0.1);

 

 

2. option 설정

 

2-1) 알고리즘

 

* 대부분의 알고리즘은 "★경사 하강법"을 기반으로 한다

- Loss Function에서 제일 최소점을 향해 내려가는 것을 목표로 한다.

- 기울기가 낮아지는 쪽으로만 계속 이동하다 보면 언젠가는 최소점에 도달하게 되는 원리를 이용.

- Learning Rate(=Step Size)에 따라 수렴할 수도, 발산할 수도 있다.

+) 경사 하강법은 일반적으로 편미분 수식을 이용한다. 

+) 최소점인줄 알았던 점이 최소점이 최소점이 아닐 수 있다 (극소점 != 최소점)

- Convex 함수(아래로 볼록한 함수)만이 극소점이 최소점임을 보장해줄 수 있다

sgdm(Stochastic Gradient Descent with Momentum)

- 경사 하강법인데 거기에 Momentum을 곁들인.

- Momentum - 관성. => 이동 방향을 스텝마다 훅훅 바꾸지 말고 살짝씩 바꾸자.

- Stochastic - 확률 => 시작 지점이 랜덤이다

 

rmsprop

- 이전 히스토리를 봐가면서 내려가자

 

adam

- rmsprop과 momentum을 둘 다 섞어쓰자

 

https://www.slideshare.net/yongho/ss-79607172

2-2) InitialLearnRate

 

경사하강법에서 사용되는 내용인데 한번 내려갈 때 스텝 사이즈를 조정하는 옵션이다.

 

 

2-3) MiniBatchSize, Epoch

 

Epoch란, 전체 데이터셋을 한 사이클 돌면서 학습을 진행했다는 뜻이다.

Epoch가 100이라는 뜻은 전체 데이터셋을 100번 돌면서 학습했다는 뜻.

 

MiniBatch란 전체 데이터 셋을 n등분으로 쪼갠 부분 데이터 셋이다.

이 부분 데이터셋 하나 하나가 전체 데이터 셋을 대표한다고 가정하고 각각 가중치를 학습한다.

 

예를 들어서 전체 데이터의 개수가 1000개이고, MiniBatchSize가 100이라면,

Epoch 한 사이클 당 10번의 학습이 이루어지게 된다.

 

+) 왜 MiniBatch를 사용하는가? 

- 전체 데이터를 모두 고려해서 한번 학습하는건 성능은 확실할지 몰라도 시간이 오래걸린다

- 부분 데이터를 가지고 학습하는건 시간이 빠르다

 

+) Epoch 값을 크게 하여 수백번 수천번 학습시킬수록 더 좋은 네트워크인가? - (X)

- 오히려 과적합 문제로 Loss율이 더 증가할 수 있다

- 적절한 수준에서 끊어주는 것이 좋다

 

+) MiniBatch 사이즈는 학습 성능에 큰 영향을 끼친다. 

너무 크면 -> 데이터셋의 제로패딩 크기가 너무 커진다(이후 RNN&LSTM 내용과 관련) / 메모리 크기 초과 등..

너무 작으면 -> 학습의 Iteration마다 성능이 들쑥날쑥해지면서 학습성능이 저하된다

 

--> Data Preprocessing으로도 제로패딩 줄이기 등 성능향상이 가능하므로 MiniBatch 사이즈 조절은 신중하는 것이 좋다.

 

2-4) Validation 관련 

 

ValidationData: validationData 지정

ValidationFrequency: Epoch n번 주기로 validation 셋으로 모델을 평가한다

 

 

이걸 다 섞어서 코드로 표현하면 다음과 같다

options = trainingOptions("sgdm", "MaxEpochs", 50, "MiniBatchSize", 128,...
    "InitialLearnRate", 0.0001, "ValidationData", valData,...
    "ValidationFrequency", 10, "Plots", "training-progress");

 

이제 옆에 써져있는 말들이 이해가 된다.

 

Epoch: 50회  -> 전체 데이터셋을 50 사이클 돌았다

Epoch당 반복 횟수 -> MiniBatch(부분 데이터셋)이 23개 있어서 한 Epoch 사이클을 돌 때 23번 학습한다

검증 빈도 -> Epoch 10 사이클마다 validationData로 네트워크 성능을 평가한다

- 과적합(Overfit) 문제와 관련.

 

-----

# 네트워크 성능 향상 방안

 

핵심) MaxEpoch와 InitialLearningRate는 짝꿍!

 

1. MaxEpoch가 너무 크면 과적합(Overfit) 문제가 발생할 수 있다.

- Loss율을 보고, 더이상 Loss가 줄어들지 않고 계속 평탄하게 유지되면 적절 선에서 끊어주는 것이 좋다.

- 위 상황을 plateau(플래토, 평원, 안정을 유지하다) 상태라고 한다. 

- MaxEpoch가 너무 크면, Loss율이 오히려 올라가는 경향을 보인다.

(모델이 train 데이터에 너무 과적합되어 예측 score값이 오히려 떨어짐) 

 

2. InitialLearningRate는 너무 크면 발산할 수 있다.

- 다만, "시간" 또한 학습에 중요한 요소이므로, 0.01 부터 시작해 10의 배수 단위로 테스트해보는 것이 좋다.

- MaxEpoch를 줄이고, InitialLearningRate를 늘이는 식으로 학습 시간을 단축시켜볼 수 있다.

 

3. Validation은 필수적으로 진행하는 것이 좋다.

- 과적합 상태를 판단하는데 필수적.

 

<Flow Chart>

 

1. 학습 모델이 수렴 하는지? 

- 수렴하지 않는다면 InitialLearningRate를 줄여보자

 

2. 학습이 끝나고 나서도 Loss율이 더 줄어들 기미가 있는지?

- 더 줄어들 기미가 있다면 MaxEpoch를 더 늘여보자.

 

3. plateau 상태에서 Loss율이 증가할 기미가 보이면 MaxEpoch를 줄여볼 필요가 있다.

 

 

<기타 옵션을 사용하는 방법>

1. "LearnRateSchedule" 옵션을 이용해 InitialLearningRate를 유동적으로 조절할 수 있다.

2. "L2Regularization" 옵션으로 데이터 정규화하여 과적합을 막는다.

3. "GradientThreshold" 옵션으로 기울기의 임계값을 지정할 수 있다. (이게 어디에 좋은지는 잘 모르겠음)

 

opts = trainingOptions("sgdm", "MaxEpochs", 30, "InitialLearnRate", 0.1,...
    "Plots", "training-progress", "ValidationData", {val_x, val_y},...
    "LearnRateSchedule","piecewise", "LearnRateDropPeriod", 5, "L2Regularization", 0.001, "GradientThreshold", 1);

 

이외에도 네트워크 레이어를 더 deep하게 구성하는 방법을 사용할 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함