Skip to main content

신경망 학습

신경망을 학습하고 계신가요? 멋진 빠른 시작 가이드를 준비했습니다. 이 글은 AI 번역본입니다. 오역이 의심되면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
신경망을 학습하는 일은 매우 혼란스러울 수 있습니다. 적절한 학습률은 얼마일까요? 은닉층은 몇 개가 적당할까요? 드롭아웃은 정말 유용할까요? 왜 그래디언트가 소실되고 있을까요?
이 글에서는 신경망의 헷갈리기 쉬운 부분들의 막을 걷고, 신경망 아키텍처에 대해 현명한 결정을 내릴 수 있도록 도와드리겠습니다.
또한 Kaggle 커널에서 Weights & Biases를 활용해 성능을 모니터링하고, 우리 신경망에 최적의 아키텍처를 선택하는 방법도 살펴보겠습니다.
강력히 추천합니다: 포크하세요 이 커널 그리고 다양한 구성 요소를 직접 만져 보며 직관을 다듬어 보세요.
궁금한 점이 있으면 언제든지 메시지를 보내 주세요. 행운을 빕니다!

1. 기본 신경망 구조



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



출력 뉴런
  • 예측하고자 하는 값의 개수입니다.
  • 회귀: 회귀 과제의 경우 출력은 하나의 값일 수 있습니다(예: 주택 가격). 다변량 회귀에서는 예측할 값마다 뉴런을 하나씩 둡니다(예: 바운딩 박스의 경우 높이, 너비, x 좌표, y 좌표에 각각 해당하는 4개의 뉴런).
  • 분류: 이진 분류(스팸 vs. 스팸 아님)에서는 양성 클래스의 확률을 나타내는 출력 뉴런을 1개 사용합니다. 다중 클래스 분류(예: 객체 감지에서 하나의 인스턴스를 자동차, 개, 집 등으로 분류하는 경우)에서는 클래스마다 출력 뉴런을 하나씩 두고, 출력 층에 Softmax 활성화 함수를 사용해 최종 확률의 합이 1이 되도록 합니다.

은닉층과 층당 은닉 뉴런 수

  • 은닉층의 개수는 문제의 특성과 신경망 아키텍처에 크게 좌우됩니다. 핵심은 너무 크지도 작지도 않은, 딱 알맞은 신경망 아키텍처를 찾아가는 것입니다.
  • 일반적으로 대부분의 문제에는 은닉층 1–5개면 충분합니다. 이미지나 음성 데이터를 다룰 때는 완전연결층만으로 구성되지 않을 수 있으며, 수십에서 수백 개의 층을 갖는 네트워크가 필요합니다. 이러한 경우에는 YOLO, ResNet, VGG 같은 사전 학습된 모델을 활용해 네트워크의 큰 부분을 그대로 사용하고, 그 위에 자신의 모델을 얹어 고차원 특성만 학습하도록 훈련할 수 있습니다. 이때도 실제로 학습해야 하는 층의 수는 소수에 불과합니다.
  • 일반적으로 모든 은닉층에 동일한 수의 뉴런을 사용하는 것으로 충분합니다. 다만 일부 데이터셋에서는 첫 번째 층을 크게 두고 그 뒤를 더 작은 층들로 이어 붙이는 편이 더 좋은 성능을 내기도 합니다. 첫 번째 층이 다양한 저수준 특성을 많이 학습하고, 이후 층들에서 이들을 결합해 소수의 고차원 특성으로 추상화해 전달할 수 있기 때문입니다.

  • 일반적으로 각 층의 뉴런 수를 늘리는 것보다 층을 더 추가하는 것이 성능 향상에 더 도움이 됩니다.
  • 처음에는 층 1–5개, 뉴런 1–100개로 시작한 뒤 과적합이 시작될 때까지 층과 뉴런을 서서히 늘려 보세요. 손실과 정확도는 다음과 같이 추적할 수 있습니다 Weights & Biases 대시보드에서 어떤 은닉층과 은닉 뉴런 조합이 최적의 손실을 내는지 확인하세요.
  • 층/뉴런 수를 너무 작게 선택하면 데이터의 근본적인 패턴을 학습하지 못해 모델이 무용지물이 될 수 있다는 점을 유의하세요. 이를 방지하는 한 가지 방법은 은닉층과 은닉 뉴런을 매우 크게 시작한 뒤, 드롭아웃과 얼리 스토핑을 사용해 신경망이 스스로 적절한 크기로 줄어들도록 하는 것입니다. 다시 말해, 몇 가지 조합을 시도해 보고 성능을 다음에서 추적해 보시길 권장합니다 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 사이가 되도록 하세요. 다중 클래스 분류에는 softmax를 사용하여 각 클래스의 출력 확률 합이 1이 되도록 하세요.

