Machine Learning - First Week

Machine Learning 2012.10.01 18:27





Coursera의 Machine Learning 첫 주 수업을 듣고 간단히 Machine Learning에 대해서 정리를 해보고자 한다.


* Machine Learning이란 무엇인가.

Machine Learning은 AI(Artificial Intelligence)의 한 분야이며 우리 주위에서 많이 쓰이고 있다. 이메일의 스팸필터라던지 검색창의 추천검색어라던지 자연언어처리나 손글씨인식이 Machine Learning을 통한 것이다. 그 외에도, 날짜예보나 (처음으로 인간을 이긴) 체스대국용 슈퍼컴퓨터인 Deep Blue도 Machine Learning을 이용한 것이다. Stanford에서 진행한 리서치중에 모형헬리콥터를 Machine Learning으로 가르쳐서 뒤집어 띄우는 게 있는데 한번 보시길. 링크 


1959년에 Arthur Samuel이 최초로 정의한 Machine Learning은 다음과 같다.

Field of study that gives computers the ability to learn without being explicitly programmed. [Wikipedia "Machine Learning" 발췌]

[ 명시적으로 프로그램을 하지않고 컴퓨터에게 배우는 능력을 주는 학문의 영역 ]

좋은 정의이긴 하지만 학문적으로 봤을 때는 모호한 면이 있다.


1997년에 Tom M. Mitchell 교수의 Machine Learning의 정의는 다음과 같다. 현재는 위의 정의보다 좀 더 많이 쓰이고 있다.

A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E. [Wikipedia "Machine Learning" 발췌]

[ "경험 E"로 인해서 "테스크 T"에 관한 성능이 "성능측정기준 P"로 측정되었을 때 향상된다면, "테스크 T"와 "성능측정기준 P"에 대하여 "경험 E"로 부터 배우는 컴퓨터 프로그램이라 부른다.]

좀 복잡한 정의인데.. 간단하게 이야기하면 컴퓨터 프로그램이 어떤 것을 배운 다음에 배울때 썼던 시간/노력보다 더 빨리/쉽게 배운 것을 해낼 수 있다면 Machine Learning이라 부른다라고 보면 될 듯 하다.


Machine Learning는 크게 두 가지로 나뉜다.


* Supervised Learning (지도학습)

답을 주고 가르치는 방법이라고 보면 된다. 과거의 기록을 집어넣고 거기서 결론을 내는 방식이다.

여기에도 2가지 방식이 있는데 Regression와 Classification이 있다.

1. Regression (회기분석) : 과거의 자료를 집어넣고 미래의 결과를 예측하는 방법.

Ex)

기상예보처럼 과거의 기상데이터를 집어넣고 내일 날씨예측.

과거의 판매기록을 가지고 오는 3개월의 매출예측.


2. Classification (분류) : 과거의 자료를 집어넣고 그 자료를 분류한 뒤 새로운 입력에 대해 분류를 하는 것.

Ex)

과거의 종양과 암에 대한 기록을 집어넣고 현재 환자가 양성인지 악성인지 걸려있는지 찾는 방법.

과거의 웹사이트 유저계정 기록을 집어넣고 현재 계정들이 해킹을 당했는지 안당했는지 구분하는 방법.


Supervised Learning은 이미 답이 나 있는 자료에 대해서만 결론을 낼 수 있다.


* Unsupervised Learning (자율학습)

Supervised Learning에 비해서 Unsupervised Learning은 답이 나있는 자료가 아닌 단순한 자료만 넣어주고 주어진 기준으로 그것을 분류하는 방법이다. 예를들면, 엄청나게 많은 뉴스사이트에서 관련기사만을 묶어서 보여주는 Google News 같은 것이 Unsupervised Learning에 포함이 된다. 그 외에도 회사에서 손님들의 정보를 집어넣고 관련된 사람끼리 묶어서 나중에 마케팅 방법을 다르게 사용하는 것도 Unsupervised Learning이라고 보면 되겠다.


오늘은 여기까지-

저작자 표시
신고

'Machine Learning' 카테고리의 다른 글

Machine Learning - First Week  (1) 2012.10.01
coursera  (1) 2012.10.01

설정

트랙백

댓글

coursera

Machine Learning 2012.10.01 18:25



  Coursera라는 사이트가 있다. 실리콘밸리에 있는 작은회사인데 Founder는 Daphne Koller와 Andrew Ng로 둘다 Stanford의 Computer Science에서 교수를 하고 있다. 현재(10/1/2012) 전 세계 33개(우리학교포함 ㅎㅎ)의 대학이 이 사이트에 참가하고 있고 18 카테고리(컴퓨터 뿐만이 아니라 의학, 비니지스 등등..)에서 198개의 코스를 무려 무료로 제공하고 있다.


  들어간 김에 어떤 코스가 있는지 보다가 Machine Learning 수업이 있다는 걸 알게 되었다. 8월20일부터 10주동안 수업이 진행되는데 이미 늦긴 했지만 한번 들어보고 싶다는 생각에 수업을 신청하고 들어가보았다. 기본적으로 동영상으로 수업이 진행되고 중간에 퀴즈가 한두개씩 나온다. 그리고 숙제로 연습문제가 제공이 되는데 데드라인이 있어서 날짜내로 턴인을 해야한다. 동영상 화질은 그렇게 좋은 건 아니지만 음질도 괜찮은 편이고 따로 슬라이드도 제공이 되서 큰 문제 없이 볼 수 있었다. 딱 한가지 아쉬운 점이라면 세계 여러나라 언어로 자막이 제공되는데 한국어가 없다는 점. 뭐 어짜피 연습문제를 풀 땐 영어문제이기 때문에 그러려니 하면서 봤다. 컴퓨터 관련 용어만 제대로 알아들어도 동영상을 보면서 따라가는게 큰 문제는 없을 듯 하다. 한번 공부 해보고 싶은 분은 www.coursera.org 강력추천.

