본문 바로가기
  • Seizure But Okay Developer
머신러닝/Coursera 강의 정리

2주차 강의 내용 정리 - 1

by Sky_Developer 2023. 7. 19.

개요

coursera 강의 2주차 내용을 정리합니다.

 

내용

지금 강의부턴 하나의 feature(input) 외에 여러 개의 feature 을 다루는 방식에 대해서 배울 것이다.

기존에 하나의 input 값으로만 구성된 방식은 아래와 같다.

그런데 만약 집 크기 외에 여러 개의 입력값이 존재한다면, 아래와 같이 재구성할 수 있고 집값을 예측하는데 더 용이하다.

위 그림에 나타난 표현식이 여러 개 있는데 정리하면 아래와 같다.

  • x_j = j번째 feature, 1번째 feature는 위 표에서 첫 번째 열을 가리킨다.
  • n = feature 의 총 개수
  • 화살표 x^i = i번째 학습 데이터의 feature 그룹, 행 벡터라고도 부름. 화살표 표현은 벡터라는 것을 나타내기 위해 씀. 화살표 x^2 의 경우 위에서부터 두번째 행이 이에 해당함. 화살표 x^2 = [ 1416 3 2 40 ] 와 같이 표현할 수도 있음
  • x_j^(i) = i번째 학습 데이터에 존재하는 j번째 feature, 특정 값을 지칭하고 싶을 때 쓰는 표현이며 위 표에서 x_3^2 의 경우 값은 2가 나옴

기존에 feature가 하나일 경우 f(x) = wx + b 로 표현했으나 이제 feature가 여러 개가 될 수 있다는 것을 알았으니, 이를 다르게 나타낼 수 있다.

여러 개의 feature을 가진 f(x) 는 위와 같이 나타낼 수 있다. (조금 헷갈린 게 n 개의 feature을 가진다고 했을 때 왜 변수 w도 n개가 생기지 싶었는데, 침대 예시를 통해서 직관적으로 이해가 되었다)

 

위 침대 예시를 설명해본다면, $1000 달러 기준으로 가격이 정해진디고 하면 기본 가격은 8만달러이다.

크기 X, 방 X, 층 X, 사용 연도 X 인 집, 즉 모든 x 에 0을 대입해도 기본 8만달러가 나오기 때문이다.

 

집 크기 x_1 변수의 0.1 값은 사이즈가 커질때마다 가격이 0.1 배씩 증가한다는 얘기이다.

방 갯수 x_2 변수의 4 값은 방이 늘어날 때마다 가격이 4배씩 증가한다는 얘기이다.

층 갯수 x_3 변수의 10 값은 층이 늘어날 때마다 가격이 10배씩 증가한다는 얘기이다.

년도 갯수 x_4 변수의 -2 값은 년도가 늘어날 때마다 가격이 2배씩 감소한다는 얘기이다.

 

(각 feature에 따라서 w 변수도 개별적으로 지정되는게 맞다는 생각이 들어 이해가 됨)

 

위 그림에 대한 설명은 아래와 같다.

화살표 w는 w 목록인 [ w_1, w_2, w_3, w_4, ..., w_n ] 으로 나타낼 수 있고 이를 벡터라고 부른다.

b는 단일 숫자이다.

 

w, b는 모델의 parameter 들이다.

 

x도 w와 마찬가지로 화살표 x로 나타낼 수 있으며 [ x_1, x_2, x_3, x_4, ..., x_n ] 로 표현된다. 마찬가지로 벡터라고 부른다.

 

여기서 dot product, 스칼라곱은 w 벡터와 x 벡터의 숫자 쌍을 확인 후 계산하는 것을 의미한다. 즉 x_1 은 w_1 과 곱해지고, x_2는 w_2, x_3 는 w_3 와 곱해지고 마지막으로 x_n 은 w_n 과 곱해져 n개까지 곱해진 갑들을 모두 합산하는 것을 의미한다.

 

이렇게 벡터 표현식을 사용하여 좀 더 간결하게 나타낼 수 있고 이렇게 나타낸 표현식을 multiple linear regression이라고 부른다. 이는 맨 처음 배웠던 feature 가 한 개인 univariate linear regression과 대조된다.

 

