Search

'머신러닝'에 해당되는 글 2건

  1. 2017.07.28 Linear Regression (선형회귀)
  2. 2017.07.20 tensorflow 설치하면서 인공지능을 정의해보자

Linear Regression (선형회귀)

컴퓨터공부/인공지능 2017.07.28 20:50 Posted by 아는 개발자 아는 개발자

앞선 포스팅에서 우리는 인공지능이란 '대량의 데이터를 학습해 가장 그럴듯한 미래를 예측한다'고 정의했습니다. 그리고 여기서 우리 개발자가 할 일은 대량의 데이터를 훌륭하게 학습시키는 알고리즘을 만드는 일이라고 말씀드렸습니다. 이제 학습 알고리즘에 대해서 공부해봐야겠죠? 마음은 벌써 알파고에 쓰인 딥러닝을 짜보고 싶지만, 지금 당장은 해볼 순 없으니 가장 기초적인 학습법인 선형회귀(Linear Regression)부터 천천히 공부해봅시다.


우리에게 아래 표처럼 나이에 따른 연봉 데이터가 있다고 가정해봅시다


실제데이터는 아닙니다. 제가 가공한거에요 헤헤


언듯 데이터를 분석해보니 나이가 많을수록 연봉을 더 많이 받는것 같습니다. 한번 차트로 볼까요?


그래프 상으로 표현해보니 실제로도 그러하네요. 위 자료를 통해 나이에 따라서 연봉을 대강 추측 해볼 수 있을 것 같습니다. 나이가 32살이라면 대강 4천 3백만원에서 5천만원 사이인 4천 6백만원 정도 받을거라고 생각 해볼 수 있겠네요. 하지만 이런 식으로 하면 좀 야매인 느낌이죠? 위 데이터를 간단히 선형 방정식으로 표현한다면 좀더 일관성 있고 훌륭하게 예측 할 수 있을 것 같네요.


엑셀에 있는 추세선 기능을 활용해 선형 방정식을 추가해봤습니다. 나이 값에 따라 연봉을 추출 할 수 있으니 더 신뢰성이 가는 데이터입니다. 좀더 전문적인 느낌이죠? 정말 별거 아닌것 같지만 이것은 인공지능의 가장 기본적인 연산작업입니다. 이렇게 짜잘한 일련의 작업들이 쌓여서 더 복합한 것들을 예측하는 작업이지요.


자 그러면 이제 가장 그럴듯한 일차 방정식을 구해봅시다. 아마 위에서 우리는 차트로 그려보고 대강 짐작했을 뿐이지 실제로는 어떻게 구해야 할지 감이 안올겁니다. 따로 이걸 구할 수 있는 방정식이 있는 것도 아니구요. 그래도 괜찮습니다. 좀 번거롭지만 그래도 컴퓨터를 이용하면 훌륭하게 구할 수 있습니다.


기본적인 선형 방정식의 수식은 이렇습니다.



여기서 두 θ(쎄타라고 부르겠습니다) 값이 어떻냐에 따라서 그래프의 모형이 결정됩니다. 우리는 학습 데이터에 가장 근접한 두 쎄타 값을 구하는것이 목표입니다. 가장 손쉽게 해볼 수 있는 방법은 랜덤 값을 막 넣어보고 가장 그럴듯한 모형을 찾는 겁니다만 이렇게 한다면 시간이 엄청 오래 걸리겠지요? 컴퓨터도 이정도 연산을 커버할 만큼 빠르지 못합니다.


마구잡이로 대입해가며 선형 방정식을 만들기 전에 한 번 생각해봅시다 우리가 구한 선형 방정식이 학습 데이터와 얼마나 근접한지를 식으로 어떻게 표현 할 수 있을까요? 가장 간단한 방법은 우리가 만든 선형 방정식이 추출한 값과 실제 데이터 값의 차이를 확인해보는 방법일 겁니다. 여기서 값의 차이의 제곱의 합을 식으로 표현해봅시다.


m: 데이터의 개수, x: 나이값, y: 연봉, h: 선형방정식 입니다


대충 이렇게 만들면 우리가 만든 선형 방정식의 효율을 측정 해 볼 수 있을것 같습니다. 위의 식은 인공지능에 비용함수(cost function)이라 부릅니다. 아마 가장 좋은 선형방정식은 비용함수의 값이 가장 낮은 방정식일 겁니다. 


