본문 바로가기
AI

ML & DL : 오류를 막는 방법

by 월곡동로봇팔 2020. 3. 8.

2019/10/24 - [machine_learning] - Machine-Learning & Deep-Learning 오류

 

Machine-Learning & Deep-Learning 오류

딥러닝에서 흔히 일어나는 오류들을 정리 1. Learning Rate 조정 !! large learning rate : overshooting = rate가 너무 크면 step이 너무커서 발산해버릴 수도 있다. small learning rate : 너무 오래걸리고 이게..

mambo-coding-note.tistory.com

위 글에서 ML & DL의 오류에 대해서 공부했다.

 

여기서는 이를 어떻게하면 해결할 수 있는지에 대해 적을 예정이다.

1. training set을 많이 가져야 한다. -> overfitting

모델은 데이터의 양이 적을 경우, 해당 데이터의 특정 패턴이나 노이즈까지 쉽게 암기하기 되므로 과적합 현상이 발생할 확률이 늘어난다.

그렇기 때문에 데이터의 양을 늘릴 수록 모델은 데이터의 일반적인 패턴을 학습하여 과적합을 방지할 수 있다.


2. data의 중복 제외 -> overfitting

data가 중복이 제외되있다면, 잘 확인해서 지워줘서 model의 성능을 올려야한다.

data의 중복은 정규화를 통해 진행한다. 간단히 말하면 data가 담겨있는 DB를 중복된 data를 없애거나 목적에 맞게 재조합, 재배열을 하여, 보다 나은 성능을 위해 한다.

 

위의 내용 DB 정규화를 자세히 보고싶으면 참고하면 좋을듯 https://wkdtjsgur100.github.io/database-normalization/

 

 

데이터베이스 정규화 개념 설명 및 예제

해당 글에서는 1~3 정규화(1~3NF)에 대해서 작성되어 있습니다.

wkdtjsgur100.github.io


3. Dropout -> overfitting

드롭아웃은 학습 과정에서 신경망의 일부를 사용하지 않는 방법입니다.

예를 들어 드롭아웃의 비율을 0.5로 한다면 학습 과정마다 랜덤으로 절반의 뉴런을 사용하지 않고, 절반의 뉴런만을 사용합니다.

드롭아웃은 신경망 학습 시에만 사용하고, 예측 시에는 사용하지 않는 것이 일반적입니다.

학습 시에 인공 신경망이 특정 뉴런 또는 특정 조합에 너무 의존적이게 되는 것을 방지해주고, 매번 랜덤 선택으로 뉴런들을 사용하지 않으므로 서로 다른 신경망들을 앙상블하여 사용하는 것 같은 효과를 내어 과적합을 방지합니다.

 

model = Sequential() 
model.add(Dense(256, input_shape=(max_words,), activation='relu')) 
model.add(Dropout(0.5)) # 드롭아웃 추가. 비율은 50% 
model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) # 드롭아웃 추가. 비율은 50% 
model.add(Dense(num_classes, activation='softmax'))

4. Normalization , 정규화 --> Data Gap

출처 : http://hleecaster.com/ml-normalization-concept/

목적

첫 번째 그림을 보면, 기존 데이터는 0~100 까지 범위에 있기 때문에 데이터가 분리되지 않아서, 알아보기 힘들다. 따라서 밑에처럼 데이터의 범위를 줄여줘서 정규화를 시켜서 데이터가 더 분리되서 알아보기 편하게 만들 수 있다.

혹은 zero-centered data, normalized data 을 함으로써 데이터가 중앙에서 벗어난 경우를 중앙으로 들어오게 할 수 있다. 이렇게 하면 데이터 분석이 더 용이하다.

또는 추정하는 값이 어느 특정 지점에 오게하기 위해 normalized 한다. 이는 내가 특정 지점으로 데이터를 center 하기 위해 쓰는 기법이다. 알아두면 좋다.

 

정규화를 하는 목적은 data가 기존의 raw한 data로써 가지는 편향성, bias를 잡아주면서 쓸데없는 부분을 model이 fitting하지 않도록 하는 전처리 기법이다.

종류

정규화 기법은 두 가지가 존재한다.

 

1. Min-Max Normalization

하나는 min-max를 기준으로 정규화를 하는 작업이다.

