이 글은...
Andrew Ng 교수의 Deep Learning 강좌 C1W2L15 까지의 내용을 정리한 것이다. 로지스틱 회귀의 경사 계산을 벡터화해보고 NumPy의 브로드캐스팅 원리를 파악한다.
내용 요약
로지스틱 회귀의 경사 계산을 벡터화 하기
이전에 for 문을 이용한 경사 계산 pseudo 코드를 아래와 같이 적었었다.
J = 0
dw_1 = 0
dw_2 = 0
b = 0
for i = 1 to m:
z[i] = w_t * x[i] + b
a[i] = sigmoid(z[i])
J += -(y_1 * log(a[i]) + (1 - y[i]) * log(1 - a[i]))
dz[i] = a[i] - y[i]
# 이곳에 for문 들어가게됨
dw_1 += x_1[i] * dz[i]
dw_2 += x_2[i] * dz[i]
db += dz[i]
J /= m
dw_1 /= m
dw_2 /= m
db /= m
w_1 := w_1 - alpha * dw_1
w_2 := w_2 - alpha * dw_2
b := b - alpha * db
위 코드에서 2개의 for 문을 걷어낸 코드를 작성하면 아래와 같이 된다. z, a, b, w 행렬의 원소에 하나씩 접근 하는 게 아니라 행렬을 통째로 벡터화하여 계산한다.
Z = np.dot(W.T, X) + B
A = sigmoid(Z)
dZ = A - Y
dW = dZ.T / m
db = np.sum(dZ) / m
W = W - alpha * dW
B = B - alpha * dB
물론 경사 하강을 하기 위한 반복 코드는 for 문을 쓸 수밖에 없다.
파이썬의 브로드캐스팅
이 단원의 제목이 '파이썬의 브로드캐스팅'이라고 적혀있는데 정확히는 파이썬 NumPy의 브로드캐스팅이 맞겠다.
브로드캐스팅을 이용하여 빠르게 계산하는 예제를 풀어보았다. 각 식자재 100g당 영양소가 가지는 칼로리를 적어놓은 표가 있다. 이 표를 참고하여 식자재 총 칼로리 중 각 영양소가 차지하는 비율을 구해보는 예제이다. 물론 브로드캐스팅을 이용해 값을 구한다.
Apples | Beef | Eggs | Potatoes | |
---|---|---|---|---|
Carb | 56.0 | 0.0 | 4.4 | 68.0 |
Protein | 1.2 | 104.0 | 52.0 | 8.0 |
Fat | 1.8 | 135.0 | 99.0 | 0.9 |
파이썬 코드는 아래와 같다.
import numpy as np
A = np.array([[56, 0, 4.4, 68],
[1.2, 104, 52, 8],
[1.8, 135, 99, 0.9]])
cal = np.sum(A, axis=0)
percentage = 100*A/cal.reshape(1, 4)
print(percentage)
백분율을 구할 때 cal 행렬의 형태를 (1, 4)로 변환하는 코드가 있는데, 사실 이 예제에서는 필요가 없다. 이미 cal 행렬이 (1, 4) 크기를 가지기 때문이다. 하지만 행렬의 형태를 확신할 수 없을 때는 reshape()
를 사용해야 한다. reshape()
연산에 필요한 부담도 많지 않아서 가능하면 항상 사용하는 습관을 지니는 게 좋다고도 했다.
브로드 캐스팅의 동작 원리는 간단하다. (m, n) 행렬이 있을 때 이것과 사칙연산을 하려는 (1, n) 행렬, (m, 1) 행렬 혹은 실수를 자동으로 (m, n)으로 확장하는 것이다. 브로드캐스팅에 대한 조금 더 자세한 설명과 응용은 NumPy 문서를 참고한다.
'연구 노트 > 머신러닝' 카테고리의 다른 글
[TIL] 210405 - Deep LearniNg (~C1W3L03) (0) | 2021.04.05 |
---|---|
[TIL] 210401 - Deep LearniNg (~C1W2L18) (0) | 2021.04.02 |
[TIL] 210330 - Deep LearniNg (~C1W2L13) (0) | 2021.03.30 |
[TIL] 210329 - Deep LearniNg (~C1W2C10) (0) | 2021.03.29 |
[TIL] 210326 - Deep LearniNg (~C1W2L07) (0) | 2021.03.26 |