# ML : Vectorization

What is 'vectorization'?


말 그대로 '주어진 Matrix(행렬)를 벡터화' 하는 것인데.
이렇게 표현하면 헷갈리니 다음의 예제를 살펴보자.


위 그림은 θj와 xj의 곱을 n+1번 반복하였을 때의 합을 보이고 있다.
Unvectorized implementation은 '벡터화 하지 않았을 때'의 계산 과정을 보이는데, for문을 이용하여 n+1번 동안 theta와 x의 곱셈을 반복하여 이를 합하고 있다.
이렇게 되면, n의 값이 기하급수적으로 증가함에따라 계산을 반복해야 하는 횟수 또한 계속하여 증가하게 된다. (n이 10000000000번이라고 가정해보자. 끔찍하다)
그래서 나온 것이 vectorized implementation이다. 아주 간단하고 심플하게 계산하고 있다. 어떻게 보면 '반복적인 계산'은 동일하게 진행되는 것 처럼 보이나, 실제 컴퓨터가 계산하는 과정은 매우 큰 차이를 보인다.

θ와 x를 각각 n*1벡터라고 할 때, 위 그림의 오른쪽과 같은 행렬들이 만들어질 것이다.
n*1벡터와 n*1벡터는 곱할 수 없기 때문에, 둘 중 하나의 행렬을 역행렬화해야 한다.
n*1벡터 끼리의 곱은 어느것을 해도 동일한 값이 나오겠지만, 일반적으로 theta를 역행렬화 한다.



위의 그림은 매우 매우 지저분하여 알아보기 힘들정도지만, 차근차근 살펴보도록 하자.

우선 위의 왼쪽 θ 값들을 살펴보자. n이 0부터 최대 2까지 존재하는 θn와 xn으로 존재하고 있다. 굉장히 복잡한 식처럼 보이지만, 이를 vectorization 하게 되면 다음과 같다.

θ := θ - ax

물론 θ와 x는 각각 n+1 * 1 벡터로 구성되어 있으며, a는 learning rate를 나타낸다.
여기서 x는 위의 그림에서 s로 표시되어 있는 '1/m * 시그마 어쩌고..' 를 표시하고 있다.
(저 식을 여기에 다시 적으려니 너무 힘들어서 말로 표현하고 있다. 양해를 부탁드립니다..)
결국 x는 위의 그림에서 화살표로 이어지는 (hθ(x) - y)*x의 합들을 나타내게 되는데, 간단하게 벡터화시켜서 표현하면 저렇게 수많은 계산을 할 필요가 없다는 것이다.
위 오른쪽은 완전 다른 예제인데, u(j) = 2v(j) + 5w(j)라는 식이 있다고 가정하자. j값이 0부터 n까지 총 n+1번 반복될 때, 우리는 n+1번의 반복 계산을 통해 u(j)값의 sum을 도출할 수 있다.
하지만 벡터를 이용하면 u = 2v+5w만 가지고도 가능하다. v와 w 각각을 벡터화시키고 더해버리면 반복하지 않고도 재빠른 계산이 가능하다는 것이다.







댓글