■ 설명 함수의 기울기(Gradient)를 계산하여 손실 함수의 값이 가장 작아지는 방향으로 일정한 크기만큼 이동하는 것. 이 과정을 반복하면서 최적의 매개변수 값을 찾아가는 방법
■ 문제점 1. 극소값(local minimum)에 도달할 수 있다는 것이 증명되었으나 전체 최소값(global minimum)으로 갈 수 있다는 보장은 없음. 극소값에 머물러 있다는 단점. 2. 훈련이 느림
2. Momentum
■ 설명 Optimizer 이며, GD의 문제를 해결하기 위해 보편적으로 사용되는 방법
■ 보완점 관성(momentum)을 적용하여 변수가 가던 방향으로 계속 가도록 속도(velocity)를 추가한 것 global minima에 이르기 전에 기울기가 0이 되는 local minima에 빠지는 것을 방지
■ 문제점 1. 여전한 지역 최솟값 탈출 어려움 2. 수렴 속도의 불안정성 3. 메모리 요구량 증가 4. 하이퍼파라미터 설정의 어려움
최근에는 Momentum의 변형인 Adam과 같은 알고리즘이 개발되어 문제를 해결하고 더 효과적인 최적화를 수행할 수 있게 됨
3. AdaGrad
■ 설명 Momentum이 경사하강법에서 공이 그레디언트의 방향으로 가속도를 더해 이동하는 것에 초점을 맞췄다면, AdaGrad는 각각의 매개변수에 맞게 학습률을 조정하면서 학습을 진행하는 방법. 즉, 'step size'에 초점을 맞춤
AdaGrad는 '적응적 학습률'을 사용하여 각 매개변수에 따라 학습률을 독립적으로 조정. 이 방법은 희소한 데이터에 대해서는 더 큰 학습률을, 빈번한 데이터에 대해서는 더 작은 학습률을 적용
■ 보완점 이미 학습이 많이 된 변수는 학습률을 느리게 하여 더 이상 크게 바뀌지 않도록 하고, 학습이 아직 덜 된 드물게 등장한 변수라면 학습률을 높여 더 빠르게 훈련. 이는 희소한 데이터에 대한 학습을 개선하는 데 도움이 됨.
■ 문제점 AdaGrad는 학습을 계속하면서 각 매개변수에 대한 학습률을 계속 낮추는데, 긴 학습 시간 동안 step size가 너무 작아져서 결국 거의 움직이지 않는 상태가 될 수 있음. 즉, 학습이 너무 느려지거나 완전히 멈출 수 있음.
4. RMSProp
■ 설명 RMSProp은 지수 가중 이동 평균(Exponentially Weighted Moving Average, EWMA)를 사용하여 최신 기울기들이 더 크게 반영되도록 함. Adagrad의 학습률이 너무 작아지는 문제를 보완하기 위해, RMSProp은 가장 최근의 그래디언트를 크게 반영하고, 과거의 그래디언트는 점차 잊어버리는 방식으로 학습률을 동적으로 조정.
■ 보완점 RMSProp의 주요 특징은 최신 기울기에 큰 가중치를 부여하여 중요한 정보를 보다 강조한다는 것. 이를 통해 기울기의 크기에 따라 학습률이 적절하게 조정되어 전역 최솟값을 효과적으로 탐색.
이러한 동적인 학습률 조정은 학습률이 너무 작아지는 문제를 개선하고, 과거의 오래된 그래디언트 정보가 현재의 학습을 방해하는 것을 방지함.
■ 문제점 여전히 하이퍼파라미터 설정에 민감하며, 지역 최솟값에 빠질 수 있는 가능성이 존재. 또한, 이동 평균을 계산하고 유지해야 하므로 메모리 요구량이 증가하기때문에 학습률을 적절하게 설정하는 것이 여전히 중요한 이슈임.
5. Adam
■ 설명 RMSProp와 Momentum을 융합한 방법. 이 방법은 각각의 매개변수에 대해 독립적으로 학습률을 조정하는 것을 가능하게 함.
Adam 알고리즘은 지금까지 계산한 기울기의 지수 평균을 저장하며, RMSProp과 유사하게 기울기의 제곱값의 지수 평균을 저장함. 이 두 가지 정보를 사용하여 학습률을 조정.
■ 보완점 Adam의 가장 큰 장점은 Momentum 방식의 장점과 RMSProp의 장점을 합친 것 즉, Adam은 지역 최솟값에 빠지는 것을 방지하면서도 학습률을 적절하게 조정.
■ 문제점 메모리 요구량이 크며, 학습률 조절이 자동적으로 이루어지기 때문에 학습률 감소 패턴을 파악하기 어려움. 또한, 하이퍼파라미터 설정에도 주의가 필요
그러나 실제로 Adam은 많은 딥 러닝 모델 학습에서 효과적으로 사용되는 일반적인 최적화 알고리즘. 학습 초기에는 학습률을 높게 설정하여 빠르게 최적점을 찾아가고, 학습이 진행됨에 따라 학습률을 낮추어 세밀하게 최적점을 찾아가는 특징 때문에 널리 사용됨.
★ Overfitting과 Early Stopping
6. 과적합 (Overfitting)
■ 설명 과적합은 모델이 학습 데이터에 너무 과도하게 적합화되어, 새로운 데이터에 대한 예측 성능이 저하되는 현상으로 모델이 학습 데이터에만 맞추어져 새로운 데이터에 대해 일반화(generalization) 능력이 부족하게 되는 것
초록색 선은 과적합된 모델을, 검은색 선은 일반 모델
7. Early Stopping
■ 설명 과적합을 방지하기 위한 방법 중 하나
▪ 학습 중 모델의 성능을 모니터링하다가 학습 데이터에 대한 성능은 계속해서 향상되지만 검증 데이터에 대한 성능은 향상되지 않거나 감소하는 지점에서 학습을 조기 종료하는 것
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, accuracy_score
from sklearn.datasets import load_iris
import time
#1. 데이터
datasets = load_iris()
print(datasets.DESCR)
print(datasets.feature_names)
#['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
x = datasets.data
y = datasets.target
print(x.shape,y.shape) # (150, 4) (150,) #input_dim = 4
# ### one hot encoding
# from keras.utils import to_categorical
# y = to_categorical(y)
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.7, random_state=100, shuffle=True
)
print(x_train.shape) #(150, 4) -> (150, 3)
#2. 모델 구성
model = Sequential()
model.add(Dense(100,input_dim=4))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(500))
model.add(Dense(3, activation='softmax'))
#3. 컴파일, 훈련
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam',
metrics=['accuracy','mse'])
start_time = time.time()
hist = model.fit(x_train, y_train, epochs=100, batch_size=50,
validation_split=0.2) #validation data 0.2 (train 0.6 / test 0.2)
end_time = time.time() - start_time
#4. 평가, 예측
loss = model.evaluate(x_test, y_test)
y_predict = model.predict(x_test)
# r2 = r2_score(y_test, y_predict)
# print('r2스코어 : ', r2)
print('걸린 시간 : ', end_time)
# 시각화
import matplotlib.pyplot as plt
plt.figure(figsize=(9,6))
plt.title('Iris_Loss & val_Loss')
plt.plot(hist.history['loss'], marker='.', c='orange', label='loss')
plt.plot(hist.history['val_loss'], marker='.', c='blue', label='val_loss')
plt.ylabel('loss')
plt.xlabel('epochs')
plt.legend()
plt.show()
Train-Test Split은 머신러닝 모델을 평가하기 위해 데이터를 나누는 과정입니다. 일반적으로 데이터는 훈련 데이터와 테스트 데이터로 나누어집니다. 훈련 데이터는 모델을 학습시키는 데에 사용되고, 테스트 데이터는 학습된 모델을 평가하는 데에 사용됩니다.
Train-Test Split의 목적은 모델이 처음에 본 데이터에 대한 예측 성능을 평가하기 위해 사용됩니다. 훈련 데이터로 모델을 학습시킨 후, 테스트 데이터로 모델의 성능을 평가하여 일반화(generalization) 능력을 확인합니다.
일반적으로 데이터의 일정 비율을 훈련 데이터와 테스트 데이터로 나눕니다. 예를 들어, 70%의 데이터를 훈련 데이터로 사용하고, 나머지 30%의 데이터를 테스트 데이터로 사용하는 것은 일반적인 방법입니다. 데이터를 나누는 과정에서 데이터의 순서를 랜덤하게 섞어서 골고루 분포되도록 합니다.
Train-Test Split은 모델의 성능을 정확하게 평가하기 위해 필수적인 과정이며, 모델의 일반화 능력을 신뢰할 수 있도록 도와줍니다.
2. Overfitting
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.datasets import fetch_california_housing
import time
# from sklearn.datasets import load_boston #윤리적 문제로 제공안됨
#1. 데이터
# datasets = load_boston()
datasets = fetch_california_housing()
x = datasets.data
# ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']
y = datasets.target
# MedInc 블록 그룹의 중간 소득
# HouseAge 중간 블록 그룹의 주택 연령
# AveRooms 가구당 평균 객실 수
# AveBedrms 가구당 평균 침실 수
# Population 인구 블록 그룹 인구
# AveOccup 평균 가구 구성원 수
# Latitude 위도 블록 그룹 위도
# Longitude 경도 블록 그룹 경도
print(datasets.feature_names)
print(datasets.DESCR)
print(x.shape) #(20640, 8)
print(y.shape) #(20640,)
x_train, x_test, y_train, y_test = train_test_split(
x, y, train_size=0.6, test_size=0.2, random_state=100, shuffle=True
)
print(x_train.shape) # (14447, 8)
print(y_train.shape) # (14447,)
#2. 모델구성
model = Sequential()
model.add(Dense(8, input_dim=8)) # print(x_train.shape) # (14447, 8) 열 숫자
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(100))
model.add(Dense(1)) # 회귀분석이므로 출력층은 1
#3. 컴파일, 훈련
from keras.callbacks import EarlyStopping
earlyStopping = EarlyStopping(monitor='val_loss', patience=50, mode='min',
verbose=1, restore_best_weights=True)
model.compile(loss='mse', optimizer='adam',
metrics=['accuracy','mse'])
start_time = time.time()
hist = model.fit(x_train, y_train, epochs=5000, batch_size=200,
validation_split=0.2,
callbacks=[earlyStopping],
verbose=1
)
end_time = time.time() - start_time
#4. 평가, 예측
loss = model.evaluate(x_test, y_test)
y_predict = model.predict(x_test)
r2 = r2_score(y_test, y_predict)
print('r2스코어 : ', r2)
print('걸린 시간 : ', end_time)
# 시각화
import matplotlib.pyplot as plt
plt.figure(figsize=(9,6))
plt.title('Califonia Loss & val_Loss')
plt.plot(hist.history['loss'], marker='.', c='orange', label='loss')
plt.plot(hist.history['val_loss'], marker='.', c='blue', label='val_loss')
plt.ylabel('loss')
plt.xlabel('epochs')
plt.legend()
plt.show()
#EarlyStopping은 Keras에서 제공하는 콜백 함수 중 하나로, 특정 조건에 도달하면 모델의 훈련을 일찍 중단하는 역할을 합니다. EarlyStopping의 주요 매개변수는 다음과 같습니다.
#monitor: Early stopping을 결정하는 기준이 되는 데이터를 의미합니다. 'val_loss'는 validation loss를 의미하며, 이 값을 기준으로 early stopping이 결정됩니다.
#patience: 개선이 없다고 바로 종료하지 않고, 개선이 없는 에포크를 얼마나 기다릴지 결정합니다. 예를 들어, patience=50이면, validation loss의 개선이 50번의 에포크 동안 없을 경우 학습을 멈춥니다.
#mode: monitor에 설정된 목표치를 최소화(min)할 것인지, 최대화(max)할 것인지 결정합니다. 예를 들어, 'val_loss'를 모니터링 할 경우 mode는 'min'으로 설정하고, 'val_accuracy'를 모니터링 할 경우 'max'로 설정합니다.
#verbose: Early stopping의 진행 사항에 대한 출력 여부를 결정합니다. verbose=1로 설정하면 언제 훈련이 중단되었는지를 출력합니다.
#restore_best_weights:훈련이 끝난 후 모델의 가중치를 가장 좋은 에포크 시점의 가중치로 복원할지 여부를 결정합니다. 이 매개변수가 True로 설정되면, 가장 좋은 에포크에서의 모델 가중치로 복원됩니다. 이는 early stopping으로 인해 마지막에 저장된 가중치가 최적의 가중치가 아닐 수 있기 때문입니다.
4. Save model
model.save() 함수는 모델의 구조와 가중치를 함께 저장합니다. 따라서 해당함수를 호출하는 위치에 따라 저장되는 내용이 달라집니다.
#1. 만약 model.save()를 model.compile() 이후, model.fit() 이전, 즉 모델 구성이 완료된 후에 호출한다면, 그 시점의 모델 구조와 초기화된 가중치(훈련 전이므로 무작위로 초기화된 값)가 저장됩니다.
#본 사진에서 주석처리한 부분만큼이 model.save_model함수가 저장하는 가중치 영역입니다.
#2. 만약 model.save()를 model.fit() 이후에 호출한다면, 그 시점의 모델 구조와 훈련된 가중치가 함께 저장됩니다.
#본 사진에서 주석처리한 부분만큼이 model.save_model 함수가 저장하는 가중치 영역입니다.
5. Save weight
model.save_weights
model.load_weights
모델의 가중치를 저장하기 위해서는 model.save_weights(filepath) 함수를 사용합니다. 여기서 filepath는 가중치를 저장할 경로를 나타냅니다. 저장된 가중치는 model.load_weights(filepath) 함수를 사용하여 다시 로드할 수 있습니다. #본 사진에서 주석처리한 부분만큼이model.save_weights 함수가 저장하는 가중치 영역입니다.
6. Model Check Point 와 model.save 의 차이
ModelCheckpoint
ModelCheckpoint Keras에서 제공하는 콜백(callback) 중 하나로, 훈련 중간에 모델의 가중치 또는 전체 모델을 저장할 수 있습니다. 이를 통해 훈련 과정에서 얻은 최적의 가중치 또는 모델을 자동으로 저장하여, 훈련이 중단되거나 완료된 후에도 최적의 결과를 사용할 수 있습니다. 일반적으로 ModelCheckpoint는 model.fit()의 callbacks 매개변수를 통해 사용됩니다. 이렇게 사용하면 에폭(epoch)이 끝날 때마다 모델이 저장됩니다. 또한 저장할 모델의 조건을 설정할 수 있습니다(예: 검증 성능이 개선될 때만 저장하기).
예시:
from tensorflow.keras.callbacks import ModelCheckpoint
# ModelCheckpoint 콜백 생성
checkpoint = ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True, mode='min')
# 훈련 중 최적의 모델을 저장하기 위해 ModelCheckpoint 콜백 사용
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_val, y_val), callbacks=[checkpoint])
Model.save
model.save(): 이 방법은 훈련 후 모델 전체(구조와 가중치, 옵티마이저)를 저장하는 메서드입니다. model.save()를 호출하는 시점에 모델의 상태가 저장되며, 훈련 중간에 자동으로 저장되지 않습니다. 따라서 사용자가 코드에서 명시적으로 호출해야 합니다.
예시:
# 모델 훈련
model.fit(X_train, y_train, epochs=10, batch_size=32)
# 훈련 후 모델 저장
model.save('my_model.h5')
요약하면, ModelCheckpoint는 훈련 중간에 최적의 모델을 자동으로 저장하는 데 사용되며, model.save()는 사용자가 코드에서 명시적으로 호출하여 모델을 저장하는 데 사용됩니다.