책: O'REILLY의 Hands-On Machine Learning with Scikit-Learn & TensorFlow

URL: http://shop.oreilly.com/product/0636920052289.do

본문에 사용되는 사진들은 모두 위의 책에서 발췌

소스코드: https://github.com/ageron/handson-ml

틀린 내용이 있으면 언제든지 댓글 달아주세요! (오역은 어느정도 이해해주시길)


chapter1. The machine Learning Landscape


머신러닝이란 무엇인가?

General Definition

[Machine Learning is the] field of study that gives computers the ability to learn without being explicitly programmed.
(Arthur Samuel, 1959)

More engineering-oriented one

A computer program is said to learn from experience E with respect to some task T and some performance measure P,
if its performance on T, as measured by P, improves with experience E.

(Tom Mitchell, 1997)


 스팸필터로 예를 들어보자.

사용자에 의해 정의된 스팸 메일과, 일반적인 메일이 있다고 가정해보자.

이러한 스팸 메일과, 일반적인 메일은 training set이라고 불린다.

각각의 training examples은 training instance(or sample)라 불린다.


Task T: 스팸 메일인지에 대해 flag 부여

Experience E: training data (이전에 스팸인지 아닌지에 대한 정보)

Performance P: 정확히 메일을 분류 했는지에 대한 비율

(여기에서 P는 accuracy 라고도 불리며, 이는 종종 classification tasks에 이용된다.)


왜 머신러닝을 사용하는가?

 위의 예에서 얘기한 스팸필터에 대해 생각해보자.


 전통적인 프로그래밍 기법을 이용한 스팸필터는 아래와 같다.

 전형적으로 스팸메일에 사용되는 단어나 구문(예를 들면, "4U", "credit card", "free" 등)들을 보고, 탐지 할 수 있는 각각의 룰을 만든다. 이는 상당히 비효율적일 수 있는데, 각각의 룰들은 상당히 복잡한 룰이 될 수 있고, 이는 유지하기도 어려운 문제점이 있다.


다음은 머신러닝을 이용한 스팸필터이다.


 머신러닝 기반의 스팸필터 방식은 자동적으로 일반 메일과 비교하여, 스팸메일에서 빈번히 특이하게 사용하는 단어들의 패턴을 찾아준다. 프로그램은 훨씬 짧고, 유지하기 쉬우며, 정확도도 높다.


 위의 그림을 보면 붉은색의 Write rules과 녹색의 Data 부분과 Train ML algorithm 부분만 다르게 표시가 되어있는데, 이는 사람이 기존에 룰을 작성하였다면, 머신러닝 기반 학습방법은 "데이터를 통해 기계가 대신 학습해준다"라고 설명할 수 있다.


 이렇게 보면 "뭐가 그렇게 다를까?" 라고 생각해 볼 수도 있는데, 만약 스패머들이 "4U"라는 단어가 룰로 작성되었다는 것을 확인하고 "For U"라고 바꿨다고 생각해보자. 전통적인 스팸 필터 방식으로는 이렇게 변형 될 때마다 룰을 작성해야한다. 그와는 대조적으로 머신러닝 기법으로는 이러한 작업이 필요가 없게 된다.


 또한, 머신러닝 기법을 적용하면 대량의 데이터에서 보이지 않는 패턴들에 대해서도 발견할 수 있게 되는데, 이는 data mining 이라고도 불린다. 가령 아래의 그림과 같이, humans learn에 도움을 줄 수 있다고 해야할까나.



 위의 내용을 요약하자면 머신러닝이 좋은 이유에 대해 다음과 같다.

1) 기존의 수작업 또는 복잡한 룰을 머신러닝 알고리즘을 통해 간결한 코드로 좋은 성능을 낼 수 있다.

2) 변화가 심한 환경에서 머신러닝 시스템은 새로운 데이터를 채택할 수 있다.

