Research note

[ 혼자 공부하는 머신러닝 + 딥러닝 ] 확률적 경사 하강법

점진적 학습 이전에 학습한 모델을 버리지 않고 새로운 데이터셋에 대해서 조금씩 훈련 대표적인 점진적 학습 알고리즘 은 확률적 경사 하강법 입니다. 확률적 경사 하강법 경사를 따라 내려가는 방법 가파른 경사를 따라 원하는 지점 에 도달하는것이 목표 가파른 길을 찾아 내려오지만 조금씩 내려오는게 중요 → 경사 하강법 모델 을

Source

이 글은 기존 Tistory 블로그에서 옮겨온 글입니다. 원문: https://jms3084.tistory.com/23

점진적 학습

이전에 학습한 모델을 버리지 않고 새로운 데이터셋에 대해서 조금씩 훈련

대표적인 점진적 학습 알고리즘확률적 경사 하강법입니다.

확률적 경사 하강법

경사를 따라 내려가는 방법

가파른 경사를 따라 원하는 지점에 도달하는것이 목표

가파른 길을 찾아 내려오지만 조금씩 내려오는게 중요 → 경사 하강법 모델을 훈련

전체 샘플을 사용하지 않고 하나의 샘플만을 가지고 가파른 길을 찾는 법 → 확률적 경사 하강법

훈련 세트를 한번 모두 사용하는 과정을 에포크, 일반적으로 수십, 수백번 수행

  1. 1개의 샘플을 사용해 경사 하강법을 수행하는 방식이 확률적 경사 하강법
  1. 여러 개의 샘플을 사용해 경사 하강법을 수행하는 방식이 미니배치 경사 하강법
  2.  실전에서 아주 많이 사용하는 방법이다.
  1. 전체 샘플을 사용해 경사 하강법을 수행하는 방식은 배치 경사 하강법
  2. 전체 샘플을 사용해 가장 안정적인 방법이고 컴퓨터 자원을 많이 사용하는 방법.

훈련 데이터가 준비되어 있지 않고 매일매일 업데이트 되어도 학습을 계속 이어나갈 수 있습니다.

손실 함수

문제에서 머신러닝 알고리즘이 얼마나 잘못되었는지 측정하는 기준

손실 함수의 값이 작을수록 좋지만, 어떤값이 최소값인지는 알 수 없다.

분류에서의 손실함수, 정답을 못 맞추는 것

정확도는 예측중에 맞은 개수 / 전체 샘플의 개수

샘플이 4개만 있다고 가정할시 가능한 정확도는 0(맞은 개수: 0), 0.25(맞은 개수: 1), 0.5(맞은 개수: 2) 0.75(맞은 개수: 3), 1(맞은 개수: 4) 이 전부이다.

이러한 정확도들은 듬성듬성하므로 연속적이지 않다.

로지스틱 손실 함수

이진 분류에서의 로지스틱 손실 함수’

양성 클래스

예측      정답      손실함수

0.9         1           -0.9

예측값타깃값을 곱한 후 음수로 바꿔주면 손실값(손실함수)이 나온다.

타깃이 양성 클래스이므로 예측이 1에 근접해야 좋은 모델 → 손실값도 -0.9이므로 작은 손실 값

음성클래스

예측                    정답                  손실함수

0.2                       0                       ?

1에서 빼준다.     1로 변환한다.    -0.8

0.8                       1                       -0.2  

음성 클래스일 경우 예측값을 1에서 빼주고 타깃값을 1로 변환한 후 양성 클래스와 같게 계산한다.

타깃이 음성 클래스이므로 예측이 0에 근접해야 좋은 모델 → 손실값도 -0.8이므로 작은 손실 값

예측 확률에 로그함수를 적용하면 더 보기가 편하다.

예측범위는 0~1 사이인데, 로그함수는 이 사이에서 음수가 되므로 최종 손실값양수가 된다.

로그함수는 0에 가까울수록 아주 큰 음수가 되기 때문에 손실을 크게 만들어 모델에 영향이 커진다.

