하이퍼 파라미터(hyher parameter)
딥러닝 신경망 모델의 성능을 높이기 위해 조절해주어야 하는 요소이다.
그냥 파라미터는 컴퓨터가 직접 컨트롤하면서 캐치하는 인자들이고, 하이퍼 파라미터의 경우는 모델 설계를 하면서 직접 조절을 해주어야 한다.
실습을 진행하기 전에 하이퍼 파라미터의 종류를 먼저 살펴본다.
은닉층의 수 (Hidden Layers counts)
신경망은 은닉층의 수에 따라 그 복잡도가 곱절이 된다. 복잡도가 올라간다는 것은 그만큼 많은 연산과 생각을 하고 이를 학습해 결과를 내보낸다는 것이지만, 자칫 과적합이 될 수 있어 너무 많은 것은 지양된다.
- 일반적으로 MLP(다층 퍼셉트론)에선 3~5개 넘어가도 효율이 떨어지는 느낌을 받지만 10개까진 쌓을 수 있다고 본다.
- CNN을 통한 이미지 처리 시에는 ~152까지도 사용하고, ~1000 까지도 사용되기도 한다.
- 그러나 이렇게 층이 많다보면 기울기 소실(Gradient Vanishing)이 발생할 수 있다.
은닉층의 노드 수 (Units of Hidden Layers)
은닉층의 노드 수도 복잡도를 높이는 데에 영향을 준다. 당연히 이 역시도 많을 수록 더 복잡해지며 성능은 올라갈 수 있지만, 과적합의 위험도가 있다.
- 데이터셋에 따라 다르지만, 10~1024까지 다양하게 설정되고, 많으면 2048까지도 가능하다. 개수에 정답이 있지는 않다.
- Grid, Random서치 시 grid_params 또는 params로 넣어 최적의 수 서치가 가능하다.
- keras tuner를 이용해서도 확인 가능하다.
활성화 함수 (Activation Function)
각 층 별로 진행되는 연산에 따라 출력되는 값에 영향을 주는 활성화 함수는 성능 향상에 영향을 끼친다. 그러므로 현 상황에 맞는 활성화 함수를 적용시켜주는 것이 필요하다. 보통 은닉층에서 ReLU를, 출력층에서 sigmoid와 softmax를 사용하는데, 이는 답이 정해진 것은 아니다.
- 중간 은닉층 노드 연산의 순전파 또는 역전파가 제대로 진행되어 학습에 문제 없도록 할 수 있는 적합한 활성함수 선택이 필요하다.
- Grid, Random서치의 params로 넣어 최적의 activation checking이 가능하다.
optimizer
역전파 시 가중치 업데이트 진행의 방법론을 결정하는 하이퍼 파라미터이다. 어떤식으로 경사하강을 진행할지 파악해서 기재해야한다.
- sgd, rsmprop, adagrad 등 많지만 adam과 sgd가 가장 많이 쓰인다.
- compile 시 설정가능하다.
학습률 learning rate
학습 진행시 학습률이 너무 높아도 최저점에 도달하지 못하고, 너무 낮아도 시간이 오래걸려 iteration 안에 도달하지 못하는 상황이 발생할 수 있다. 그렇기에 적절한 학습률을 설정하는 것은 무엇보다 중요하다.
- 대개 1e-5~1e-1까지의 log 학습률을 먼저 체크한 뒤, 적절한 범위 내에서 다시 찾는것이 방법.
- 범위가 정해지면 learning rate scheduling을 이용해 맨 처음엔 빠른 폭으로 학습을 하도록 하고, 일정 수준이상 학습이 되면 보폭을 줄여 경사하강을 진행하도록 할 수 있다.
- keras tuner를 이용해 최적값 찾기 가능.
- callback 함수를 이용해 scheduler 또는 더 업그레이드 된 plateau를 이용할 수 있다.
tf.keras.callbacks.LearningRateScheduler
tf.keras.callbacks.ReduceLROnPlateau
Dropout rate
Dropout을 몇 % 해야 가장 최적일 지 모르는 경우도 있을 수 있다. 이 역시도 적절히 사용하는것이 좋지만 대개 0.3으로 설정한다고 한다.
- 대개 0.1~0.5로 설정을 해주고 0.3을 가장 많이 사용한다고 함.
- keras tuner를 통해 조정 가능
Batch size
배치설정을 하면 전체 데이터 수에서 설정한 배치 수 만큼으로 쪼개져 쪼개진 한블럭을 모두 한번에 학습하고 업데이트 하는 방식이다. 배치 역시도 너무 커질경우 컴퓨터의 과부하가 올 수 있고, 너무 작을 경우 학습이 느려질 수 있다.
- 적절한 것이 좋겠지만, 실무상에선 일단 가능한 크게 한다고들 한다.
- 32~512 등 2의 제곱 배수로 진행하면 효율이 더 좋다고 한다.
- overfitting이 심한경우는 batch를 축소해야 한다.
- keras tuner, grid&random 서치로 최적값 파악이 가능하다.
Epochs
전체 iteration이 한번 도는 주기를 뜻하는 epochs도 너무 많이 진행되면 학습 데이터와 검증 데이터간의 loss격차가 커지면서 과적합이 될 수 있으므로 최적의 값을 찾는 것이 중요하다. 그 역할로 early stopping을 진행하기도 하며, epochs 자체를 params로 넣어 최적의 값을 찾을 수도 있다.
- early stopping 진행을 통해 최적의 epochs를 찾을 수 있다.
- callback 함수를 통해 early stopping 가능
- keras tuner 자체 early stopping 기능을 이용 가능.
- grid, random 서치를 통해 최적의 epochs 수 캐치 가능.