본문 바로가기
DL|ML

<혼자 또는 같이하는 머신러닝 스터디 잼> Intro to Deep Learning 코스 요약 (2)

by 이든Eden 2021. 4. 16.

 

4. Overfitting and Underfitting

Interpreting the Learning Curves

학습 데이터가 주는 정보는 signal noise 가지 유형으로 생각할 있다. signal 일반화할 있는 부분이며, 모델 새로운 데이터로 예측을 하는 도움을 주게한다. Noise 학습 데이터에만 해당되는 부분이다. Noise 데이터에서 발생하는 모든 임의의 변동이거나 모델이 실제로 예측하는 도움이되지 않는 모든 부수적이고 정보가 없는 패턴이다. 유용해 보일 있지만 실제로는 그렇지 않은 것이다.

 

Signal, Noise에 대한 설명은 여기를 참고하세요.

epoch(에폭)마다 learning curve 그리면 어떻게 학습되었는지 있다. 그래프를 분석하는 방법을 알아야한다.

 

Training loss는 모델이 signal에 대해 학습하고나 어떤 것이 noise인지 알게되면 줄어든다. 하지만 validation loss는 모델이 signal에 대해 학습할 때만 내려간다. 그래서 모델이 signal을 학습하면 두 loss 커브가 내려가지만, noise를 학습하면 곡선사이에 간격이 생긴다. 간격의 크기를 통해 모형이 학습한 노이즈의 양을 알 수 있다.

 

이상적으로, 우리는 모든 signal 대해 학습하고, 어떤 noise 대해서도 학습하지 않도록 만든다. 하지만 이건 일어나지 않는 일이다. 대신 우리는 거래를 한다. 우리는 모델이 많은 noise 학습하는 대가로 많은 signal 학습하도록 있다. 거래가 우리에게 유리한 , validation loss 계속 줄어들 것이다. 그러나 일정 시점이 지나면 거래가 우리에게 불리해질 있고, loss 증가하기 시작한다.

이러한 trade-off 결과는 모델이 학습될 두가지 문제를 일으킨다: 충분하지 않은 signal 혹은 너무 많은 noise. 실선은 모델이 학습 데이터를 이용해 학습된 후의 결과이고, 점선은 학습되었을 때의 모습이다. Underfitting 모델이 충분히 signal 대하여 학습하지 않아서 손실이 가능한 만큼 낮아지지 않았기 때문에 생긴다. Overfitting 모델이 너무 과하게 많은 noise 학습했기 때문에 손실이 가능한 만큼 낮아지지 않은 경우다. 딥러닝 모델을 학습시키는 방법은 사이의 알맞은 균형을 찾는 일이다.

 

Capacity

모델의 capacity는 모델이 학습 가능한 복잡성의 크기를 말한다. 뉴럴넷의 경우, 이는 뉴런의 수와 뉴런이 어떻게 서로 연결되느냐에 따라 크게 결정될 것이다. 네트워크가 데이터에 적합하지 않은 것으로 나타나면 네트워크 capacity를 늘려야 한다.

 

네트워크 용량을 넓히거나(기존 layer 많은 unit 추가) 깊게( 많은 layer 추가)하여 늘릴 있다. 넓은 네트워크는 많은 선형 관계를 학습하는 쉬운 시간을 갖는 반면, 깊은 네트워크는 많은 비선형 관계를 선호한다. 데이터 셋에 따라 나은 방법이 있다.

 

model = keras.Sequential([
    layers.Dense(16, activation='relu'),
    layers.Dense(1),
])

wider = keras.Sequential([
    layers.Dense(32, activation='relu'),
    layers.Dense(1),
])

deeper = keras.Sequential([
    layers.Dense(16, activation='relu'),
    layers.Dense(16, activation='relu'),
    layers.Dense(1),
])

 

Early Stopping

모델이 noise 너무 열심히 학습할 경우 학습 중에 validation loss 증가하기 시작할 있다고 이야기 했었다. 이를 방지하기 위해 validation loss 이상 줄어들지 않는 것처럼 보일 학습을 중단할 있다. 이런 식으로 학습을 멈추게 하는 것을 early stopping이라고 한다.

from tensorflow.keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(
    min_delta=0.001, # minimium amount of change to count as an improvement
    patience=20, # how many epochs to wait before stopping
    restore_best_weights=True,
)

 

Dropout and Batch Normalization

Dense layer 이외에 더 많은 레이어들이 있다. 어떤 것들은 dense layer과 같이 뉴런 사이의 연결을 정의하며, 다른 종류의 전처리나 변환을 하는 layer도 있다.

 

Dropout

“Dropout layer”는 overfitting을 방지해준다. 이전에 overfitting은 네트워크가 noise 즉, 가짜 패턴에 대하여 학습할 때 일어난다고 했었다. 학습 데이터에 점점 더 구체적으로 모델이 학습되면, 테스트 할 때 이전의 데이터와 비교하여 아주 작은 변화가 있어도 결과는 달라질 수 있다.

 