이제 위 mulitple linear regression을 실행하기 위해선 vectorization 이란 기법을 사용해야한다. 해당 기법을 사용하여 간단하게 mulitple linear regression 외에 다른 알고리즘들을 실행할 수 있다. vectorization 에 대해서 배워보자.

 

Vectorization

vectorization은 머신러닝 알고리즘을 사용할 때 우리의 코드를 간단하게 만들면서 빠르고 효율적으로 동작하게끔 도와주는 도구이다. 이에 대해서 예제를 통해 더 알아보도록 하자.

 

아래 예제는 n = 3 인 벡터, 즉 총 3개의 원소가 포함된 w, x 벡터를 보여주고 있다. 이를 코드로 표현한다면 어떻게 될까?

이를 파이썬 코드로 나타내면 아래와 같고 아래 예시는 NumPy 라이브러리를 가져다 표현한 것이다.

프로그래밍에서 순서 개념은 0부터 시작하므로 기존 수학에서 1부터 시작하는 것과 헷갈리지 않도록 주의하자.

 

이제 위 예시를 Vectorization 을 사용하지 않고 표현할 경우 2가지를 살펴볼 것이다, 하나는 연속적으로 변수를 나열하는 것이고 시그마를 사용해서 나타내는 것이다.

 

아래는 변수를 연속으로 나열한 표현식과 이를 코드로 나타낸 것이다.

변수를 연속으로 나열

만약 변수가 1000개, 100,000개 이상이면 위와 같은 표현식으로 나타내는 것은 비효율적이다. 시그마 표현식을 사용해서 나타내는 표현식과 이를 for 문을 사용해서 나타내는 코드를 살펴보자.

 

시그마를 통한 표현식

시그마 표현식과 이를 코드로 나타낸 것이다. 앞선 코드보단 좀 더 간결해졌지만 성능상 효율성을 더 개선할 수 있을 여지가 있다. 이때 Vectorization을 사용할 수 있다. 앞서 배운 스칼라 곱으로 수학식을 표현해보고 이를 코드로 옮기면 아래와 같다.

 

스칼라 곱을 통한 표현식

위 NumPy 에서 제공한 dot 함수는 두 w, x 벡터 간의 연산을 벡터화하여 구현한 것이다. 그리고 해당 함수는 크기가 클수록 더 효율적으로 동작한다.

 

정리하면 Vectorization은 코드를 간결하고 짧게 해주는 점과 코드를 훨씬 빠르게 동작하게 해준다는 점이 장점이다.

 

NumPy 의 dot 함수는 함수 사용시 내부적으로 병렬 처리를 수행하기 때문에 속도가 빠르고 효율적으로 동작한다, 추가정보로 GPU가 탑재된 컴퓨터는 GPU가 머신러닝 작업을 처리하는 것을 도와주기 때문에 더욱 빠르게 동작한다.

 

이제 Vectorization이 실제로 어떻게 병렬 처리를 수행하는지 알아보자. 아래 예제는 Vectorization 이 적용되지 않은 예시이다.

 

t 변수가 의미하는 것은 시간대 인데, for 문이 돌면서 n번의 연산을 수행하고 t_n 만큼 시간이 든다. n 만큼의 크기가 있으면 그만큼의 연산을 하면서 시간이 든다.

 Vectorization의 경우 이들을 병렬적으로 처리하여 한꺼번에 연산을 할 수 있다, NumPy 를 이용하면 하드웨에상에서 Vectorization이 수행되면서 아래와 같이 n개의 변수를 한꺼번에 가져온다, 그런 다음 바로 n개의 변수에 대해서 곱을 수행한다. 한번의 연산으로 위 과정이 바로 처리된다. 이를 병렬 수행이라고 한다.

그런 다음 특별한 하드웨어를 사용해 매우 효율적으로 곱셈 결과들을 모두 더한다. 앞서 봤던 거처럼 n번의 연산을 하여 더하기를 수행했던 것과 차이를 확인할 수 있다.

