본문 바로가기
[파이썬]/딥러닝

[딥러닝] 신경망 계층 추가방법 및 성능향상방법(옵티마이저; Optimizer+학습률(learning_rate)+모멘텀(Momentum))

by sung min_Kim 2024. 1. 4.


 이번 글에서는 "신경망 계층 추가방법 및 성능 향상방법(옵티마이저)"에 대한 방법들을 살펴보려 한다.
차례와 사용 툴 및 라이브러리는 아래와 같다.

 [차례]
첫 번째, 신경망계층 추가 | Loss, Metrics | 옵티마이저 
두 번째, 옵티마이저 - 학습률(Learing Rate) 적용하기

세 번째, 모멘텀(Momentum) 적용하기

 [사용 툴]

- Jupyter notebook(웹 기반 대화형 코딩 환경)
 
 [사용 라이브러리 및 모듈]

  • 머신러닝 라이브러리 및 모델: scikit-learn
    - sklearn.model_selection.train_test_split: 훈련 및 테스트 데이터 세트 분리

  • 딥러닝 라이브러리 및 모델: TensorFlow
    - tensorflow.keras: 사용자 친화적 인터페이스를 제공하는 TensorFlow의 고수준 API

 


신경망 계층 추가
+ Loss, Metrics
+ Opimizer

 

1. 라이브러리 정의 및 데이터 수집
1.1 라이브러리 정의


 딥러닝의 인공신경망을 모델링하기 위해 'tensorflow', 'keras' 라이브러리를 호출한다. 또한, 결과의 일관성을 보장하기 위해 난수 시드를 설정하고, 연산 고정 옵션을 활성화한다. 이를 통해, 모델의 훈련 과정이나 결과를 다른 실무자들이 재현할 수 있도록 도와준다. 이는 실제 서비스 환경에서도 중요한 요소이다.

import tensorflow as tf
from tensorflow import keras

# 실행 결과의 일관성을 위한 난수 시드 설정
tf.keras.utils.set_random_seed(42)

# 연산의 결정성을 확보하기 위한 연산 고정 처리
tf.config.experimental.enable_op_determinism()

from sklearn.model_selection import train_test_split

 

1.2 데이터 수집


 keras 라이브러리에서 제공하는 'fashion_mnist' 패션 데이터셋을 로드하면, 훈련 데이터셋(train_input, train_target)과 테스트 데이터셋(test_input, test_target)이 튜플 형태로 반환된다.

 이 데이터셋은 픽셀 값으로 구성된 3차원 이미지 배열을 포함하고 있으며, 여기서 3차원 배열은 색상, 이미지의 높이, 너비를 의미한다. 픽셀값은 0부터 255 사이의 정수로, 총 256개의 다른 색상 값을 나타내며, 이는 이미지의 밝기 또는 그레이스케일 값을 나타낸다.

 따라서, 훈련 및 테스트 데이터셋의 독립변수는 3차원 배열의 픽셀 데이터를, 종속변수는 1차원 배열의 이미지 데이터의 레이블(옷의 종류를 나타내는 정수)을 담게 된다.

(train_input, train_target), (test_inpurt, test_target) = keras.datasets.fashion_mnist.load_data()

print(train_input.shape, train_target.shape)
print(test_inpurt.shape, test_target.shape)

훈련 및 테스트 데이터

 

2. 데이터 전처리
2.1 데이터 스케일링


 픽셀 데이터는 0에서 255까지의 큰 범위폭을 갖는 값을 가지고 있기 때문에, 최소값과 최대값 사이를 0과 1 사이로 압축하는 데이터 스케일링(일반화) 과정을 수행한다. 이 작업은 전용 라이브러리 함수를 사용하거나, 단순히 모든 픽셀 값을 '255'로 나누는 산술 연산을 통해 수행할 수 있으며, 여기서는 후자의 방법을 사용하여 데이터 스케일링을 진행한다.

train_scaled_255 = train_input / 255.0
train_scaled_255[0]

test_sclaed_255 = test_inpurt / 255.0
test_sclaed_255[0]

train_scaled_255.shape, test_scaled_255.shape

 

2.2 데이터 분리


 앞서 'fashion_mnist' 패션 데이터셋을 훈련 데이터와 테스트 데이터로 분리하였고, 이후에는 훈련 데이터를 다시 8:2 비율로 나누어 추가적으로 검증 데이터셋을 생성한다. 검증 데이터셋은 모델을 평가하고 조정하는 과정에서 활용된다.