가중치 초기화 방법

올바른 가중치 초기화 방법을 선택하면 수렴 속도를 크게 높일 수 있습니다. 어떤 초기화 방법을 쓸지는 사용하는 활성화 함수에 따라 달라집니다. 시도해 볼 것들:
  • ReLU 또는 Leaky ReLU를 사용할 때는 He 초기화
  • SELU 또는 ELU를 사용할 때는 LeCun 초기화
  • softmax, 로지스틱, 또는 tanh를 사용할 때는 Glorot 초기화
  • 대부분의 초기화 방법은 균등 분포와 정규 분포 두 가지 형태로 제공됩니다.

배치 정규화

배치 정규화는 각 층 입력의 최적 평균과 스케일을 학습하는 기법입니다. 입력 벡터를 평균 0으로 맞추고 정규화한 뒤, 스케일링과 시프팅을 적용해 수행합니다. 또한 정규화 기법처럼 작동하므로, 드롭아웃이나 L2 정규화를 사용하지 않아도 되는 경우가 많습니다.
배치 정규화를 사용하면 학습률을 더 크게 설정할 수 있어 수렴 속도가 빨라지고, 기울기 소실 문제를 줄여 대부분의 신경망에서 큰 성능 향상을 얻을 수 있습니다. 단점은 각 층에서 추가 연산이 필요해 학습 시간이 약간 늘어난다는 점입니다.

기울기 클리핑

특히 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 대시보드에서 성능을 비교해 최적의 값을 선택하세요. 출력 층에는 드롭아웃을 절대 사용하지 않는 것이 좋습니다.
읽기 이 논문 BatchNorm과 함께 Dropout을 사용하기 전에
이 커널에서는 AlphaDropout을 사용했습니다. 이는 입력의 평균과 표준편차를 보존하여 SELU 활성화 함수와 잘 작동하도록 설계된 기본 드롭아웃의 변형입니다.

6. 최적화 기법

경사하강법만이 유일한 최적화 방법은 아닙니다! 선택할 수 있는 다른 기법들도 몇 가지 있습니다. 이 글 선택할 수 있는 몇 가지 최적화 기법을 잘 설명해 줍니다.

수렴의 질이 가장 중요하고 시간이 그다지 급하지 않다면, 확률적 경사하강법을 사용하는 것을 일반적인 권장 사항으로 드립니다.
수렴까지의 시간(시간 대비 효율)이 더 중요하고, 최적점에 충분히 가까운 지점이면 만족한다면 Adam, Nadam, RMSProp, Adamax 최적화 기법을 시도해 보세요. Weights & Biases 대시보드가 당신에게 가장 잘 맞는 최적화를 찾아주는 데 도움을 줄 것입니다!
Adam/Nadam은 보통 좋은 시작점이며, 학습률이 다소 부적절하거나 다른 하이퍼파라미터가 최적이 아니어도 비교적 관대하게 동작하는 편입니다.
Andrej Karpathy에 따르면, ConvNet의 경우, 잘 튜닝된 SGD가 거의 항상 Adam보다 약간 더 뛰어난 성능을 보입니다.
이 커널에서는 Nesterov 기법을 더한 일반적인 Adam 최적화기인 Nadam이 가장 좋은 성능을 보였으며, 그 결과 Adam보다 더 빠르게 수렴했습니다.

7. 학습률 스케줄링


