신경망 학습
신경망을 학습하고 계신가요? 훌륭한 빠른 시작 가이드를 준비했습니다. 이 글은 AI 번역본입니다. 오역이 의심되면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
Comment
신경망을 학습하는 일은 매우 혼란스러울 수 있습니다. 적절한 학습률은 무엇일까요? 네트워크에는 은닉층을 몇 개나 두어야 할까요? 드롭아웃은 정말 유용할까요? 왜 기울기가 사라질까요?
이 글에서는 신경망의 혼란스러운 요소들을 속속들이 살펴보고, 신경망 아키텍처를 설계할 때 현명한 결정을 내릴 수 있도록 도와드리겠습니다.
또한 Kaggle 커널에서 Weights & Biases를 활용해 성능을 모니터링하고, 우리 신경망에 가장 적합한 아키텍처를 선택하는 방법도 살펴보겠습니다.
궁금한 점이 있으면 언제든지 메시지 주세요. 행운을 빕니다!
1. 기본 신경망 구조

입력 뉴런
- 이는 신경망이 예측을 수행할 때 활용하는 특성의 개수를 의미합니다.
- 입력 벡터에는 각 특성마다 하나의 입력 뉴런이 필요합니다. 표 형식 데이터의 경우 이는 데이터셋에서 중요한 특성의 개수를 의미합니다. 이러한 특성은 신중하게 선택하고, 학습 세트를 넘어 일반화되지 않아 과적합을 유발할 수 있는 패턴을 담은 특성은 제거하세요. 이미지의 경우에는 이미지의 차원을 의미합니다(예: MNIST는 28×28 = 784).

출력 뉴런
- 예측하고자 하는 값의 개수입니다.
- 회귀: 회귀 작업의 경우 예측 값이 하나일 수 있습니다(예: 주택 가격). 다변량 회귀에서는 예측 값 하나당 뉴런을 하나씩 둡니다(예: 바운딩 박스의 경우 높이, 너비, x좌표, y좌표에 각각 해당하는 4개의 뉴런).
- 분류: 이진 분류(스팸 vs. 스팸 아님)의 경우 양성 클래스를 위한 출력 뉴런을 하나 사용하며, 해당 출력은 양성 클래스의 확률을 의미합니다. 다중 클래스 분류(예: 객체 감지에서 하나의 인스턴스가 자동차, 개, 집 등으로 분류될 수 있는 경우)에서는 클래스마다 출력 뉴런을 하나씩 두고, 출력 층에 softmax 활성화 함수를 사용해 최종 확률의 합이 1이 되도록 합니다.
은닉 층과 각 은닉 층의 뉴런 수
- 은닉 층의 개수는 문제의 성격과 신경망 아키텍처에 크게 좌우됩니다. 핵심은 너무 크지도, 너무 작지도 않은, 딱 알맞은 신경망 아키텍처를 찾는 것입니다.
- 일반적으로 대부분의 문제에는 은닉 층 1~5개면 충분합니다. 이미지나 음성 데이터로 작업할 때는 수십에서 수백 개의 층이 필요한 경우가 많으며, 그중 모두가 완전 연결층일 필요는 없습니다. 이러한 용도에는 사전 학습된 모델(YOLO, ResNet, VGG)이 있어, 이들의 네트워크 상당 부분을 활용하고 그 위에 모델을 올려 고차원 특성만 학습하도록 할 수 있습니다. 이 경우에도 실제로 학습해야 하는 층 수는 소수에 그칩니다.
- 일반적으로 모든 은닉 층에 동일한 수의 뉴런을 두면 충분합니다. 다만 일부 데이터셋에서는 첫 번째 층을 크게 두고 그 뒤를 더 작은 층들로 이어 가는 구성이 더 나은 성능을 보이기도 합니다. 첫 번째 층이 많은 하위 수준 특성을 학습해 다음 층들의 소수 고차 특성으로 효과적으로 전달할 수 있기 때문입니다.

