DL.4 _ 신경망 용어정리, Keras Hyperparameters
DataScience/인공지능

DL.4 _ 신경망 용어정리, Keras Hyperparameters

728x90

신경망 용어 정의

  • 뉴런(Neuron): 뉴런은 신경계를 구성하는 세포이다. 딥러닝에서는 이러한 뉴런을 모사한 인공 뉴런인 퍼셉트론은 다수의 입력 신호를 받아 하나의 신호를 출력한다.
  • 입력층(Input Layer):입력층(Input Layer)은 데이터 셋으로부터 입력을 받는 층으로 보통 입력변수와 입력 노드의 수를 같게 설정한다. 보통 입력층은 어떤 계산도 수행하지 않고 그냥 값들을 전달하기만 하는 특징을 가지고 있다.
  • 은닉층(Hidden Layer):입력층과 출력층 사이에 있는 층들을 은닉층이라고 부르는데 은닉층은 계산 결과를 사용자가 확인 할 수 없기 때문에 은닉층이라는 이름이 붙었다.
  • 출력층(Output Layer):신경망에서 가장 오른쪽, 마지막 층이 출력층으로 예측하고 하는 클래스를 출력해주는 층이다. 출력층에는 대부분 활성함수가 존재하는데 활성화함수는 풀고자 하는 문제에 따라 다른 종류를 사용한다.
  • 활동함수(Activation Function):신경망 회로에서 한 노드에 대해 입력값을 받아 다음 노드에 보낼지 말지 결정하는 함수. 대표적으로 step, sigmoid, Relu가 있다.
  • 역전파(Back Propagation): 역전파는 "Backwards Propagation of errors"의 줄임말로 신경망에 존재하는 가중치들을 어떻게 업데이트 해야할지 결정하기 위해 epoch/batch 마다 출력층에서 입력층 방향(역방향)으로 미분값을 계산하고 가중치를 업데이트 하여 신경망을 다시 학습하는 알고리즘이다.

역전파

역전파는 "Backwards Propagation of errors"의 줄임말로 신경망에 존재하는 가중치들을 어떻게 업데이트 해야할지 결정하기 위해 epoch/batch 마다 출력층에서 입력층 방향(역방향)으로 미분값을 계산하고 가중치를 업데이트 하여 신경망을 다시 학습하는 알고리즘이다.

위 그림은 내가 직접 비전공자에게 역전파에 대한 설명을 한다고 가정하고 만들어본 설명자료이다.


Keras 딥러닝 모델 하이퍼파라미터 성능 올리기

머신러닝보다 복잡한 학습을 하는 딥러닝에선 하이퍼파라미터 튜닝이 중요하다.

튜닝가능한 파라미터 옵션

  • Batch size 
    • 모델의 가중치 업데이트시 한번에 몇 개의 관측치를 볼것인가
    • Loss를 계산해서 가중치를 업데이트 해야되기 때문에 적절한 크기로 설정해야한다. 32부터 512까지 2의 제곱이 되는 수가 적절하다.
  • Optimizer 
    • 손실함수를 기반으로 네트워크 업데이트 결정
    • 가중치를 변경하는 방법론, 최적화 방법을 설정
    • 손실함수 : 신경망의 성능을 나타내는 지표. (선택에 따라 하이퍼파라미터의 종류, 설정값이 달라진다)
    • SGD, Adam, RMSprop, Adagrad, Adadelta, Adamax, Nadam
  • Learning Rate 
    • 경사하강 알고리즘에서 cost 값 앞에 오는 알파값
    • 기울기가 줄어드는 지점으로 얼만큼 이동할 것인지 나타내는 지표. →얼만큼의 step으로 최소값에 도달할것인가
    • 값이 너무 커버리면 최소값을 넘어서 발산(overshooting), 작으면 최소값 수렴에 실패
    • 0.01로 시작해서 발산하면 점점 줄이고, 학습속도가 느리면 올리고.
  • Mometum 
    • SGD와 연관됨. local minima에서 빠져나오도록 하는것

교차검증

  • 모델돌보기(Babysitting one model) 
    • 모델 성능을 직접 확인하면서 파라미터 값을 수동으로 조절해주는 방법
    • 더 정교한 튜닝이 될 수 있겠지만 시간이 오래걸리고 노가다라는 단점이 있다.
  • Random Search 
    • 지정된 범위에서 무작위로 설정해 모델을 학습하는 방법
    • 완벽한 하이퍼 파라미터를 찾지는 못하지만 Grid보다 시간이 덜 걸린다.
  • Grid Search
    • 범위내에서 알아서 최적의 조합을 찾아주는 방법(가장 성능이 높게 나옴)
    • 시간이 오래걸린다는 유일한 단점이 있는데 그 시간이 데이터에 따라서 어마어마하게 걸릴 수 있다.
    • 그래서 랜덤서치와 병행하면서 사용하는게 꿀팁
  • Keras-tuner
    • Keras 라이브러리의 튜닝방법으로 잘 사용하면 유용함
    • 성능은 아직 좋은지 잘 모르겠다.

파라미터 튜닝 코드 (Python)

    • 주제 : 통신사 고객 이탈 데이터셋에서 정확도를 조정해보기
    • 데이터 : 통신사 고객 이탈(Churn)
    • 작업
      1. 전처리 진행 
      2. 원핫인코딩 
      3. 훈련데이터, 테스트 데이터 나누기 
      4. StandardScaler를 이용하여 정규화를 진행
      5. 모델링
  • 하이퍼 파라미터 튜닝(Grid Search사용)
# 모델 만들기
tf.random.set_seed(7)

def model_builder(nodes=16, activation='relu'):

  model = Sequential()
  model.add(Dense(nodes, activation=activation))
  model.add(Dense(nodes, activation=activation))
  model.add(Dense(1, activation='sigmoid')) # 이진분류니까 노드수 1, 활성함수로는 시그모이드

  model.compile(optimizer='adam', 
                loss='binary_crossentropy', 
                metrics=['accuracy'])

  return model

# keras.wrapper를 활용하여 분류기를 만듭니다
model = KerasClassifier(build_fn=model_builder, verbose=0)

# GridSearch
batch_size = [64, 128]
epochs = [10, 15, 20]
nodes = [128, 256]
activation = ['relu', 'sigmoid']
param_grid = dict(batch_size=batch_size, epochs=epochs, nodes=nodes, activation=activation)


# GridSearch CV를 만들기
grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, verbose=1, n_jobs=-1)
grid_result = grid.fit(X_train_scaled, y_train)
# 최적의 결과값을 낸 파라미터를 출력합니다
print(f"Best: {grid_result.best_score_} using {grid_result.best_params_}")
means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print(f"Means: {mean}, Stdev: {stdev} with: {param}")

Best: 0.7995065848032633 using {'activation': 'sigmoid', 'batch_size': 64, 'epochs': 20, 'nodes': 128}

728x90