train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled_255, train_target,
                                                                      test_size=0.2,
                                                                      random_state=42)

print(train_scaled.shape, train_target.shape)
print(val_scaled.shape, val_target.shape)

훈련 및 검증 데이터

 

3. 인공신경망 모델 구축


 keras 라이브러리의 'Sequential' 함수를 사용하여, 빈 인공신경망 모델(model)을 구축한다. 'Sequential' 모델은 여러 계층(layer)을 순서대로 쌓아 놓은 것으로, 각 계층은 하나의 입력 데이터를 받아 처리하고, 그 결과로 출력 데이터를 생성한다. 이 출력 데이터는 다음 계층의 입력 데이터가 된다. 이런 식으로 데이터가 계층을 거치면서 변환되고, 최종적으로 모델의 출력 데이터가 생성된다.

model = keras.Sequential()
model

인공신경망 구축

 

4. 인공신경망 계층 추가
4.1 입력 계층(Input Layer) 추가 - 전처리 계층(Flatten)


 keras 라이브러리의 'Flatten' 함수를 사용하여, 모델에 전처리 계층인 Flatten을 추가할 수 있다. Flatten 계층은 고차원 데이터를 1차원으로 변환하는 역할을 한다. 이는 주로 이미지 데이터와 같이 2차원 이상의 차원을 가진 데이터를 처리할 때 사용된다. 이 과정은 데이터의 구조를 변환하지만, 데이터의 내용 자체는 변경하지 않으므로 모델의 훈련에 직접적인 영향을 미치지는 않는다.

 Flatten 계층은 일반적으로 입력 계층(input layer) 바로 다음에 위치하거나, 경우에 따라서는 입력 계층 자체로 사용되기도 한다. 이는 신경망이 1차원 데이터를 필요로 할 때, 고차원 입력을 적절하게 처리할 수 있게 해 준다.

model.add(    
    keras.layers.Flatten(input_shape=(28, 28))
)

 

4.2 은닉 계층(Hidden Layer) 추가


 은닉 계층은 출력 크기를 '100'으로 설정하였다. 이는 이 계층이 100개의 특성(뉴런)을 가지며, 이 특성(뉴런)들이 모델의 입력을 받아 처리하는 역할을 한다는 의미이다. 각 특성(뉴런)은 입력 데이터의 다른 특징을 학습하게 된다.

 활성화 함수로는 'relu'를 사용하였다. relu는 'Rectified Linear Unit'의 약자로, 음수 입력에 대해 '0'을 출력하고, 양수 입력에 대해 입력 그대로를 출력하는 함수이다. 이 함수는 '비선형성'을 제공하여 모델이 복잡한 패턴을 학습하는 데 도움을 준다.

 따라서, 이 은닉 계층은 입력 계층에서 넘겨받은 출력을 비선형으로 변환하여 모델의 예측 성능을 향상시킨다. 이 계층을 통해 모델은 입력 데이터의 다양한 특징을 학습하고 이를 바탕으로 더 정확한 예측을 수행할 수 있게 된다.

model.add(
    keras.layers.Dense(100, activation="relu")
)

 

4.3 출력 계층(Output Layer) 추가


 출력 계층에서는 출력 크기를 '10'으로 설정하였다. 이는 모델이 최종적으로 10개의 다른 클래스(ex. 티셔츠, 청바지 등) 중 하나를 예측해야 하는 다중 클래스 분류 문제를 해결하는 데 사용한다. 각 특성(뉴런)은 각각의 클래스에 대응하며, 그 출력값은 해당 클래스가 '정답일 확률'을 나타낸다.

 활성화 함수로 사용한 'softmax'는 이러한 확률을 계산하는 데 사용되며, 모든 클래스에 대한 확률의 합이 '1'이 되도록 만든다.

 따라서, 이 출력 계층은 은닉 계층으로부터 받은 출력을 처리하여 '10'개의 확률 값을 반환한다. 이 값들은 각각의 클래스가 정답일 확률을 나타내며, 이 중 가장 큰 값을 가진 클래스가 모델의 최종 예측 결과가 된다.

model.add(
    keras.layers.Dense(10, activation="softmax")
)

 