- 일반적으로 각 층의 뉴런 수를 늘리는 것보다 층을 더 추가하는 편이 성능 향상에 더 크게 기여합니다.
- 처음에는 1~5개의 층과 층당 1~100개의 뉴런으로 시작한 뒤, 과적합이 시작될 때까지 층과 뉴런을 천천히 늘려 가는 것을 권합니다. 손실과 정확도는 다음에서 추적할 수 있습니다. Weights & Biases 대시보드에서 어떤 은닉 층과 은닉 뉴런 조합이 최상의 손실 값을 내는지 확인하세요.
- 층이나 뉴런 수를 너무 적게 선택하면, 네트워크가 데이터의 근본적인 패턴을 학습하지 못해 쓸모가 없어질 수 있다는 점을 유의해야 합니다. 이를 보완하는 한 가지 방법은 은닉 층과 은닉 뉴런을 매우 크게 시작한 뒤, dropout과 early stopping을 사용해 신경망이 스스로 적절한 크기로 줄어들게 하는 것입니다. 다시 말해, 몇 가지 조합을 시도해 보고 성능을 다음에서 추적해 보세요. Weights & Biases 대시보드에서 내 문제에 딱 맞는 네트워크 규모를 판단하세요.
- Andrej Karpathy도 다음을 권장합니다 과적합 후 정규화 접근법 “먼저 과적합이 가능할 만큼 충분히 큰 모델을 만들고(즉, 학습 손실에 집중한 뒤) 적절한 정규화를 적용해(일부 학습 손실을 감수하고 검증 손실을 개선하도록)라.”
손실 함수

- 회귀: 이상치가 많지 않다면 평균제곱오차가 가장 흔히 최적화하는 손실 함수입니다. 이상치가 상당히 많다면 평균절대오차 또는 후버 손실.
- 분류: 교차 엔트로피 대부분의 경우에 잘 통할 것입니다.
배치 크기
- 대용량 배치는 GPU의 병렬 연산 능력을 활용해 더 많은 학습 샘플을 동시에 처리할 수 있으므로 유리할 수 있습니다. OpenAI는 이미지 분류와 언어 모델링에서는 수만 개 규모, 강화학습 에이전트의 경우에는 수백만 개 규모의 큰 배치 크기가 확장성과 병렬 처리 측면에서 효과적이라는 사실을 확인했습니다.
- 하지만 작은 배치 크기를 선택해야 할 이유도 있습니다. 이에 따르면 이 논문 Masters와 Luschi에 따르면, 대규모 배치 실행으로 얻는 병렬성 증대의 이점은, 작은 배치가 제공하는 더 나은 일반화 성능과 더 작은 메모리 사용량으로 상쇄됩니다. 그들은 배치 크기가 커질수록 안정적으로 수렴을 보장하는 학습률의 허용 범위가 줄어든다는 점을 보여줍니다. 요지는 작을수록 실제로 더 낫다는 것입니다. 그리고 미니배치 크기는 2에서 32 사이에서 최상의 성능을 냅니다.
- 대규모 스케일이 아니라면, 작은 배치 크기부터 시작해 점차 늘려 가면서 성능을 모니터링할 것을 권합니다. Weights & Biases 대시보드에서 최적의 적합도를 판단하세요.
에포크 수
- 에포크 수는 넉넉하게 잡고, 성능 향상이 멈추면 학습을 중단하도록 Early Stopping을 사용하길 권합니다(4. 소실/폭주 그래디언트 섹션 참고).
특성 스케일링

- 간단히 한 가지 주의할 점: 신경망의 입력으로 사용하기 전에 모든 특성의 스케일을 비슷하게 맞추세요. 이렇게 하면 수렴 속도가 빨라집니다. 특성들의 스케일이 서로 다르면(예: 급여는 수천 단위, 경력 연수는 수십 단위) 비용 함수가 왼쪽 그림처럼 길게 늘어진 그릇 형태가 됩니다. 이 경우 정규화된 특성(오른쪽)과 비교해 최적화 알고리즘이 계곡을 가로지르는 데 훨씬 오래 걸립니다.
2. 학습률

- 학습률을 올바르게 설정하는 것은 매우 중요하며, 반드시 제대로 맞춰야 합니다. 이상적으로는 네트워크의 다른 하이퍼파라미터를 조정할 때마다 학습률도 함께 다시 조정하는 것이 좋습니다.
- 최적의 학습률을 찾으려면 매우 작은 값(예: 1e-6)에서 시작해, 상수를 곱해가며 천천히 값을 키워 매우 큰 값(예: 10)에 도달할 때까지 반복하세요. 이때 모델 성능을 학습률의 로그 값과 비교하여 측정하세요. Weights & Biases 대시보드에서 어떤 학습률이 문제에 가장 적합했는지 판단하세요. 그런 다음 이 최적의 학습률로 모델을 다시 학습시키면 됩니다.
- 최적의 학습률은 보통 모델이 발산하기 시작하는 학습률의 절반 정도입니다. 동봉된 코드에서 learn_rate 값을 다양하게 바꿔 보며 성능 변화를 확인해 보세요. 이렇게 하면 학습률에 대한 직관을 기르는 데 도움이 됩니다.
- 저는 또한 사용하는 것을 추천합니다 학습률 파인더 Leslie Smith가 제안한 방법입니다. 대부분의 경사 최적화기(SGD의 여러 변형)에서 좋은 학습률을 찾는 훌륭한 방법이며, 대부분의 네트워크 아키텍처에서 잘 작동합니다.
- 또한 아래의 학습률 스케줄링 섹션을 참고하세요.
3. 모멘텀

