본문 바로가기
배움 기록

머신러닝 기본 개념 정리

by 작지만 중요한 것들을 발견하는 블로그. 2024. 6. 11.

타이타닉 캐글 데이터셋으로 케라스 창시자에게 배우는 딥러닝 챕터3, 4번 예제로 딥러을 진행 해보다가 결국 값이 나오기는 했지만, '기본 개념을 자세하게 모르고 진행 하는 것은 큰 의미가 없다'는 생각에 돌아와 기본 개념을 이해해야겠다는 생각으로 정리를 해보았습니다.

Gradient

  • 텐서연산의 도함수 f'(x)를 그레이디언트(Gradient) 라고 부르는데, 수학적 연산이다. 모델 가중치를 여러 방향으로 이동했을 때 손실이 얼마나 변하는지 알 수 있으며, 손실이 감소하는 방향으로 가중치를 이동 시킬 수 있다.
  • 한 번에 하나씩이 아니라 한번의 업데이트로 전체 가중치를 동시에 업데이트 시킨다는 특징이 있다.
  • 시작 단계에서는 작은 난수로채워져있음. W와 b가 난수일 때, relu(dot(W, input) + b )는 의미없는 난수 표현이지만 점진적으로 피드백 신호에 기초하여 가중치가 점진적으로 조정됨.

이 점진적인 조정(훈련)이 머신러닝 학습의 핵심!

네이버 커넥트 딥러닝, 뉴런이 귀엽다.

 

활성화 함수:

  • 이전 층(layer)의 결과값을 변환하여 다른 층의 뉴런으로 신호를 전달하는 역할
  • 활성 함수를 사용하면 입력값에 대한 출력값이 비선형적으로 만든다. 신경망에서는 활성화 함수로 비선형 함수만을 사용하는데 선형 함수를 사용하면 신경망의 층을 깊게 쌓는 것에 의미가 없어지기 때문
  • 따라서, 은닉층(hidden layer)의 개수를 늘리거나 Unit(node)를 늘린다고 해서 비선형 문제를 해결할 수 없다. 
  • 함수 종류: 시그모이드(Sigmoid) , 하이퍼블릭 탄젠트(TanH),  렐루(ReLU : Rectified Linear Unit), SoftMax 등

케라스 창시자에게 배우는 딥러닝 그림 3-1

 

  • 옵티마이저(Optimizer)는 말그대로 '최적화' 시켜주는 역할을 맡는다.
  • 처음 데이터가 input되고, 계산을 시작합니다. 계산이 완료되면 loss 함수를 통해 결과값과 정답(Target Label)을 비교하여 가중치를 계산해 업데이트를 진행합니다. 이 과정에서 옵티마이저의 딥러닝의 가장 중요한 핵심인 경사하강법을 사용하여 딥러닝을 진행합니다. 학습률과 Gradient, 즉 도함수(미분)를 이용하여 기울기 값이 낮아지는 방향을 찾는 방법으로 최적화를 진행합니다.

IBM의 경사하강법 설명 사진

 

옵티마이저는 다음과 같은 방법으로 학습률(Learning rate)을 사용합니다.

 

  1. Gradient 계산: 현재 모델의 파라미터 값에서 손실 함수의 기울기(gradient)를 계산합니다.
  2. Gradient Descent: 계산된 기울기와 학습률을 이용하여 파라미터 값을 업데이트합니다. 일반적으로 기울기가 클수록, 학습률이 클수록 파라미터 값은 더 크게 변화합니다.
  3. 학습률 스케줄링 (Optional): 학습 과정 중에 학습률을 조절하는 방법입니다. 예를 들어, 학습 초기에는 큰 학습률을 사용하여 빠르게 학습하고, 학습 후반에는 작은 학습률을 사용하여 안정적으로 수렴하도록 합니다.

다양한 옵티마이저 종류

다양한 옵티마이저들이 존재하며, 각각 학습률을 조절하고 적용하는 방식이 다릅니다. 몇 가지 대표적인 옵티마이저를 소개합니다.

  • SGD (Stochastic Gradient Descent): 가장 기본적인 옵티마이저로, 학습률을 고정값으로 사용합니다.
  • Momentum: 이전 업데이트 방향을 고려하여 현재 업데이트 방향을 결정합니다. 이를 통해 학습 속도를 높이고 지역 최솟값에 빠지는 문제를 완화합니다.
  • Adagrad: 파라미터별로 학습률을 다르게 적용합니다. 자주 업데이트되는 파라미터는 학습률을 낮추고, 드물게 업데이트되는 파라미터는 학습률을 높입니다.
  • RMSprop: Adagrad의 단점을 개선하여 학습률이 너무 빠르게 감소하는 문제를 해결합니다.
  • Adam: Momentum과 RMSprop의 장점을 결합한 옵티마이저로, 현재 가장 널리 사용되는 옵티마이저 중 하나입니다.

 

코드로 보는 딥러닝 (케라스 창시자에게 배우는 딥러닝 예제 4.1)

# 데이터 준비
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = y_train[:1000]
partial_y_train = y_train[1000:]

 

모델 정의 및 훈련

# Dense layer에 활성화 함수와 함께 세 층으로 쌓기. 노드 수는 64, 64, 46개.
model = keras.Sequential([
    layers.Dense(64, activation='relu'),
    layers.Dense(64, activation='relu'),
    layers.Dense(46, activation='softmax')
])

# 컴파일을 통해 옵티마이저, 손실함수, 메트릭 정의
model.compile(optimizer="rmsprop",
              loss="categorical_crossentropy",
              metrics=["accuracy"])

# 모델 훈련
history = model.fit(partial_x_train,
                    partial_y_train,
                    epochs=20,
                    batch_size=512,
                    validation_data=(x_val, y_val))

# loss율과 정확도 확인
results = model.evaluate(x_train, y_train)
results

 

텐서플로우와 케라스 덕분해 딥러닝이 참 쉬워진 세상이라 신기하고 감사하게도 이렇게 앉아서 딥러닝을 배웁니다🥹

 

※ 파라미터 개수 구하는 방법 (feat. layer 갯수, 출력 뉴런 (unit) 갯수)

layer1. (입력 뉴런의 수 10000 * 출력 뉴런의 수 64) + 출력 뉴런의 수 64 = 640,064

layer2. (입력 뉴런의 수 64 * 출력 뉴런의 수64) + 출력 뉴런의 수 64 = 4,160

layer3. (입력 뉴런의 수 64 * 출력 뉴런의 수 46) + 출력 뉴런의 수 46 = 2,990

model.summary()

 

사실... 모델 정의(어떤 문제냐 !) 와 데이터 셋 분석(Exploratory Data Analysis) 가 중요하지만 개념을 정리해보았습니다.

정리하고 보니 조금은 더 구체적이고 전체적인 그림이 그려지는 것 같네요.