Life Logs

  • 딥러닝 하이퍼파라미터

    딥러닝 모델을 만들 때 가장 중요한 것 중 하나는 하이퍼파라미터 설정입니다. 하이퍼파라미터는 모델의 학습 과정을 제어하는 변수로, 학습 시작 전에 설정해야 합니다. 오늘은 주요 하이퍼파라미터들을 순수 파이썬 코드와 함께 자세히 알아보겠습니다.

    1. 배치 크기 (Batch Size)

    배치 크기는 한 번에 처리할 데이터의 양을 결정합니다. 큰 데이터셋을 작은 묶음으로 나누어 처리하는 것이 메모리 효율과 학습 안정성 측면에서 유리합니다.

    data = [i for i in range(1, 101)]  # 1부터 100까지의 데이터
    batch_size = 10
    for i in range(0, len(data), batch_size):
        batch = data[i:i+batch_size]
        print(f"Batch: {batch}")

    작은 배치 크기는 더 자주 모델을 업데이트하지만 노이즈가 많고, 큰 배치 크기는 안정적이지만 업데이트 횟수가 줄어듭니다.

    2. 학습률 (Learning Rate)

    학습률은 모델이 한 번에 얼마나 많이 학습할지 결정하는 중요한 파라미터입니다. 다음은 간단한 경사하강법 예제입니다:

    current_value = 10
    learning_rate = 0.1
    
    def gradient(x):
        return 2 * x  # 예제 기울기 함수
    
    for step in range(10):
        grad = gradient(current_value)
        current_value -= learning_rate * grad
        print(f"Step {step+1}: Value = {current_value}")

    학습률이 너무 크면 최적점을 지나칠 수 있고, 너무 작으면 학습이 매우 느려집니다.

    3. 드롭아웃 (Dropout)

    드롭아웃은 과적합을 방지하는 강력한 정규화 기법입니다. 학습 중에 일부 뉴런을 임의로 비활성화하여 모델의 일반화 성능을 높입니다.

    import random
    
    def apply_dropout(neurons, dropout_rate=0.4):
        return [n for n in neurons if random.random() > dropout_rate]
    
    neurons = [1, 2, 3, 4, 5]
    active_neurons = apply_dropout(neurons)
    print(f"Active neurons: {active_neurons}")

    4. 활성화 함수 (Activation Function)

    활성화 함수는 뉴런의 출력을 비선형으로 변환합니다. 가장 널리 사용되는 ReLU와 Sigmoid를 살펴보겠습니다:

    def relu(x):
        return max(0, x)
    
    def sigmoid(x):
        import math
        return 1 / (1 + math.exp(-x))
    
    inputs = [-1, 0, 1, 2]
    print(f"ReLU: {[relu(x) for x in inputs]}")
    print(f"Sigmoid: {[sigmoid(x) for x in inputs]}")

    실전 팁

    1. 배치 크기는 보통 2의 제곱수(16, 32, 64, 128 등)로 설정합니다.
    2. 학습률은 0.1, 0.01, 0.001 등 로그 스케일로 탐색하는 것이 효과적입니다.
    3. 드롭아웃은 보통 0.2~0.5 사이의 값을 사용합니다.
    4. 활성화 함수는 일반적으로 은닉층에서는 ReLU를, 출력층에서는 목적에 맞는 함수를 선택합니다.

    하이퍼파라미터 튜닝은 실험과 경험이 필요한 작업입니다. 위 예제들을 직접 실행해보면서 각 파라미터가 모델에 미치는 영향을 이해하면, 더 효과적인 모델 개발이 가능할 것입니다.