- 경사하강법 아주 작고 일정한 보폭으로 지역 최소점 쪽으로 이동하기 때문에, 기울기가 매우 작을 때는 수렴하는 데 시간이 오래 걸릴 수 있습니다. 반면 모멘텀은 이전 기울기들을 고려하여 계곡을 더 빠르게 지나가 수렴을 가속하고, 지역 최소값에 갇히는 것을 피합니다.
- 일반적으로 모멘텀 값은 1에 매우 가깝게 설정하는 것이 좋습니다. 작은 데이터셋에서는 0.9로 시작하는 것이 좋고, 데이터셋이 클수록 1에 더 가깝게(예: 0.999) 점진적으로 높이세요. (nesterov=True를 설정하면 현재 지점보다 몇 단계 앞의 비용 함수 기울기를 고려하므로, 약간 더 정확하고 빠르게 수렴합니다.)
4. 기울기 소실과 폭주

- 사람과 마찬가지로, 모든 신경망 층이 동일한 속도로 학습하는 것은 아닙니다. 따라서 역전파 알고리즘이 출력층에서 초기 층으로 오차 기울기를 전파할 때, 기울기는 점점 더 작아져 첫 번째 층에 도달할 즈음에는 거의 무시할 정도로 작아집니다. 이는 초기 층의 가중치가 각 단계에서 크게 업데이트되지 않는다는 뜻입니다.
- 이는 다음과 같은 문제입니다. 기울기 소실(유사한 문제로 기울기 폭주가 있는데, 특정 층의 기울기가 점점 커지면서 다른 층과 달리 일부 층에서 가중치가 과도하게 업데이트되는 현상을 말합니다.)
- 기울기 소실을 완화하는 방법은 몇 가지가 있습니다. 지금부터 차례로 살펴보겠습니다!
활성화 함수
은닉층 활성화
일반적으로 활성화 함수를 달리 사용할 때의 성능은 다음 순서로 향상됩니다(낮음→높음): 로지스틱 → tanh → ReLU → Leaky ReLU → ELU → SELU.
ReLU는 가장 널리 쓰이는 활성화 함수이며, 활성화 함수를 따로 조정하고 싶지 않다면 ReLU로 시작하는 것이 좋습니다. 다만, ReLU의 효과는 점점 낮아지고 있다는 점을 염두에 두세요. ELU 또는 GELU.
좀 더 도전해 보고 싶다면, 다음을 시도해 보세요:
- 신경망의 과적합을 완화하기: RReLU
- 런타임 지연 시간 줄이기: Leaky ReLU
- 대규모 학습 데이터셋에 적합: PReLU
- 빠른 추론 속도를 위해: Leaky ReLU
- 네트워크가 자체 정규화를 하지 못한다면: ELU
- 전반적으로 안정적인 활성화 함수가 필요하다면: SELU
항상 그렇듯, 몇 가지 다른 활성화 함수를 과감히 시도해 보고, 필요할 때는 자신의 Weights & Biases 여러 선택지 중에서 당신에게 가장 잘 맞는 것을 고를 수 있도록 도와주는 대시보드!
출력층 활성화 함수
- 회귀회귀 문제에서는 출력 뉴런에 활성화 함수를 사용할 필요가 없습니다. 출력이 어떤 값이든 가질 수 있어야 하기 때문입니다. 다만 특정 범위로 값을 제한하고 싶다면, −1→1 범위에는 tanh를, 0→1 범위에는 로지스틱 함수를 사용할 수 있습니다. 출력이 양수만 나오길 원한다면 softplus 활성화 함수를 사용할 수 있습니다.
- 분류이진 분류에는 시그모이드 활성화 함수를 사용해 출력이 0과 1 사이가 되도록 하세요. 다중 클래스 분류에는 소프트맥스를 사용해 출력 확률의 합이 1이 되도록 하세요.
가중치 초기화 방법
적절한 가중치 초기화 방법을 선택하면 수렴까지 걸리는 시간을 크게 단축할 수 있습니다. 어떤 초기화 방법을 쓸지는 사용하는 활성화 함수에 따라 달라집니다. 시도해 볼 만한 것들:
- ReLU나 Leaky ReLU를 사용할 때에는 He 초기화
- SELU나 ELU를 사용할 때에는 LeCun 초기화
- softmax, logistic, 또는 tanh를 사용할 때에는 Glorot 초기화
- 대부분의 초기화 방법은 균등 분포와 정규 분포 두 가지 형태로 제공됩니다.
배치 정규화
BatchNorm은 각 층 입력의 최적 평균과 스케일을 학습합니다. 입력 벡터를 평균 0으로 맞추고 정규화한 뒤, 스케일링과 시프트를 적용하는 방식으로 작동합니다. 또한 정규화 기법처럼 작용하므로, 드롭아웃이나 L2 정규화가 필요하지 않을 수 있습니다.
BatchNorm을 사용하면 더 큰 학습률을 적용할 수 있어 수렴이 빨라지고, 기울기 소실 문제를 줄여 대부분의 신경망에서 큰 성능 향상을 얻을 수 있습니다. 단점은 각 층에서 추가 연산이 필요해 학습 시간이 약간 늘어난다는 점입니다.
그래디언트 클리핑
특히 RNN을 학습할 때 기울기 폭주를 줄이는 훌륭한 방법은, 기울기가 특정 값을 넘으면 단순히 잘라내는(클리핑하는) 것입니다. 기울기 벡터의 방향을 유지할 수 있도록 clipvalue 대신 clipnorm을 사용하는 것을 권장합니다. clipnorm은 l2 노름이 특정 임계값을 초과하는 모든 기울기를 그 임계값으로 정규화해 제한합니다.
여러 가지 임계값을 시도해 보며 가장 잘 맞는 값을 찾아보세요.
조기 종료
조기 종료를 사용하면 필요한 것보다 더 많은 은닉 층, 더 많은 은닉 뉴런, 더 긴 에폭으로 모델을 마음껏 학습시키다가, 성능이 n 에폭 연속으로 개선되지 않으면 학습을 멈출 수 있습니다. 또한 가장 성능이 좋은 모델을 자동으로 저장해 줍니다. 모델을 학습할 때 콜백을 설정하고 save_best_only=True로 지정하면 조기 종료를 활성화할 수 있습니다.
5. 드롭아웃
드롭아웃 은 아주 간단한 기법임에도 불구하고 최첨단 모델 기준으로 약 2%의 성능 향상을 제공하는 훌륭한 정규화 기법입니다. 드롭아웃이 하는 일은 매 학습 단계에서 각 층의 뉴런 중 일정 비율을 무작위로 꺼 버리는 것뿐입니다. 이렇게 하면 특정 입력 뉴런 집합에 의존해 예측할 수 없게 되어 네트워크가 더 견고해집니다. 지식이 네트워크 전체에 분산되기 때문입니다. 학습 과정 동안 구조에 포함된 뉴런 수를 n이라 할 때, 약 2^n개의 약간씩 다른 신경망이 생성되고, 이들이 앙상블되어 예측에 사용됩니다.
적절한 드롭아웃 비율은 0.1~0.5 사이이며, RNN에는 0.3, CNN에는 0.5를 권장합니다. 층이 클수록 더 높은 비율을 사용하세요. 드롭아웃 비율을 높이면 과적합이 줄어들고, 비율을 낮추면 과소적합을 완화하는 데 도움이 됩니다.
네트워크의 초기 층들에서 서로 다른 드롭아웃 값들을 실험해 보고, Weights & Biases 대시보드에서 결과를 확인해 가장 성능이 좋은 값을 선택하세요. 출력 층에서는 드롭아웃을 사용하지 않는 것이 확실히 좋습니다.
이 커널에서는 AlphaDropout을 사용했습니다. 이는 입력의 평균과 표준편차를 보존하여 SELU 활성화 함수와 잘 맞는 기본 드롭아웃의 변형입니다.
6. 최적화 알고리즘