# Min-Max Normalization
def min_max_scaler(data):
    # (data, 0) 0은 axis 이다. 
    numerator = data - np.min(data, 0)
    denominator = np.max(data, 0) - np.min(data, 0)
    # noise term prevents the zero division
    return numerator / (denominator + 1e-7)

보기 예시처럼 최솟값과 최댓값을 기준으로 정규화를 진행한다..

 

2. Z-Score Normalization

standardization 을 통해 표준화를 시켜 위의 문제를 해결할 수도 있다. (Z = (X-mean) / sigma)

 

# Z-Score Normalization
def z_score_normalize(lst):
    normalized = []
    for value in lst:
        normalized_num = (value - np.mean(lst)) / np.std(lst)
        normalized.append(normalized_num)
    return normalized

5. weight regularization 일반화 -> Data Gap, Prevent Overfitting

출처 : https://www.globalsoftwaresupport.com/regularization-machine-learning/

위의 그림은 오른쪽 그림이 overfitting 된 것이다. 그래서 우리는 왼쪽 그림처럼 overfitting을 막고, 전반적인 데이터에 맞는 모델을 구성해야한다.

Regularization은 cost function이 너무 data에 최적화되는 것을 방지, 즉 cost function에서 너무 minimize한 cost로 가지 않도록 penalty를 부여한 것이고, 그 penalty의 함수에 따라 L1, L2 로 나뉜다.

  • L1 규제 : 가중치 w들의 절대값 합계를 비용 함수에 추가합니다. L1 노름이라고도 합니다.
  • L2 규제 : 모든 가중치 w들의 제곱합을 비용 함수에 추가합니다. L2 노름이라고도 합니다.

L1 규제는 기존의 비용 함수에 모든 가중치에 대해서 λw를 더 한 값을 비용 함수로 합니다. L1 규제는 미분이 불가능한 함수이기 때문에, Gradient Learning에는 잘 맞지 않는다.

L2 규제는 기존의 비용 함수에 모든 가중치에 대해서 λw**2를 더 한 값을 비용 함수로 합니다. L2 규제는 미분이 가능하므로, Gradient Learning에서 굉장한 effiecient 를 보인다.

 

λ는 규제의 강도를 정하는 하이퍼파라미터입니다. 

λ가 크다면 모델이 훈련 데이터에 대해서 적합한 매개 변수를 찾는 것보다 규제를 위해 추가된 항들을 작게 유지하는 것을 우선한다는 의미가 됩니다.

 

참고 : https://light-tree.tistory.com/125

 

딥러닝 용어 정리, L1 Regularization, L2 Regularization 의 이해, 용도와 차이 설명

제가 공부하고 정리한 것을 나중에 다시 보기 위해 적는 글입니다. 제가 잘못 설명한 내용이 있다면 알려주시길 부탁드립니다. 사용된 이미지들의 출처는 본문에 링크로 나와 있거나 글의 가장 마지막에 쓰여 있습..

light-tree.tistory.com


6. Model 의 복잡성을 줄이기 -> model complexity

인공 신경망의 복잡도는 은닉층(hidden layer)의 수나 매개변수의 수 등으로 결정됩니다.

과적합 현상이 포착되었을 때, 인공 신경망 모델에 대해서 할 수 있는 한 가지 조치는

인공 신경망의 복잡도를 줄이는 것 입니다. 즉 layer의 수를 줄이는 것이다.

  • 인공 신경망에서는 모델에 있는 매개변수들의 수를 모델의 수용력(capacity)이라고 하기도 합니다.

7. ReLU & Leaky ReLU -> Gradient Vanishing

2020/03/08 - [machine_learning/DL] - DL : Deep Learning 개요 : 인공 신경망, Activation Function

 

DL : Deep Learning 개요 : 인공 신경망, Activation Function

1. Feed-Forward Neural Network 2. Fully-Connected Layer, Dense Layer 어떤 층의 모든 뉴런이 이전 층의 모든 뉴런과 연결되어있는 층을 전결합층이라고 한다. 위의 그림에서 FFNN에 해당한다. 3. 활성화 함수..

mambo-coding-note.tistory.com

