본문 바로가기
COURSERA

week 2_벡터화(Vectorization) (Andrew Ng)

by HYUNHP 2022. 2. 7.
728x90
반응형

안녕하세요, HELLO

 

오늘은 DeepLearning.AI에서 진행하는 앤드류 응(Andrew Ng) 교수님의 딥러닝 전문화의 첫 번째 과정인 "Neural Networks and Deep Learning"을 정리하려고 합니다. "Neural Networks and Deep Learning"의 강의 목적은 '딥러닝의 기능, 과제 및 결과 이해'를 통해 '머신 러닝을 업무에 적용하고, 기술 수준을 높이고, AI 분야에서 단계를 밟을 수 있는 지식과 기술을 얻을 수 있는 경로'를 배우기 위함이며, 강의는 아래와 같이 구성되어 있습니다.

 

~ Introduction

~ Basics of Neural Network programming

~ One hidden layer Neural Networks

~ Deep Neural Networks

 

"Neural Networks and Deep Learning" (Andrew Ng) 2주차 "벡터화(Vectorization)"의 강의 내용입니다.


CHAPTER 1. '벡터화(Vectorization)'

 

CHAPTER 2. 'for loop 구문 지양(Whenever possible, avoid explicit for-loops)'

 

CHAPTER 3. 'Logistic Regression Vectorization'

 

CHAPTER 4. 'Broadcasting in Python'

 


CHAPTER 1. '벡터화(Vectorization)'

 

Vectorization

 

벡터화(Vectorization)는 코딩에서 명백한 for loop을 제거하는 방법입니다. 딥러닝 알고리즘에서 대규모 데이터 세트를 활용하는 데, 코딩을 빨리 진행하는 것이 중요합니다. 이는 코딩 시간이 길어지면, 그에 맞춰 결괏값을 얻는데 오랜 시간이 걸리기 때문입니다.

 

로지스틱 회귀 함수 z = wX + b에서, non-vectorized를 도입했다면, 아래처럼 코드를 작성할 수 있습니다.

 

# Non-vectorized
# 로지스틱 회귀: z = wx + b

z = 0
for i in range(n-x):
	z += w[i] * x[i]
z += b

 

반면에, vectorized를 도입했다면, 1줄의 코드로 for loop없이 작업이 가능합니다.

 

# Vectorized
# 로지스틱 회귀: z = wx + b

# np.dot(w, x) = w transpose x
z = np.dot(w, x) + b

□ vectorizaation vs non-vectorization (code)

 

vectorization과 non-vectorization을 아래 코드를 통해 실제 소요 시간을 살펴보면, vectorization 했을 때는 1.00ms가 소요된 것에 비해 non-vectorization의 for loop 코드는 600ms로 약 600배 차이가 난 것을 볼 수 있습니다. cpu, gpu 성능에 따라 차이가 있겠지만, 여기서 중요한 점은 "for loop 구문을 사용하는 것을 피하는 것'입니다. 

 

# vectorization
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")

# non-vectization
c= 0 
tic = time.time()
for i in range(1000000):
    c += a[i] * b[i]
toc = time.time()

print('-'*10)
print(c)
print("For loop: "+ str(1000*(toc-tic)) + "ms")

 

 

CHAPTER 2. 'for loop 구문 지양(Whenever possible, avoid explicit for-loops)'

 

코드를 작성함에 있어서 되도록이면 for-loop 사용을 지양하고, 가능하면 내장된 함수를 사용하는 것이 중요합니다.

임의의 함수 u = Av에 대해서 계산을 하게되면, non-vectorized의 경우는 for-loop를 2번 사용하는 것에 비해, vectorized는 내장 함수 np.dot()을 활용해 1줄의 코드로 작성할 수 있습니다.

 

중요한 점은 내장 함수를 활용해 for-loop없이 처리할 수 있는지 확인하는 것이 중요합니다.


□ Logistic regression derivatives

 

