본문 바로가기

머신러닝/혼자 공부하는 머신러닝

10강 확률적 경사 하강법 알아보기

이 글은 https://www.youtube.com/watch?v=A1UUnfijQfQ&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=10 보고 공부한 글 입니다.

 

지난시간에 

선형 함수의 z 값을 시그모이드 함수에 넣어서 확률을 구한다.

z값만 가지고 예측을 해볼 수 있다. 이렇게 판단하는것이 decission_function이다.

선형 함수의 z값만 보고 판단한다. 0.5> 이면 양성, 0.5 미만이면 음성

 

decission_function을 사용하는 것이 predict 함수 이다.

바로 확률을 예측해준다.

 

사실 이진분류일 때 z함수가 1개만 계산이 된다.

양성일 경우 함수만 계산을 한다. 

음성은 z값을 시그모이드 함수에 넣고 결과값에 1을 빼면 음성 클래스의 확률이 나온다.

 

다중 분리일 경우 클래스가 여러개 이니 각 클래스마다 선형함수를 학습해야 한다.

 

predict_proba로 각 샘플마다 클래스를 예측을 볼 수 있다.

 

 

가상의 시나리오 

럭키 백이 대박이나서 찾는사람이 많아 졌다!

 

럭키백에 다양한 클래스를 넣어달라한다. 

일정 간격을 두고 새로운 모델을 학습하는것 

 

1. 데이터가 추가될때 마다 새롭게 학습을 하는 것

 

2. 새로운 데이터가 추가됬을 때 기존 데이터를 버려서 일정한 데이터를 유지할 수 있다.

 

원래 만들어 두었떤 모델을 업데이트 할 수 없을까? 이러한 방식을 점진적 학습, 온라인 학습 이라고 부른다.

 

온라인 학습 - 모델을 서비스하는 도중에 업데이트 한다.

 

점진적,온라인 학습을 사용할 수 있는 방법이 확률적 경사 하강법 이다.

 

선형, 로지스틱 회귀처럼 머신러닝 알고리즘이 아니다. 

머신러닝 알고리즘을 훈련하는 방법, 최적화 방법 이다.

 

 

 

확률적 경사 하강법 


확률적 = 무작위(랜덤) 하다.

경사 = 기울기

하강법 = 내려가는 것

 

무작위 하게 경사를 내려가는 방법

빨리 내려가려면 가파른 경사를 찾아서 조금씩 내려가야 한다.

 

 

 

1. 훈련세트에 있는 샘플을 하나씩 꺼낸다.(확률적 경사 하강법) 

훈련세트를 모두 소진했다면 1에포크 완료라고 한다.

텅빈 훈련세트를 다시 채워서 다시 시작한다.

 

 

왜 다시 채우냐면 조금씩 내려가야 하기 때문이다.(건너 뛸 수 있어서)

 

에포크를 여러번 반복하는 것이 기본

 

 

2. 2번 째는 여러 개씩 꺼내본다.(미니 배치 경사 하강법)

텅빈 훈련세트를 다시 채워서 다시 시작한다.

 

3. 3번 째는 몽땅 꺼내본다.(배치 경사 하강법)

데이터가 많기 때문에 메모리가 부족하거나 cpu가 부족할 수 있다.

 

 

 

손실 함수 


머신러닝 알고리즘이 얼마나 나쁜지 측정하는 정도

 

값이 작을 수록 좋다.

분류: 정확도를 바라본다.

 

ex)

이진분류 샘플이 4개있다.

50%맞은 정확도는 0, 0.25, 0.5, 0.75, 1 이라는 정확도가 끝일 것이다.

 

그런데 정확도는 부드럽게 되야 한다.

이렇게 구간이 있는 것은 손실 함수로 사용할 수 없다.

미분 가능하지 않다.

 

 

로지스틱 손실 함수 

회귀 - 평균 절대값 오차, 평균 제곱 오차 를 사용하기 때문에 미분가능하다.

