인공 신경망
퍼셉트론(perceptron), 다층 퍼셉트론 (MLP)
주피터노트북에서 tensorflow gpu 사용하기
이전 내용
심층 신경망 훈련
◆ 심층 신경망(Deep Neural Network, DNN)
[인공 신경망 실습을 통해 알게 된 두 가지]
1. 퍼셉트론은 인간의 뉴런을 모방한 '인공신경망'이다.
2. 다층 퍼셉트론은 퍼셉트론을 직렬로, 병렬로 연결하여 1개 이상의 은닉층을 가진 구조이다.
XOR문제, 기울기 소실 문제 등으로 인공신경망의 인기는 빠르게 식어갔다. 그러다 2006년 인공신경망 대신 심층 신경망(Deep Neural Network, DNN)이라는 용어가 사용되기 시작했다. 가중치 초기화 설정, ReLU 함수, 컴퓨터 성능 발전 등 다양한 방법으로 기울기 소실의 문제를 어느정도 해결하였다고 한다.
다층 퍼셉트론에서 은닉층을 많이 늘린 구조를 심층 신경망이라고 말할 수 있는데, 일반적으로 은닉층이 3개 이상인 구조를 심층 신경망이라고 하며, 이러한 심층 신경망을 이용하여 컴퓨터가 문제를 해결하는 과정을 딥러닝(Deep learning)이라고 한다. 즉 딥러닝은 컴퓨터가 데이터를 스스로 학습하여 문제를 해결하는 머신러닝(Machine learning) 방법 중 하나이다.
[심층 신경망 훈련 중 마주할 수 있는 문제들]
수백 개의 뉴런으로 구성된 10개 이상의 층을 수십만 개의 가중치로 연결해 훨씬 더 깊은 인공 신경망을 훈련한다고 생각해보면, 심층 신경망을 훈련하는 것은 쉬운 일이 아니며, 훈련 중에 아래와 같은 문제를 마주할 수 있다.
- 심층 신경망의 출력 층에서 멀어질수록 그레이디언트가 점점 더 작아지거나 커지는 문제가 나타날 수 있으며, 두 문제 모두 하위 층을 매우 훈련하기 어렵게 만든다.
- 대규모 신경망을 위한 훈현 데이터가 충분하지 않거나 레이블을 만드는 작업에 비용이 너무 많이 들어갈 수 있다.
- 훈련이 극단적으로 느려질 수 있다.
- 수백만 개의 파라미터를 가진 모델은 훈련 세트에 과대적합될 위험이 매우 크며, 특히 훈련 샘플이 충분치 않거나 잡음이 많은 경우에는 과대적합 될 확률이 더 크다.
해결책1 - 그레이디언트를 안정화 시키는 방법
1. 그레이디언트 소실과 폭주 문제
- 그레이디언트 소실(Gradient Vanishing): 역전파 과정에서 입력층으로 갈수록 기울기가 점차적으로 작아지는 현상. 경사 하강법이 하위 층의 연결 가중치들이 제대로 업데이트 되지 않아 최적의 값을 찾지 못하게 된다. 기울기 소실문제는 신경망의 활성화 함수의 미분 결과 값(도함수 값)이 계속 곱해지면서 가중치에 따른 결과값의 기울기가 0이 되어 경사하강법을 이용할 수 없게 된다.
- 그레이디언트 폭주(Gradient Exploding): 기울기가 점차 커져 가중치들이 비정상적으로 큰 값이 되어 발산되어 최적의 값을 찾지 못하는 현상. 순환 신경망(RNN)에서 주로 나타난다.
1-1. 글로럿과 He 초기화
◆ 글로럿 초기화
- 주요 목표: 입력값이 계층을 통과하면서 너무 작아지거나 커지지 않도록 함.
- 사용 사례: Sigmoid나 Tanh, 소프트맥스 활성화 함수를 사용할 때 적합.
- 장점: 입력값과 출력값의 분산을 유지해 학습 초기에 기울기 소실(vanishing gradient) 문제를 완화.
◆ He 초기화
- 주요 목표: ReLU(ReLU 계열 활성화 함수 포함)를 사용할 때 기울기 소실 문제를 더 효과적으로 해결.
- 사용 사례: ReLU 또는 Leaky ReLU, ELU, GELU, Swish, Mish와 같은 활성화 함수를 사용할 때 적합.
- 장점: ReLU 활성화 함수가 가지는 비대칭적인 특성(음수는 0으로 바뀜)을 반영해 초기화.
2. 고급 활성화 함수
[ReLU 활성화 함수]
앞서 언급한 논문에 의하면, 활성화 함수를 잘못 선택하면 자칫 그레이디언트의 소실이나 폭주로 이어질 수 있으며, 시그모이드 활성화 함수가 아닌 다른 활성화 함수가 심층 신경망에서 훨씬 더 잘 작동한다는 사실이 밝혀졌다. 특히 ReLU 함수는 특정 양숫값에 수렴하지 않고 계산도 빠르다는 장점이 있다.
그러나 ReLU 함수는 완벽하지 않은데, 훈련하는 동안 일부 뉴런이 0 이외의 값을 출력하지 않는 죽은 ReLU 문제가 있다.
- 특히 큰 학습률을 사용하면 신경망의 뉴런 절반이 죽어있기도 하고
- 뉴런의 가중치가 바뀌어 훈련 세트에 있는 모든 샘플에 대해 ReLU 함수의 입력이 음수가 되면 뉴런이 죽게 된다
- 가중치 합이 음수이면 ReLU 함수의 그레이디언트가 0이 되므로 경사 하강법이 더는 작동하지 않음.
위 문제들을 해결하기 위해 ReLU 함수의 변형을 사용한다.
2-1. LeakyReLU
2-2. ELU, SELU
2-3. GELU, Swish, Mish
3. 배치 정규화(batch normalization)
ReLU 또는 다른 ReLU 변형 함수와 함께 He 초기화를 사용하면 훈련 초기 단계에서 그레이디언트 소실이나 폭주 문제를 크게 줄일 수 있지만, 훈련하는 동안 다시 발생할 가능성이 있다.
배치 정규화 기법은 딥러닝에서 학습 안정성과 속도를 개선하기 위해 사용되는 기법이다. 입력 데이터나 은닉층 출력을 정규화(normalization)하는 과정을 통해 학습 과정에서 발생할 수 있는 여러 문제를 완화할 수 있다.
[배치 정규화의 장점]
1) 기울기 소실/폭발 문제 완화
2) 학습 속도 향상
3) 초기화 의존성 감소
4) 높은 학습률 사용 가능
5) 과적합(Overfitting) 방지 효과
6) 활성화 함수 선택 유연성
7) 모델 일반화 성능 개선
[배치 정규화의 한계]
- 미니배치 크기 의존성: 배치 크기가 너무 작을 경우 정규화 통계가 정확하지 않아 성능이 저하될 수 있다.
- 추론 단계에서 추가 계산: 학습과 추론 과정에서 배치 정규화의 동작이 다르므로 추가적인 계산이 필요하다.
4. 그레이디언트 클리핑
그레이디언트 폭주 문제를 완화하는 또 다른 방법은 역전파될 때 특정 임곗값을 넘어서지 못하게 그레이디언트를 잘라내는 그레이디언트 클리핑이 있다. 이 기법은 일반적으로 배치 정규화를 사용하기 어려운 까다로운 순환 신경망에서 사용된다.
해결책2 - 전이 학습, 비지도 사전 훈련
전이 학습과 비지도 사전 훈련은 레이블된 데이터가 적을 때 복잡한 문제를 다루는 데 도움이 된다.
- 전이 학습: 한 작업 또는 데이터 세트를 통해 얻은 지식을 사용하여 다른 관련 작업 및/또는 다른 데이터 세트에서 모델 성능을 개선하는 머신 러닝 기술이다. 다시 말해, 전이 학습은 한 환경에서 학습된 내용을 사용하여 다른 환경에서 일반화를 개선하는 것이다.
- 비지도 사전 훈련: 레이블된 훈련 데이터가 많지 않을 때 수행하는 것이다. 말그대로 비지도 학습 기법으로 레이블이 없는 전체 데이터로 모델을 훈련한 다음, 지도학습 기법을 사용하여 레이블된 데이터만으로 최종 학습을 위해 세밀하게 튜닝하는 것이다. 비지도 학습 부분은 한 번에 하나의 층씩 훈련하거나 바로 전체 모델을 훈련할 수 있다.
해결책3 - 다양한 최적화 방법
대규모 모델의 훈련 속도를 크게 높여주는 다양한 최적화 방법이 있다.
1. 고속 옵티마이저
1-1. 모멘텀 최적화
모멘텀은 물리학의 운동량 개념을 가져온 것으로, 경사 하강법에서 현재 기울기뿐만 아니라 이전의 업데이트 방향을 고려하여 학습 방향을 정한다. 이는 학습을 더 빠르게 진행하면서 불필요한 진동을 줄여준다. 예를 들어, 공이 높은 경사면을 굴러 내려갈 때, 처음에는 천천히 움직이지만 점차 가속이 붙으며 더 빠르게 내려오는 현상과 유사하다.
1-2. 네스테로프 가속 경사(Nesterov accelerated gradient, NAG)
네스테로프 가속 기법은 모멘텀 최적화의 개선된 버전으로, 단순히 현재 위치의 그래디언트를 계산하는 것이 아니라, "미리 예측된 위치"에서 그래디언트를 계산한다. 이를 통해 보다 정확한 방향으로 이동할 수 있다. 예를 들어, 목표지점을 향해 뛰어갈 때 현재 위치가 아닌, 예상 이동 지점을 미리 고려하여 움직이는 것과 유사하다.
1-3. AdaGrad
AdaGrad는 학습률을 각 파라미터에 대해 개별적으로 조정하는 방법으로, 자주 업데이트되는 파라미터는 학습률을 줄이고, 드물게 업데이트되는 파라미터는 학습률을 유지하거나 증가시킨다. 이는 희소한 데이터(드문 데이터를 다루는 상황)에서 매우 효과적이다. 하지만 학습률이 시간이 지남에 따라 너무 빠르게 감소하는 단점이 있어, 장기간 학습에는 적합하지 않을 수 있다.
1-4. RMSProp
RMSProp은 AdaGrad의 단점인 너무 빨리 느려져서 전역 최적점에 수렴하지 못하는 위험을 해결하기 위해 제안된 방법으로, RMSProp 알고리즘은 훈련 시작부터의 모든 그레이디언트가 아닌 가장 최근 반복에서 비롯된 그레이디언트만 누적함으로써 이 문제를 해결했다. 이렇게 하기 위해 알고리즘의 첫 번째 단계에서 지수 감소(지수 이동 평균)를 사용하는 데, 지난 그레이디언트 제곱의 지수 감소된 평균을 따른다. 이렇게 하면 학습률이 지나치게 감소하지 않아 안정적인 학습이 가능하다. 이는 딥러닝에서 매우 자주 사용된다.
1-5. Adam(적응적 모멘트 추정, adaptive moment estimation)
Adam은 모멘텀과 RMSProp을 결합한 방식으로, 기울기의 1차 모멘텀(평균)과 2차 모멘텀(분산)을 동시에 활용하여 학습률을 조정한다. 이는 대부분의 딥러닝 문제에서 기본적으로 사용되는 최적화 알고리즘이다. 초기 단계에서의 빠른 학습과 안정성을 모두 제공한다.
1-6. AdaMax
AdaMax는 Adam의 변형으로, 기울기 분산을 계산할 때 𝐿∞ 노름(최대값)을 사용한다. 이렇게 하면 계산이 더 간단해지고 안정적인 업데이트가 가능하다.
1-7. Nadam
Nadam은 Adam에 네스테로프 가속 기법을 결합한 알고리즘으로, 더 빠르고 부드러운 수렴을 제공한다. 이는 초기에 학습이 안정적이고, 복잡한 문제에서도 성능이 우수하다.
1-8. AdamW
AdamW는 Adam 알고리즘에 L2 정규화를 더한 방식으로, 학습률 업데이트와 가중치 감소(weight decay)를 분리한다. 이를 통해 과적합을 방지하고, 트랜스포머 모델과 같은 최신 모델에서 많이 사용한다.
<옵티마이저 비교표> - A: 좋음, B: 보통, C: 나쁨
클래스 | 수렴 속도 | 수렴 품질 |
SGD | C | A |
SGD(momentum=..) 모멘텀 최적화 | B | A |
SGD(momentum=..., nesterov=True) 네스테로프 가속 기법(NAG) |
B | A |
Adagrad | A | C (너무 일찍 멈춤) |
RMSprop | A | A or B |
Adam | A | A or B |
AdaMax | A | A or B |
Nadam | A | A or B |
AdamW | A | A or B |
2. 학습률 스케줄링
좋은 학습률을 찾는 것은 매우 중요하다.
- 학습률을 너무 크게 잡을 경우: 훈련 발산 위험
- 학습률을 너무 작게 잡을 경우: 최적점에 수렴하나 시간이 매우 오래 걸림.
- 학습률을 조금 높게 잡을 경우: 처음에는 매우 빠르게 진행하나, 최적점 근처에서는 요동이 심해져 수렴 불가.
- 한정적인 컴퓨팅 자원일 경우: 차선의 솔루션을 만들기 위해 완전히 수렴하기 전에 중지.
▶ 좋은 학습률을 찾기 위해서는 매우 작은 값에서 매우 큰 값까지 지수적으로 학습률을 증가시키면서 모델 훈련을 수백 번 반복하는 방식을 사용할 수 있다. 그 다음 학습 곡선을 살펴보고 다시 상승하는 곡선보다 조금 더 작은 학습률을 선택하고, 모델을 다시 초기화하고 이 학습률로 훈련한다.
일정한 학습률보다 더 나은 방법은, 큰 학습률로 시작하고 학습 속도가 낮아질 때 학습률을 낮추면 고정 학습률보다 좋은 솔루션을 더 빨리 발견할 수 있다. 아래는 훈련하는 동안 학습률을 감소시키는 다양한 학습 스케줄 전략이다.
2-1. 거듭제곱 기반 스케줄링
학습률(learning rate)을 학습 과정 동안 점진적으로 감소시키는 방식으로, 감소 속도가 1/(1+t)^p 형태를 따른다. 여기서
t는 현재 에포크(epoch) 또는 스텝(step)이고, p는 감소 속도를 제어하는 지수이다.
초기에는 높은 학습률로 빠르게 학습하다가, 시간이 지남에 따라 학습률을 천천히 줄여 안정적인 수렴을 유도한다.
2-2. 지수 기반 스케줄링
학습률을 학습 스텝(step) 또는 에포크(epoch)에 따라 미리 정해진 값으로 조정하는 방식이다. 특정 단계마다 학습률을 바꾸기 때문에 간단하고 직관적인 접근법이다.
2-3. 구간별 고정 스케줄링
학습을 여러 섹션으로 나누고, 각 섹션에서 일정한 학습률을 사용하는 방식이다. 섹션이 변경될 때 학습률을 감소시키거나 변경한다. 일정 횟수의 에포크 동안 일정한 학습률을 사용하고 그다음 또 다른 횟수의 에포크 동안 작읍 학습률을 사용하는 식인데, 이 방법이 잘 작동할 수 있지만 적절한 학습률과 에포크 횟수의 조합을 찾으려면 이리저리 바꿔봐야 한다.
예를 들어, 110 에포크 동안 0.01, 1120 에포크 동안 0.001과 같이 특정 구간에서 고정된 학습률을 사용한다.
2-4. 성능 기반 스케줄링
모델의 학습 성능(예: 검증 손실 또는 정확도)에 따라 학습률을 동적으로 조정하는 방식이며, N 스텝마다 조기 종료처럼 검증 오차를 측정하고 검증 손실이 개선되지 않으면 학습률을 감소시킨다.
2-5. 1사이클 스케줄링
1-Cycle 학습률 스케줄링은 학습 과정 동안 학습률을 먼저 점진적으로 증가시키고(업스윙), 이후 다시 감소시키는(다운스윙) 방식이다. 이 방식은 학습 초기에 빠르게 최적의 방향을 찾고, 학습 후반에는 미세 조정을 통해 최종 수렴을 돕는다. 학습률뿐만 아니라 모멘텀(momentum)도 함께 조정하는 경우가 많다.
해결책4 - 대규모 신경망을 위한 규제 기법들
1. 규제를 사용해 과대적합 피하기
1-1. L1 규제와 L2 규제
신경망의 연결 가중치를 제한하기 위해 L2 규제를 사용하거나 많은 가중치가 0인 희소 모델을 위해 L1 규제를 사용할 수 있다.
L1 규제가 필요하면 keras.regularizers.l1()을 사용할 수 있고, 둘 다 필요하면 keras.regularizers.l1_l2() 를 사용한다.
l2 규제는 SGD, 모멘텀 최적화, 네스테로프 모멘텀 최적화와 같이 사용해도 괜찮지만 Adam과 그 변형에 사용했을 때는 그렇지 않다. Adam에 가중치 감쇠를 적용하고 싶다면 l2 규제 대신에 AdamW를 사용해야 한다.
1-2. 드롭아웃
드롭아웃 규제는 신경망 모델의 과적합(overfitting)을 방지하기 위해 사용되는 기법이이다. 이 방법은 학습 과정 중 임의로 일부 뉴런을 "드롭"(혹은 비활성화)하는 방법이다.
이 방식은 매 훈련 스텝에서 각 뉴런(입력 뉴런 - 포함, 출력 뉴런 - 제외)은 임시적으로 드롭아웃될 확률 p를 가지는 데, 하이퍼파라미터 p를 드롭아웃 비율이라고 하며 보통 10~50% 사이로 지정한다.
순환 신경망에서는 20~30%에 가깝고, 합성곱 신경망에서는 40~50%에 가깝다. 훈련이 끝난 후에는 뉴런에 더는 드롭아웃을 적용하지 않는다.
한 가지 중요한 점은 드롭아웃을 적용한 훈련을 했다면 테스트하기 전 훈련이 끝난 뒤 각 가중치에 보존확률 1-p를 곱해야 하는 데, 드롭아웃을 적용하여 훈련하면 훈련을 할 때와 달리 테스트할 때 하나의 뉴런이 1-p만큼 더 많은 입력 뉴런과 연결되기 때문이다. 결국은 하나의 뉴런은 가중합(weighted sum)을 이용한 계산을 할 것이므로, 드롭아웃을 적용할 때보다 그만큼의 스케일이 커지는 데, 이를 꼭 보존해야 하는 것이다.
1-3. 몬테 카를로 드롭아웃
몬테 카를로 드롭아웃 규제는 기본 드롭아웃 기법의 변형으로, 베이지안 추론을 활용해 불확실성을 추정하는 데 사용된다. 이 기법은 훈련된 드롭아웃 모델을 재훈련하거나 전혀 수정하지 않고 성능을 크게 향상시킬 수 있는 강력한 기법으로, 모델의 불확실성을 더 잘 측정할 수 있고 단 몇 줄의 코드로 구현할 수 있다. 즉, MC 드롭아웃은 드롭아웃 모델의 성능을 높여주고 더 정확한 불확실성 추정을 제공하는 훌륭한 기술이며, 훈련하는 동안은 일반적인 드롭아웃처럼 수행하기 때문에 규제처럼 작동한다.
1-4. 맥스-노름 규제
맥스-노름(Max-Norm) 규제는 뉴런의 가중치 벡터의 크기를 일정한 최대값으로 제한하는 기법이이다. 가중치 벡터의 노름(norm)이 지정된 임계값을 초과하지 않도록 하는 것이 목표이다.
실용적인 가이드라인
1. 기본 DNN 설정
하이퍼파라미터 튜닝을 크게 하지 않고 대부분의 경우에 잘맞는 설정 (고정은 아님)
하이퍼파라미터 | 기본값 |
커널 초기화 | He 초기화 |
활성화 함수 | 얕은 신경망 - ELU, 깊은 신경망 - Swish |
정규화 | 얕은 신경망 - 없음. 깊은 신경망 - 배치 정규화 |
규제 | 조기 종료 필요하면 가중치 감쇠 |
옵티마이저 | 네스테로프 가속 경사 또는 AdamW |
학습률 스케줄 | 성능 기반 스케줄링 또는 1사이클 스케줄링 |
2. 자기 정규화를 위한 DNN 설정
네트워크가 완전 연결 층을 쌓은 단순한 모델일 경우 자기 정규화를 사용할 수 있으며, 아래의 설정을 사용하는 게 좋다.
하이퍼파라미터 | 기본값 |
커널 초기화 | 르쿤쿤 초기화 |
활성화 함수 | SELU |
정규화 | 없음(자기 정규화) |
규제 | 필요하다면 알파 드롭아웃 |
옵티마이저 | 네스테로프 가속 경사 |
학습률 스케줄 | 성능 기반 스케줄링 또는 1사이클 스케줄링 |
입력 특성을 정규화해야 하며, 비슷한 문제를 해결한 모델을 찾을 수 있다면 사전 훈련된 신경망의 일부를 재사용해봐야 한다. 레이블이 없는 데이터가 많다면 비지도 사전 훈련을 사용하고, 비슷한 작업을 위한 레이블된 데이터가 많다면 보조 작업에서 사전 훈련을 수행할 수 있다.
3. 예외 사항
- 희소 모델이 필요한 경우, L1 규제를 사용할 수 있다. 매우 희소한 모델이 필요하면 텐서플로 모델 최적화 툴킷(TF-MOT)을 사용할 수 있다. 이 도구는 자기 정규화를 깨뜨리므로 이 경우 기본 DNN 설정을 사용해야 한다.
- 빠른 응답을 하는 모델이 필요하면 층 개수를 줄이고 배치 정규화 층을 이전 층에 합친다. 그리고 LeakyReLU나 ReLU 같이 빠른 활성화 함수를 사용한다. 희소 모델을 만드는 것도 도움이 된다. 또한, 부동소수점 정밀도를 32비트에서 16비트 혹은 8비트로 낮출 수도 있다. (여기에서도 TF-MOT 확인)
- 위험에 민감하고 예측 속도가 매우 중요하지 않은 어플리케이션이라면 성능을 올리고 불확실성 추정과 신뢰할 수 있는 확률 추정을 얻기 위해 MC 드롭아웃 사용.
다음 내용
[출처]
핸즈 온 머신러닝
고등학생을 위한 인공신경망과 딥러닝
딥 러닝을 이용한 자연어 처리 입문
IBM
https://iambeginnerdeveloper.tistory.com/188
https://post.naver.com/my.naver?memberNo=26040503
https://jaylala.tistory.com
https://velog.io/@kyungmin1029
'[파이썬 Projects] > <파이썬 딥러닝, 신경망>' 카테고리의 다른 글
[딥러닝] 심층 신경망 훈련 - 3 (1) | 2024.11.25 |
---|---|
[딥러닝] 텐서플로를 사용한 사용자 정의 모델과 훈련 (0) | 2024.11.24 |
[딥러닝] 심층 신경망 훈련 - 2 (2) | 2024.11.24 |
[딥러닝] 심층 신경망 훈련 - 1 (0) | 2024.11.23 |
[딥러닝] 신경망 하이퍼파라미터 튜닝하기 (1) | 2024.11.21 |