저작자 표시
신고

'Machine Learning' 카테고리의 다른 글

Machine Learning - First Week  (1) 2012.10.01
coursera  (1) 2012.10.01

설정

트랙백

댓글

C# 5.0의 Asynchronous

C# 2012.09.18 19:54



이번에 Microsoft는 Windows8과 Windows Phone8을 발표하면서 그 플랫폼들과 호환되는 Visual Studio 2012를 발표했고 그와 동시에 C# 5.0을 발표했다. 과거 3.0에서의 LINQ, 4.0에서의 Dynamic Programming처럼 엄청난 변화는 아니지만 Asynchronous Programming이라는 상당히 강력한 기능이 5.0에 포함되었다.


Windows Phone 7 App을 개발하면서 느꼈던 큰 문제점 중 하나는 쓰레드 관리였다. UI에 상당히 공을 많이 들여서[특히나 반응속도에] OS 최적화가 되어 있음에도 불구하고 메인 쓰레드가 UI를 모두 처리하기 때문에 쓸데없이 무거운 코드를 메인 쓰레드에 할당해버릴 경우 반응속도가 줄거나 아예 사용자 입력을 무시해버리는 일까지 일어났다. 그래서 사용한 방법이 Dispatcher를 이용해 백그라운드에서 처리를 하는 방법을 많이 사용했는데 필요할 때마다 delegate이나 lambda function을 Dispatcher에 보내서 사용해야만 했기때문에 쓸데없는 코드와 코드블럭이 많아지면서 의도하지 않은 난독화(obfuscation)가 되는 상황이 발생했다.


이번 C# 5.0에서 추가된 Asynchronous Programming은 이런 문제는 어느정도 해소시켜 줄 수 있을 것 같다. async와 await, 이 두 개의 키워드와 지원 SDK로 상당히 쉽게 추상화된 thread programming을 가능하게 해준다.

static Task<int> sumUpToAsync(int n)
{
  return Task<int>.Run(() => // returns Task object
    {
      int result = 0;
      for(int i = 1; i <= n; i++) result += i;
      return result;
    });
}

// in main method
Task<int> task = sumUpToAsync(1000);
var awaiter = task.GetAwaiter();
awaiter.OnCompleted( () =>
  {
    int result = awaiter.GetResult();
    Console.WriteLine(result);
  });

이 코드는 async와 await을 사용하지 않고 구현한 Asynchronous 코드다. Task class는 Android의 AsyncTask와 비슷한 일을 하는데 AsyncTask와는 조금 다른 구현방법을 취하고 있다. Task class의 Run 메쏘드의 파라미터로 delegate이나 lambda function을 넣어서 바로 그 코드를 실행시킨다. 동시에 Run 메소드는 실행 중인 Task 객체를 돌려주고, 호출한 곳에서는 그 Task 객체를 받아서 거기서 다시 awaiter를 받은 뒤 그 awaiter의 OnCompleted event에 delegate이나 lambda function을 넣어줘서 Task 객체가 백그라운드에서 일을 끝난 뒤에 자동으로 이벤트를 호출되도록 하는 구조다. 뭔가 쓸데없이 복잡하다. 자 그럼 이제 이 코드를 한번 줄여보자.

// async를 메쏘드앞에 추가.
static async Task<int> sumUpToAsync(int n)
{ /* 위와 같음 */ }

// in main method.
int result = await sumUpToAsync(1000);
Console.WriteLine(result);

async와 await로 7줄의 코드가 단2줄로 줄었다. 코드블럭이 없어져서 보기도 쉽고 이해하기도 쉽다. async와 await을 사용하면 Task, awaiter를 통할 필요없이 바로 결과값을 받아서 처리가 가능하다. 정확히 말하면 컴파일러[Visual Studio 2012]가 컴파일시간에 자동으로 아래의 2줄을 위의 7줄처럼 바꿔준다. 다만, Task 내에서 에러가 날 경우가 있으니 try catch 등으로 사용해서 에러핸들링 하는 방법은 생각해둬야 한다. 참고로 try문으로 await이 포함된 라인을 감싸서 예외처리를 할 수 있다.


이 외에도 리턴값이 필요하지 않은 일에 대해서는 await printAsync();처럼 백그라운드에서 완전히 독립시켜 실행할 수 있고, await Task.WhenAll(task1, task2); 처럼 독립적으로 동시에 여러 Task를 실행할 수 있는 방법도 있다.


아직도 여전히 완전히 이해하지 못했거나 부족한 부분이 있지만 훨씬 가독성이 좋고 깔끔한 코드를 짜는데 도움이 될 것 같다.

저작자 표시
신고

'C#' 카테고리의 다른 글

C# 5.0의 Asynchronous  (2) 2012.09.18
Covariance와 Contravariance 그리고 in 과 out  (0) 2012.09.05
C# yield와 함수형언어의 느긋한 계산법  (0) 2012.08.27

설정

트랙백

댓글