3) 복잡하고 대량의 데이터에서 통찰력을 얻을 수 있다.

(그냥 머신러닝이 좋은 얘기를 구구절절 설명하고 있음)


머신러닝 시스템의 종류

1.  Whether or not they are trained with human supervision
(supervised, unsupervised, semisupervised, and Reinforcement Learning)

2. Whether or not they can learn incrementally on the fly

(online versus batch learning)

3. Whether they work by simply comparing new data points to known data points, or instead detect patterns in the training data and build a predictive model, much like scientists do

(instance-based versus model-based learning)


1. Whether or not they are trained with human supervision

1) Supervised learning

- 지도학습(감독학습이라고도 불림)은 쉽게 얘기해서 라벨(레이블)값을 주는 학습 방법이다.

 위의 training set을 보면 instance 즉 각각의 메일에 대해 정답을 부여하는 것이다. 

("이 메일은 정상 메일이다. 이 메일은 스팸 메일이다." 라는 정답)

전형적인 지도학습 방식은 분류(classification)이다. 즉, 메일이 스팸이냐 아니냐를 구분함.


 또다른 방식은 회귀(regression)가 있는데, 이는 쉽게 얘기하여 주식이나 집 값 같이 변동하는 연속적인 데이터들에 대해 예측하는 방식이라고 이해하면 된다.


지도학습에 자주 사용되는 알고리즘은 아래와 같다. (책에서 다룰 내용들)

  • K-Nearest Neighbors
  • Linear Regression
  • Logistic Regression (사실 Logistic Regression은 Logistic Classification이 더 적합)
  • Support Vector Machines
  • Decision Trees and Random Forests
  • Neural networks
    (모두 지도학습은 아님. autoencoders나 restricted Boltzmann machines같은 비지도 학습(Unsupervised)도 있고, deep belief networks 같은 준 지도학습(Semi-supervised)도 있음)

2) Unsupervised learning

- 비지도학습(무감독학습이라고도 불림)은 지도학습과 반대라고 생각하면 된다. 즉 라벨 값을 주지 않는 것이다. 기존의 라벨값을 주는 선생님이 있다고 했다면, 이번에는 선생님 없이 학습을 하는 방법이다.

 위의 그림 같이, 알려주는 사람이 없다.

 데이터의 특성에 따라 군집이 형성되는 것을 확인할 수 있다.

예를 들어, 내 블로그에 방문하는 사람들에 대해 군집화(Clustering) 알고리즘을 사용할 수 있는데, 영화를 좋아하는 방문자들, 쇼핑을 좋아하는 방문자들 등으로 분류를 할 수 있다. 또한, hierarchical clustering 알고리즘을 사용하여 영화 중에서도 드라마, 액션 등의 작은 그룹으로 분류 할 수 있다. 


비지도학습에 자주 사용되는 알고리즘은 아래와 같다.

  • Clustering
    • k-Means
    • Hierarchical Cluster Anaslysis(HCA)
    • Expectation Maximization
  • Visualization and dimensionality reduction
    • Principal Component Analysis (PCA)
    • Kernel PCA
    • Locally-Linear Embedding (LLE)
    • t-distributed Stochastic Neighbor Embedding (t-SNE)
  • Association rule learning
    • Apriori
    • Eclat

