-
Vectorization (벡터화) | Supervised Machine Learning: Regression and ClassificationMachine Learning/Stanford ML Specialization 2023. 10. 28. 14:55
Vectorization vs non-Vectorization Code
학습 알고리즘을 구현할 때, Vectorization(백터화)를 이용하게 되면 코드도 짧아지고 효율도 좋아진다고 한다. 또한 백터화된 코드를 사용하면 그래픽 용도로 사용되는 GPU를 사용할 수 있다고 한다. 백터화란 무엇인가?
앞서서 살펴본 내용에서 언급한것처럼, feature가 많은 수식을 다음과 같이 벡터화해서 나타낼 수 있다.
w = [w1, w2, w3, ...] b = is a number x = [x1, x2, x3, ...]
예를 들어, Python Library에서 가장 많이 쓰이는 NumPy를 이용해서 코드화 하면 아래와 같다. 아래 숫자는 임의로 지정한 것이다.
w = np.array([1.0, 2.5, -3.3]) b = 4 x = np.array([10, 20, 30])
컴퓨터 언어에서는 보통 첫번째가 0이기 때문에, w[0]로 1.0을, w[1]으로 2.5를 엑세스 할 수 있다.
만약 이런 vectorization없이 수식을 나타내야 한다면?
f = w[0] * x[0] + w[1] * x[1] + w[2] * x[2] + b
Feature가 3개뿐이라면 다행히지만, 만약 100,000개라면? 수식은 길어지고 가독성도 떨어지며, 코드 파일의 크기도 증가하게 된다.
그렇다면 이것을 간소화 시킬 수 있을까? 바로 for loop을 이용하면 된다.
f = 0 for j in range(0, n); f = f + w[j] * x[j] f = f + b
range를 이용해서 0부터 n - 1까지, 0으로 설정된 f에 각 x 와 w를 곱한 값을 더해주고, 최종적으로 b를 업데이트 해주는 방식이다. 코드가 훨씬 간소화 되었다. 하지만 이 for loop의 단점은? 병렬화 처리를 하지 못한다는 점이다.
여기서 Vectorization을 이용해서 코드도 간소화 하고 병렬화 계산을 이용해 빠르게 처리하게 되면 이점을 볼 수 있다.
f = np.dot(w, x) + b
Dot product를 해주는 Numpy의 함수 dot() 함수를 이용해서 w, x 벡터들을 각각 곱해주고, b를 더해주는 방식인데, 병렬화된 계산도 할 수 있어서 훨씬 효율적이다.
Parallel Computing
실제로 for loop과 Vectorization이 어떤 차이가 있는지 알아보자.
https://youtu.be/uvTL1N02f04 For loop으로 구현했을 때, 매 시간마다 j가 변화 하면서, 0부터 15까지 순차적으로 w[j] + x[j] 값을 계산해서 f에 더해주게 된다. 하지만 위 강의 화면 오른쪽에서 보여지듯, np.dot(w, x) 함수를 이용해서 계산했을 때, 함수 연산이 시작 되자 마자, 모든 값들의 곱셈은 한번에 병렬적으로(in parallel) 계산되게 되고, 모든 연산이 다 끝난 후, 또 한번 그 결과값들을 한번에 t1 시점에 더하게 된다. 이는 t0 부터 t15까지 총 16차례동안 연산을 한 for 보다 훨씬 효율적이고, 특히 큰 데이터에는 더욱더 효율적이다.
이는 모델을 계산할때 이외에도 Gradient Descent Algorithm에도 정말 큰 효율성을 부여한다.
https://youtu.be/uvTL1N02f04 Gradient Descent값을 계산할 때, 만약 feature가 1개라고 한다면, 다음 w값을 계산하기 위해서 아래와 같은 수식을 계산해야 했다.
$ w = w - a * d[j] $
만약 feature가 16개라면? 이야기는 복잡해진다. w1, w2,,, w16까지 모두 계산해야 하는데, 이것 역시 for loop으로 계산하게 되면 위 이미지의 수식에 의해서 w1부터 하나씩 계산이 된다. 하지만 Vectorization을 이용하면, vector끼리 계산을 해서 병렬처리를 할 수 있다.
Reference
NumPy documentation — NumPy v1.26 Manual
The reference guide contains a detailed description of the functions, modules, and objects included in NumPy. The reference describes how the methods work and which parameters can be used. It assumes that you have an understanding of the key concepts.
numpy.org
'Machine Learning > Stanford ML Specialization' 카테고리의 다른 글