혜랑's STORY

[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 1 본문

무지성 작업실/WSS 세미나 - Face Recognition

[정리] 기계학습(Machine Learning, 머신러닝)은 즐겁다! Part 1

hyerang0125 2021. 9. 4. 15:05

#1. 기계학습(Machine Learning)이란 무엇인가?

- 문제를 해결하기 위한 맞춤 코드(custom code)를 작성하지 않고도 일련의 데이터에 대해 무언가 흥미로운 것을 알려줄 수 있는 일반 알고리즘(generic algorithms)이 있다는 아이디어

ex) 분류(classification) 알고리즘 - 데이터를 서로 다른 그룹으로 분류하는 것을 이용하여 이메일을 스팸과 스팸이 아닌 것으로 분류할 수 있다.

서로 다른 많은 분류 문제에 재사용될 수 있는 블랙박스

기계학습(Machine Learning)은 이런 종류의 일반 알고리즘(generic algorithms)을 포함하는 포괄적인 용어이다.

#2. 두 종류의 기계학습 알고리즘 - 지도학습(supervised), 비지도학습(unsupervised)

기계학습 알고리즘은 지도학습(supervised learning)비지도학습(unsupervised learning)의 두 가지 주요 범주 중 하나로 분류될 수 있다.

1) 지도학습(Supervised Learing)

- 훈련 데이터가 주어지고, 컴퓨터는 답을 찾기 위해 "무언가"를 하여 관계를 알아내도록 함.

ex)  모든 연산 기호가 지워진 수학 시험에 대한 해답을 갖고 있는 것

학습 데이터

즉, 지도학습은 정답을 얻기 위해서는 어떤 연산자가 들어가야 하는지를 찾아내는 것과 같다.

2) 비지도 학습(Unsupervised Learning)

- 알려지지 않은 숫자 (예를 들어, 정답)를 예측하려하지 않더라도 여전히 다른 흥미로운 일들을 할 수 있다.

즉, 비지도 학습(Unsupervised Learning)은 정확한 답을 가진 라벨이 붙여진 데이터가 아닌 경우에 사용할 수 있다.

#3. 진짜 기계학습을 통해 주택 가격이 얼마인지 "학습"을 통해 추정할 수 있을까?

- 인간은 대부분의 상황에 대해 이해할 수 있으며, 명시적으로 가르쳐 주지 않아도 상황을 어떻게 해결하면 되는지 배울 수 있다. 이러한 능력을 컴퓨터로 복제하는 것이 Strong AI 연구의 목표이다. 아직까지 그 수준에 도달하지 못하였지만 샘플 데이터를 기반으로 특정 문제를 해결하기위한 방정식을 알아낼 수 있다.

프로그램 작성

기계학습에 대해 잘 모른다면, 아마 다음과 같이 주택 가격을 추정하기위한 기본 규칙들을 작성하고자 할 것이다.

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0
# 담당 지역내 평균 주택 가격은 평방 피트 당 200 달러이다
  price_per_sqft = 200
if neighborhood == "hipsterton":
    # 하지만 다른 지역은 조금 더 비싸다
    price_per_sqft = 400
elif neighborhood == "skid row":
    # 그리고 다른 몇몇 지역은 싸다
    price_per_sqft = 100
# 주택의 크기를 기반으로 주택 가격을 추정하는 것으로 시작한다
  price = price_per_sqft * sqft
# 이제 침실의 개수로 추정치를 조정한다
  if num_of_bedrooms == 0:
    # 원룸형 아파트는 가격이 싸다
    price = price — 20000
  else:
    # 일반적으로 많은 침실이 있는 주택이 더 비싸다
    price = price + (num_of_bedrooms * 1000)
return price

그러나 가격이 변함에 따라 로직을 유지하기 어렵고, 프로그램 또한 완벽하지 않다. 따라서 컴퓨터가 이 기능을 구현하게 하는 방법을 찾아보자.

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = <컴퓨터, 나 대신 수학식 좀 만들어줘>
return price

이렇게하면 정말 간단하게 원래 함수를 다음과 같이 줄일 수 있다.

ex) 가격(price)이 맛있는 스튜(stew)이며 그 재료는 침실의 개수(number of bedrooms), 평방 피트 면적(square foorage) 및 지역(neighborhood)이다.

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
 price = 0
