4-2) 확률적 경사 하강법
럭키백 이벤트를 성공적으로 해낸 한빛마켓은 이제 새로운 문제에 당면했다. 수산물을 공급하겠다는 곳이 너무 많아 샘플을 골라내는 일이 너무 힘들 뿐더러, 추가되는 수산물은 아직 샘플을 갖고 있지도 않으며 어느 생선이 먼저 올지도, 모든 생선이 도착할 때까지도 기다릴 수도 없는 상황에서 영업 팀은 새로운 생선이 도착하는 대로 가능한 즉시 훈련 데이터를 제공하겠다고 약속한 상태이다..
1) 한빛마켓이 당면한 문제는 훈련 데이터가 한번에 준비되는 것이 아니라 조금씩 전달된다는 것이다. 그렇다면 기존의 훈련 데이터에 새로운 데이터를 추가하여 모델을 매일매일 다시 훈련하면 어떨까? → 괜찮은 방법이나 점점 시간이 지남에 따라 모델을 훈련하기 위해 서버를 늘려야 하고 지속가능한 방법처럼 보이지 않는다.
2) 또 다른 방법은 새로운 데이터를 추가할 때 기존 데이터를 버림으로써 훈련 데이터 크기를 일정하게 유지하는 것이다. 이렇게 하면 데이터셋의 크기를 유지할 순 있지만 데이터를 버릴 때 중요한 생선 데이터가 포함되어 있다면 큰일이다.
3) 그렇다면 훈련한 모델을 버리지 않고 새로운 데이터에 대해서만 조금씩 더 훈련할 수 없을까? → 이런 훈련 방식을 점진적 학습이라 하고, 대표적인 점진적 학습 알고리즘으로 확률적 경사 하강법이 있다.
확률적 경사 하강법
- 확률적 경사 하강법에서의 '확률적'이라는 의미는 '무작위, 랜덤하게'의 기술적 표현이다.
- 산에서 내려온다고 할 때, 가장 빨리 내려올 수 있는 길은 경사가 가장 가파른 길을 선택하는 것이다.
- 경사 하강법은 가장 가파른 경사를 따라 원하는 지점에 도달하는 것이 목표이다. 그러나 한번에 걸음이 너무 크면 경사를 따라 내려가지 못하고 오히려 올라갈 수도 있다(?)
- 그러므로 경사 하강법은 가장 가파른 길을 찾아 내려오지만 한번에 조금씩 내려오는 것이 중요하고, 이렇게 내려오는 과정이 경사 하강법 모델을 훈련하는 것이다.
- 그렇다면 가장 가파른 길을 찾는 방법은 무엇일까? 당연히 훈련세트를 사용하여 가장 가파른 길을 찾으나, 전체 샘플을 사용하지 않고 딱 하나의 샘플을 훈련세트에서 랜덤하게 골라 가장 가파른 길을 찾는다.
- 이처럼 훈련세트에서 랜덤하게 하나의 샘플을 고르는 것이 바로 확률적 경사 하강법이다.
- 즉, 훈련세트에서 랜덤하게 하나의 샘플을 선택하여 경사를 조금씩 내려가고, 또 다음 훈련세트에서 랜덤하게 하나의 샘플을 선택하여 경사를 조금씩 내려간다. 이런 식으로 전체 샘플을 모두 사용할 때까지 계속한다.
- 모든 샘플을 다 사용할 때까지 산을 다 내려오지 못했다면 다시 처음부터 훈련세트에 모든 샘플을 다시 채워놓고 그 다음 다시 랜덤하게 하나의 샘플을 선택해 경사를 내려오는 과정을 반복한다.
- 확률적 경사 하강법에서 훈련세트를 한번 모두 사용하는 과정을 epoch 라고 부른다. 일반적으로 경사 하강법은 수백번 이상의 에포크를 수행한다.
- 확률적 경사 하강법을 꼭 사용하는 알고리즘으로 신경망이 있다.
- 만약 샘플을 한 개씩 선택하는 것이 걱정이 된다면 무작위로 몇 개의 샘플을 선택하여 경사를 내려갈 수도 있다. 이렇게 여러 개의 샘플을 사용하여 경사하강법을 수행하는 방식을 미니배치 경사하강법이라고 한다. (실전에서 자주 사용)
- 극단적으로 한번 경사로를 따라 이동하기 위해 전체 샘플을 사용할 수도 있다. 이를 배치 경사하강법이라고 부른다.
이는 전체 데이터를 사용하기 때문에 가장 안정적일 수 있으나 그만큼 자원을 많이 사용하게 된다.
손실 함수
- 손실 함수는 어떤 문제에서 머신러닝 알고리즘이 얼마나 엉터리인지를 측정하는 기준이다. (작을수록 좋음)
- 학습 후 모델의 성능을 평가하는 성능 지표와는 달리 손실 함수는 학습 중에 학습이 얼마나 잘 되고 있는지 평가하는 지표이다.
- 비용 함수(cost function)은 손실 함수의 다른 말이지만 엄밀히 말하면 손실 함수는 샘플 하나에 대한 손실을 정의하고 비용 함수는 훈련세트에 있는 모든 샘플에 대한 손실 함수의 합을 말한다.
- 손실 함수는 미분이 가능해야 한다. (연속적이어야 한다)
로지스틱 손실 함수
- 로지스틱 손실 함수 또는 이진 크로스엔트로피 손실 함수라고 부른다.
- 다중 분류는 크로스엔트로피 손실 함수를 사용한다.
- 직접 계산하는 일은 드물지만 이 함수가 무엇인지, 왜 정의해야 하는지 알아야 한다.
SGD Classifier
- 사이킷런에서 확률적 경사하강법을 제공하는 대표적인 분류용 클래스인 SGDClassifier
- SGDClassifier의 객체를 만들 때는 손실함수의 종류를 지정하는 loss, 수행할 에포크 횟수를 지정하는 max_iter 두 개의 매개변수를 지정한다.
- SGDClassifier은 객체에 한번에 훈련세트 전체를 전달한 것으로 보이지만, 이 알고리즘은 전달한 훈련세트에서 1개씩 샘플을 꺼내어 경사하강법 단계를 수행한다. (미니배치 경사하강법, 배치 하강법 제공 x)
- loss는 손실함수의 종류를 지정하고, 여기에서는 loss='log'로 지정하여 로지스틱 손실함수를 지정하였다. 이 함수는 다중분류일 경우 클래스마다 이진분류 모델을 만든다.
- 확률적 경사하강법은 점진적 학습이 가능하며, SGDClassifier 객체를 다시 만들지 않고 이미 훈련한 모델 sc를 추가로 더 훈련할 수 있다. (partial_fit 메서드 사용)
에포크와 과대 / 과소적합
- 확률적 경사하강법을 사용한 모델은 에포크 횟수에 따라 과소적합이나 과대적합이 될 수 있다.
- 에포크 횟수가 적으면 훈련세트를 덜 학습하므로 훈련세트와 테스트세트에 잘 맞지 않는 과소적합일 가능성이 높다.
- 에포크 횟수가 많으면 훈련세트에 너무 잘 맞아 테스트세트에는 오히려 점수가 낮은 과대적합일 가능성이 높다.
- 에포크가 진행됨에 따라 훈련세트 점수는 에포크가 진행될수록 꾸준히 증가하지만 테스트세트 점수는 어느 지점에서 감소하기 시작한다. → 바로 이 모델이 과대적합되기 시작하는 곳
- 과대적합이 시작하기 전에 훈련을 멈추는 것을 조기 종료라고 한다.
- 이 예제에서는 fit() 대신 partial_fit()만 사용할 것이다.
- partial_fit() 메서드를 사용하려면 훈련세트에 있는 전체 클래스의 레이블을 partial_fit()에 전달해주어야 한다.
- np.unique() 함수로 train_target에 있는 7개 생선의 목록을 만들고, 에포크마다 훈련세트와 테스트세트 점수를 기록하기 위해 2개의 리스트를 만든다.
- 100번째 에포크가 가장 적절한 것을 확인함.
'ML > [책] 혼공머신' 카테고리의 다른 글
4) 다양한 분류 알고리즘 (1) (0) | 2022.11.03 |
---|---|
3) 회귀 알고리즘과 모델 규제 (2) (1) | 2022.11.02 |
3) 회귀 알고리즘과 모델 규제 (1) (0) | 2022.10.21 |
2) 데이터 다루기 (수상한 생선을 조심하라!) (0) | 2022.10.21 |
1-3) 마켓과 머신러닝 (0) | 2022.10.11 |