🔸 과소적합
🔸 과대적합
🔸 매니폴드 가설
높은 차원에 존재하는 데이터들의 경우, 해당 데이터들을 아우르는 낮은 차원의 다양체(manifold)가 존재한다는 가설
🔸 딥러닝의 작동
🔸 훈련데이터의 중요성
딥러닝이 곡선을 맞추는 것이기 때문에 모델이 이를 잘 수행하려면 조밀하게 샘플링하여 훈련해야한다.
더 좋고, 더 많은 데이터에서 훈련하는 것이 모델을 향상시키는 가장 좋은 방법.
단순한 보간의 이상을 기대하면 안됨: 가능한 한 쉽게 보간하기 위해 할 수 있는 모든 일을 해야한다
데이터 수집이 어려울 시(특정데이터에 과대적합을 피하기 위해):
참고할 수 있는 상식수준의 기준점을 가져야 모델 평가시 적절한 점수의 범위를 알 수 있다.
🔸 학습률과 배치크기 튜닝: mnist
from keras.datasets import mnist
from keras.layers import Dense
import keras
(train_images, train_labels), _ = mnist.load_data()
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype("float32") / 255
model = keras.Sequential([
Dense(512, activation="relu"),
Dense(10, activation="softmax")
])
model.compile(optimizer=keras.optimizers.RMSprop(1.),
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
model.fit(train_images, train_labels,
epochs=10,
batch_size=128,
validation_split=0.2)
model = keras.Sequential([
Dense(512, activation="relu"),
Dense(10, activation="softmax")
])
model.compile(optimizer=keras.optimizers.RMSprop(1e-2),
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
model.fit(train_images, train_labels,
epochs=10,
batch_size=128,
validation_split=0.2)
model = keras.Sequential([
Dense(512, activation="relu"),
Dense(10, activation="softmax")
])
model.compile(optimizer=keras.optimizers.RMSprop(1e-2),
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
model.fit(train_images, train_labels,
epochs=10,
batch_size=512,
validation_split=0.2)
🔸 부족한 층과 층 크기 예시
from keras.datasets import mnist
from keras.layers import Dense
import keras
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype("float32") / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype("float32") / 255
model = keras.Sequential([Dense(10, activation="softmax")])
model.compile(optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
history_small_model = model.fit(
train_images, train_labels,
epochs=20,
batch_size=128,
validation_split=0.2)
import matplotlib.pyplot as plt
val_loss = history_small_model.history["val_loss"]
epochs = range(1, 21)
plt.plot(epochs, val_loss, "b--",
label="Validation loss")
🔸 층과 층 크기 늘리기 예시
model = keras.Sequential([
layers.Dense(96, activation="relu"),
layers.Dense(96, activation="relu"),
layers.Dense(10, activation="softmax"),
])
model.compile(optimizer="rmsprop",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
history_large_model = model.fit(
train_images, train_labels,
epochs=20,
batch_size=128,
validation_split=0.2)
val_loss = history_large_model.history["val_loss"]
epochs = range(1, 21)
plt.plot(epochs, val_loss, "b--",
label="Validation loss")
어떤 방식으로 데이터가 표현되어야 모델이 수월하게 작업할 수있는가에 대한 연구
특성을 더 간단한 방식을 표현하면 잠재 매니폴드를 더 매끄럽고, 간단하고, 구조적으로 만든다(문제가 쉬워짐)
좋은특성을 발견하면, 더 적은 지원으로, 더 적은 데이터로 충분히 문제를 잘 풀 수 있다.
🔸 가중치 규제 추가
L1규제: 절댓값에 비례하는 비용이 추가(영향력에 집중)
L2규제: 제곱에 비례하는 비용 추가
🔸 드롭아웃 추가
모델 층(layer)에 드롭아웃 적용
무작위로 층의 출력을 일부 0으로 만들어 특성 제외
코드 예제
model = keras.Sequential([
layers.Dense(16, activation="relu"),
layers.Dropout(0.5),
layers.Dense(16, activation="relu"),
layers.Dropout(0.5),
layers.Dense(1, activation="sigmoid")
])
model.compile(optimizer="rmsprop",
loss="binary_crossentropy",
metrics=["accuracy"])
history_dropout = model.fit(
train_data, train_labels,
epochs=20, batch_size=512, validation_split=0.4)