4.4 계층 확인하기


 summary 함수를 사용하여, keras 모델의 구조를 자세히 살펴볼 수 있다. 이 함수는 각 계층의 이름(Layer), 계층 유형(type), 출력 크기(Output Shape), 그리고 해당 계층의 매개변수(Param)의 수를 보여준다. 특히, 'Param' 열은 각 계층에서 학습할 수 있는 가중치와 편향의 총 수를 나타내며, 하단의 'Trainable params'는 훈련 과정에서 업데이트될 수 있는 매개변수의 수를, 'Non-trainable params'는 훈련 과정에서 업데이트되지 않는 매개변수의 수를 의미한다.

 전처리된 입력 계층인 'Flatten'은 데이터를 1차원으로 평면화하는 역할을 수행하며, 훈련 가능한 매개변수가 존재하지 않아 '0'으로 표시된다. 

model.summary()

모델 구조 확인

 

5. 인공신경망 모델 설정
5.1 Loss, Metrics

 
 모델 설정(compile) 단계에서는 모델의 성능을 평가하고 개선하기 위한 핵심 요소들을 설정한다. 이는 손실함수 'loss'와 모델 성능 평가 지표인 'metrics', 그리고 최적화 알고리즘이 포함된다. 손실함수 'loss'는 모델의 예측값과 실제값 사이의 차이를 수치로 표현하는 함수로, 이 값을 최소화하는 방향으로 모델을 학습시킨다. 이때 사용되는 손실 함수의 종류는 아래와 같다.

  • categorical_crossentropy: 원-핫 인코딩 된 레이블이 있는 다중 분류 문제에 사용된다. 예를 들어, 레이블이 [0, 1, 0]과 같이 주어질 때 적합하다.

  • sparse_categorical_crossentropy: 레이블이 정수 형태로 주어진 다중 분류 문제에 사용된다. 예를 들어, 레이블이 0, 1, 2와 같이 주어질 때 적합하다.

  • binary_crossentropy: 두 개의 클래스를 가진 이진 분류 문제에 사용된다. 예를 들어, 레이블이 0 또는 1로 주어질 때 적합하다.

 

 'metrics'는 모델의 성능을 평가하는 지표로, 일반적으로 분류 문제에서는 'accuracy'(정확도)를 사용한다. 또한, 최적화 알고리즘은 모델의 가중치를 업데이트하는 방식을 결정한다. 이 부분에 대해서는 아래 '5.2 Optimizer'에서 다루도록 하겠다.

model.compile(
    optimizer="sgd",
    loss="sparse_categorical_crossentropy",
    metrics="accuracy"
)

 

5.2 Optimizer


 옵티마이저(Optimizer)는 모델의 손실을 줄이는 방법을 설정하는 역할을 한다. 이는 모델 학습 과정에서 중요한 요소로, '경사하강법'이라는 방식을 기반으로 한다. 경사하강법이란 모델의 손실을 줄이는 방향을 찾아 점차 그 방향으로 이동하는 방법을 의미한다.

출처 : slideshare.net/yongho

 위 그림에서 볼 수 있듯이, 옵티마이저는 어떤 방향으로 이동할지(파란색 화살표)와 얼마나 이동할지, 즉 학습률(빨간 화살표)을 결정하는 과정에서 중요한 역할을 한다. 즉, 옵티마이저는 모델의 학습률과 이동 방향을 결정하여 모델의 성능을 최적화한다.

 다루어볼 옵티마이저의 종류로는 'Adam', 'SGD', 'RMSProp', 'Adagarad' 등이 있다. 각 옵티마이저는 서로 다른 방법으로 모델의 손실을 줄이며, 상황에 따라 적합한 옵티마이저를 선택하는 것이 중요하다.

  •  SGD(확률적 경사하강법): 현재 위치에서 손실이 가장 크게 줄어드는 방향을 찾아, 그 방향으로 조금씩 이동하는 방법이다.

  • Agagrad: '학습률 감소' 기술을 사용하여, 학습이 진행됨에 따라 학습률을 점차 줄여나가는 방법이다. 초기에는 크게 학습하다가 점차 학습률을 줄여, 더 세밀하게 최적의 값을 찾아간다.

  • RMSProp: Adagrad의 단점인 학습률이 너무 작아져서 학습이 진행되지 않는 문제를 해결한 방법이다. 이 방법은 최근의 기울기를 더 크게 반영하며, 먼 과거의 기울기는 조금만 반영하여 학습률이 '0'이 되는 것을 방지한다.

  •  Adam: '모멘텀(momentum)'과 Adagrad를 결합한 방법으로, 모멘텀은 관성가속도를 사용하여 이동하던 방향으로 유연하게 작동하게 한다. 이 방법은 좋은 결과를 얻을 수 있지만, 과거 데이터를 저장해야 하므로 메모리 사용량이 많다는 단점이 있다

 

