def forward_prop(X, W1, W2, b1, b2):
Z1 = np.dot(W1, X) + b1
A1 = np.tanh(Z1)
Z2 = np.dot(W2, A1) + b2
A2 = sigmoid(Z2)
cache = {"Z1": Z1,
"A1": A1,
"Z2": Z2,
"A2": A2}
return A2, cache
X
: 입력 데이터 벡터/행렬
W1
, W2
: 첫 번째 및 두 번째 층의 가중치 행렬
b1
, b2
: 첫 번째 및 두 번째 층의 편향 벡터
요약
- 입력 데이터
X
가 가중치와 편향을 거치면서 첫 번째 층을 통과하고, tanh
활성화 함수가 적용
- 그 다음, 두 번째 층을 통과하면서 시그모이드 활성화 함수가 적용되어 최종 출력
A2
가 계산
- 각 중간 값(
Z1
, A1
, Z2
, A2
)은 cache
에 저장되어 이후 역전파에 사용
def compute_cost(A2, Y):
m = Y.shape[1]
cost_sum = np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2))
cost = - np.sum(logprobs) / m
cost = np.squeeze(cost)
return cost
요약
- 이 함수는 교차 엔트로피 비용 함수를 사용하여 예측(
A2
)과 실제 출력(Y
) 간의 오차를 계산
- 교차 엔트로피는 예측 확률과 실제 값의 차이를 측정하는 방법으로, 값이 작을수록 예측이 더 정확하다는 것을 의미합니다.
- 계산된
cost
는 학습 과정에서 모델이 가중치를 조정하도록 돕기 위해 사용됩니다.
def back_propagate(W1, b1, W2, b2, cache):
A1 = cache['A1']
A2 = cache['A2']
dZ2 = A2 - Y
dW2 = (1 / m) * np.dot(dZ2, A1.T)
db2 = (1 / m) * np.sum(dZ2, axis = 1, keepdims = True)
dZ1 = np.multiply(np.dot(W2.T, dZ2), 1 - np.power(A1, 2))
dW1 = (1 / m) * np.dot(dZ1, X.T)
db1 = (1 / m) * np.sum(dZ1, axis = 1, keepdims = True)
W1 = W1 - learning_rate * dW1
b1 = b1 - learning_rate * db1
W2 = W2 - learning_rate * dW2
b2 = b2 - learning_rate * db2
return W1, W2, b1, b2
요약
- 이 함수는 역전파를 통해 출력 오차를 입력층까지 전파하면서 각 층의 가중치와 편향에 대한 그래디언트를 계산
- 계산된 그래디언트를 사용하여 기울기 하강법으로 가중치와 편향을 업데이트
- 모델이 손실을 줄이기 위해 매개변수를 조정하고 점점 더 좋은 성능을 발휘할 수 있게 됨