본문 바로가기

딥러닝/DeepLearning.ai

2주차. Vectorization

Vectorization

- for 문으로 관측치 하나하나 계산을 하는 것보다 벡터 형태로 만들어서 계산을 하는게 훨씬 빠르고 계산 비용이 적게 든다.

- SIMD(simple instruction multiple data):  GPU, CPU에서 계산 속도가 빨라진다.

 

More Vectorization Examples

- A가 행렬, v가 벡터일 때 np.dot(A,v)로 행렬의 곱 계산 가능

- element wise 하게 여러 계산을 적용할 수 있다.

u=np.exp(v)

u=np.log(v)

u=np.abs(v)

v의 모든 element에 exp, log, abs 등의 계산을 적용할 수 있다.

 

Vectorizing Logistic Regression

logistic regression에서도 forward propagation을 할 때 for 문을 통해 각 example들에 일일히 계산을 해주기보다, vectorization으로 계산 비용을 줄일 수 있다.

z(i)=w(t)*x(i)+b, a(i)=σ(z(i))을 계산해야 한다.

X는 x(1)~x(m)을 좌우로 쌓아 nx*m의 shape을 가진다.

w는 w(1)~w(nx)로 nx*1짜리 열벡터가 된다.

w(t)*x(i)는 W(t)*X (1*nx * nx*m => 1*m)이고, Z=w(t)*X+b 즉, Z=np.dot(w(t),X)+b이다.

Broadcasting은 행렬에 실수가 더해질 때 실수가 행렬의 크기로 확장되어 행렬의 모든 원소들에 실수가 더해지는 것이다.

A=sigmoid(Z)로, Z의 모든 element에 sigmoid 처리를 해준 결과가 A가 된다. 

 

 

Vectorizing Logistic Regression Gradient Output

dz(1)=a(1)-y(1), dz(2)=a(2)-y(2), ... , dz(m)=a(m)-y(m)을 dZ=[dz(1) dz(2) ... dz(m)]으로 1*m의 vector를 만들어야 한다.

A=[a(1) ... a(m)]의 1*m vector, Y=[y(1) ... y(m)]의 1*m vector

dZ = A-Y = [a(1)-y(1) ... a(m)-y(m)] = [dz(1) ... dz(m)]의 1*m vector

dz를 정의해줬으니, dw1, dw2, ... , dwn, db를 정의해야 한다. 

원래 dw1(i) = x1(i)*dz(i), dw2(i) = x2(i)*dz(i) 이어서 dw+=x1(i)dz(i)...로 계산하고 for문이 끝나면 dw1/=m을 해줬다.

db(i) = dz(i) 이어서 db+=dz(i)로 계산하고 for문이 끝나면 dz/=m을 해줬다.

vectorization에선, db = (1/m) * np.sum(dZ)으로 dZ의 dz(1), ... dz(m)을 모두 더해주고 m으로 나눠준다.

dW = (1/m) * X * dZ(t) = 1/m * [x(1)*dz(1) + ... + x(m)*dz(m)] = [dw_1; dw_2; ... dw_nx]의 nx*1 벡터가 된다. 

 

Broadcasting in Python

- m*1 벡터에 실수를 더하면 실수가 m*1 벡터인 것처럼 확장되어 벡터의 모든 원소에 대해 덧셈이 일어난다.

- m*n 행렬에 m*1 벡터를 더하면 벡터가 m*n 벡터인 것처럼 확장되여 행렬의 모든 원소에 대해 덧셈이 일어난다.

 

A note on Numpy/Python Vectors

- a = np.random.randn(5)가 아닌 np.random.randn(5,1) 처럼 1열/1행을 꼭 붙여주자