2018년 8월 20일 월요일

DL/ Vectorization(벡터화) - 쓰는 중

Vectorization(벡터화)란 무엇인가?

벡터화란 어떤 수들, 혹은 행렬을 열벡터로 바꾸어주는 것을 말한다. 선형 변환의 일종이다. 가령 어떤 2x2 행렬 A를 벡터화해서 다음과 같이 행렬 vec(A)를 만들 수 있다.

이 글은 Coursera에 올라온 Andrew Ng 교수님의 딥러닝 강의를 정리하기 위한 용도임 

$$ \text{한 노드의 weight: } w_1 = \begin{bmatrix} w_1 \\ w_2 \\ \cdots \\ w_{n_x} \end{bmatrix} \qquad w^T_1 = \begin{bmatrix} w_1 & w_2 & \cdots & w_{n_x} \end{bmatrix}$$

$$ \text{한 레이어의 weight: } W^{[1]} = \begin{bmatrix}
\cdots & w^{[1]T}_1 & \cdots \\
\cdots & w^{[1]T}_2 & \cdots \\
\cdots & w^{[1]T}_3 & \cdots \\
\cdots & w^{[1]T}_4 & \cdots
\end{bmatrix} = \begin{bmatrix}
w^{[1]}_{1' 1} & w^{[1]}_{1' 2} & \cdots & w^{[1]}_{1' n_x} \\
w^{[1]}_{2' 1} & w^{[1]}_{2' 2} & \cdots & w^{[1]}_{2' n_x} \\
w^{[1]}_{3' 1} & w^{[1]}_{3' 2} & \cdots & w^{[1]}_{3' n_x} \\
w^{[1]}_{4' 1} & w^{[1]}_{4' 2} & \cdots & w^{[1]}_{4' n_x}
\end{bmatrix} $$

$$ \text{입력 데이터 하나: } x = \begin{bmatrix} x_1 \\ x_2 \\ \cdots \\ x_{n_x} \end{bmatrix} $$

$$ \text{입력 데이터 m개 전체: } X = \begin{bmatrix}
x^{(1)}_{1} & x^{(2)}_{1} & \cdots & x^{(m)}_{1} \\
x^{(1)}_{2} & x^{(2)}_{2} & \cdots & x^{(m)}_{2} \\
\cdots & \cdots & \cdots & \cdots \\
x^{(1)}_{n_x} & x^{(2)}_{n_x} & \cdots & x^{(m)}_{n_x}
\end{bmatrix} $$

벡터화는 여러 수치들을 하나의 행렬로 묶어서 한번에 연산을 처리할 수 있게 한다. 행렬로 묶음으로써 행렬(혹은 벡터)의 내적(dot product)이나 외적(cross product)을 한번에 구할 수 있게 한다. 물리나 수학에서는 그런데 벡터화를 통한 빠른 연산이 가능한 하드웨어적인? 이유는 CPU와 GPU가 병렬 처리를 하기 때문이다.

왜 쓰는가?

딥러닝에서 벡터화는 명시적인 for loop를 없애서 계산 속도를 크게 높여준다. 즉 행렬 연산을 빠르게 하기 위해 쓰인다고 할 수 있다. 특히 데이터가 많으면 많을수록 벡터화는 더 중요하다. 가령 1,000,000개의 성분을 가진 행렬끼리 곱한다고 할 때 벡터화를 쓰냐 그렇지 않으냐는 300배 이상의 속도 차이가 난다. 이중 혹은 삼중 for loop 같은 경우 알고리즘의 효율이 몹시 떨어지므로 벡터화를 통해 계산해야 한다. 모든 for loop을 대체할 수는 없지만, 행렬 연산으로 가능한 부분은 벡터화한 계산으로 해결할 수 있다.

어떻게 쓰는가?

벡터화를 통한 행렬 연산은 MATLAB 등의 언어에서도 지원하고 있지만, 내가 지금 듣는 Andrew Ng 교수님의 코세라 강의에서는 파이썬을 이용해서 프로그램을 구현하고 있다. 파이썬에서 벡터화를 하기 위해서는 numpy 라이브러리에 포함된 함수들을 이용해야 한다. 다음 예시는 코세라 강의에서 나왔던 것이다.

예시 코드 1. 벡터화하지 않은(non-vectorized) 코드


= 0 #Loss함수 J(w, b) 초기화
for i=1 to m #dw들 초기화
    dw[i] = 0
db = 0 #db 초기화
for i=1 to m


cs
예시 코드 2. 벡터화한(vectorized) 코드



두 코드를 비교해 보면

주의사항




댓글 없음:

댓글 쓰기

DL/코세라 딥러닝 3.이진 분류기(Binary Classifier)를 만들기 위해서는?

이 글은 코세라 Andrew Ng 교수의 deep learning AI 강의를 듣고 기억하기 좋게 정리한 것입니다. 목표는 제 부모님도 이해하시도록 쉽게 쓰는 것입니다.