[으.... 주성분 분석, 커널 PCA 등 어려운 내용이 많다. 이전 자료 http://kkn1220.tistory.com/133에서 지도학습은 한번 훑어본 경험이 있지만, 비지도학습의 경우 제대로 학습을 하지 않았기에 벌써부터 걱정이다....]


 Visualization 알고리즘 또한 비지도학습의 좋은 예로 들 수 있다. 만약 복잡하고 라벨이 부여되지 않은 많은 데이터가 있을 때 이것을 2D(square)나 3D(cube)로 나타낼 수 있다. 

 이것과 관련이 있는 task는 차원축소(dimensionality reduction)가 있는데, 차원 축소의 목적은 데이터의 많은 정보에 대해 손실 없이 데이터를 간략하게 하는 것에 있다.

이것의 한가지 방법으로는 여러개의 feature들에 대해 상관 관계를 통해, 하나의 feature로 만드는 것이다. 이러한 것을 feature extraction이라고 부른다.


※Tip

 다른 머신러닝 알고리즘에 데이터를 넣기 전, 차원 축소를 이용하여 training data의 차원을 줄이는 것은 

좋은 시도일 수 있다. 그 이유는 속도를 빠르게 해주며, 디스크와 메모리를 덜 사용하게 하고, 또한 성능도 좋을 수 있기 때문이다.


 비지도 학습에도 군집화 말고 다른 중요한 것은 비정상 탐지(anomaly detection)을 말할 수 있다.

예를 들어, 평소와 다른 카드 거래를 감지하거나, 생산 및 제조 단계에서 감지할 수도 있다. 또는 다른 러닝 알고리즘에 적용하기 전 데이터셋으로부터 자동적으로 이상점(outlier)을 제거할 수도 있다.

아래의 그림은 정상 데이터를 통해 학습된 시스템이다. 새로운 데이터가 들어 왔을 때, 해당 데이터가 정상적인지, 아니면 비정상적인지 확인할 수 있다.


 마지막으로 비지도학습에서 중요한 task로 연관 규칙 학습(association rule learning, association analysis)이 있다.

연관 규칙 학습의 목적은 대량의 데이터에서 속성들(attributes) 사이에 관계를 발견하는 것이다.

예를 들어 슈퍼마켓을 운영하고 있다고 가정해보자. 사람들의 구매 내역에서 연관 규칙 학습을 통해 '바베큐 소스와 감자튀김을 구입한 사람들은 스테이크 또한 사는 경향을 보이더라.' 라는 결과를 얻을 수 있다. 그렇기 때문에, 운영자 입장에서는 이 음식들을 가까이 배치할 수 있다.


3) Semisupervised learning

준지도학습(실제로 준지도학습이라 부르는건 못들어본듯..)은 이름에서 얘기하듯이 지도학습과 비지도학습을 섞어놓았다고 생각하면 된다. 페이스북을 생각해보자. 일단 사용자는 페이스북에 자신의 친구나 가족들의 사진들을 업로드 할 수 있다. 이 때, 페이스북은 자동으로 사진들에 대해 A라는 사람과 B라는 사람을 인식할 수 있다. 여기까지는 비지도학습의 군집화(clustering) 부분이다. 그다음 사용자는 사진에 대해 A는 OOO이다. B는 XXX이다. 라고 라벨을 부여하게 된다. 이는 지도학습의 분류(classification)  부분이다. 이러한 방법은 사진을 검색하는데 상당히 유용하다.

페이스북에서 사진에 이사람은 누구입니까? 라는 것을 보았을 것이다. 결국 같은 맥락이다. 라벨을 많이 부여할수록 정확하게 인식하는 것은, 당연한 얘기


 대부분의 준지도학습의 알고리즘은 지도학습과 비지도학습의 결합(combinations) 이다.

예를 들어, deep belief networks(DBNs)는 restricted Boltzmann machines(RBMs) 라고 불리는 비지도학습에 기반한다.

RBMs는 비지도학습 방법에 의해 학습되며, 그 다음 전체 시스템은 지도학습 기법을 통해 fine-tuned 된다.


4) Reinforcement learning

- 강화학습은 위에서 언급한 것들과 매우 많이 다르다. 아래의 그림에서 보이는 agent가 주변 환경을 관찰한다. 

그 다음 환경에 맞는 선택을 하고 행동을 수행하게 되는데 이 때 정확한 행동에 대해서는 보상(rewards)을 하고, 반대로 정확하지 않은 행동에 대해서는 벌점(Penalty)을 부여하게 된다.