Vectorization을 사용한 코드는 매우 짧은 시간안에 계산을 해낸다. 데이터 셋이 매우 클 경우 이러한 특성은 매우 효과적으로 동작할 수 있다. 결과적으로 벡터화를 통한 계산법은 머신러닝이 학습을 효율적으로 할 수 있게끔 해줬으며 현재의 머신러닝 모델들이 매우 큰 사이즈의 데이터를 학습할 수 있게 해줬다.

 

이제 Vectorization이 multiple linear regression 에 어떻게 적용되는지 보자. w, b 값을 gradient descent로 구한다고 한 것을 기억하는가? 아래 예제는 gradient descent 를 이용해 w, b를 구하는 예제이다. paramter로 b와 16개의 feature(w), 16개의 미분(d)을 가지고 있다. 학습율은 0.1 이고 아래 예제를 좀 더 쉽게 실행하기 위해 b는 없다고 하자.

 

w 값(feature)을 계산하기 위해 gradient descent 알고리즘을 사용해야 한다. 원래 공식은 w = w - 알파 * d/dw * J(w) 이지만 아래와 같이 미분 표현식을 d 로 치환하였다.

16개의 feature에 대해 수정 및 계산을 Vectorization 없이 매번 한다면 아래와 같다.

Vectorization을 적용한 코드는 아래와 같다. 컴퓨터는 16개의 변수를 병렬적으로 계산함으로써 한번에 처리를 한다. Vectorization을 적용함으로써 linear regression model을 효율적으로 구할 수 있고 이는 많은 데이터를 학습시켜야 경우 아주 적은 시간을 들여 학습시킬 수 있다.

이처럼 NumPy는 머신러닝 알고리즘을 실행시킬 때 매우 효율적인 도구이다, 이제 multiple linear regression의 수학 공식과 vectorization를 조합하여 gradient descent 를 동작시켜보도록 하자.

 

먼저 multiple linear regression 는 아래와 같은 표현식으로 나타낼 수 있다.

여기에 vector 표기법을 적용시키면 아래와 같다. mulitple linear regression 에서 parameter는 벡터 w 와 b 이다.

Model과 cost function, gradient descent 또한 벡터 표기법으로 간결하게 나타낼 수 있다.

 

잠깐, gradient descent 를 실행했을 때를 볼 것인데 그중 미분영역에 대해서 심층적으로 다시 살펴보자.

앞선 시간에 봤던 거처럼 미분공식을 풀었을 때 아래와 같이 나타낼 수 있고 이는 feature가 1개일 때를 의미한다.

feature가 여러개 인경우, 즉 multiple linear regression인 경우 gradient descent 공식이 어떻게 표현되는지 보면 아래와 같다.

참고로 gradient descent 외에 linear regression의 w,b 값을 구하는 방법이 있다. 이를 normal equation이라고 부른다.

gradient descent 는 최소화된 크기의 cost function J함수의 w, b 값을 찾을 수 있는 좋은 방법인 반면,

normal equation은 linear regression에서만 w, b 값을 찾을 때 아주 적절한 방법이다.

이 방법은 반복적인 gradient descent 알고리즘이 필요없다. 이는 성능이 더 좋은 선형 수학 라이브러리를 사용해 한번에 w, b를 구할 수 있다는 것을 말한다.

단점으론, 다른 머신러닝 알고리즘(논리 회귀 알고리즘, 신경망 등)에 일반화되어있지 않아 이 경우 적용할 수 없다.

그리고 feature가 많으면 많을수록 속도가 느려진다.

대부분의 실무자는 normal equation을 직접 작성해서 수행하지만, 만약 당신이 숙련된 머신러닝 라이브러리에서 linear regression을 사용한다면 라이브러리의 뒷단에서 w, b를 찾기 위해 normal equation을 쓸 수 있다.

그러나 대부분의 머신러닝 알고리즘들은 gradient descent 알고리즘을 사용해 작업을 수행하는 것이 더 낫다.

 

여기까지 multiple linear regression 에 대해서 알아봤는데, 전 세계에서 가장 많이 사용되는 알고리즘 중 하나이다. 이제 몇가지 트릭을 사용해 학습율 등의 변수들을 적절한 값으로 선택할 수 있으며 결과적으로 multiple linear regression이 더 나은 성능으로 동작할 수 있게할수 있다.

 

출처

coursera 강의

댓글