1. DNN Architecture
Deep Neural Networks, DNN 은 많은 hidden layer가 있는 NN이다.
큰 데이터셋을 학습시키고 싶을 때 더 많은 연결이 있는 high-capacity model을 사용해야 한다.
일단 층이 깊을수록 일반화가 잘된다. 그리고 sparse connection과 함께라면 일반화가 더욱 잘된다.
이게 모델이 크다고만 해서 학습이 더 잘 되는 것만은 아니다.
첫 번째로, high capacity로 인한 과적합 문제가 발생할 수 있다.
이때 해결책은 정말 다양하다.
정규화, Drop-out, 데이터 증강, parameter sharing, sparse connection이 그 해결책이다.
두 번째로, high capacity로 인한 느린 최적화 문제가 발생할 수 있다.
이때는 SGD, Adaptive learning rate, Momentum으로 해결할 수 있으며, 대표 알고리즘은 AdaGrad, RMSProp, Adam이 있다.
세 번째로 Vanishing/Exploding gradient 문제가 발생할 수 있다.
Vanishing gradient 문제는
Exploding gradient 문제는
이런 문제를 일단은 접어두고, Deep Feedforward Networks에 대해 조금 더 알아보겠다.
이 네트워크의 목표는 어떤 함수 f'(x)를 근사하는 것이다. 참고로 이 f'(x)는 input과 output을 mapping하는 함수이다.
따라서 DFN은 input과 output에 맞는 함수 f'(x)의 parameter theta를 찾는 것이 학습의 목표이다.
이 네트워크는 체인의 형태로 생겼다.
y = f(x) = f3(f2(f1(x))) 이런 식으로 말이다. 이때 체인의 길이는 신경망의 깊이이다.
Gradient-based Learning
기존의 간단한 XOR 예제같은 경우는 정말 드물고, 실제로는 항상 오차가 존재한다.
손실 함수가 보통 non-convex하기에 최솟값을 찾는 것에 어려움이 있다.
따라서 반복 학습 과정으로 손실을 최소화하는 것이 좋다.
이때 수렴 문제에서는 초기 가중치에 민감하고, gradient 계산이 조금 복잡하다.
Hidden Units에서는 ReLU가 주로 쓰인다.
ReLU는 max(0, x)의 형태로, 계산하기가 편하다.
그리고 미분값이 sigmoid에 비해 커서 학습에 유리하다.
그치만 음수 입력에 대해서는 gradient가 0이 되어서 뉴런이 죽는 문제가 발생할 수 있다.
그래서 이를 보완해서 뭐.. Leaky ReLU, PReLU, Maxout 같은 일반화된 ReLU들이 존재한다.
이중 sigmoid와 tanh에 대해 알아보자면,
이 둘은 모두 대부분 구간에서 gradient가 매우 작아 기울기 소실 문제가 발생할 가능성이 높으며,
특히 0 근처가 아니라면 민감하지가 않다.
신경망 구조 설계를 위해서는
- 어떤 층을 몇 개 넣을지
- 어떤 뉴런을 쓸지
- 층간 연결을 어떻게 할지
등을 봐야 한다. 그리고 이후 시행착오를 통해 최적의 구조를 발견할 수 있다.
2. Numerical stability
딥러닝 모델이 깊어질수록 기울기 계산 때 수치 불안정성이 커지고, 손실 함수 gradient 계산이 어렵고 복잡해진다.
즉, Gradient Exploding 문제와 Gradient Vanishing 문제가 발생한다.
예를 들어 깊은 신경망에서, ReLU를 사용했다면, input이 양수인 경우 활성화 함수의 미분값은 항상 1이 되므로,
가중치값이 계속 그대로 곱해져서 값이 엄청 커지게 된다.
Gradient Vanishing
sigmoid같은 활성화함수 쓰면 기울기가 작아져서.. 계속 곱하면 gradient가 0에 가까워진다.
이건 아래쪽 층이 제대로 훈련되지 않는 문제를 유발한다. 일단 gradient가 0이 되면 학습 자체가 진행되질 않는다.
보통 윗층만 학습되고 아랫층은 학습이 안되는데.. 이럼 깊은 신경망의 장점을 살릴 수 없다.
따라서 안정적인 학습을 위해 gradient가 적당한 범위 내에 머물게 만들 수 있다.
곱셈 대신 덧셈 구조를 사용하거나(ResNet, LSTM), 정규화를 하거나, 가중치를 초기화하고 활성화 함수를 바꾸거나!
이 중 가중치 초기화는, 초기값 설정이 잘못되면 학습 초기에 수치적 문제가 발생한다.
하지만 깊은 네트워크에서는 가중치 초기화만으로는 부족하다.
Xavier Initialization
입력값의 분산 -> 출력값의 분산이 일정하게 유지되도록 초기화
이때 입출력값은 평균 0, 분산 고정, 가중치도 마찬가지!
출력을 일정하게 유지하려면 n_in * sigma_square = 1, 역전파시 n_out * sigma_square = 1인데,
둘 다 동시에 만족은 불가능하므로 절충안을 쓰려 한다.
정규분포에서 Xavier 초기화는 분산을 2/(n_in+n_out)으로 설정하는 것이고,
균등분포에서 Xavier 초기화는 범위를 (-6/(n_in + n_out), 6/(n_in + n_out)) 으로 정하는 것이다.
따라서 이건 가중치 초기화를 네트워크 구조에 맞춰 자동으로 조절하는 방식이고,
초기 가중치가 너무 작거나 크지 않게 조절해서 학습 안정성을 확보하는 방식이다.
num = np.array[200, 300, 400]
num_1 = num.astype(np.uint8)
num_2 = num.astype(np.int8)
print(num)
print(num_1)
print(num_2)
#[200, 300, 400]
#[200, 44, 144]
#[-56, 44, -112]
이렇게 컴퓨터 내에서 범위에 맞지 않는 수가 입력되면 의미 없는 아무 숫자가 된다.
3. Optimization
이건 제약조건이 있을 때 목적함수를 최소/대화 하여 최선의 해를 찾는 것이다.
신경망 학습에서는 대부분 목적함수 J(theta)를 최소화한다.
이게 일반적인 최적화와는 다르다고 하는 이유가,
실제로 높이고 싶은 건 성능 P이지만, 직접적으로 최적화하는 것은 손실함수 J(theta)인 것이다. 이 둘이 항상 일치하진 않으니 말이다.
또한 진짜 데이터 분포를 모르기에 대신 훈련 데이터로 근사하여 경험적 위험을 최소화할 수 있다. 그치만 과적합 위험 증가
Batch and minibatch algorithms
전체 데이터를 한 번에 다 쓰면 비효율적이기에 미니배치를 사용한다.
여기서 Batch는 전체 데이터, Stochastic은 하나씩, Mini-batch는 몇 개씩 사용하는 것이다.
이 중 당연 mini-batch가 속도&일반화 사이 절충안이라고 볼 수 있다.
이때 주의해야 할 점은, 데이터를 shuffle 해서 독립성을 유지할 수 있게 하는 것이다.
신경망은 로컬 최소가 매우 많지만, 보통은 로컬 최소도 충분히 성능이 좋기에 크게 걱정할 것은 없다.
근데 만약에 saddle point가 되거나 cliff에 도달했다면, 이땐 수렴이 어렵다. 그렇다면 gradient clipping을 통해 해결할 수 있다.
Stochastic Gradient Descent(SGD)
이건 학습률 조절이 중요하다. BGD면 학습률이 고정될 수 있고, SGD면 점점 줄일 수 있다. 너무 크면 발산, 너무 작으면 정체된다.
Momentum
이건 과거 기울기를 누적해서 관성처럼 작용하는 방식이다. 평탄한 구간에서 가속되며 진동이 억제된다.
AdaGrad
기울기가 많이 누적된 파라미터는 학습률을 줄이는 방식이다.
자주 업뎃된 가중치는 천천히, 덜 업뎃된 가중치는 빠르게!
Moving Average (MA/EMA)
이건 평균을 낼 때 최근값일수록 가중치를 더 주는 방식이다.
EMA값만 있다면 앞의 값이 각각 무엇인지 잊어도 된다.
RMSProp
AdaGrad의 누적 평균에 감소 가중치를 적용한 버전이다. 최근 기울기의 영향을 좀 더 크게 반영한다.
Adam
Momentum + RMSProp 결합으로 빠르고 안정적이어서 딥러닝에서 기본 최적화 도구로 사용된다.
이때 Bias Correction이라는 것이 있는데, 초기에 평균이 0에서 시작해서 바이어스가 있을 때, 이를 보정해주는 공식이 있다.
Covariance Shift
1. 외부 공변량 변화 : train 분포와 test 분포가 다른 경우, ex. 대학생으로 학습하고 노인에게 테스트.. 일반화성능 밷
2. 내부 공변량 변화 : 네트워크 내부에서 각 층의 입력 분포가 훈련 중에 계속 바뀌는 것. 학습 속도가 느려지고 불안정해짐. 이걸 해결하기 위해 Batch normalization이 필요하다.
4. Batch normalization
일단 그냥 정규화는 Normalization.. 보통 Z-score 로 평균 0, 표준편차 1로 재조정한다.
Batch Normalization은 각 은닉층의 출력을 미니배치 단위로 정규화하는 것이다. 이때 학습 가능한 파라미터는 gamma, beta
이걸 하면 좋은점!
- 학습 안정성 향상
- 학습 속도 증가
- 내부 공변량 변화 감소
- 정규화 효과 있음
- 초기값에 덜 민감
이 과정은.. 훈련 때는 미니배치 평균/표준편차로 정규화하고, 추론 때는 전체 데이터에 대해 학습된 평균/분산을 사용하는 것이다.
Transfer Learning
유사한 도메인에 대해 사전 학습된 모델을 활용하는 것이다.
적은 데이터로 빠르게 성능을 확보할 수 있다.
'AI > 딥러닝' 카테고리의 다른 글
CNN applications and RNN (1) | 2025.06.18 |
---|---|
CNN (1) | 2025.06.18 |
Regularization (1) | 2025.04.24 |
족보 (1) | 2025.04.24 |
Perceptron, MLP (0) | 2025.04.24 |