agent는 가장 좋은 정책(policy)을 스스로 학습하여, 주어진 상황에 맞게 행동할 수 있게 된다.

예로는 많은 로봇들이 어떻게 걷는지에 대해 학습시킬 때 사용 될 수도 있고, 2016년 3월에 이슈가 되었던 알파고가 있다. 알파고는 게임을 하는 동안에는 학습을 꺼두고, 단지 학습된 정책을 applying 했다는 것을 기억하라고 한다.


2. Whether or not they can learn incrementally on the fly

 머신러닝 시스템을 구분할 때 사용되는 다른 기준으로는, incoming data로 부터 점진적으로 학습할 수 있는 시스템인지 아닌지에 대한 분류이다.


1) Batch learning

- (일괄학습?)은 결론부터 말하자면 점진적으로 학습할 수 없는 시스템이다.

이것은 이용가능한 모든 데이터를 학습해야 한다. 그렇기 때문에, 일반적으로 많은 시간과 컴퓨팅 자원을 소모한다. 

시스템이 일단 학습이 되면, 더이상의 학습이 없이 적용이 된다. 이것은 offline learning 이라고 불린다.

만약 새로운 스팸메일 유형을 발견하여, batch learning 시스템에 적용을 원한다고 생각해보자. 이 때, 단순 새로운 데이터에 대한 것을 학습시키는 것이 아니라 기존 데이터 또한 학습시켜야 한다. 그 다음 기존 시스템을 중단하고, 새로운 시스템으로 교체를 해야 한다.

 다행인지는 모르겠지만, 왜 머신러닝을 사용해야 하는가? 부분에서 자동화 부분을 얘기했듯이, 전체 프로세스는 자동화 처리할 수는 있다. 그렇지만 이러한 시스템을 새로 동작하기 위해서, 기존 데이터까지 같이 학습을 시켜야 되는데 이 때, 시간과 자원을 소모해야 한다. 변동이 심한 데이터일 경우는 어떻겠는가... 이럴 때에는 batch learning이 적합하지 않다.


2) Online learning

- 온라인 학습은 연속적으로(각각이든 mini-batches로 불리는 소그룹이든) 들어오는 데이터에 대해 점진적으로 학습할 수 있는 시스템이다. 그렇기 때문에 각각의 학습 단계는 빠르고 적은 리소스를 사용하게 된다. 

 batch learning과는 달리 연속적인 데이터(예: 주가) 에 대해 상당히 유용하게 사용될 수 있으며, 즉 빠르게 대체할 수 있다. 이는 또한 한정된 컴퓨팅 리소스에 대해서도 좋은 학습 방법이다. 

새로운 데이터에 대해서만 학습을 하는 방식이기 때문에 기존의 것들은 버릴 수 있다.(기존으로 롤백 할 일이 없다면..)


 위의 그림처럼 온라인 학습 알고리즘은 또한,  하나의 기계의 메인 메모리로만 처리할 수 없는 대량의 데이터셋에도 이용 할 수 있다.(이를 out-of-core learning 이라고도 부른다). 알고리즘은 데이터의 부분을 load하며, 부분적 데이터를 각각 돌리고, 이를 전체 데이터를 돌릴 때까지 반복한다.


 온라인 학습 시스템에서 가장 중요한 파라미터 중 하나는 어떻게 변화하는 데이터를 빠르게 적용할 수 있냐는 것이다. (이를 learning rate라고 부른다.)

 만약 learning rate를 높게 설정하면, 시스템은 빠르게 새로운 데이터를 적용할 것이다. 그러나 이러한 방식은 기존 데이터를 빠르게 잊어버리는 경향을 보인다.

 반대로 learning rate를 낮게 설정하면, 시스템은 내성?(inertia)이 생겨 느리게 학습 될 것이지만, 새로운 데이터의 노이즈 값에 덜 반응하게 될 것이다.

 온라인 학습 시스템에서 가장 큰 도전은 '만약 bad한 데이터가 시스템에 유입될 때, 시스템 성능이 서서히 감소'하는 것이다. 이러한 위험을 감소시키기 위해, 시스템을 면밀히(closely) 모니터링 해야하며, 만약 성능이 저하되는 것을 확인했을 때 즉시 학습을 중단하여야 한다.(가능하면 이전 상태로 돌려놓는 것이 좋다.)


