비유를 통해 신경망을 훈련하는 방법의 직관을 가져보자. 그래디언트 하강(GD)이라고 알려진 유명한 훈련 기법에 중점을 두자. 그래디언트 하강은 가파른 경사면을 따라 내려가며 도랑을 찾는 것을 목표로 하는 등산객에 비유할 수 있다.
텐서플로는 이런 그래디언트 하강에 대해 계산해 주므로 계산이나 구현을 걱정할 필요가 없다. 신경망은 본질적으로 수천 개 때로는 수백만 개의 매개변수를 가진 여러 미분 가능 함수의 복합체로 구성된다. 각 신경망 계층은 학습 단계에서 관찰된 정확도를 향상하고자 오차를 최소화하는 함수를 계산한다. 뒤에서 역전파를 알아볼 때 최소화라는 것이 여기 있는 간단한 예제보다는 더 복잡하다는 것을 알게 될 것이다. 그러나 여전히 도랑에 도달하려면 경사를 내려간다는 직관은 동일하다.
텐서플로는 그래디언트 하강의 속도를 높이기 위한 변형인 SGD와 함께 RMSprop와 Adam등이 있다. RMSProp과 Adam은 SGD의 가속 구성 요소외에도 모멘텀(momenturm)개념을 포함하고 있다.
이는 좀 더 많은 계산을 통해 더 빠른 수렴이 가능토록 해준다. 어느 방향으로 움직이기 시작했다가 방향을 바꾸기로 결심했지만 이전의 선택을 기억하고 있는 등산객을 상상해보라. 모멘텀은 SGD를 유관 방향으로 가속화하고 왔다 갔다 하는 것을 줄이는 데 도움을 준다는 것이 증명됐다.
기존 SGD를 RMSProp로 바꾸어 사용하면 RMSProp는 SGD보다 빠르다. Accuracy일반적으로 더 높다. 에폭 수가 증가할 때 훈련과 테스트 집합에서 정확도가 어떻게 증가하는지 관찰해 보면 유용하다. Adam도 함께 해본다.
- SGD -
- Adam -
- RMSProp -
에폭수 증가시키기
만약 에폭수를 200에서 2000으로 늘려본다면 어떻게 될까? 불행하게도 이 선택은 계산 시간을 10배나 늘렸지만, 별다른 소득이 없다. 실험은 성공적이지 않지만 배우는 데 더 많은 시간을 소비한다고 해서 반드시 결과가 개선되는 것이 아니라는 것을 알게 되었습니다.
내부 은닉층 개수 증가
다른 접근 방법은 내부에 은닉된 뉴런의 수를 변경하는 것입니다. 은닉 뉴런의 수가 증가함에 따라 결과가 어떻게 되는지 살표보자. 모델의 복잡도를 증가시키면 최적화해야 할 매개변수가 점점 많아지므로 실행 시간이 크게 증가한다는 것을 알 수 있다.
그러나 신경망의 크기를 증가시킴으로써 얻는 이득은 망이 증가함에 따라 점점 더 감소한다. 은닉 뉴런의 수를 일정 이상 증가시키면 신경망이 일반화를 잘하지 못할 수 있기 때문에 정확도가 오히려 저하될 수 있다는 점에 주목
배치 계산 크기 증가
그래디언트 하강은 훈련 집합에서 제공되는 모든 예제와 입력에서 제공되는 모든 특징에 대해 비용 함수를 최소화려고 한다. SGD는 BATCH_SIZE크기의 예제만 고려하면 되는 계산이 훨씬 간단한 변형이다.
Accuracy Rate를 높이기 위해 훈련 단계를 개선하기 위한 정규화와 배치 정규화에 대해 알아보겠습니다.
과적합을 피하기 위한 정규화 적용
직관적으로 생각할 때 좋은 머신러닝 모델이란 훈련 데이터에서 낮은 오류율을 가져야 한다. 이는 수학적으로 주어진 훈련 데이터에 대해 모델의 손실 함수를 최소화하는 것과 같다. 그러나 이것만으로는 충분치 않을 수 있습니다. 훈련 데이터에 내재된 모든 관계를 포착하려다 모델이 지나치게 복잡해질 수 있다. 이러한 복잡도의 증가는 두 가지 부정적인 결과를 초래할 수 있다.
첫째, 복잡한 모델을 실행하려면 상당한 시간이 소요될 수 있다. 둘째, 복잡한 모델은 훈련 데이터에서는 매우 우수한 성과를 달성할 수 있지만 검증 데이터에서는 상당히 나쁜 성과를 거둘 수 있다. 그 이유는 모델이 훈련 상황에서만 특화된 많은 매개변수 사이의 관계를 고려할 수 있지만, 사실 이러한 관계는 좀 더 일반적인 맥락 안에서는 존재하지 않기 때문이다.
이러한 방식으로 일반화하는 능력을 잃게 된 모델을 '과적합(Overfitting)'이라고 한다. 다시 말해 학습은 암기보다 일반화에 더 가까운 법이다.
과적합 문제를 해결하려면 모델의 복잡도, 즉 모델이 얼마나 복잡한지를 파악할 수 있는 방법이 필요하다. 해결책은 무엇일까? 모델이란 가중치의 벡터에 불과하다. 각 가중치는 0이나 0에 매우 가까운 것을 제외하고 모두 출력에 영향을 준다. 따라서 모델의 복잡도는 편의상 0이 아닌 가중치의 개수로 표현될 수 있다.
다시말해 손실 함수 측면에서 거의 동일한 성능을 가진 M1과 M2의 두 모델이 있는 경우라면 0이 아닌 가중치의 개수가 최소인 가장 간단한 모델을 선택해야 한다.
- L1 정규화(LASSO): 모델의 복잡도는 가중치 절댓값의 합으로 나타낸다.
- L2 정규화(Ridge): 모델의 복잡도는 가중치 제곱의 합으로 나타낸다.
- Elastic 정규화: 모델의 복잡도는 앞 두 기법의 조합으로 나타낸다.
정규화를 사용하면 특히 과적합이 분명한 상황에서 신경망의 성능을 향상할 수 있는 좋은 방법이 될 수 있다. 텐서틀로는 L1, L2, Elastic 정규화를 지원한다.
from keras.regularizers import l2, activity_l2
model.add(Dense(64, input_dim=64, W_regularizer=l2(0.01), activity_regularizer=activity_l2(0.01)))
- 참고-
배치 정규화의 이해
배치 정규화(Batch Normalization)은 또 다른 형태의 정규화로 배치 정규화를 사용하면 경우에 따라 훈련 에폭을 절반으로 줄여 훈련을 가속화할 수 있으며 일부 정규화를 제공한다.
훈련 과정에서 초기 계층의 가중치는 변경될 것이 당연하므로 이후 계층의 입력은 크게 변경될 수 있다. 즉, 각 계층은 모든 배치마다 가중치를 지속적으로 다른 분포로 다시 조정해야 한다. 이로 인해 모델의 훈련 속도가 크게 떨어질 수 있다. 핵심 아이디어는 각 배치와 각 에폭에 대해 계층 입력이 좀 더 유사한 분포를 갖게 하자는 것이다.
또 다른 문제는 시그모이드 활성화 함수는 0근처에서는 아주 잘 작동하지만 값이 0에서 상당히 멀어지면 '고착'되는 경향이 있다는 것이다. 때때로 뉴런 출력이 시그모이드 0에서 멀리 떨어져 변동되면 해당 뉴런은 자신의 가중치를 갱신할 수 없게 된다. 따라서 다른 핵심 아이디어는 계층 출력을 0에 가까운 가우시안 분포 단위로 변환하는 것이다. 이렇게 하면 계층에서 배치 사이의 변형이 크게 줄어든다.
이 방법을 통해 배치 정규화는 활성화 속도가 너무 작아 없어지거나 너무 커져 폭발하는 것을 방지하는 데 도움이 되기 때문에 훈련 속도와 정확도를 모두 높일 수 있는 매우 효과적인 방법으로 입증됐다.
'Deep Learning With Tensorflow > 01.신경망 구현 지식' 카테고리의 다른 글
04. 실습: IMDB를 이용한 감정분석과 초매개변수 튜닝과 AutoML, 출력 예측, 역전파에 대한 실용적 개괄에 대해 (0) | 2021.10.30 |
---|---|
02. 딥러닝의 작동원리필기체 숫자 인식 (0) | 2021.10.21 |
01. 퍼셉트론에 대한 이해와 활성화 함수 (0) | 2021.10.18 |