overfitting
모델을 학습시킬 때, 우리는 학습의 과적합을 막고 그 성능을 높이고자 다양한 기법들을 사용 한다. 데이터를 조건에 맞게 scaling 하거나 학습 과정을 변경할 수도 있다. 그 중에서도, 자주 사용하는 방법을 크게 2가지로 나눠보면 아래와 같다.
batch normalization
batch normalization 은 layer의 연산 결과를 다음 입력으로 보내기 전에 평균 0, 표준편차 1로 정규화하는데 사용한다. 각 층의 network마다 들어오는 입력의 분포가 제각각 다른 것을 어느 정도 맞춰주어 학습이 한쪽으로 쏠리는 것을 방지할 수 있다. 아래의 코드처럼 비선형 함수 앞, 연산을 수행하는 layer 뒤에 위치하여 연산의 결과를 원하는 분포로 나오게 한다.
keras.Sequential([
# ...
model.add(Conv2D(filters = 50, ... ))
model.add(BatchNormalization())
model.add(Activation('relu'))
# ...
])
regularization
학습 결과를 scaling 하는 위의 개념과는 다르게, 학습 중인 weight 값 자체에 제약을 거는 방법이다. cs231n에서는 학습에 penalty 를 준다고 설명했는데 좋은 표현이라고 생각한다. dropout 으로 예를 들면 이해하기 쉬울 것 같아서 keggle의 dropout 을 시각화하고 적용한 코드를 가져왔다.
https://www.kaggle.com/code/ryanholbrook/dropout-and-batch-normalization/tutorial
keras.Sequential([
# ...
model.add(Flatten())
model.add(Dense(50, activation = 'relu', ... ))
model.add(Dropout(0.5)) # apply 50% dropout to next layer
# ...
])
비선형 함수까지 거친 뒤에 sum하는 과정에서 dropout layer를 넣어 network 중 일부를 생략하고 계산하는 방법이 dropout이다. 여기서 rate = 0.5이므로 절반의 확률로 값들이 sum됨을 알 수 있다. 이는 랜덤 선택된 network는 학습에 영향을 끼치지 않게 하여 너무
딱 맞게 학습되는 것을 막아준다. 또한 각각의 network가 서로에게 주는 영향이 줄어들기 때문에 좀 더 좋은 feature를 얻을 수 있게 한다.
그 외에도 l1 ,l2 모두 regularization의 한 방법이라고 생각할 수 있다. 위에서는 구분했지만
결국 목적은 학습의 overfitting을 막고 더 나은 학습을 위한다는 점에서 같다. 이제 할 일은
그 방법들을 적절한 곳에 잘 활용할 수 있도록 하는 것이겠다.
Author And Source
이 문제에 관하여(overfitting), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@heyme/overfitting저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)