※Warning

 온라인 학습 방법 역시 offline으로 수행된다... 그렇기 때문에 온라인이라는 용어는 혼동될 수 있다.

온라인 학습 방법은 incremental learning으로 생각하면 된다.


3. Whether they work by simply comparing new data points to known data points, or instead detect patterns in the training data and build a predictive model, much like scientists do

 마지막으로 머신러닝 시스템을 분류하는 방법으로는 어떻게 데이터들을 일반화(generalize)하는 것이다.

 대부분의 머신러닝 tasks는 예측하는 것이다. 즉 학습 데이터(training examples)가 주어졌을 때, 시스템은 이전에 보지 못했던 examples에 대해 generalize할 필요가 있다. 

 학습데이터를 잘 분류하는 것은 좋은 일이지만, 불충분하다. 결국 우리의 목적은 새로운 데이터들을 얼마나 잘 분류할 수 있는지에 대해 성능이 좋아야 되기 때문이다.


1) Instance-based learning

(이 부분은 한글로 번역하기 애매한 부분들이 있어 영어로 작성)

 Possibly the most trivial form of learning is simply to learn by heart. If you were to create a spam filter this way, it would just flag all emails that are identical to emails that have already been flagged by users - not the worst solution, but certainly not the best.

 Instead of just flagging emails that are identical to known spam emails, your spam filter could be programmed to also flag emails that are very similar to known spam emails. This is requires a measure of similarity between two emails. A(very basic) similarity measure between two emails could be to count the number of words they have in common. The system would flag an emails as spam if it has many words in common with a known spam email.

 This is called instance-based learning: the system learns the examples by heart, then generalizes to new cases using a similarity measure.

 그림을 보니 결국 K-NN을 얘기하는 것 처럼 보였다. 그냥 기존의 학습 데이터에 새로운 데이터가 추가되었을 때, 데이터의 유사성을 측정하여 분류를 하는 것으로 이해했다. 


2) Model-based learning

데이터 셋으로부터 Generalize하는 다른 방법으로는 이러한 데이터들을 가지고 모델을 만드는 방법이다. 그 다음 생성 된 모델을 가지고 예측을 하는 것이다.

그렇다. 위의 Instance-based learning과 차이가 보인다. Instance based learning의 경우 새로운 instance 값이 들어왔을 때, 각각의 Training Instances들과 유사성을 측정을 해야한다. 그렇지만 밑의 Model-based learning의 경우 생성 된 모델에 새로운 instance 값이 들어왔을 때, 해당 영역으로 분류를 할 수 있다. 모델을 만드는 방법은 다음 챕터부터 차근차근 책에서 나온다.


Main Challenges of Machine Learning

머신러닝을 돌리기 위해 몇가지 나쁜 사례에 대해 얘기하고 있는데, 이부분은 가볍게 읽어보고 넘김

- 불충분한 학습 데이터의 양, 제각각의 Feature, 학습 데이터의 over/under fitting 등에 대해 소개

  


chapter1에서는 머신러닝이 무엇인지, 머신러닝이 왜 필요한지, 머신러닝의 종류가 무엇인지 등 머신러닝의 전반적인 부분에 대해 소개하고 있었다. chapter2에서는 End-to-End Machine Learning Project라는 주제로 진행하게 되는데, 머신러닝 데이터를 학습하기 전 데이터를 어떻게 수집하는지, 전처리는 어떻게 하는지에 대한 프로세스 설명이 될 것 같다.

+ Recent posts