신경망에 조정해야 하는 하이퍼파라미터는 많다
1) 다양한 하이퍼파라미터 조합 중 가장 좋은 점수를 내는 조합 선택
#케라스 모델을 사이킷런 추정기처럼 보이도록 바꿈
def build_model(n_hidden=1, n_neurons=30, learning_rate=0.01, input_shape=[8]):
model = keras.models.Sequential()
model.add(keras.layers.InputLayer(input_shape = input_shape))
for layer in range(n_hidden):
model.add(keras.layers.Dense(n_neurons, activation = 'relu'))
model.add(keras.layers.Dense(1))
optimizer = keras.optimizers.SGD(lr= learning_rate)
model.compile(loss = 'mse', optimizer = optimizer)
return model
#kerasregressor 클래스의 객체를 만듦
#일반적인 사이킷런 회귀 추정기처럼 fit, score, predict method 사용 가능
keras_reg = keras.wrappers.scikit_leran.KerasRegressor(build_model)
#파라미터 탐색
params = {"n_hidden": [0,1,2,3], "n_neurons":np.arange(1,100),
"learning_rate": scipy.stats.reciprocal(3e-4, 3e-2)} #reciprocal: continuous random variables
search = RandomizedSearchCV(keras_reg, params, n_iter = 10, cvv = 3)
search.fit(X_train, y_train, epochs = 100, validation_data, callbacks)
이론적으로는 뉴런 수가 무한하다면 hidden layer 하나로 어떤 함수도 근사할 수 있다
다만, 심층 신경망이 얕은 신경망보다 파라미터 효율성이 좋음
스트레치 팬츠 방식: 더 많은 층과 뉴런을 가진 모델을 선택하고 과대적합되지 않도록 조기종료 / 규제기법 사용하는 것이 간단하고 효과적
한 층의 뉴런 개수가 너무 적으면 입력에 있는 정보를 충분히 표현하지 못하고 소실 가능
나머지 층이 아무리 크고 강해도 소실된 정보는 다시 복원되지 않음
(3D이미지를 input 으로 가지는데 뉴런 두개면 일부 정보 잃음)
일반적으로 최적의 학습률 = 최대 학습률의 절반 정도
큰 배치를 사용하게 되면 일반화를 잘 못하여 불안정하게 훈련됨
보통 2-32 정도의 배치 사이즈 권장
학습률 예열을 하면 큰 배치 사용 가능
큰 배치는 훈련 시간을 단축시킬 수 있다
학습률 예열 : 작은 학습률로 훈련시키다가 점점 증가
early over fitting 방지할 수 있다
* 예를 들면 lr = p이면, 첫번째 batch에서 lr = p/n, 두번째 batch lr = 2p/n ... n번째 lr = p