손실함수 = 측정지표 가 된다.

평균 제곱 오차를 많이 사용한다.

 

분류는 정확도로 성능을 보고

 

최적화 로지스틱 선형함수로 최적화를 한다.

예측을 0.9로 하면 정답과 가깝다.

-를 붙히면 -0.9이다.

 

예측을 0.3으로 하면 -0.3으로 손실 값을 매긴다.

 

만약 - 를 안붙히면 0.9가 손실이 더 커지기 때문이다. 

0.3, 0.9일 때 0.3이 손실이 더 크다.

 

타킷과 가까운 값은 더 낮은 값으로 만든다.

 

 

음성 클래스는 0을 곱하면 안되니깐 1로 바꾸고 예측값 0.2를 0.8로 바꿔서 계산한다.

양성 클래스 처럼 계산한다.

 

예측이 0.2고 정답이 0이니 상당히 가깝다. 결과 -0.8은 손실이 꽤 낮다.

 

 

예측과 정답을 곱했을 때 

정답에 결과가 가까운 것낮은 값이되고

정답에 결과가 멀리 떨어진 것은 높은 값이 된다.

앞에다 -log를 붙히면 더 좋다.

0.8을 봤을 때 -log를 붙히면 작은 양수가 나온다.

 

0.2는 아주 큰 양수가 나온다.

 

손실이 양수로 나오면 좋지 않다.

 

 

손실을 얻어서 손실이 작아지는 쪽으로 훈련을 진행한다.

 

이런 함수를 로지스틱 손실 함수라 부르고 이진 크로스 엔트로피 손실 함수라고도 부른다.

 

 

데이터 전처리 

가장 가파른 경사를 따라 내려가야 한다. 

각각 특성마다 스케일이 같아야 한다.

 

다르면 가파른 경사를 측정할 수 없다.

 

StandardScaler로 스케일을 조정해준다.

항상 훈련세트에서 찾은 통계값으로 훈련세트, 테스트 세트를 둘다 조정한다.

 

 

 

SGDClassifier(확률적 경사 하강법)

확률적 경사 하강법의 분류일때 사용

확률적 경사 하강법의 회귀일때 SGDRegression사용

객체를 생성하고 훈련을 시킨다.

 

loss에 'log'라고 되어있는데 로지스틱 손실 함수를 지정한 것이다. 

 

어떤 머신러닝 알고리즘을 최적화 할지 정해줘야 한다.

 

max_iter=10은 점진적인 학습을 위해 작게줬다

이는 에포크와 동일한 의미 (=10번정도만 훈련세트를 다시 사용)

 

 

partial_fit() 은 기존에 학습했던것을 다시 학습한다.

 

배치, 미니배치는 지원하지 않는다.

 

사실 train_scaled에서 하나씩 꺼내서 쓴다.

 

 

 

 

에포크와 과대/과소적합

규제가 작아지면 과대적합된다.

 

규제가 커지면 훈련 세트와 테스트 세트의 점수가 모두다 낮아진다.

 

 

에포크도 비슷하다. 더 많이 훈련할 수록 훈련세트에는 잘맞는데 테스트세트에는 떨어진다.

 

에포크를 적게하면 과소적합이 된다.

 

가운데 지점을 찾는 것이 조기종료라고 한다.

 

 

 

조기 종료

partial_fit으로 모델을 훈련한다.

 

classes 매개변수는 partial_fit은 훈련세트의 일부분 주어진다고 가정한다.

fit()를 앞에 쓰지 않으면 클래스 갯수를 알 수 없다.

fit()을 쓰지 않고 partial_fit을 사용할 때는 사용가능한 class들을 넣어줘야 한다.

 

 

score값을 리스트에 추가한다.(그래프를 그리려고)

 

100epoch 정도가 중간지점이라고 생각한다.

 

SGDClassifier를 다시만들때 max_iter를 100으로 설정(에포크=100)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90