위의 그래프는 쎄타 값의 변화에 대한 비용함수 그래프입니다. 볼록볼록한 산능선 같은것이 둘쭉날쭉합니다. 지도상의 십자가 포인터는 현재 우리가 있는 지점이고 우리가 가야할 지점, 비용 함수가 가장 낮은 지점은 z 값이 가장 낮은 지점 즉 별표로 표시된 부분입니다. 이때의 쎄타값들을 구해 줄 수 있다면 가장 훌륭한 선형 방정식을 만들어 낼 수 있을것 같습니다.


이건 'Gradient Descent'라는 방법을 이용해서 가능합니다. 먼저 수식을 보여드릴게요!


여기서 α는 Learning Rate라고 합니다


위의 수식은 두개의 쎄타 값이 수렴 할 때 까지 반복하라고 되어 있습니다. 반복하는 작업은 비용함수의 편미분값 곱하기 알파 값을 기존 쎄타 값에서 빼주는 것을 계속 반복하는 방식입니다. 이렇게만 설명하면 감이 잘 오지 않죠? 다시 그래프로 돌아가봅시다


비용함수에서 쎄타0 값을 일반 상수로 놓고 Θ과 비용에 대한 그래프를 그려봅시다. 그러면 아래와 같이 볼록한 이차원 그래프가 만들어질겁니다(위 비용함수 그래프에서 특정 쎄타0를 축으로 자른다고 생각해보세요!)


여기서 노란 십자가는 현재 저희가 있는 지점입니다. 빨간 십자가 지점에 가까워 질수록 비용 값은 작아지겠죠? Gradient Descent 방법은 한번에 최적의 지점에 도달하진 못하지만 반복작업을 통해 최적의 지점에 도달 할 수 있게 해줍니다. 위의 수식을 1회 적용한 그래프는 아래와 같습니다.



비용함수를 쎄타에 대해서 미분한 값은 그 지점의 접선 기울기와 같습니다(고등학교때 다 배웠습니다) Gradient Descent 방법대로 기울기에 α값을 곱한 값을 기존 쎄타값에 빼주면 그래프는 최적점과 조금 더 가까워지게 됩니다. 이 방법을 여러번 반복하면 점점더 그래프가 최적점에 가까워지겠죠?


       


쎄타 0와 쎄타 1 각각에 대해서 위 작업을 반복하면 최적의 선형 방정식을 구해 낼 수 있게됩니다. 단 여기서 주의해야 할 점이 있습니다. Learning Rate라 말씀드린 α값을 어떻게 정하느냐에 따라서 학습 속도 및 성공의 유무가 결정됩니다. 만약 이 값이 너무 크거나 혹은 너무 작으면 어떻게 될까요?



왼쪽 그림은 α값이 너무 큰 경우에 해당합니다. 이때는 기존 쎄타 값이 너무 급격하게 변해 오히려 비용함수의 값이 더 증가하는 방향으로 움직이고 있네요. 이런 경우는 차라리 안하느니만 못합니다.


오른쪽그림은 α값이 너무 작은 경우입니다. 이때는 비용함수의 값이 감소하는 방향으로 이동하는데 이동하는 크기가 너무 느립니다. 한 두번이면 되는 학습 횟수를 몇배 더 해야하니 학습에 소요되는 시간이 오래 걸리게 됩니다. 그래도 비용함수가 증가하는 방향은 아니니 시간이 많다면 충분히 최적점에 도달 할 수 있겠네요


적당한 Learning Rate 값을 세팅하고 두 쎄타값을 구해내는 과정이 Linear Regression입니다. 생각보다 복잡한 수학 지식이 적용되진 않았지요? 고등학교 수학 + 편미분 만 알고 있으면 충분히 따라 갈 수 있을 정도입니다. 앞으로 배울 Logistic Regression도 이와 큰 차이는 없습니다! 다음 포스팅에선 이거랑 비슷한 Logistic Regression에 대해서 배워보도록 합시다

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

