07. multi-variable linear regression (lec 04)

여기까지가 머신러닝에서 가장 기본이 되는 Linear Regression이다. 앞에서는 문제를 쉽게 하기 위해 입력 변수(feature)가 하나밖에 없는 단순 모델을 보여줬지만, 여기서는 여러 개의 입력 변수를 다루기 위한 전초전으로 2개의 입력을 처리하고 있다. 굿럭.


시험 성적을 예측하기 위해 공부한 시간만으로 판단하는 것에는 무리가 있다. 가령, 텔레비전을 켜고 공부했는지, 친구들하고 함께 공부했는지, 졸린 상태로 했는지 등등 성적에 영향을 줄 수 있는 다양한 요인을 살펴봐야 한다. 여기서는 수업 참석 여부를 갖고 판단하고 있다.

왼쪽 그림에는 시간을 뜻하는 변수(x, hours)가 있고, 오른쪽 그림에는 시간(x1, hours)과 수업 참석(x2, attendance)의 두 가지 변수가 있다. 그런데, 두 가지가 됐다고 해서 겁낼 필요 없다고 교수님께서 말씀하셨다. 우리에게는 거의 차이가 없다.


왼쪽 그림은 hypothesis, 오른쪽 그림은 cost 함수이다. 앞에서 지겹도록 보아온 내용이다. hypothesis에서는 공식이 조금 달라졌다. feature가 1개일 때는 Wx+b로 처리할 수 있었는데, 이제는 복잡해져서 w₁x₁ + w₂x₂ + b라고 해야 한다. 다시 말해, w와 x를 feature 갯수만큼 곱하고 b를 더하면 된다.

그런데, 중요한 것은 이게 아니다. 오른쪽 그림에서 hypothesis가 달라졌음에도 불구하고 cost 함수의 정의는 달라지지 않았다는 사실이다. 이 뜻은 나중에 나오는데, 기존 코드를 그대로 사용하면 multi-variable도 처리할 수 있음을 의미한다.



이번 그림에서는 앞서 설명한 feature가 여러 개일 경우에 대해, 2개일 때와 n개일 때에 대해 친절하게 나열해서 보여주고 있다. 갯수가 많아졌기 때문에 위와 같은 방식으로는 복잡해 보일 수밖에 없지만, 축약하면 같은 공식이 나오므로 걱정하지 않아도 된다.


동영상 중간에 행렬에 대해 짧게 얘기하는 곳이 나온다. 두 가지만 이해하면 된다. 왼쪽 그림은 행렬의 곱셈. 행렬은 앞쪽의 열 전체와 뒤쪽의 행 전체가 연산에 참여한다. 참여한 셀 각각을 곱해서 더하는 것이 기본이다. 곱셈이 성립하기 위해서는 앞 행렬의 열과 뒤 행렬의 행 크기가 같아야 한다. 이번 코딩을 진행하면서 가장 많이 실수했던 부분이다. 에러가 발생하는데, 코드상으로는 문제가 없어 보였다. 오랫동안 살펴보고 나서야 행과 열의 크기가 맞지 않는다는 사실을 발견할 수 있었다.

  2행 3열 x 3행 2열 = 2행 2열
  1행 2열 x 2행 1열 = 1행 1열
  5행 3열 x 3행 5열 = 5행 5열

간단하다. 곱셈에 인접한 2개의 숫자(왼쪽 열, 오른쪽 행)만 같으면 된다.

오른쪽 그림은 전치 행렬(transposed matrix)을 보여준다. 우리가 최종적으로 원하는 것은 행렬의 특정 열과 특정 행을 곱셈해서 더한 결과인데, 이때 행 또는 열의 순서가 맞지 않는 경우가 있을 수 있다. 앞서 말했듯이 행렬 곱셈은 열과 행이 참가해야 하기 때문인데, 이때 전치 행렬을 만들어서 곱셈을 한다. 당연히 행과 열을 맞추기 위해서 행과 열을 바꾸는 것이 아니라, 그렇게 곱셈해야 하기 때문이다.

나는 전치 행렬의 깊은 의미는 모르지만, 김성훈 교수님께서 말씀하신 내용에 대해서는 어렵지 않게 이해를 했다. 바로 뒤에 나오니까, 아래 그림을 참고하자.


변수가 여러 개인 cost 함수를 계산하기 편하도록 행렬(matrix)로 표현했다. w는 1x3 행렬, x는 3x1 행렬, 결과는 1x1 행렬이다. 1행 3열 x 3행 1열은 바깥쪽 행과 열이 결과 행렬의 크기를 좌우하므로 1행 1열이 나와야 한다. cost 함수는 기울기(w)에 따른 비용을 계산하는 함수이므로, 결과는 1개의 어떤 값이 되어야 한다.

그런데, 왜 w와 x의 행렬 크기가 다른 것일까? 다른 이유는 없고 행렬 곱셈을 적용해야 하기 때문이다. 2개의 행렬을 같은 크기인 1x3으로 만들면 곱할 수가 없기 때문에 전치(transpose)시킨 후에 곱셈을 해야 한다. 행렬은 우리가 직접 만들기 때문에 조금이라도 계산이 편하도록 미리 transpose시켰다고 보면 된다.

행렬을 hypothesis로 표현하게 되면 오른쪽 그림이 나온다. 결국은 행렬 곱셈이라는 1개의 표현으로 정리되기 때문에 지금까지 배운 hypothesis와 같을 수밖에 없다.



수학이 제일 어려웠던 것처럼 수학하는 사람들이 참, 똑똑하다. hypothesis를 처리할 때, 계산을 쉽게 하기 위해 y 절편에 해당하는 b를 넣지 않았었다. 계산의 편리함도 사실이긴 하지만, 진실은 필요없기 때문이었다는 것을 위의 그림이 보여주고 있다.

변수가 여러 개일 때, 결국은 행렬 곱셈을 해야 하고, y 절편도 넣을 수 있기 때문에 결국 b는 공식에 나타나지 않게 된다. 다만 b는 상수이고, 최종적으로 1회 더해지기만 하면 되므로 x쪽 행렬에 1을 넣는다. 이 부분이 굉장히 중요한데 그냥 1이다. 그래야 b와 1을 곱해서 최종적으로 b를 더하게 된다.

지금까지 보여준 왼쪽 그림은 수학적으로는 어색할 수밖에 없다. 2개의 행렬을 곱하는데, 한쪽은 수평으로 길고, 한쪽은 수직으로 길다. 어색하다. 수학을 전공했던 분들은 이런 상황을 인정하지 않고, 2개의 행렬이 똑같은 크기를 갖는다고 가정한다.

가령, 1x3 행렬 2개라던가 3x1 행렬 2개라던가.. 그런데, 행렬 곱셈에서 크기가 같은 행렬은 곱할 수가 없다. 행과 열의 크기가 같은 정방 행렬(square matrix)을 제외하면 말이다. 오른쪽 그림의 공식에서는 W의 위에 T가 붙어 있다. 수학에서는 T가 붙은 행렬을 전치 행렬이라고 부른다. 다시 말해, W 행렬을 transpose해서 사용한다는 뜻이다.

여기서 잠깐! 행렬 X는 1x3이 맞을까, 3x1이 맞을까? 둘 다 맞다고 생각한다면.. 그럴 수도 있긴 하겠지만..

최종 결과는 1개의 값으로 나와야 하기 때문에, 가능한 행렬 조합은 1x3과 3x1을 곱하는 것 뿐이다. 그래서, W 행렬을 transpose시켜야 하기 때문에 정답은 3x1 행렬이 된다.