6. 인공신경망 모델 학습


 모델 설정이 끝난 후에는, 이 모델을 학습(훈련)시키는 단계가 필요하다. 학습 단계에서는 fit 함수를 사용하여, 스케일링된 훈련 데이터의 독립변수, 종속변수, 그리고 반복 횟수인 'epochs'라는 매개변수를 설정한다. 'eopochs'는 모델 학습을 반복하는 횟수를 의미한다.

 이렇게 설정한 후, 모델 학습을 시작하면 모델은 각 반복마다 손실 함수(loss)의 손실률을 계산한다. 이 손실률은 예측값과 실제값 사이의 차이를 나타내는 지표로, 이 값이 작을수록 모델의 예측 성능이 좋다는 것을 의미한다. 그래서, 모델은 각 반복마다 이 손실률을 최소화하는 방향으로 학습을 진행하게 된다. 이 과정을 통해, 모델의 성능이 개선된다.

 예를 들어, 옵티마이저(optimizer)를 적용하지 않았을 때의 손실률(loss)과 정확도(accuracy)는 각각 0.3394, 0.8809로 나타났지만, 옵티마이저를 적용한 이후에는 이 값들이 개선된 것을 볼 수 있다. 즉, 옵티마이저를 적용함으로써 모델의 학습 성능이 더 좋아진 것을 확인할 수 있다.

model.fit(train_scaled, train_target, epochs=50)

모델 학습 - 손실율(loss) 감소 목적

 

7. 인공신경망 모델 성능 평가


 학습이 완료된 모델의 성능을 평가하기 위해 evaluate 함수를 사용하며, 검증 데이터셋을 해당 함수의 인자로 전달한다. evaluate 함수는 손실값(loss)과 정확도(accuracy)를 반환한다. 이를 통해 모델이 얼마나 잘 학습되었는지, 즉 패턴을 얼마나 잘 학습했는지를 평가할 수 있다.  

score = model.evaluate(val_scaled, val_target)
score

모델 성능 검증


 학습 데이터에 대한 손실값(loss)은 '0.2532'로 낮은 편이지만, 검증 데이터에 대한 손실값은 '1.2146'으로 높게 나왔다. 이를 통해, 모델이 학습 데이터에는 잘 맞지만, 새로운 데이터(검증 데이터)에 대해서는 그렇지 못한 상황을 보여준다. 이를 '과적합(overfitting)'이라고 한다. 이를 해소하기 위한 방법으로 '학습률(learning_rate)'을 적용해 볼 것이다.

 


옵티마이저 - 학습률(Learing Rate) 적용하기


 학습률은 모델 학습의 '보폭'으로 이해할 수 있다. 즉, 모델이 학습 과정에서 한 번에 얼마나 많은 변화를 가져올지를 결정하는 값이다. 이 값이 작을수록 보폭이 작아져, 학습 과정에서 더 세밀하게 최적의 값을 찾아간다.

 학습률은 모델이 '손실함수(loss)의 최솟값'을 찾아가는 과정에서 중요한 역할을 한다. 이때 모델은 스스로 최적의 위치를 찾아 이동하게 되며, 이 과정에서 모델이 스스로 움직일 뿐, 사람의 개입은 이루어지지 않는다.

 일반적으로 사용되는 학습률의 기본값은 '0.01'이며, 값의 범위는 대략 '0.1'부터 '0.0001' 사이에서 조정하게 된다. 사용되는 옵티마이저를 객체로 생성하여 'learing_rate(학습률)' 값을 설정할 수 있다.

 학습률은 모델이 과대적합 또는 과소적합 되는 것을 방지하는 데에도 중요한 역할을 한다. 만일 과대적합이 발생하면 학습률을 줄여 모델의 학습 속도를 늦추고, 반대로 과소적합이 발생하면 학습률을 높여 모델의 학습 속도를 빠르게 한다.

 결국, 과대적합 혹은 과소적합과 관계없이, 모델이 잘 일반화되는 최적의 학습률 값을 찾는 것이 중요하다. 이 값은 다양한 범위의 학습률을 적용하여 튜닝을 수행한 후 결정하게 된다.  


1. 인공신경망 모델 재구축


 새로운 학습률(learining_rate)을 적용한 옵티마이저 객체를 사용하여 모델을 재훈련하기 위해, 우선 새로운 모델을 구축한다. 이전에 학습한 모델의 가중치나 학습 상태를 초기화하고, 새롭게 학습을 진행하기 위함이다.

model = keras.Sequential()
model

인공신경망 재구축

 

