SK Networks Family AI bootcamp 강의노트

26일차 [ Multi Classification Model (pytorch)]

HyunJung_Jo 2025. 2. 20. 17:37
명상/책읽기를 어느정도 습관처럼 하게 되었다. 짬짬이 운동을 좀 더 체화해야겠다. 어깨 한번 접어서 편 이후로는 이제 어깨가 아프지 않는다. 내 컨디션을 위해서 조금더 스트레칭해야겠다. 또... 프로젝트 관리를 잘 하기 위해 좀 더 고안을 해봐야겠다. 아무래도 챗봇 프젝/단위프젝/토이프젝/ 다 해야하니까...!

이진 분류 모델 실습

댕댕이냐 아니냐 / 댕댕이와 갓냥이,버스,식물중 뭐가 대표이냐 / 댕댕이랑 식물이 있느냐/ 

 

수업 자료

원본

https://colab.research.google.com/drive/12RdRIoemME_3ig9p0Qx4vFTDuLxQv7Ye#scrollTo=8Wb_HYb1fl8r

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

수업중 강사님이 만드신 자료

https://colab.research.google.com/drive/1VVu6h-qpjijvRpk-pWALsLMl2z_VrfUL

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

더보기

좋아요, 모델의 출력값을 확률값으로 바꿔야 하는 이유를 예시를 들어 쉽게 설명해 드릴게요.

동전 던지기 게임

동전 던지기 게임을 한다고 생각해 봅시다. 우리의 목표는 동전이 앞면인지 뒷면인지 예측하는 모델을 만드는 것입니다.

모델은 동전의 특징 (예: 무게, 던지는 힘, 공기 저항 등)을 분석하고 숫자를 출력합니다. 이 숫자는 모델의 'raw prediction'입니다. 예를 들어, 모델이 3이라는 숫자를 출력했다고 가정해 봅시다.

이 숫자 3은 그 자체로 앞면 또는 뒷면을 직접적으로 나타내지 않습니다. 단지 모델이 앞면이라고 생각하는 '강도'를 나타낼 뿐입니다.

이 숫자를 확률로 바꿔야 비로소 앞면이 나올 확률을 알 수 있습니다.

시그모이드 함수의 역할

시그모이드 함수는 이러한 'raw prediction'을 0과 1 사이의 확률값으로 변환하는 역할을 합니다.

동전 던지기 예시에서 모델이 3이라는 숫자를 출력했다면, 시그모이드 함수를 적용하면 0.95와 같은 확률값이 나올 수 있습니다. 즉, 모델은 동전이 앞면일 확률을 95%로 예측한 것입니다.

확률값으로 변환하면 다음과 같은 이점이 있습니다.

  1. 해석: 0.95라는 확률값은 3이라는 숫자보다 훨씬 직관적으로 이해하기 쉽습니다. 모델이 얼마나 확신하는지 바로 알 수 있습니다.
  2. 비교: 여러 데이터 포인트에 대한 모델의 예측을 비교하기 쉽습니다. 예를 들어, 0.95와 0.65라는 확률값을 비교하면 어떤 예측이 더 확실한지 알 수 있습니다.
  3. 분류: 확률값을 기반으로 특정 기준 (예: 0.5)을 설정하여 데이터를 분류할 수 있습니다. 동전 던지기 예시에서 확률값이 0.5보다 크면 앞면, 작으면 뒷면으로 분류할 수 있습니다.

결론

모델의 raw prediction을 확률값으로 변환하는 것은 모델의 예측을 해석, 비교, 분류하기 쉽게 만들어 주기 때문에 중요합니다. 시그모이드 함수는 이러한 변환을 수행하는 데 사용되는 핵심적인 도구입니다.

이제 코드 y_pred_prob = torch.sigmoid(y_pred)가 왜 필요한지 이해가 되셨기를 바랍니다! 😉

 

더보기

주어진 코드에서 trainloader는 마치 식당의 요리사와 같다고 생각할 수 있습니다.

  1. trainset: trainset은 요리사가 사용할 모든 식재료들을 모아놓은 창고와 같습니다. 다양한 채소, 고기, 양념 등이 준비되어 있죠.
  2. trainloader: 요리사는 손님들에게 음식을 제공하기 위해 식재료 창고(trainset)에서 재료를 가져와 요리합니다. trainloader는 이 요리사의 역할을 합니다.
  3. batch_size=64: 요리사는 한 번에 64인분의 음식을 만들어 손님들에게 제공합니다. 이처럼 batch_size=64는 요리사가 한 번에 처리하는 음식의 양 (데이터의 양)을 의미합니다.
  4. shuffle=True: 요리사는 매번 같은 순서로 재료를 사용하지 않고, 창고에서 무작위로 재료를 선택하여 다양한 요리를 만듭니다. shuffle=True는 이처럼 재료 선택 순서를 무작위로 바꾸는 것을 의미합니다. 이는 모델이 데이터의 순서에 의존하지 않고 다양한 패턴을 학습하도록 돕습니다.

