Machine Learning/Deep Learning

[Machine Learning] Neural Network의 한계

데이터 세상 2021. 3. 3. 22:35
728x90
반응형

Neural Network의 한계

  • Vanishing Gradient
  • Local Minima
  • Overfitting
  • 느린 학습

 

Vanishing Gradient

  • Layer를 쌓아서 비선형 문제를 풀고 Backpropagation으로 multi layer를 학습하지만 전파하는 과정에서 기울기 값이 사라져 학습 안됨
  • backpropagation은 출력층부터 앞으로 하나씩 되돌아가며 각 층의 가중치를 수정하는 방법 사용
  • 가중치를 수정하려면 출력 오차 값(loss)을 미분하여 사용
  • layer가 늘어나면 기울기가 중간에 0이 되어 버리는 기울기 소실(vanishing gradient) 문제가 발생
  • activation 함수로 사용된 sigmoid 함수의 특성 때문에 발생
  • sigmoid 미분하면 최대치가 0.3이 되고 layer를 거쳐갈수록 기울기가 사라져 가중치를 수정할 값이 소실됨

 

Vanishing Gradient Solution

  • 문제를 해결하고자 여러 activation 함수가 만들어짐
  • 비선형이면서 loss 전파를 잘되고(미분 값이 작으면) zero-centered한(optional 조건) 함수

 

sigmoid

비선형으로는 좋지만

  • 문제 1) Gradient Vanishing 발생
  • 문제 2) zero-centered (0점을 기준으로 대칭을 가짐)가 아니라서 학습을 불안정하게 만듦
    • zero-centered가 아니면 w의 gradient가 한쪽으로 치우침(양수 또는 음수)
  • 문제 3) exp의 연산 비용이 큼(연산이 어려움)

※ Layer가 깊지 않은 경우에는 간단히 사용 가능

 

tanh

  • 문제 1) Gradient Vanishing 완전 삭제가 되지 않음
  • 문제 2) exp의 연산 비용이 큼(연산이 어려움)

 

Relu

  • 문제 1) zero-centered가 아님 ==> 하지만 학습은 잘됨
  • 문제 2) 0 이하의 값은 전부 0으로 처리가 됨

 

leaky Relu

 

parametric Relu(PReLU)

 

Exponential Linear Units(ELU)

 

 

가중치 감소 기법 (xavier와 he 초기화)

Vanishing Gradient와 Local Minima를 해결 가능

weight를 잘 초기화 하자

  • large random value: w가 너무 커서 오버슈팅(-1, 1에 포화)
  • small random value: 초반에 layer는 잘 분포되나, layer가 깊어질수록 layer들의 분산이 0으로 수렴
  • 가중치 매개변수의 값이 작아지도록 학습하는 방법
  • 가중치를 작게 만들고 싶으면 초기값도 최대한 작은 값에서 시작하는 것이 가장 일반적 방법
  • hidden layer 활성화 값의 분포를 관찰하면 중요한 정보를 얻을 수 있음

 

xavier initialization

  • 자비에르 글로로트와 요수아 벤지오의 논문에서 권장하는 가중치 초기값
  • 각 측의 활성화값들을 광범위하게 분포시킬 목적으로 노드 개수 n개를 이용하여 √1/n 분포를 사용
  • sigmoid or Tanh에 효율적
  • Relu activation에서는 잘 동작되지 않음

 

he initialization

  • Relu의 경우에는 카이밍 히의 이름을 따서 만든 he 초기값을 사용
  • 표준편차가 √2/n 정규분포 값 사용

 

 

## he 초기화 방법
x = tf.keras.layers.Dense(10, activation='sigmoid',
	kernel_initializer=tf.keras.initializers.he_normal())(input_Layer)
## xavier 초기화 방법
x = tf.keras.layers.Dense(10, activation='sigmoid',
	kernel_initializer=tf.keras.initializers.glorot_uniform())(x)

 

 

Local Minima

  • Cost 값을 줄여가면서 학습을 하는 과정에서 모델을 업데이트하지만 Layer가 깊어질수록 비선형의 Cost 함수에서 가장 작은 Cost 값을 찾지 못함

  • 경사 하강법
    • 학습 시 느린 학습 속도와 정확도 문제가 발생
    • 정확하게 가중치를 찾아가지만, 한 번 업데이트할 때마다 전체 데이터를 미분해야 하므로 계산량이 매우 많다
    • 비등방성 함수(방향에 따라 성질, 즉 기울기가 달라지는 함수)에서는 탐색 경로가 비 효율적

 

Local Minima Solution

적절한 Optimizer를 선택하여 Local Minima, 느린 학습을 해결 가능!!

  • 스텝 방향과 스텝 사이즈의 2가지 측면에서 적합한 optimizer가 존재
  • Adam은 2가지 측면을 모두 고려하지만 모든 데이터에 적합한 것은 아님
  • SGD, RMSProp, Adam이 가장 흔하게 쓰이는 optimizer
  • SGD는 일반화를 고려할 때 사용하는 경우도 있음

 