→ 이러한 함수를 로지스틱 손실 함수라고 부른다. 또는 이진 크로스엔트로피 손실 함수라고 부른다.

다중 분류에서의 로지스틱 손실 함수’

다중 분류에서의 손실함수는 크로스엔트로피 손실 함수를 사용한다.

회귀에서의 손실 함수는 평균 절댓값 오차, 평균 제곱 오차를 많이 사용한다.

평균 절댓값 오차: 타깃에서 예측을 뺀 절댓값모든 샘플에 평균

평균 제곱 오차: 타깃에서 예측을 뺀 값을 제곱한모든 샘플에 평균

확률적 경사 하강법을 사용한 분류 모델 생성

  1. csv파일데이터프레임을 만들어준다.
  2. 데이터프레임에서 필요한 들을 입력, 타깃 데이터로 나눠 넘파이 배열로 만들어준다.
  3. 사이킷런의 train_test_split() 함수로 데이터를 훈련세트와 테스트 세트로 나눈다.
  4. 훈련세트와 테스트 세트를 표준화 전처리한다.
    1. 훈련세트로 학습한 통계 값으로 훈련세트와 테스트 세트를 변환해야 한다.
from sklearn.preprocessing import StandardScaler

ss = StandardScaler() ss.fit(train_input) train_scaled = ss.transform(train_input) test_scaled = ss.transform(test_input)

확률적 경사 하강법 제공하는 분류용 클래스(SGDClassifier) 생성

from sklearn.linear_model import SGDClassifier

#loss는 손실함수의 종류 지정, log로 로지스틱 손실 함수 지정 #max_iter에서 수행할 에포크의 횟수 지정 sc = SGDClassifier(loss=‘log’, max_iter=10, random_state=42) sc.fit(train_scaled, test_scaled)

확률적 경사 하강법점진적인 학습이 가능하다.

추가로 모델을 훈련하고 싶을 경우 객체.partial_fit() 함수로 이어서 훈련한다.

호출시 1에포크(모든 샘플 1번 로테이션)씩 이어서 훈련한다.

에포크와 과대/과소적합

과대적합: 훈련세트의 정확도 > 테스트세트의 정확도, 훈련이 훈련세트에만 너무 잘됨.

  1. 많은 에포크 횟수 동안 훈련한 모델은 훈련세트에 너무 잘 맞아 과대적합 모델

과소적합: 훈련세트의 정확도 테스트 세트의 정확도, 둘다 매우 낮은 경우, 훈련 덜 됨.

  1. 적은 에포크 횟수 훈련한 모델은 과소적합 모델

훈련세트는 에포크가 진행될수록 꾸준히 증가

하지만 테스트세트 점수는 최적점을 지나고부터 감소하기 시작

과대적합이 시작되기 전에 훈련을 멈추는 것을 조기종료 라고 한다.

코드로 구현시

  1. 300번의 에포크동안 훈련을 반복하여 훈련결과를 리스트에 저장한다.
  2. 저장한 리스트를 **plt.plot()**으로 그려본다.
  3. 최적점100번째 에포크라고 가정하자.

      4. 위 그래프에서 최적점을 지나면서 훈련세트와 테스트 세트의 점수가 조금씩 벌어지는 것을 볼 수 있다.

         에포크 초기에는 과소적합되어 훈련세트와 테스트 세트의 점수가 모두 낮다.

      5. 이러한 경우 100번째 에포크가 최적점(적절한 반복 횟수)라고 말할 수 있다.

SGDClassifier매개변수인 tolNone으로 지정시 멈추지 않고 학습하는것을 의미한다.

SGDClassifier매개변수인 loss 매개변수의 기본값은 ‘hinge’ 힌지손실이다.

힌지손실서포트 벡터 머신 이라는 다른 머신러닝 알고리즘을 위한 손실함수이다.

Copyright 2021. 박해선 All rights reserved.

공유하기

게시글 관리

Jisanglee

Search titles, venues, and tags.

move · openesc close