그래서 랜덤하게 layer마다 units 일부를 임의로 삭제하여, 네트워크가 학습 데이터에서 이러한 가짜 패턴을 학습하는 것을 훨씬 어렵게 만든다. 넓고 일반적인 패턴을 검색하게 만든다.

Adding Dropout
keras.Sequential([
    # ...
    layers.Dropout(rate=0.3), # apply 30% dropout to the next layer
    layers.Dense(16),
    # ...
])

 

Dropout에 대한 더 많은 설명은 여기를 참고하세요(Why disable dropout during validation and testing? 왜 dropout은 validation, testing 동안 적용하지 않을까?)

 

Batch Normalization

“Batch normalization" 레이어는 느리고 불안정한 모델 학습을 나아지게 해준다. 

 

신경망의 경우, 모든 데이터를 scaling(스케일링)하는 것이 좋다. Scikit-learn's StandardScaler나 MinMaxScaler와 같은 것을 사용하는 것이 좋다. 그 이유는 SGD가 데이터가 생성하는 activation의 크기에 비례하여 네트워크 weights(가중치)를 업데이트(이동하기; 원문에서는 shift 사용함) 때문이다. 매우 다른 크기의 activation을 생성하는 경향이 있는 피쳐들은 불안정한 학습 경향을 만들 수 있다.

 

*스케일링. 즉, 데이터를 특정 척도(예: 0-100 또는 0-1)에 맞도록 변환하는 것

 

이제 데이터가 네트워크에 들어가기 전에 데이터를 정규화하는 것이 좋다면 네트워크 내부에서 정규화하는 것이 더 나을 수 있다! 사실, 우리는 이 역할을 할 수 있는 특별한 종류의 layer, batch normalization layer이 있다. Batch normalization layer는 들어오는 각 배치를 살펴보고, 먼저 자체 평균과 표준 편차를 사용하여 배치를 정규화한 다음, 두 개의 학습 가능한 파라미터를 사용하여 데이터를 scaling 한다.

 

대부분의 경우 optimization 프로세스에 보조 도구로서 batchnorm이 추가된다(때로는 성능 예측에도 도움이 될 수 있음). Batchnorm이 있는 모형은 훈련을 완료하는 데 더 적은 시간이 걸린다. 또한 batchnorm은 학습 과정에서 “stuck”하게 할 수 있는 다양한 문제를 해결할 수 있다. 특히 학습 중에 문제가 있는 경우 모델에 batchnorm을 추가하는 것이 좋다.

 

Batch normalization은 레이어의 뒤에 적용할 수도 있고,

layers.Dense(16, activation='relu'),
layers.BatchNormalization(),

또는 레이어 사이에 적용할 수도 있다.

layers.Dense(16),
layers.BatchNormalization(),
layers.Activation('relu'),

 

Binary Classification

 

고객이 구매를 할 가능성이 있는지, 신용카드 거래가 사기인지, deep 우주 신호가 새로운 행성의 증거를 보여주는지, 또는 질병의 의료 테스트 증거를 보여주는지 여부를 예측하고자 할 수 있다. 모두 binary classification 문제이다.

 

Raw data에서는 "Yes" and "No" 혹은 "Dog" and "Cat”으로 표현되어 있을지 모른다. 데이터를 사용하기 전에 class label 바꿔주어야 한다. 예를 들면 클래스는 0 나머지 클래스는 1 말이다.

 

Accuracy and Cross-Entropy

Accuracy는 classification(분류) 문제에서 얼마나 성공적인지를 측정하는 많은 metric(메트릭, 척도) 중 하나다. accuracy = number_correct(측정한 값 중 맞춘 개수) / total(총 측정한 값 개수)로 나타낼 수 있다.

 

Accuracy(및 대부분의 다른 분류 문제의 메트릭)의 문제점은 loss function으로 사용할 수 없다는 것이다. SGD는 부드럽게 변하는 loss function이 필요하지만, accuracy는 카운트의 비율이다. 따라서, 우리는 loss function의 역할을 할 대체할 것을 찾아야다. 이 대체물은 교차 엔트로피 함수이다.

 

이제, loss function은 학습 중에 네트워크의 목표를 정의한다는 것을 기억하자. Regression을 통해 예상 결과와 예측 결과 사이의 거리를 최소화하는 것이 목표였고, 이 거리를 측정하기 위해 MAE를 선택했었다

 

Classification 위해서, 우리가 대신 원하는 것은 확률 사이의 거리이고, 이것이 cross-entropy 제공하는 것이다. Cross-entropy 확률 분포에서 다른 확률 분포까지의 거리에 대한 일종의 척도이다.

 

Making Probabilities with the Sigmoid Function

Cross-entropy accuracy 함수는 입력으로 0부터 1까지의 숫자인 확률을 요구한다. Dense layer 의해 생성된 실제 출력을 확률로 바꾸기 위해, 우리는 새로운 종류의 활성화 함수인 시그모이드 활성화를 사용할 것이다.

 

 

 

와 드디어 끝

두 개만 더 하면 티셔츠 받는다 오예오예 👕