본문 바로가기

CS/AI | CV

벡터화 예제 | Vectorization Examples

@신경망이나 로지스틱 회귀를 프로그래밍할 때 기억해야 할 것

-컴퓨터의 계산 효율성을 위해 가능한 한 for문을 쓰지 않는 것

 for문을 쓰지 않는 게 항상 가능한 건 아니지만 필요한 값을 계산할 때 내장 함수나 다른 방법을 쓸 수 있다면 for문을 쓰는 것 보다 대부분 빠를 것

 

 

 

벡터 v가 메모리 상에 미리 있다고 가정, 이 벡터 v의 모든 원소에 지수 연산을 하고 싶다고 할 때

왼쪽은 벡터화되지 않은 구현, 오른쪽은 벡터화된 구현

벡터화되지 않은 구현에서는 먼저 u를 0인 벡터로 초기화하고 그 후에는 원소를 하나씩 계산하는 for문이 있음

 

하지만 파이썬 Numpy에는 이 벡터들을 하나의 호출로 계산해주는 내장 함수가 많음

벡터화된 구현에서는 간단히 u를 np.exp(v)로 지정해주면 됨

입력 벡터인 v를 사용해 출력 벡터인 u를 한 줄로 계산함

->for문 없이 구현 가능

 

벡터화된 구현이 벡터화되지 않은 구현보다 훨씬 빠르기도 함

 

 

 

@자주 쓰는 Numpy 라이브러리

-np.log(v) : 로그값

-np.abs(v) : 절대값

-np.max(v,0) : v의 원소와 0 중에서 더 큰 값 반환

-v**2 : 모든 원소를 제곱한 벡터 반환

 

for문을 쓰고 싶을 때 그 공식을 쓰지 않고 Numpy 내장 함수를 쓸 수 있는지 확인해보기

 

 

 

@로지스틱 회귀 도함수 구하는 코드의 2번째 for문 벡터화

j가 1부터 n_x까지 일 때 dw_j를 갱신하는 for문이 있는 셈.

 

 

dw_1, dw_2 등을 0으로 초기화하는 대신 dw를 벡터로 만들기

dw = np.zeros((n_x,1))

 

두번째 for문을 벡터 연산인 dw += x^(i)*dz(i)로 바꿀 수 있음

 

마지막 라인의 이 부분 대신 dw /= m을 쓸 수 있음

 

->두 개의 for문을 하나의 for문으로 줄임

 

 

 

for문을 하나 제거하는 것 만으로도 코드는 훨씬 빠르게 실행됨

 

 

 

 

참고)

https://youtu.be/pYWASRauTzs

 

-Numpy 수학 관련 라이브러리

docs.scipy.org/doc/numpy-1.13.0/reference/routines.math.html


Tiny Star