# 이건 한 꼬집 넣고
 price += num_of_bedrooms * .841231951398213
# 그리고 저건 한 스픈 정도 넣고
 price += sqft * 1231.1231231
# 이건 아마도 한 줌 넣고
 price += neighborhood * 2.3242341421
# 그리고 마지막으로, 약간의 소금을 추가
 price += 201.23432095
return price

주황색으로 쓰여진 숫자를 주목하자. 이 숫자들이 바로 가중치이다.

최상의 가중치를 알아낼 때 한가지 쉬운 방법은 다음과 같다.

Step 1:

먼저 가중치를 1.0로 하고 시작한다.

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
 price = 0
# 이건 한 꼬집 넣고
 price += num_of_bedrooms * 1.0
# 그리고 저건 한 스픈 정도 넣고
 price += sqft * 1.0
# 이건 아마도 한 줌 넣고
 price += neighborhood * 1.0
# 그리고 마지막으로, 약간의 소금을 추가
 price += 1.0
return price

Step 2:

알고있는 모든 주택 데이터를 함수를 통해 실행해보고 각 주택의 정확한 가격과 이 함수가 얼마나 차이가 나는지 살펴보자.

주택 데이터를 함수를 이용해 각 주택의 가격을 예상해 보자.

예를 들어, 첫번째 주택은 실제로는 $250,000에 판매되었고, 위 함수는 $178,000에 판매되었다고 추정한것인데, 이 주택 하나만 보더라도 $72,000만큼 차이가 난다.

데이터 500개에 대한 함수가 추정한 값과 실제 가격의 차이를 제곱한 값의 총합은 $86,123,373라고 가정해보자. 이를 통해 함수가 현재 얼마나 "잘못되었는지" 알 수 있다. 이제 500으로 나눠 각 주택별로 얼마나 차이가 나는지 평균값을 구해보자. 이 평균 오류 값을 이 함수의 비용(cost)이라고 한다.

가중치를 잘 조정해서 이 비용을 0으로 만들 수 있다면, 함수는 완벽해지게 된다. 다시 말해서, 모든 경우에 대해서 함수가 입력 데이터를 기반으로 주택 가격을 완벽하게 추정할 수 있다는 것으르 의미한다.

우리의 목표는 다른 가중치를 시도하여 가능한 이 비용을 낮추려는 것이 된다.

Step 3:

가능한 모든 가중치를 조합해서 2단계를 계속 반복한다. 어떤 조합의 가중치든 비용을 0에 가깝게 만들어 주는 것을 사용하면 된다.

이때 시도 할 숫자의 조합은 무한하기 때문에 당연하게도 영원히 걸릴 것이다. 이것을 피하기 위해서, 수학자들은 많은 것을 시도하지 않고도 이러한 가중치에 대한 좋은 값을 빨리 찾을 수 있는 방법을 알아냈다.

먼저, 위 Step 2를 나타내는 간단한 방정식을 작성한다.

이 방정식이 바로 비용 함수(cost funnction)이다.

똑같은 방정식을 기계 학습의 수학 용어를 사용하여 재작성해 보자.

θ는 현재 가중치를 나타낸다. J(θ)는 '현재 가중치의 비용'을 의미

이 방정식은 현재 설정한 가중치에 대해 우리의 가격 추정 함수가 얼마나 차이 나는지를 나타낸다.

number_of_bedrooms와 sqft에 대한 모든 가능한 가중치 값에 대해 이 비용 방정식을 그래프로 나타내면 다음과 같다.

비용 함수의 그래프는 그릇(bowl)처럼 보인다. 세로축이 비용

이 그래프에서 파란색의 가장 낮은 지점이 비용이 가장 낮은 곳이다. 즉, 우리가 이 그래프의 가장 낮은 지점으로 이동할 수 있는 가중치를 찾는다면 답을 찾아내는 것이다.

각 가중치에 대한 비용 함수의 편미분을 계산하고, 각 가중치에서 해당 값을 뺄 수 있다. 이를 통해 우리는 가장 낮은 곳으로 이동하기 위해 움직일 수 있다. 이 작업을 계속하면 궁극적으로 언덕 맨 아래에 도달하여 가장 좋은 가중치를 얻게된다.

이 방법은 함수의 적합한 가중치를 찾는 방법 중에 하나인 배치 기울기 하강(batch gradient descent)에 대한 개괄적인 설명이다.