2. 옵티마이저 객체 생성 및 학습률 지정


 옵티마이저는 모델 학습 과정에서 손실 함수(loss)의 최솟값을 찾아가는 방법을 결정한다. 이때, 학습률 'learning_rate'는 이 최솟값을 찾아가는 과정에서 모델이 얼마나 빨리 학습하는지를 결정하는 중요한 매개변수이다.

 여기서는 학습률(learning_rate)을 '0.1'로 설정하여, 확률적 경사하강법 방식의 옵티마이저 객체 'sgd'를 생성한다. 이렇게 생성된 'sgd' 객체는 이후 모델 학습에 사용된다. 

sgd = keras.optimizers.SGD(learning_rate=0.1)

 

3. 모델 재설정


 위에서 생성한 옵티마이저 객체 'sgd'를 적용하여, 모델을 재설정한다. 이렇게 설정된 모델은 'sgd' 옵티마이저를 사용하여 학습한다.

model.compile(
    optimizer=sgd,
    loss="sparse_categorical_crossentropy",
    metrics="accuracy"
)

 

4. 인공신경망 모델 재학습


 이제 학습률(learning_rate=0.1)이 적용된 'sgd' 옵티마이저를 사용하여 모델을 재훈련시킨다. 이렇게 학습률을 지정하여 학습시킨 모델의 성능과 이전에 학습률을 지정하지 않고 학습시킨 모델의 훈련 성능을 비교해 보자.

model.fit(train_scaled, train_target, epochs=50)

학습률을 지정한 옵티마이저 사용 - 모델의 훈련 성능
학습률을 지정하지 않은 옵티마이저 사용 - 모델의 훈련 성능


 결과를 보면, 학습률(learning_rate)을 '0.1'로 적용한 옵티마이저 'sgd' 객체를 사용하여 훈련한 모델이, 학습률을 지정하지 않고 훈련한 모델에 비해 약 0.12 낮은 손실률을 보이고, 정확도는 약 0.04 상승한 것을 확인할 수 있다. 이를 통해, 학습률을 적절히 지정한 모델의 훈련 성능이 더 좋다는 것을 알 수 있다.

5. 인공신경망 모델 성능 재평가


 학습률을 적용한 모델의 성능을 평가하여, 검증 데이터(새로운 데이터)에 대한 과적합이 해소되었는지 확인해 볼 것이다.

score = model.evaluate(val_scaled, val_target)
score

학습률을 지정했을 때의 모델 성능
학습률을 지정하지 않았을 때의 모델 성능


 학습률을 지정했을 때와 지정하지 않았을 때의 모델 성능을 비교해 본 결과, 학습률을 지정했을 때 손실률이 약간 감소하고 정확도가 약간 상승한 것을 볼 수 있다. 이를 통해 학습률 조정일정 부분 도움이 되었다는 것을 보여주지만, 여전히 손실률이 높게 나타나는 것으로 보아 과적합은 해소되지 않은 것으로 판단된다.

 학습 과정을 안정화하고, 최적화 과정을 가속화하는 데 도움을 주는 '모멘텀(momentum)'을 적용하여, 과적합을 조금이라도 완화해보고자 한다.


모멘텀(Momentum) 적용하기


 옵티마이저(Optimizer)는 기계 학습 모델을 학 학습 과정에서 모델을 학습시키는 도구라고 생각하면 된다. 이 도구는 모델이 학습하는 방식을 결정하며, 이를 통해 모델이 '배운다'라고 볼 수 있다. 그런데, 이렇게 '배우는' 과정을 좀 더 빠르고 효과적으로 만들어 주는 여러 가지 기법들이 있는데, 그중 하나가 바로 모멘텀(Momentum)이다.

 모멘텀은 '관성'과 비슷한 의미를 가지고 있다. 예를 들어, 언덕에서 공을 굴리면 공은 아래로 계속해서 굴러갈 것이다. 이처럼 모멘텀은 모델이 '학습'하면서 어떤 방향으로 가야 할지를 결정할 때, 이전에 어떤 방향으로 '학습'했는지를 고려하여 그 방향으로 계속해서 나아가도록 도와주는 기법이다.

 모멘텀은 보통 '0.9' 이상의 값을 적용하며, 이 값이 클수록 관성의 효과가 커진다. 또한, 'nesterov=True' 속성을 함께 사용하는 경우가 많으며, 이는 모멘텀 방향보다 조금 더 앞서서 기울기를 계산하여 보다 빠르고 안정적으로 최적의 솔루션에 도달하게 한다.

 이렇게 모멘텀을 이용하면 모델은 '학습'을 좀 더 빠르고 효율적으로 할 수 있게 된다. 특히 SGD와 같은 옵티마이저에 이 모멘텀 기법을 많이 사용한다.

 즉, 모멘텀은 기계 학습 모델이 '배우는' 방향을 잘 잡아주는 '항해사' 같은 역할을 한다고 볼 수 있다.