Momentum

  • 운동량을 뜻하는 단어로 물리와 관계가 있음
  • 매번 기울기를 구하지만 이를 통한 오차를 수정하기 전 바로 앞 수정 값과 방향(+, -)을 참고하여 같은 방향으로 일정한 비율만 업데이트
  • 전에 구해 놓은 미분값(오차 수정값)을 일부분 반영하여 현재의 미분값을 상충하는 효과가 있음

 빠른 속도로 학습이 가능

v = m * v -learning_rate * gradient
self.weight[i] += v

 

Nesterov Momentum

  • 모멘텀을 개선해서 만든 알고리즘
  • 모멘텀 방법으로 이동될 방향을 미리 예측하고 해당 방향으로 미리 이동한 gradient 값을 사용
  • 속도는 그대로이면서 이동을 실행하기 전 한 단계를 미리 예측함으로써 불필요한 이동을 줄일 수 있음

v = m * v -learning_rate * gradient(Self.weight[i-1] + m * v)
Self.weight[i] += v

 

Adagrad (Adaptive Gradient)

  • 업데이트 수에 따라 학습률을 조절
  • 최적 지점에 거의 도달할 경우 학습률을 조정함으로써 좀 더 세밀한 최적값을 얻을 수 있음
  • G(t): t 스텝까지 각 스텝 별로 변수가 수정된 gradient 제곱을 모두 합한 값
  • 𝜀: 아주 작은 상수. 0으로 나눈 것을 방지

 

g += gradient ** 2
Self.weight[i] += -learning_rate * gradient / (np.sqrt(g) + e)

 

RMSprop

  • Adagrad의 G(t) 값이 무한히 커지는 것을 방지하는 optimizer
  • 이동 지수의 평균을 이용하여 G(t)값이 무한히 커지는 것을 방지
  • 기울기의 영향을 억제하는 효과를 보이며 Adagrad의 G(t) 값에 해당하는 부분이 급격히 변하는 것을 방지

 

g = gamma*g + (1-gamma) * gradient ** 2
Self.weight[i] += -learning_rate * gradient / (np.sqrt(g) + e)

 

Adam

  • RMSprop와 Momemtum 방식을 이용하여 업데이트한 optimizer
v = gamma1 * m + (1-gamma1) * dx
g = gamma2 * v + (1-gamma2) * (dx**2)
x += -learning_rate*g / (np.sqrt(v) + e)

 

Overfitting

  • 다양한 Feature에 대해 과도하게 학습된 상황
  • 학습할 때는 성능이 잘 나오지만 테스트 할 때는 성능이 나오지 않음
  • train data에만 지나치게 적응되어 그 외의 데이터에서는 제대로 대응하지 못하는 상태
  • High Variance, 과분산
  • 비슷한 입력에 부정확 반응 결과가 나옴(학습대상만 정상 반응)
  • Overfitting 발생 조건
    • hidden layer가 너무 많거나 각 층의 노드 수가 많아 변수가 복잡해 질 경우
    • test set과 train set이 중복될 때
    • 모델링할 때 사용한 데이터가 전체 데이터에 대한 반영이 이루어지지 않은 경우(train 데이터가 적은 경우)

 

Underfitting

  • 일부의 Feature에만 집중되어 학습된 상황
  • 예측값이 실제값과 멀어져서 예측되어짐
  • 데이터해석 능력 저하
  • High bias, 과편향
  • 여러 가지 입력에 제대로 반응 불가
  • 새로운 데이터를 너무 잘 예측하는 상황(True=True로 예측, False=True로 오판 확률도 높음)

 

Overfitting / Underfitting 판단 

Train/Validation/Test data의 loss 또는 Accuracy로 판단

→ 데이터의 의존성이 크다

 

현장/실제 상황에 가장 가까운 데이터를 많이 모아야 하고

데이터를 train/validation/test로 구분할 때 분포도가 잘 분배될 수 있도록 해야 한다.

 

 

Overfitting 방지 방법

학습 및 테스트 데이터셋 구분

  • 모델링에 사용할 데이터셋을 학습 데이터셋과 테스트 데이터셋으로 구분해서 사용
  • 학습 데이터와 테스트 데이터의 비율을 7:3이나 8:2 정도 사용

 

k겹 교차 검증

  • 데이터 셋을 7:3 비율로 나눴다면 테스트셋은 겨우 전체 데이터의 30%만 사용하게 된다.
  • 이 경우 30%의 테스트만으로 모델이 실제로 잘 작동하는지 확신하기는 쉽지 않다

  • 데이터셋을 여러 개로 나누어 하나씩 테스트셋으로 사용하고 나머지를 모두 합해서 학습셋으로 사용하는 방법
  • 데이터의 100%를 테스트셋으로 사용할 수 있다.

 