수렴의 품질이 가장 중요하고 시간이 크게 중요하지 않다면 확률적 경사하강법을 사용할 것을 전반적으로 권합니다.
수렴까지의 시간과 최적값에 근접한 지점이면 충분하다고 생각한다면 Adam, Nadam, RMSProp, Adamax 최적화 알고리즘을 실험해 보세요. Weights & Biases 대시보드가 여러분에게 가장 잘 맞는 최적화기를 찾는 데 도움을 줄 것입니다!
Adam/Nadam은 보통 좋은 출발점이며, 잘못된 학습률이나 최적이 아닌 다른 하이퍼파라미터에도 비교적 관대하게 동작합니다.
이 커널에서는 Nesterov 기법을 더한 일반적인 Adam 최적화기인 Nadam이 가장 좋은 성능을 보였으며, 그 결과 Adam보다 더 빠르게 수렴했습니다.
7. 학습률 스케줄링

좋은 학습률의 중요성은 이미 이야기했습니다. 학습률이 너무 높으면 비용 함수가 최적값 주변에서 이리저리 흔들리다 발산할 수 있으니 피해야 합니다. 반대로 너무 낮으면 수렴에 매우 오랜 시간이 걸리므로 역시 바람직하지 않습니다.
학습률을 관리하는 일은 쉽지 않습니다. 높은 학습률과 낮은 학습률 모두 장단점이 있기 때문이죠. 하지만 좋은 소식이 있습니다. 하나의 학습률에 고정될 필요는 없습니다! 학습률 스케줄링을 사용하면 초반에는 더 높은 학습률로 기울기 경사를 빠르게 내려가고, 하이퍼파라미터 공간에서 기울기 골짜기에 도달해 더 작은 보폭이 필요한 시점에는 학습률을 낮춰 천천히 진행할 수 있습니다.
학습률 스케줄링에는 여러 방법이 있습니다. 지수적으로 학습률을 감소시키거나, 스텝 함수로 조정하거나, 성능이 떨어지기 시작할 때 미세 조정하거나, 1cycle 스케줄링을 사용할 수 있습니다. 이 커널에서는 성능이 n 에포크 동안 하락할 때마다 일정한 비율로 학습률을 낮추는 ReduceLROnPlateau 콜백 사용 방법을 보여 드립니다.
1cycle 스케줄링도 꼭 함께 시도해 보시길 강력히 추천합니다.
다른 하이퍼파라미터를 모두 학습할 때까지는 일정한 학습률을 사용하세요. 그리고 마지막에 학습률 감쇠 스케줄링을 적용하세요.
대부분의 경우와 마찬가지로, 여러 가지 스케줄링 전략으로 몇 가지 실험을 돌려 보고 Weights & Biases 대시보드에서 가장 좋은 모델로 이어지는 방법을 선택할 것을 권합니다.
8. 몇 가지 더 알아둘 점
- 시도해 보세요 EfficientNet 네트워크를 최적으로 확장하기 위해서입니다.
- 읽기 이 논문 추가적인 학습률, 배치 크기, 모멘텀, 가중치 감쇠 기법의 개요를 확인해 보세요.
- 그리고 이것 확률적 가중치 평균화(SWA)에 관한 내용입니다. 주기적 또는 일정한 학습률을 사용해 SGD의 경로를 따라 얻은 여러 지점을 평균하면 일반화 성능을 더 높일 수 있음을 보여줍니다.
- Andrej Karpathy의 글을 읽어 보세요 훌륭한 가이드 신경망에서 최대한의 성능을 끌어내는 방법에 대해.
결과
이번 글에서는 신경망의 다양한 측면을 폭넓게 살펴보았습니다!
은닉층 수, 은닉층 뉴런 수, 배치 크기 등 기본 설정을 포함해 기본적인 신경망을 구성하는 방법을 살펴보았습니다.
모멘텀과 학습률이 모델 성능에 어떤 영향을 미치는지에 대해 배웠습니다.
마지막으로, 기울기 소실 문제와 이를 해결하기 위한 방법으로 비포화 활성화 함수, BatchNorm, 더 나은 가중치 초기화 기법, 그리고 조기 종료를 살펴보았습니다.
시도한 다양한 기법의 정확도와 손실 성능을 하나의 차트에서 비교하려면 Weights & Biases 대시보드로 이동하세요.
신경망은 해결하려는 문제에서 최고의 성능을 끌어내기 위해 조정할 수 있는 손잡이가 매우 많은 강력한 도구입니다. 제공되는 커스터마이징의 폭이 워낙 커서 숙련된 실무자에게도 부담스러울 수 있습니다. 이런 하이퍼파라미터의 세계를 탐색하고, 다양한 실험을 수행하며, 가장 강력한 모델을 고르는 데에는 Weights & Biases 같은 도구가 가장 좋은 동반자입니다.
이 안내서가 여러분의 여정에 든든한 출발점이 되길 바랍니다. 행운을 빕니다!
강력히 권장합니다 fork하여 사용하시길 이 커널 그리고 다양한 구성 요소를 직접 만져 보며 직관을 다듬어 보세요. 아래 데모에서는 W+B를 활용해 최적의 신경망 아키텍처를 선택하는 과정을 단계별로 안내합니다.
Add a comment