즉, trainloader는 trainset에 있는 데이터를 batch_size만큼씩 묶어서 모델에게 전달하는 역할을 하며, shuffle=True 옵션을 통해 데이터의 순서를 무작위로 섞어 모델의 학습 효과를 높입니다.

비유를 통해 설명하자면:

  • trainset: 레고 블록 상자 - 다양한 모양과 색깔의 레고 블록들이 들어있습니다.
  • trainloader: 레고 조립 설명서 - 블록 상자에서 필요한 블록들을 순서대로 가져와 조립하도록 안내합니다.
  • batch_size: 한 번에 조립할 블록의 개수 - 설명서에서 한 번에 몇 개의 블록을 조립할지 알려줍니다.
  • shuffle=True: 블록 상자 흔들기 - 조립 전에 블록 상자를 흔들어 블록들의 순서를 무작위로 섞습니다. 이는 매번 다른 조립 순서로 레고를 만들게 하여 더 다양한 모양을 만들 수 있도록 돕습니다.

이처럼 trainloader는 모델이 데이터를 효율적으로 학습할 수 있도록 돕는 중요한 역할을 합니다.

 

더보기

Gradient: 머신러닝에서의 의미

머신러닝에서 gradient는 모델의 loss function을 최소화하기 위해 모델의 parameter를 어떤 방향으로, 얼마나 조정해야 하는지를 나타내는 벡터입니다.

쉽게 설명하자면, gradient는 모델이 더 나은 예측을 하기 위해 각 parameter를 어떻게 변경해야 하는지 알려주는 지표라고 할 수 있습니다.

Gradient의 역할

모델은 입력 데이터를 받아 예측을 출력합니다. 이 예측과 실제 값 사이의 차이를 loss라고 합니다. 우리의 목표는 이 loss를 최소화하는 것입니다.

Gradient는 이 loss를 최소화하기 위해 각 parameter를 어떻게 조정해야 하는지 알려줍니다.

  • 방향: Gradient는 loss function이 가장 가파르게 증가하는 방향을 가리킵니다. 따라서, gradient의 반대 방향으로 parameter를 조정하면 loss를 줄일 수 있습니다.
  • 크기: Gradient의 크기는 해당 parameter가 loss에 미치는 영향력을 나타냅니다. Gradient의 크기가 클수록 해당 parameter를 조정했을 때 loss의 변화가 커집니다.

Gradient Descent

Gradient descent는 gradient를 이용하여 모델의 parameter를 업데이트하는 최적화 알고리즘입니다.

Gradient descent는 다음과 같은 단계로 진행됩니다.

  1. 현재 parameter에서 loss function의 gradient를 계산합니다.
  2. Gradient의 반대 방향으로 parameter를 업데이트합니다.
  3. 1-2 단계를 반복하여 loss function을 최소화합니다.

비유를 통한 이해

Gradient를 이해하기 위한 비유를 들어보겠습니다.

산 정상에서 골짜기로 내려가는 상황을 생각해 보세요.

  • 현재 위치: 모델의 parameter
  • 골짜기: loss function의 최솟값
  • 경사: gradient

Gradient는 현재 위치에서 가장 가파른 내리막 방향을 알려줍니다. Gradient descent는 이 경사를 따라 조금씩 내려가면서 골짜기를 찾는 과정과 같습니다.

요약

  • Gradient는 모델의 loss function을 최소화하기 위해 parameter를 어떻게 조정해야 하는지 알려주는 벡터입니다.
  • Gradient descent는 gradient를 이용하여 모델의 parameter를 업데이트하는 최적화 알고리즘입니다.
  • Gradient는 머신러닝 모델 학습에 있어 매우 중요한 역할을 합니다.

도움이 되었기를 바랍니다.

 

케라스 배우면서 배웠던 개념을 다시 상기하는 기분이다. 그걸 파이토치로 하려니 옛날 생각이 난다.
개념을 다시 공부하면서 상기해보는 시간을 가졌다... 이것도 복습이 좀 필요한 듯