뉴럴네트워크(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

tensorflow 설치하면서 인공지능을 정의해보자

2017.07.20 21:55 Posted by 아는 개발자 아는 개발자

인공지능이 정확히 무엇인지 생각해보기에 앞서서 Ubuntu 터미널에 tensorflow 설치 명령어 하나만 실행해둡시다.

(혹시 GPU를 사용하는 버전으로 설치하고 싶으신 분은 tensorflow 사이트에서 확인해보시고 설치하셔야 합니다!)


sudo pip install --upgrade tensorflow


인터넷 사양에 따라서 20-30분 정도 걸립니다. 딱 인공지능에 대해서 정의 해보기 좋은 시간이네요. 그럼 시작해볼까요?


지금 우리에게 가장 익숙한 인공지능은 알파고입니다. 알파고는 엄청난 양의 기보를 학습한 후에 어떤 위치에 수를 놓으면 유리한지를 알게 됐습니다. 자 그렇다면 인공지능은 결국 대량의 데이터를 학습한 결과물 이라고 손쉽게 정의해볼 수 있을 것 같습니다.


그런데 대량의 데이터라면 어떤 단어가 떠오르지 않으세요? 2-3년전만해도 이 단어가 뉴스를 휩쓸고 다녔습니다. 바로 "빅데이터"입니다. 대량의 데이터를 축적한 기업 또는 연구소가 이 데이터를 분석해 사용자에게 유용한 정보를 제공하기 위해 여러가지 연구를 진행하곤 했었죠. 이런 데이터 분석 덕분에 쇼핑몰에서는 특정 나이대의 소비자들이 어떤 상품을 선호하는지, 정부 연구소에서는 사회 취약층의 소득 구조를 좀더 잘 파악하게 됐습니다. 이것 역시 대량의 데이터 덕분입니다.


인공지능은 대량의 데이터를 학습했고 빅데이터는 분석했습니다. 학습과 분석. 사실 이렇게 개념으로 표현해서 달라 보이는 것이지 데이터를 이용했다는 사실 만큼은 둘다 동일합니다. 데이터를 사용한 사실 하나만 놓고 보면 둘 간의 경계가 매우 모호한것 같습니다.


 

(인공지능과 빅데이터 모두 대량의 데이터를 사용한다는 점은 다를 것이 없어 보입니다)


하지만 둘 사이에 예측이란 단어를 놓으면 차이는 확연히 구분됩니다. 빅 데이터는 (물론 분야마다 다르긴 합니다만)예측을 하지 않습니다. 빅데이터는 어질러진(unstructured) 데이터들을 분석하기 좋게 정리정돈을 잘 한 후 여기서 유용한 정보(useful information)를 추출하는 것이 목표입니다. 이와 달리 인공지능은 잘 정돈된 데이터(structured)를 여러 알고리즘을 통해 학습 한 후 가장 그럴듯한 미래를 예측합니다. 알파고로 예를 들면 기보는 학습에 사용된 잘 정돈된 데이터 였고 알파고가 이세돌을 상대로 놓았던 수들은 승리하기 가장 유리한 예측 들이었습니다. 


자 그러면 이제 인공지능을 정의 해볼 수 있겠습니다. 인공지능은 '대량의 데이터를 학습해 가장 그럴듯한 미래를 예측한다'. 엄청 거창한 것이 나올 줄 알았는데 의외로 간단하지요? 정의를 아래의 그림처럼 표현해 볼 수 있습니다


(잘 정돈된 데이터를 학습한 모델은 미래를 예측 할 수 있습니다)


여기서 모델은 잘 정돈된 데이터를 학습한 결과물입니다. Test Data를 모델에 입력하면 가장 그럴 듯한 예측을 하는 것을 말하지요. 머신러닝의 성능은 얼마나 예측을 잘하는 모델을 잘 만드느냐에 달렸고 이 모델은 얼마나 풍부한 데이터를 갖고 있느냐 그리고 얼마나 우수한 학습 알고리즘을 사용하고 있느냐에 달려있습니다. 많은 인공지능 연구자들이 좋은 학습 알고리즘을 만드는데 시간을 많이 투자했고 가장 간단한 선형 회귀(Linear Regression) 부터 알파고에 적용된 딥러닝(Deep Learning)까지 만들어진 상태입니다.


이제 우리가 공부할 부분도 명확해졌습니다. 우리는 인공지능에서 학습 알고리즘을 공부해볼 것입니다. 가장 기초적인 선형회귀에서부터 뉴럴네트워크까지 차근차근 밟아볼까요?