: machine_leaning

개발자들 중에 최근 머신러닝에 대한 관심이 매우 많으나
인터넷에 방법을 검색해도 뭔지 기억도 안나는 수학공식이랑
알아듣지 못하는 말만 난무해서 지레 겁먹고 좌절한 사람들을 위해
이글을 써봅니다.

본 필자는 수학을 중학교2학년때부터 포기하고 수학책은 베고자는 용도로만 사용했으며 (당당)
현재는 쌈마이 개발자로 근근히 입에 풀칠하면서 사는 사람이고
이런 바보도 머신러닝 흉내라도 낼 수 있다는것을 알려드리기 위해!!
이글을 쓰게 되었습니다.

주의!

  • 이글은 매우 **쌈마이** 스럽습니다. 머신러닝에 조예가 있는 사람이 읽었다간 시력을 잃을 수 있습니다(으악 내눈!)
  • 알고리즘, 수학공식, 내부 구조 전부 생략합니다. 오직 설명과 scikit-learn 예제만 들어갑니다. 알고리즘이 필요하면 다른 많은 서적과 블로그 글들이 많습니다.
  • 어려운 용어나 번역투 다 생략합니다.
  • 저도 전문가가 아니라 적은 글이 맞지 않을 수 있으니, 틀린부분 지적은 언제나 환영합니다
  • 그래도 개발은 어느정도 해보신 분이여야 글을 알아보실 수 있습니다. 소스코드가 있기 때문이죠.

머신러닝은 뭘까

위키백과에서는 인공 지능의 한 분야로, 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야를 말한다 라고 적혀있네요.
힝 어렵당

매우 딱딱하니깐 간단히 풀겠습니다.

현재의 머신러닝은 기본적으로 통계와 확률에 더 가깝습니다.
과거의 통계데이터를 컴퓨터에 입력해서 앞으로의 통계 데이터를 예측(predict)하는 기술이라고 보는게 제일 무난할 것 같습니다.
그래서 현재까진 모든 데이터를 수치화 하여야합니다.
즉!, 이미지든 텍스트든 동영상이든 모두 개발자가 숫자로 일일히! 변환해서 학습을 시켜야 합니다.
그래서 주로 2차원, 3차원 숫자 배열을 많이 이용합니다.
그래서 이런 차원 데이터를 매우 쉽게 다룰 수 있는 python을 머신러닝에서 주로 애용합니다.

언제 사용할 수 있을까

간단하게 설명하면 과거의 데이터미래를 예측할때 쓸 수 있습니다. (색을 봐보세요)

  • 추천 시스템 (이 사용자는 이런 데이터를 좋아했으니[과거] 앞으로 이 사용자는 저런 데이터[예측]를 좋아할꺼야)
  • 스팸 필터 (이런 데이터는 스팸메일[과거]이 확실하니 앞으로 저런 유형의 메일[예측]은 자동으로 삭제해도 상관없다)
  • 사진 라벨분류(이런 사진은 강아지 사진이었으니 [과거] 이거랑 비슷한 수치의 저 사진은 강아지 사진일것이다[예측])
  • 주식예측 (과거에 특정 라인을 보이는 주식이 급등하였으니[과거] 이와 비슷한 유형의 저 주식은 급등[예측] 할것이다)
  • 바둑(?) (과거에 이런 기보에서 이런 수를 뒀을때 승리했으니[과거] 나는 이런수를 두면 이길 확률이 높아진다[예측])

뭘 할 수 있을까

큰 개념으로 주로 회귀(Regression), 분류(Classifiction), 군집화(Clustering)로 분류됩니다.

간략하게 회귀는 주로 데이터의 평균 수치나 데이터의 예측등에 사용하며
분류는 위에 설명한 사진 라벨분류나 MNIST처럼 손으로 쓴 글씨가 어떤 숫자인지 분류한다던지 할때 사용하며
군집화는 데이터를 여러 유형끼리 묶기 위해서 사용합니다

머신러닝으로 무엇을 할지에 대한 내용은 방대하여 우선은 간략하게 설명하고 추가로 나중에 다시 설명하겠습니다

머신러닝의 학습방법

머신러닝은 크게 지도학습, 비지도 학습, 심화학습 3가지 종류가 있습니다.
학습이란 단어가 와닿지 않으면, 내가 컴퓨터한테 몇개의 (인자)값을 전달하면 되냐로 이해하면 됩니다.

지도학습

컴퓨터한테 학습시킬 데이터와 정답이 되는 데이터셋 두개를 전달하는 학습방법입니다.
프로그래밍 적으로 설명하자면 x와 y값 두개를 전달하는 방법입니다
더 간단하게 설명하면 파라미터가 두개 있는 함수라고 생각하면 됩니다
scikit-learn random forest 예제 링크를 봐보겠습니다.

from sklearn.ensemble import RandomForestClassifier
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)