1. 인공신경망 모델 재구축


 모멘텀(momentum)을 적용한 옵티마이저 객체를 사용하여 모델을 재훈련하기 위해, 새로운 모델을 구축한다. 

model = keras.Sequential()
model

인공신경망 재구축

 

2. 옵티마이저 객체 생성 및 모멘텀 적용


 생성하였던 'sgd' 옵티마이저 객체에 모멘텀(momentum) 값을 '0.9'로 설정한다. 모멘텀은 학습 과정에서 이전의 기울기를 얼마나 반영할지 결정하는 값이다. 이 값이 클수록 이전의 기울기 방향이 더욱 강하게 반영된다. 이렇게 설정한 후, 이 옵티마이저를 사용하여 모델을 학습시켜, 모멘텀이 모델 학습에 어떠한 영향을 미치는지 확인해 보도록 하자.

sgd = keras.optimizers.SGD(
    momentum=0.9, nesterov=True, learning_rate=0.1
)

 

3. 모델 재설정


 이제 모델을 재설정하고, 모멘텀(momentum)을 설정한 옵티마이저 'sgd' 객체를 이용하여 모델을 학습시키도록 설정한다. 이렇게 하면 모델은 이 'sgd' 옵티마이저의 도움을 받아 학습을 진행하게 된다.

model.compile(
    optimizer=sgd,
    loss="sparse_categorical_crossentropy",
    metrics="accuracy"
)

 

4. 인공신경망 모델 재학습


 이제 모멘텀(momentum=0.9)을 적용한 'sgd' 옵티마이저를 사용하여, 모델을 재훈련시킨다. 이렇게 모멘텀을 지정하여 학습시킨 모델의 성능과 이전에 모멘텀을 지정하지 않고 학습시킨 모델의 훈련 성능을 비교해 보자.

model.fit(train_scaled, train_target, epochs=50)

모멘텀을 지정한 옵티마이저 사용 - 모델의 훈련 성능
모멘텀을 지정하지 않은 옵티마이저 사용 - 모델의 훈련 성능


 모멘텀을 적용한 결과, 훈련 데이터에 대한 모델의 성능은 약간 떨어졌다. 손실률이 약 0.24 상승했고, 정확도는 약 0.08 정도 낮아졌다. 이는 모델이 훈련 데이터에 대해 과도하게 적합되는 것을 막았기 때문에 발생한 현상이다. 즉, 모델이 훈련 데이터의 특정 패턴이나 노이즈에 과도하게 반응하지 않고, 더 일반적인 패턴을 학습하려 했기 때문에 훈련 성능이 약간 하락되었다.

5. 인공신경망 모델 성능 재평가


 검증 데이터셋을 활용하여 모델 성능을 평가하고, 모멘텀을 적용하지 않았을 때의 과적합이 완화되었는지를 확인해 볼 것이다.

score = model.evaluate(val_scaled, val_target)
score

모멘텀을 지정했을 때의 모델 성능
모멘텀을 지정하지 않았을 때의 모델 성능


 모델 훈련 성능은 약간 떨어졌지만, 검증 데이터(새로운 데이터)에 대한 모델의 성능은 크게 향상된 것을 볼 수 있다. 손실률은 모멘텀을 적용하지 않은 모델보다 약 0.6 정도 낮아진 '0.5526'으로 나타났고, 이는 모델이 새로운 데이터에 대해 더 잘 일반화되었다는 의미이다.

 정확도는 약 0.0024 정도 낮아진 '0.8574'로 나타났다. 이는 모델이 검증 데이터의 일부를 잘못 분류했음을 의미한다. 하지만 손실률 감소가 정확도 감소보다 매우 높게 나타났으므로, 전반적으로 모델의 성능은 향상되었다고 볼 수 있다.

 결과적으로, 모멘텀을 적용하면 훈련 데이터에 대한 성능은 약간 떨어질 수 있지만, 검증 데이터에 대한 성능, 즉 모델의 일반화 성능은 향상될 수 있으며, 이는 과적합을 완화하는 데 도움이 되는 것으로 나타났다.