Early Stopping

  • 오버피팅 현상 발생 시 조기 학습 종료
  • 학습데이터와 검증용 데이터로 나눠서 학습 시 학습 현황을 관찰하여 오버피팅 현상 일어날 경우 조기에 학습 종료

 

Dropout 규제 방법 사용

  • 제프리 힌튼이 2012년에 제안
  • 매 학습 단계에서 각 노드를 일정 비율로 학습에서 무시하는 것
  • 매 epoch마다 일정 비율로 perceptron를 제외하고 학습

 

Data Augmentation (데이터 증식)

  • 모든 데이터를 전부 수집하는 것은 현실적으로 불가능하기 때문에 실제와 같은 훈련 데이터를 생성하는 것
  • 사람이 인공적으로 만든 샘플인지 구분할 수 없어야 함
  • white noise를 추가하는 것은 도움이 되지 않음-> 적용한 수정사항이 학습 가능한 것이어야 함
  • 이미지 데이터 증식할 때 유용

 

Shallow Learning(모델 간소화)

  • Hidden layer와 Perceptron(node)를 간소화하여 모델링

 

Batch Nomalization

  • 학습을 제대로 안정적으로 빠르게 진행시키기 위해 고려되었으나 추가적으로 Overfitting 감소 효과도 있음
  • Layer와 Layer 사이에 Normalization을 추가
  • 각각의 스칼라 Feature들을 독립적으로 정규화 하는 방식으로 진행
  • 각각의 Feature들의 Mean 및 Variance를 0과 1로 정규화 하는 것
  • Deep Neural Network 의 Internal covariate shift를 피하자

 

Internal Covariate Shift

  • train data를 가지고 학습 할 때, 이전 레이어의 값이 다음 레이어에 값을 전달하는 형태이므로 결국 이전 레이어의 값 따라 다음 레이어의 가중치 값에 영향을 미침
  • 아무런 규제 없이 가중치들이 학습하다보면 모델 파라미터가 제멋대로 범위가 넓어지거나 퍼지게 되어 있음. 또한 모델 파라미터 값들의 변동이 심해지는데 현상을 말함

 

Batch Nomalization 연산

  • 각각의 스칼라 Feature들을 독립적으로 정규화 하는 방식으로 진행
  • 각각의 Feature들의 Mean 및 Variance를 0과 1로 정규화 하는 것

입력받은 모든 값들의 평균을 구한다

B는 batch를 의미하므로 μB는 Batch 사이즈만큼의 feature들의 평균을 의미

 

구한 평균을 기반으로 입력받은 모든 값들의 분산을 구함

 

구한 평균과 분산을 기반으로 0~1사이로 정규화를 시킴

0~1의 정규화를 시키면 역전파알고리즘 효과를 줄임

→ 문제를 해결하기 위해 scale과 shift 적용

γ와 β를 통해 nomalize된 값을 scale과 shift를 해주는데

이 값을 학습을 통해 찾게되는 이는 결국 representation power를 유지해주는 역할

 

 

Benefits of BN

  • Increase learning rate
  • Remove dropout
  • Reduce L2 weight decay
  • Accelerate learning rate decay
  • Remove local response normalization

 

Regularization

 

기타 방법

  • Parameter Norm Penalties
  • Dataset Augmentation
  • Noise Robustness: to input, weights, and output
  • Semi-Supervised Learning = learning a representation
  • Multitask learning
  • Parameter Tying and Parameter Sharing
  • Sparse representation
  • Bagging and Other Ensemble Methods
  • Adversarial Training

 

Summary

Netrual Network 한계 대표 해결법

  • Batch Normalization
  • Dropout
  • Regulation
  • Small Model
  • Data Augmentation
  • 새로운 Activation 함수
  • 최적의 Optimizer

 

학습 시 중요한 것

  • 데이터를 모을 때 실제 현장과 비슷하거나 발생할 모든 케이스의 데이터를 많이 모아야 함
  • 학습/검증/시험 데이터를 나눠서 학습 시 성능 확인을 하고 overfitting 확인 해야 함
  • 데이터를 나눌 때 분포가 고르게 되어야 함
  • 학습 모델 weight가 고루 잘 퍼져 있는게 일반적으로 잘 학습되었다고 할 수 있음
  • 최적의 learning rate, 모델 파라미터 초기값, 모델 설계, batch size, ecoch 등을 검증해야 함
  • 검증 데이터는 학습 시 모델 업데이트에 적용되지 않아야 함

References

728x90
반응형

'Machine Learning > Deep Learning' 카테고리의 다른 글

epoch, batch size, iteration  (0) 2022.12.08
[Machine Learning] Neural Network  (0) 2021.03.03
[Machine Learning] Perceptron  (0) 2021.02.27