좋은 학습률의 중요성은 이미 이야기했습니다. 학습률이 너무 높으면 비용 함수가 최적값 주변에서 이리저리 흔들리다가 발산할 수 있습니다. 반대로 너무 낮으면 수렴하는 데 시간이 매우 오래 걸립니다.
학습률을 세심하게 관리하는 일은 쉽지 않습니다. 높은 학습률과 낮은 학습률 모두 장단점이 있기 때문입니다. 다행히 하나의 학습률에 고정할 필요는 없습니다. 학습률 스케줄링을 사용하면 초기에 더 높은 학습률로 기울기 경사를 빠르게 내려가다가, 하이퍼파라미터 공간에서 기울기 골짜기에 도달했을 때는 더 작은 보폭이 필요하므로 학습률을 낮춰 천천히 진행할 수 있습니다.
학습률을 스케줄링하는 방법은 매우 다양합니다. 지수적으로 학습률을 감소시키거나, 스텝 함수로 줄이거나, 성능이 떨어지기 시작할 때 조정하거나, 1cycle 스케줄링을 사용하는 방식 등이 있습니다. 이 커널에서는 성능이 n 에포크 동안 하락할 때마다 일정 비율로 학습률을 낮추는 ReduceLROnPlateau 콜백의 사용 방법을 보여 드립니다.
1cycle 스케줄링도 꼭 시도해 보시길 강력히 추천합니다.
다른 하이퍼파라미터를 모두 학습해 확정하기 전까지는 고정된 학습률을 사용하세요. 마지막에 학습률 감소 스케줄링을 적용하세요.
대부분의 경우와 마찬가지로, 여러 가지 스케줄링 전략으로 몇 가지 실험을 돌려 보고 Weights & Biases 대시보드를 활용해 가장 좋은 모델로 이어지는 전략을 선택하길 권합니다.

8. 몇 가지 더 알아둘 점

  • 시도해 보세요 EfficientNet 네트워크를 최적으로 확장하기 위해서입니다.
  • 읽기 이 논문 추가적인 학습률, 배치 크기, 모멘텀, 가중치 감쇠 기법에 대한 개요를 확인하세요.
  • 그리고 이것 Stochastic Weight Averaging(SWA)에 관한 내용입니다. 주기적 또는 일정한 학습률을 사용하면서 SGD 경로상의 여러 지점을 평균하면 더 나은 일반화 성능을 얻을 수 있음을 보여줍니다.
  • Andrej Karpathy의 글을 읽어보세요 훌륭한 가이드 신경망에서 최대한의 성능을 끌어내는 방법에 관하여.

결과

이 글에서는 신경망의 여러 측면을 폭넓게 살펴보았습니다!
기본적인 신경망을 설정하는 방법(은닉층 수, 은닉 뉴런 수, 배치 크기 등을 선택하는 것 포함)을 살펴보았습니다.
모멘텀과 학습률이 모델 성능에 어떤 영향을 미치는지 배웠습니다.
마지막으로, 기울기 소실 문제와 이를 해결하기 위한 비포화 활성화 함수, BatchNorm, 더 나은 가중치 초기화 기법, 그리고 Early Stopping을 사용하는 방법을 살펴보았습니다.
여러 기법으로 시도한 정확도와 손실 성능을 Weights & Biases 대시보드에서 하나의 차트로 비교할 수 있습니다.
신경망은 해결하려는 문제에서 최고의 성능을 끌어내기 위해 조정할 수 있는 레버가 매우 많은 강력한 도구입니다. 제공되는 커스터마이즈의 폭이 워낙 넓어 숙련된 실무자에게도 압도적으로 느껴질 수 있습니다. 이런 때에는 하이퍼파라미터의 세계를 탐색하고, 다양한 실험을 시도하며, 가장 강력한 모델을 고르는 데 Weights & Biases 같은 도구가 가장 든든한 동반자가 됩니다.
이 안내서가 여러분의 여정을 시작하는 데 좋은 출발점이 되기를 바랍니다. 행운을 빕니다!
강력히 추천합니다: 포크하세요 이 커널 그리고 다양한 구성 요소를 직접 만져 보며 직관을 갈고닦아 보세요. 여기에는 W+B를 사용해 완벽한 신경망 아키텍처를 고르는 과정을 단계별로 안내하는 데모도 준비되어 있습니다.

이 글은 AI로 번역되었습니다. 오역이 의심되는 부분이 있으면 댓글로 알려 주세요. 원문 보고서는 다음 링크에서 확인할 수 있습니다: 원문 보고서 보기