파란색 글씨는 로지스틱 회귀에서 도함수를 구하는 공식입니다. 이를 파이썬의 내장 함수(np.zeros)를 활용해서 기존의 2개의 for-loop를 1개로 줄일 수 있습니다.

 

반응형

 

CHAPTER 3. 'Logistic Regression Vectorization'

 

□ Logistic Regression Vectorization

 

■ vectorization(벡터화)

 

벡터화(Vectorization)는 행렬을 세로 벡터로 바꾸는 선형변환입니다. m×n행렬 A의 선형화는 vec(A)로 표기하며, 행렬 A의 열을 다음 열 위에 쌓아가며 얻을 수 있습니다. 이러한 벡터화의 장점은 for-loop 등의 방법을 통해 동일한 결과를 내는 알고리즘을 파이썬에 내장된 함수를 통해 빠르고, 가벼운 효율적인 알고리즘을 구성할 수 있는 점입니다. 

 

아래 그림처럼 변수 x1, x2, ... xn에 대한 각각의 예측값(a)에 대해서 개별적으로 for-loop를 사용하지 않고, [1 x m] 차원으로 1줄로 행렬을 정리할 수 있습니다.


□ Vectorizing Logistic Regression's Gradient Computation

 


CHAPTER 4. 'Broadcasting in Python'

 

□ Broadcasting

 

파이썬 Numpy 라이브러리의 브로드캐스팅은 특정 조건을 만족면 모양이 다른 배열끼리의 연산도 가능하게 해 주며, 모양이 부족한 부분은 확장하여 연산을 수행할 수 있도록 하는 것을 의미합니다. 확장 또는 전파한다는 의미로 Broadcasting을 설명하는 가장 간단한 예시는 배열과 스칼라를 계산하는 것이다.

http://www.astroml.org/book_figures/appendix/fig_broadcast_visual.html

 

브로드캐스팅을 달성하기 위한 조건은 아래와 같습니다.


ⓐ 차원의 크기가 1일때 가능합니다.
 - 두 배열 간의 연산에서 최소한 하나의 배열의 차원이 1이라면(0번 축이든 1번 축이든; 1행이든 1열이든) 가능합니다.

 

ⓑ 차원의 짝이 맞을 때 가능합니다.
 - 차원에 대해 축의 길이가 동일하면 브로드캐스팅이 가능하다.


□ Numpy vectors Tips

 

1차원 array를 만들게 되면, array를 전치(transpose) 해도 동일한 값을 가지게 되어, 벡터 간의 계산에 있어서 계산 실수, 오류가 발생하게 됩니다. 이를 방지하기 위해 1차원 array(rank 1 array) 대신에 1차원 벡터(rank 1 vector)를 만드는 게 오류를 줄이는 데 도움이 됩니다.

 

# 1차원 array
a = np.random.randn(5)

print("차원 크기: ", np.shape(a))
print("원본: ", a)
print("Transpose: ", a.T)
print("행열 곱: ", np.dot(a, a.T))

print('------------'*5)
print('------------'*5)

# 1차원 벡터
b = np.random.randn(5, 1)

print("차원 크기: ", np.shape(b))
print("원본: ", b)
print("Transpose: ", b.T)
print("행열 곱: ", np.dot(b, b.T))

 

만약에 1차원 array를 만들었다고 하더라도, reshape 함수를 통해 1차원 벡터로 수정할 수 있습니다.

 

# 1차원 array
c = np.random.randn(5)
print("1차원 array: ", np.shape(c))

# 1차원 배열로 수정
c = a.reshape(5,1)
print("1차원 배열: ", np.shape(c))


■ 마무리

 

"Neural Networks and Deep Learning" (Andrew Ng) 2주차 "벡터화(Vectorization)"에 대해서 정리해봤습니다.

 

그럼 오늘 하루도 즐거운 나날 되길 기도하겠습니다

좋아요와 댓글 부탁드립니다 :)

 

감사합니다.

반응형

댓글