이 글은...
Andrew Ng 교수의 Deep Learning 강좌 C1W2L13 까지의 내용을 정리한 것이다. 벡터화가 무엇이고 어떻게 사용하는지 살펴본다.
내용 요약
벡터화 (Vectorization)
순차적으로 계산하는 것보다 동시에 분산해서 처리하는 것이 훨씬 빠른 결과를 낼 수 있다. 예시로든 코드를 직접 실행해보니 for 문은 약 600ms, 벡터화를 사용한 코드는 약 2ms의 시간이 걸렸다.
import numpy as np
import time
a = np.random.rand(1000000)
b = np.random.rand(1000000)
tic = time.time()
c = np.dot(a, b)
toc = time.time()
print(c)
print("Vectorized version: " + str(1000*(toc-tic)) + "ms")
c = 0
tic = time.time()
for i in range(1000000):
c += a[i]*b[i]
toc = time.time()
print(c)
print("for loop: " + str(1000*(toc-tic)) + "ms")
결과값
250238.9485569864
Vecterized versiont: 1.9943714141845703ms
250238.94855698457
for loop: 571.4085102081299ms
벡터화는 계산을 병렬처리 하기위한 방법이다. SIMD(Single Instruction Multiple Data) 라는 병렬 프로세서를 이용하여 하나의 명령으로 동시에 여러 데이터를 연산하는 방식이라고 한다. 그것을 어떻게 구현하는지에 대한 자세한 설명은 없었다. 대신 파이썬의 NumPy 라이브러리에 벡터화로 구현된 함수가 준비되어 있으니 그것을 적극적으로 활용하면 된다. 주어진 계산식을 있는 그대로 구현하기 전에 for 문을 대신할 수 있는 함수가 있는지 찾는 습관을 지니도록 한다.
로지스틱 회귀의 벡터화
m개의 훈련 세트가 있을 때 아래처럼 m번 계산을 해야했다.
$z^{(1)}=w^Tx^{(1)}+b,\ ...\ ,\ z^{(m)}=w^Tx^{(m)}+b$
$a^{(1)}=\sigma(z^{(1)}),\ ... \ ,\ a^{(m)}=\sigma(z^{(m)})$
이것을 행렬로 표현하면 아래와 같다.
$Z = \begin{bmatrix} z^{(1)} & \cdots & z^{(m)} \end{bmatrix} \
\ \ \ \ = w^T\begin{bmatrix} \vdots & & \vdots \ x^{(1)} & \cdots & x^{(m)} \ \vdots & & \vdots\end{bmatrix} + \begin{bmatrix} b^{(1)} & \cdots & b^{(m)} \end{bmatrix}$
그리고 이것을 벡터화를 사용한 파이썬 코드로 쓰면 다음과 같이 된다.
Z = np.dot(w.T, X) + b
여기서 b는 실수인데, 파이썬은 이 하나의 실수를 알아서 (1, m) 크기 행렬로 바꾸어 연산한다. 이를 '브로드캐스팅'이라고 한다. 정확히는 NumPy에서 지원하는 기능으로 알고있다.
위와 마찬가지로 sigmoid 함수 계산도 벡터화 할 수 있다. NumPy의 exp 함수를 이용한다.
A = 1/(1 + np.exp(-Z))
'연구 노트 > 머신러닝' 카테고리의 다른 글
[TIL] 210401 - Deep LearniNg (~C1W2L18) (0) | 2021.04.02 |
---|---|
[TIL] 210331 - Deep LearniNg (~C1W2L15) (0) | 2021.03.31 |
[TIL] 210329 - Deep LearniNg (~C1W2C10) (0) | 2021.03.29 |
[TIL] 210326 - Deep LearniNg (~C1W2L07) (0) | 2021.03.26 |
[TIL] 210325 - Deep LearniNg (~C1W2L03) (0) | 2021.03.25 |