시그모이드 함수를 사용하면 입력의 절대값이 클 경우에 시그모이드 함수의 출력값이 0 또는 1에 수렴하면서 기울기가 0에 가까워집니다. 그래서 역전파 과정에서 전파 시킬 기울기가 점차 사라져서 입력층 방향으로 갈 수록 제대로 역전파가 되지 않는 기울기 소실 문제가 발생할 수 있습니다.

 

기울기 소실을 완화하는 가장 간단한 방법은 은닉층의 활성화 함수로 시그모이드나 하이퍼볼릭탄젠트 함수 대신에 ReLU나 ReLU의 변형 함수와 같은 Leaky ReLU를 사용하는 것입니다.

  • 은닉층에서는 시그모이드 함수를 사용하지 말고, ReLU or Leaky ReLU 함수의 변형을 사용하기
  • Leaky ReLU를 사용하면 모든 입력값에 대해서 기울기가 0에 수렴하지 않아 죽은 ReLU 문제를 해결.

8. 그래디언트 클리핑(Gradient Clipping) -> Gradient Exploding

그래디언트 클리핑은 말 그대로 기울기 값을 자르는 것을 의미합니다.

  • 기울기 폭주를 막기 위해 임계값을 넘지 않도록 값을 자릅니다. 다시 말해서 임계치만큼 크기를 감소시킵니다.
  • 이는 RNN에서 유용합니다. RNN은 BPTT에서 시점을 역행하면서 기울기를 구하는데, 이때 기울기가 너무 커질 수 있기 때문입니다. 
from tensorflow.keras import optimizers
Adam = optimizers.Adam(lr=0.0001, clipnorm=1.)

9. 가중치 초기화(Weight initialization) -> Gradient

같은 모델을 훈련시키더라도 가중치가 초기에 어떤 값을 가졌느냐에 따라서 모델의 훈련 결과가 달라지기도 합니다.

다시 말해 가중치 초기화만 적절히 해줘도 기울기 소실 문제과 같은 문제를 완화시킬 수 있습니다.

1) 세이비어 초기화(Xavier Initialization) -> S자 형태 함수 최적화

이 방법은 균등 분포(Uniform Distribution) 또는 정규 분포(Normal distribution)로 초기화 할 때 두 가지 경우로 나뉘며, 이전 층의 뉴런 개수와 다음 층의 뉴런 개수를 가지고 식을 세웁니다. 이전 층의 뉴런의 개수를 nin, 다음 층의 뉴런의 개수를 nout이라고 해봅시다.

 

논문에서는 균등 분포를 사용하여 가중치를 초기화할 경우 다음과 같은 균등 분포 범위를 사용하라고 합니다.

WUniform(√(6 / (nin+nout)) + √(6 / (nin+nout)) 다시 말해 √(6 / (nin+nout))를 m이라고 하였을 때, m +m 사이의 균등 분포를 의미합니다.

 

정규 분포로 초기화할 경우에는 평균이 0이고, 표준 편차 σ가 다음을 만족하도록 합니다.

σ=2/ (nin+nout)

 

세이비어 초기화는 여러 층의 기울기 분산 사이에 균형을 맞춰서 특정 층이 너무 주목을 받거나 다른 층이 뒤쳐지는 것을 막습니다.

세이비어 초기화는 시그모이드 함수나 하이퍼볼릭 탄젠트 함수와 같은 S자 형태인 활성화 함수에 적용해야한다.

2) He 초기화(He initialization)

He 초기화(He initialization)는 세이비어 초기화와 유사하게 정규 분포와 균등 분포 두 가지 경우로 나뉩니다.

다만, He 초기화는 세이비어 초기화와 다르게 다음 층의 뉴런의 수를 반영하지 않습니다. 전과 같이 이전 층의 뉴런의 개수를 nin이라고 해봅시다.

 

He 초기화는 균등 분포로 초기화 할 경우에는 다음과 같은 균등 분포 범위를 가지도록 합니다.

W∼Uniform(−√(6/nin),  +√(6/nin)

정규 분포로 초기화할 경우에는 표준 편차 σ가 다음을 만족하도록 합니다.

σ=√(2/nin)

  • ReLU 계열 함수를 사용할 경우에는 He 초기화 방법이 효율적입니다.
  • ReLU + He 초기화 방법이 좀 더 보편적입니다.

10. 배치 정규화

https://wikidocs.net/61375

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

너무 길어서 이 부분은 이 부분 읽고 이해하자.

댓글