본문 바로가기
Machine Learning (인공지능)/기초

[ML] Vectorization (벡터화)

by muha0-0 2025. 10. 10.

Definition (Vector의 정의)

Vector (벡터)

숫자를 원소로 가지는 리스트 또는 배열을 의미한다. 백터를 원소로 가지는 2차원 배열을 행렬이라고 한다. 

#리스트
x = [1,2,3]

#배열
x = np.array([1,2,3])

 

Vector의 특성

  • Dimension (혹은 Rank): 벡터에 포함된 원소의 수 (#)
  • 같은 종류의 데이터끼리만 묶는다 (e.g. 숫자는 숫자끼리, 문자는 문자끼리)

 

NumPy의 활용

NumPy는 "Numeric Python"의 약자로, 대규모 다차원 배열 및 행렬을 계산하는데 필요한 함수와 메서드를 제공하는 파이썬 라이브러리이다.

 

Motivation (벡터화 목적)

For loop 구문의 지양

Vectorization (벡터화)는 코드에서 for loop를 제거하고 데이터를 병렬적으로 처리해 학습의 속도와 성능을 개선하고, GPU의 사용을 가능하게 한다. 머신러닝에서는 대규모 데이터를 사용하기 때문에 컴퓨팅의 for loop을 사용하여 컴퓨팅을 할 경우 계산의 속도가 매우 느려지게 된다. 벡터화를 통해 데이터를 병렬적으로 처리함으로써 계산 속도를 향상할 수 있다. 

 

NLP (Natural Language Processing)에서도 Vectorization은 중요한 역할을 한다. 사람이 사용하는 언어를 기계가 이해할 수 있는 숫자로 변형하는데에 사용되어, Sentiment Analysis (감정 분석), Machine Translation (기계 번역), Information Retrieval 등을 훨씬 정확하고 빠르게 수행할 수 있다. 

 

 

For loop vs Vectorization

For 구분을 쓸 경우 주어진 범위에 대한 계산을 각각 실행해야한다. 반면, 벡터화를 통해 계산을 할 경우, 작업이 병렬적 (in parallel)으로 이루어져 보다 효율적인 계산을 할 수 있고, 더 큰 데이터셋으로 확장 (Scale)이 가능하다.

Andrew Ng 선생님의 강의샷 (2:27)

 

 

 

Vector Dot Product

For 구문을 사용했을 때와 np.dot() 메써드를 사용했을 때의 계산 속도의 차이를 비교해보자. 

벡터의 곱

 

np.random.seed(1)
a = np.random.rand(10000000)  # very large arrays
b = np.random.rand(10000000)

tic = time.time()  # capture start time
c = np.dot(a, b)
toc = time.time()  # capture end time

print(f"np.dot(a, b) =  {c:.4f}")
print(f"Vectorized version duration: {1000*(toc-tic):.4f} ms ")

tic = time.time()  # capture start time
c = my_dot(a,b)
toc = time.time()  # capture end time

print(f"my_dot(a, b) =  {c:.4f}")
print(f"loop version duration: {1000*(toc-tic):.4f} ms ")

del(a);del(b)  #remove these big arrays from memory

 

결과

np.dot의 연산이 loop 연산보다 50배 이상 빠른 것을 확인할 수 있다. (159초 vs 8623초)

np.dot(a, b) =  2501072.5817
Vectorized version duration: 159.9598 ms 
my_dot(a, b) =  2501072.5817
loop version duration: 8623.6336 ms