Logistic Regression (로지스틱 회귀)

컴퓨터공부/인공지능 2017. 7. 31. 21:49 Posted by 아는 개발자

앞선 포스팅에서 나이에 따른 연봉 변화로 선형 회귀를 설명했었습니다. 이번에는 예시를 조금 변형해서 연봉이 5000만원이 넘는지 안넘는지를 결정하는 함수를 생각해봅시다. 먼저 연봉이 5000만원을 넘지 않는 경우를 0, 넘는 경우를 1로 생각하고 그래프를 그려볼까요?



y축의 값이 0과 1밖에 없으니 그래프가 상당히 단조로워졌네요. 아마 30-32 사이에서 연봉이 5000만원으로 변화하는 지점이 있는 것 같습니다. 이 정보를 토대로 선형회귀를 해보면 아래 그림처럼 추세선을 만들어 줄 수 있을 것 같습니다.



대략 추세선의 값이 0.5 정도가 넘으면 연봉이 5000만원이 넘는다고 짐작 할 수 있겠네요. 이렇게 하면 뭐 더이상 손댈 것도 없을것 같습니다. 그런데 새로운 학습 데이터가 추가됐다고 해봅시다. 요렇게요.



55세 57세 데이터가 들어오면서 기울기가 낮아져버렸습니다. 아까처럼 y축 값이 0.5 가 넘을때 연봉이 5000만원이 넘을 것이라고 단언하면 30-32세 사이의 데이터를 커버 할 수 없게 됩니다. 골치아프네요. 그렇다고 기준 값을 0.4로 내리자니 다른 데이터로 학습 한 후에는 또 달라질 것이고 머리가 아픕니다. 모든 경우를 커버 해줄수가 없죠.


이런 분류(Classification)의 문제는 선형 회귀로 해결 할 수 없습니다. 차라리 특정 지점을 지나면 분류 되는 것으로 정하면 편할 것 같네요. 인공지능에서도 이렇게 두 가지 경우를 분류합니다. 이때 사용하는 회귀 방법이 Logistic Regression 입니다. 여기서 특정 임계치를 지날 때의 값을 표현하는 함수가 여러가지 있는데요 가장 대표적인 Sigmoid 함수에 대해서 알아봅시다.



그래프를 보니 x축이 증가하는 방향은 1로 수렴하고 감소하는 방향은 0으로 수렴하네요. 쉽게 x>0 인 구간은 1이고 x<0인 구간은 0으로 정의 할 수 있을것 같습니다. 우리는 식을 살짝 변형시켜서 특정 입력값이 0 보다 큰 경우에는 분류가 참인 경우로, 그렇지 않은 경우에는 거짓인 경우로 나눠볼 수 있습니다.



처음보는 수식이 나왔죠? 쎄타 위에 T자가 붙어있습니다. 이건 행렬에서 transpose라는 개념입니다만 지금 설명하면 길어지니 바로 오른쪽 그림처럼 이것이 지난 포스팅에서 배운 선형 방정식과 동일하다는 것만 확인하죠. 이렇게 식을 만들면 결국 z 값에 따라서 분류 기준이 결정되고 z는 곧 우리가 세운 선형 방정식이 됩니다. 우리는 다시 가장 그럴듯한 쎄타 값만 찾아주면 되겠네요.


선형회귀에서 쎄타 값을 찾기 위해 어떻게 했는지 기억 나시나요? 네 맞습니다. 비용 함수를 만들어 내고 여기에 Gradient Descent라는 기법을 적용해 여러번 반복해 가장 우수한 쎄타 값을 찾아 낼 수 있었습니다. 여기도 방식은 똑같습니다. Logistic 회귀에 해당하는 비용 함수를 만들고 이 함수에 Gradient Descent를 여러번 반복해 쎄타값을 찾아낼 수 있습니다. Logistic 회귀의 비용함수는 다음과 같아요



수학자들이 이렇게 하면 가장 좋다는 것을 이미 밝혀 냈으니! 증명하는 것은 생략합시다. 위 수식으로 우리가 설정한 쎄타값이 얼마나 학습 값을 잘 맞추고 있는지 확인 해 볼 수 있어요. 그리고 위 수식에 Gradient Descent를 적용해서 가장 우수한 쎄타값을 구해 낼 수 있답니다. 이것도 증명은 생략하고 수식만 보고 갈까요? 



선형회귀에서 했던 것처럼 Logistic 회귀에서도 위의 수식을 반복 적용해서 훌륭한 쎄타 값을 구해 줄 수 있습니다. 너무 위 식에 신경쓸 필요 없습니다. 어차피 Tensorflow가 모두 계산해 줄 거니까요 하하하. 그냥 느낌만 가져갑시다!


그런데 여기서 의문이 하나 생기네요. 지금껏 우리는 두가지 경우로 분류하는 것만 생각했습니다. 하지만 실제로는 아래 그림처럼 여러가지 경우로 분류하게 되는 경우가 생깁니다. 이런 경우는 어떻게 해야할까요?



방법은 생각보다 간단합니다. 분류 작업을 각각의 군집 마다 세번 실행하면 됩니다. '이것 아니면 나머지는 다 무효로 처리해!' 방법을 쓰는거지요. 아마 그림을 보시면 바로 감이 올겁니다.



첫번째 그림에서 파란색 군집과 나머지를 모두 검은색으로 생각했습니다. 그러면 파란색에 대해서는 확실히 구해 줄 수 있겠지요? 시계방향으로 이어지는 노란색과 초록색도 각각의 색깔에 대해서 만큼은 분류를 확실히 해줄 수 있었습니다. 각각의 분류 기준을 모두 합하니 각 기준에 대해서 분류를 해줄 수 있게 되었네요.


결국 여러 경우에 대해서 분류를 하는 것은 한 군집 집단에 대해서만 Logistic 회귀를 해주면 되는 것으로 귀결됩니다. 정말 유용한 함수죠? 다음 포스팅에선 지금까지 배운 것들을 이용해 손글씨를 판별하는 Tensorflow Tutorial 코드분석을 해보도록 하겠습니다!


* 참고한 자료


Coursera Machine Learning Andrew Ng 강의자료 - https://www.coursera.org/learn/machine-learning/

'컴퓨터공부 > 인공지능' 카테고리의 다른 글

뉴럴네트워크(Neural Network)  (0) 2017.08.18
오버피팅(Overfitting)  (0) 2017.08.10
숫자인식 코드 분석해보기  (2) 2017.08.03
Softmax와 Cross entropy  (0) 2017.08.03
Logistic Regression (로지스틱 회귀)  (0) 2017.07.31
Linear Regression (선형회귀)  (0) 2017.07.28