신경망의 위쪽으로 갈수록 층을 지날 때마다 분산이 계속 커져 가장 높은 층에서는 활성화 함수가 0이나 1로 수렴함.
ReLU activation function 의 경우 He Initialization 을 사용.
ReLU 사용시에 일부 뉴런이 0이외의 값을 출력하지 않는 현상이 발생하여 음수 구간에서도 작은 기울기를 가질 수 있는 LeakyReLU 가 등장
각 층에서 activation fn 을 통과하기 전에 연산을 추가. Normalize 후에 scale 을 조정하고 shift.
Inference 시에는 보통 1장 단위로 입력을 넣기에, batch-wise mean, std dev 를 구할 수 없는 문제가 있음.
출력층 등 상위에 해당하는 층만 재학습하고 나머지는 다른 모델에서 가져온 layer를 freeze 하여 학습에 사용
재사용 층에서 unfreeze 할때는 learning rate 를 줄이는 것이 도움이 된다.
keras 에서 모델 A를 B로 transfer 하는 경우 B 학습시에 A도 영향을 받기 때문에 A를 clone 해준다.
model_A = keras.models.load_model("my_model.h5")
model_B = keras.models.Sequential(model_A.layers[:-1])
model_B.add(keras.layers.Dense(2, activation = "sigmoid")
model_A_clone = keras.models.clone_model(model_A)
model_A_clone.set_weights(model_A.get_weights())
# layer 를 freeze 한 후 compile 할 것
for layer in model_B.layers[:-1]:
layer.trainable = False
model_B.compile(loss = "binary_crossentropy", optimizer = "sgd", metrics = ["loss"])
먼저 unlabeled data 를 unsupervised 방식으로 (GAN) train 하고 supervised 방식으로 마지막 출력층만 fine-tune
이전 기울기가 얼마였는지를 고려하여 기울기를 가속도와 같은 개념으로 사용.
처음에는 느리게 출발하지만 점점 가속되는 방식.
현재 위치가 아닌 모멘텀의 방향으로 조금 앞선 theta + beta*momentum
에서 cost function 의 gradient 를 계산.
최적값에 조금 더 금방 가까워지기 때문에 기존 모멘텀 방식보다 더 빠름.
가장 가파른 차원을 따라 gradient vector 의 스케일을 감소시켜 전역 최적점 쪽으로 정확한 방향을 잡도록 설계.
Learning rate decay 에 있어 경사가 완만한 차원보다 가파른 차원에 대해 더 빠르게 감소.
딥러닝에는 사용하지 않고 regression 에 종종 사용.
AdaGrad 는 너무 빨리 느려져서 global minima 에 수렴하지 못하는 위험이 있음.
그래서, 시작부터의 모든 gradient 가 아닌 최근 반복에서 비롯된 gradient 만 누적함으로써 이 문제를 해결.
Adaptive Moment Estimation
Momentum 방식과 RMSProp 방식의 결합
optimizer = keras.optimizers.SGD(lr = 0.001, momentum = 0.9, nesterov = True)
optimizer = keras.optimizers.RMSProp(lr = 0.001, rho = 0.9)
optimizer = keras.optimizers.Adam(lr = 0.001, beta_1 = 0.9, beta_2 = 0.999)