예제 소스코드를 보시면 x와 y를 fit함수에 두개를 넘기죠? 이게 지도학습 입니다.

(미리 경고했지 않습니까 겁나 쌈마이 스럽다고..!)


즉 이미 우리가 결과물에 대해 어느정도 알고있는 상황에서 사용 가능하며 가장 일반적인 학습방식입니다.

비지도학습

컴퓨터에게 정답을 알려주지 못하는 상황에서 데이터만 보고 컴퓨터가 그룹을 군집화해주는 학습방식입니다. 간단하게 정답이 없으면 비지도 학습입니다. 이번에도 scikit-learn K-means 예제 링크를 봐보죠

from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
               [4, 2], [4, 4], [4, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)

위의 random-forest예제와 매우 유사하나 마지막을 보면 fit method에 (X) 한개!!밖에 전달을 안하네요.
그럼 정답이 없는데 데이터를 어떻게 예측할 수 있나가 궁금해질것입니다

가령 예를들어 1부터 10까지의 숫자가 있습니다.
이걸 사람보고 두개로 그룹으로 나누라고 하면 일반적으로
가운데에 선을 하나를 그어 [1,2,3,4,5]와 [6,7,8,9,10] 로 나누겠죠?
컴퓨터도 마찬가지로 데이터에 선을 그어 데이터의 그룹을 분류시킵니다. 그림에서 점들이 데이터고 선들이 분류하기 위해서 그은 선들이고 흰색x로 표기된 구역이 분류된cluster라고 보시면 됩니다.

이 방식은 정답(Y)가 필요하지 않은대신 몇개의 그룹(cluster)으로 나눌것인지가 필수됩니다.
위의 scikit-learn예제에서 n_cluster=2를 대입한것은 데이터(X)를 두개의 그룹으로 나누겠다는 뜻입니다.

심화학습

구글이 알파고를 학습시킬때 사용한 방법으로
머신러닝으로 만들어진 결과 데이터셋을 가지고 다시 학습시키는 방법입니다.
알파고끼리 대국을 둔 결과를 다시 학습데이터로 사용한것이지요.


X?? Y??

처음 머신러닝을 접하면 예제코드에 일반적으로 x, y, w, b등으로 작성되어있는데요
tensorflow 가이드에서도 이런식으로 작성되어있습니다.

근데 머신러닝에 아예 무지하다면 대체 X가 뭐고 Y가 뭔지부터 혼돈이 올 수 있습니다.

(아닌가? 나는 그랬는데.. -_-;;)


주로 X를 입력할 데이터셋. Y를 결과셋(정답셋)으로 보시면 됩니다.

우리가 수학문제를 풀때 많이 나오는 x = y 의 개념이 적용되었다고 보시면 됩니다
수학을 아무리 포기 했더라도 어렸을적에 x + 2 = y 이런 문제 한개 정도는 봐보셨으리라 생각됩니다
즉 x에다가 뭔짓을 하면 y가 된다라는 공식이 머신러닝에도 들어가는것이고
결국 x = input_data, y = result 로 보셔도 무방합니다.

여기에 추가로 W와 b가 존재하는데 이것들은 W = Weight, b = bias(boost)라고 보시면 되며
주로 X (input_data)에 곱해주는값(W)와 더해주는값(b)를 설정합니다.

다음은 텐서플로우 예제인데

y = tf.nn.softmax(tf.matmul(x, W) + b)

자세히 보면 x라는 값과 W를 곱해준뒤(multiply) b라는 값을 더해준걸 y라는 변수에 넣는것을 알 수 있습니다
tf.matmul (matrix multiply)은 array와 array를 곱하기 위해서 사용하는 tensorflow의 method라고 생각하시면 됩니다

우리가 일반적으로 풀었던 수학문제같이 설명해보면
철수는 X라는 값에 W를 곱하고 b를 더했더니 y에 4라고 하는 값이 나왔다. 이때 X라는 값에 10을 넣으면 y가 몇이 되는지를 구하시오.(5점) 정도로 설명할 수 있을겁니다.

프로그래머 입장에서 만일 변수명을 x나 y로 작성한다면 솔직 싸다구 맞아도 할말 없겠지만
머신러닝쪽에선 너무 일반적인것이라 예제를 보통 이렇게 작성하는듯합니다.

나는 뭘 써야할지 모르겠어요

나는 이런이런것을 하고 싶은데 인터넷에 검색해보면 무슨 보기싫은 수학공식만 잔뜩 나오고
뭐 회귀하고 경사하강하고 시그모이드고 소프트맥스고 외계어만 나와 한개도 모르겠어요!!
알고리즘이 한두개가 아닌데 머신러닝중에 어떤 알고리즘을 써야할지 모르겠어요 하는 케이스가 아마 많을것입니다.

다음장에서 해당 내용들을 적을 수 있도록 하겠습니다.