저번 포스트에서 우리는 Machine Learning의 근간에 대해서 알아보았다.
이번에는 좀 더 깊게 알아보도록 하자.
먼저, 우리는 이전에 x의 값을 하나로 생각하고 식을 전개하였는데,
현실에서 feature가 하나일 일은 거의 존재하지 않는다.(Ex. 눈, 코, 입, 귀 등을 살펴봐서 얼굴을 파악할 수 있음)
우리는 이제 하나 이상의 feature을 갖는 데이터에 대해서 생각해보자.
기호 부터 다시 재정립하자면,
고로, 만약 feature의 개수가 4개라고 한다면,
그래서 우리는 저걸 다 풀어쓰지 않고 이걸 벡터의 내적으로 표현할 수 있다.
우리는 지금 이걸 하나의 training example에 대해서만 생각하여 vector형태로 나오지만, m개의 training example을 생각하면 행렬의 곱으로 나오게된다.
그리고 그걸 Vectorization이라고 한다.
그럼 이제 이 multiple feature들에 대해서는 gradient descent를 어떻게 하는 지 알아보자.
위에서 이 두 식을 보고 우리는 이제 손실함수 J를 이런 식으로 표현할 수 있다.
그리하여, 이제 n개의 가중치를 모두 업데이트 해야하므로
=> 하지만, 이런 식으로 n개의 연산을 다 하는게 아니라, 행렬 곱으로 n길이의 Vector W를 출력으로 주는데, 각 자리에 맞는 w값이 들어가 있는 vector이다.
다양한 feature들이 있을 것이다.(ex. 방의 개수, 방의 크기)
하지만 feature들이 다같은 범위의 값을 갖는 건 당연하다.
예를 들어, 방의 크기는 10,000m일 수가 있는데(사실 잘 모름), 방의 개수는 4개인 경우 둘의 값의 차이가 너무 크다.
이런 경우, 학습에 있어 방의 크기가 주는 영향이 상대적으로 너무 작아서 거의 없는 것과 다르지 않을 수 있다.
이런 현상을 방지하기위해 우리는 feature scaling이라는 방법을 사용해주는 것이다.
naive하게 생각하면, feature이 가질 수 있는 최대 값으로 다른 training example의 같은 feature들을 나눠주면 0~1값 사이로 나오게 된다.
또한, 많이 사용하는 방법으로는 Mean Normalization이 있다.
이렇게 해주면 모든 feature값들의 중심이 0으로 맞춰지고 -1과 1사이의 값으로 나온다.
이 방법은 표준편차로 나눠준다.
이렇게 구할 수 있다.
어떤 경우 우리는 feature scaling을 해줘야할까?
-> 하나의 feature이 다른 애들에 비해 너무 크거나, feature의 값의 범위가 너무 넓을 때 해주면 된다.
우리는 cost function(비용함수) J를 최소화시키는게 목적인데, 과연 J의 값이 변화하지 않는데 더이상 작업을 진행하는게 의미가 있을까?
우리는 그런 지점을 설정해주어서 불필요한 작업들을 줄여준다.
=> 우리는 최적의 learning rate를 찾기위해 0.001부터 3씩 곱해서 실험해보고 최적의 learning rate를 찾는다.
이전에 봤던 것 처럼 feature을 scaling하여 크기를 조정하는 것 뿐만 아니라,
feature들을 합쳐서 새로운 feature을 만드는 방법도 있다.
예를 들어, feature 중에 방의 바닥의 넓이와 방의 높이라는 2개의 feature이 존재하면 이 2개를 사용해서 방의 부피라는 feature을 새로 만들어서 모델의 성능을 올릴 수도 있다.
feature engineering에서 만약 하나의 feature을 제곱하여 새로운 feature을 만들어낸다면 어떨까? => 곡선으로 데이터를 fitting할 수 있게될 것이다.
그리고 이러한 형태를 Polynomial Regression이라고 부르는 것이다.
그리고 당연하게도 이런 경우에는 feature scaling이 더 중요하게 되는 것이다.
새로 생겨난 제곱 항 feature은 훨씬 큰 값을 가질 것이기 때문이다.