본문 바로가기
IT/인공지능

[Deep Learning Specialization] Neural Networks and Deep Learning

by 드인 2024. 7. 14.

 

 

[Deep Learning Specialization] Neural Networks and Deep Learning


로지스틱 회귀

1. 모델 정의

  • 로지스틱 회귀 모델은 선형 회귀 모델을 시그모이드 함수에 적용한 형태
    $$ z = w^T x + b $$
  • $w$: 가중치 벡터
  • $x$: 입력 특성 벡터
  • $b$: 바이어스 (편향) 항

이 $z$ 값을 시그모이드 함수에 적용하여 확률값을 계산합니다.
$$ \hat{y} = \sigma(z) = \frac{1}{1 + e^{-z}} $$

2. 비용 함수 (Cost Function)

  • 로지스틱 회귀에서 사용되는 비용 함수는 로그 손실 (Log Loss) 함수
    • 로그 손실 함수는 예측된 확률과 실제 클래스 간의 차이를 측정합니다.
      $$ J(w, b) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)}) \right] $$
      여기서:
  • $m$: 훈련 데이터의 샘플 수
  • $y^{(i)}$: $i$번째 샘플의 실제 레이블
  • $\hat{y}^{(i)}$: $i$번째 샘플에 대한 예측 확률

3. 경사 하강법 (Gradient Descent)

  • 경사 하강법을 사용하여 비용 함수를 최소화하는 최적의 $w$와 $b$ 값 탐색
    • 반복적으로 가중치와 바이어스를 업데이트하여 비용 함수를 최소화합니다.
      $$ w = w - \alpha \frac{\partial J}{\partial w} $$
      $$ b = b - \alpha \frac{\partial J}{\partial b} $$
  • $\alpha$: 학습률
  • $\frac{\partial J}{\partial w}$, $\frac{\partial J}{\partial b}$: 가중치와 바이어스에 대한 비용 함수의 기울기

4. 기울기 계산

$$ \frac{\partial J}{\partial w_j} = \frac{1}{m} \sum_{i=1}^{m} ( \hat{y}^{(i)} - y^{(i)} ) x_j^{(i)} $$
$$ \frac{\partial J}{\partial b} = \frac{1}{m} \sum_{i=1}^{m} ( \hat{y}^{(i)} - y^{(i)} ) $$

  • $x_j^{(i)}$: $i$번째 샘플의 $j$번째 특성 값

5. 계산 예시

import numpy as np

# 샘플 데이터 생성
np.random.seed(0)
X = np.array([[0.5, 1.5], [-1.5, -0.5], [1.0, 1.0], [1.5, -0.5], [0.0, 0.0], 
              [0.5, -0.5], [-0.5, 0.5], [-1.0, -1.0], [1.0, -1.0], [-1.5, 1.5]])
y = np.array([1, 0, 1, 1, 0, 0, 1, 0, 1, 0])

# 초기화
w = np.zeros(2)
b = 0
alpha = 0.1
num_iterations = 10

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

for i in range(num_iterations):
    # 모델 예측
    z = np.dot(X, w) + b
    y_hat = sigmoid(z)

    # 비용 함수 계산
    cost = -1/len(y) * np.sum(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat))

    # 기울기 계산
    dw = 1/len(y) * np.dot(X.T, (y_hat - y))
    db = 1/len(y) * np.sum(y_hat - y)

    # 파라미터 업데이트
    w = w - alpha * dw
    b = b - alpha * db

    print(f"Iteration {i}: Cost {cost}, w {w}, b {b}")

print("Final weights:", w)
print("Final bias:", b)
  • 각 반복에 대한 계산 수행
  • 초기 값
    • $w = [0, 0]$
    • $b = 0$
  • 첫 번째 반복
  1. 모델 예측
    $$ z = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] $$
    $$ y_hat = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] $$
  2. 비용 함수 계산
    $$ cost = -1/10 \sum ([1, 0, 1, 1, 0, 0, 1, 0, 1, 0] \log([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]) + (1 - [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]) \log(1 - [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5])) $$
    $$ cost = 0.693 $$
  3. 기울기 계산
    $$ dw = 1/10 \sum X^T ([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] - [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]) $$
    $$ dw = [-0.25, -0.2] $$
    $$ db = 1/10 \sum ([0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5] - [1, 0, 1, 1, 0, 0, 1, 0, 1, 0]) $$
    $$ db = 0 $$
  4. 파라미터 업데이트
    $$ w = [0, 0] - 0.1 \times [-0.25, -0.2] $$
    $$ w = [0.025, 0.02] $$
    $$ b = 0 - 0.1 \times 0 $$
    $$ b = 0 $$

 

신경망

1. 신경망 구조

  • 하나의 은닉층을 가진 신경망 구조
    • 입력층: $x$
    • 은닉층: $a^{[1]}$ (활성화 값)
    • 출력층: $\hat{y}$ (예측값)

신경망의 각 층은 가중치 $W$와 바이어스 $b$를 가집니다.

2. 순전파 계산 (Forward Propagation)

  • 순전파는 입력 데이터를 신경망을 통해 전달하여 예측값을 계산하는 과정
(1) 입력층에서 은닉층으로의 계산

$$ z^{[1]} = W^{[1]} x + b^{[1]} $$
$$ a^{[1]} = g(z^{[1]}) $$

  • $g$: 활성화 함수(ReLU, sigmoid, tanh 등)
(2) 은닉층에서 출력층으로의 계산

$$ z^{[2]} = W^{[2]} a^{[1]} + b^{[2]} $$
$$ \hat{y} = g(z^{[2]}) $$

3. 비용 함수 (Cost Function)

  • 예측값과 실제 값 사이의 오차를 측정하는
    • 이진 분류의 경우, 로지스틱 회귀와 동일하게 로그 손실 (Log Loss)을 사용합니다.
      $$ J = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)}) \right] $$
  • 비용 함수 정의

4. 역전파 계산 (Backward Propagation)

  • 역전파는 비용 함수를 최소화하기 위해 가중치와 바이어스를 업데이트하는 과정
(1) 출력층에서 은닉층으로의 기울기 계산

$$ \delta^{[2]} = \hat{y} - y $$
$$ \frac{\partial J}{\partial W^{[2]}} = \frac{1}{m} \delta^{[2]} a^{[1]T} $$
$$ \frac{\partial J}{\partial b^{[2]}} = \frac{1}{m} \sum_{i=1}^{m} \delta^{[2]} $$

(2) 은닉층에서 입력층으로의 기울기 계산

$$ \delta^{[1]} = W^{[2]T} \delta^{[2]} \cdot g'(z^{[1]}) $$
$$ \frac{\partial J}{\partial W^{[1]}} = \frac{1}{m} \delta^{[1]} x^T $$
$$ \frac{\partial J}{\partial b^{[1]}} = \frac{1}{m} \sum_{i=1}^{m} \delta^{[1]} $$

  • $g'$: 활성화 함수의 도함수

5. 경사 하강법을 통한 파라미터 업데이트

  • 학습률 ($\alpha$)를 사용하여 가중치와 바이어스 업데이트
    $$ W^{[2]} = W^{[2]} - \alpha \frac{\partial J}{\partial W^{[2]}} $$
    $$ b^{[2]} = b^{[2]} - \alpha \frac{\partial J}{\partial b^{[2]}} $$
    $$ W^{[1]} = W^{[1]} - \alpha \frac{\partial J}{\partial W^{[1]}} $$
    $$ b^{[1]} = b^{[1]} - \alpha \frac{\partial J}{\partial b^{[1]}} $$

6. 계산 예시

import numpy as np

# 샘플 데이터 생성
np.random.seed(0)
X = np.array([[0.5, 1.5], [-1.5, -0.5], [1.0, 1.0], [1.5, -0.5], [0.0, 0.0]])
y = np.array([[1], [0], [1], [1], [0]])

# 가중치와 바이어스 초기화
W1 = np.random.randn(2, 3)
b1 = np.zeros((3, 1))
W2 = np.random.randn(3, 1)
b2 = np.zeros((1, 1))

# 활성화 함수와 그 도함수 정의
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def sigmoid_derivative(z):
    s = sigmoid(z)
    return s * (1 - s)

print("Initial W1:", W1)
print("Initial b1:", b1)
print("Initial W2:", W2)
print("Initial b2:", b2)

# 순전파
Z1 = np.dot(W1.T, X.T) + b1
A1 = sigmoid(Z1)
Z2 = np.dot(W2.T, A1) + b2
A2 = sigmoid(Z2)

print("Z1:", Z1)
print("A1:", A1)
print("Z2:", Z2)
print("A2:", A2)

# 비용 함수 계산
m = y.shape[0]
cost = -1/m * np.sum(y * np.log(A2.T) + (1 - y) * np.log(1 - A2.T))
print("Cost:", cost)

# 역전파
dZ2 = A2 - y.T
dW2 = 1/m * np.dot(A1, dZ2.T)
db2 = 1/m * np.sum(dZ2, axis=1, keepdims=True)

dA1 = np.dot(W2, dZ2)
dZ1 = dA1 * sigmoid_derivative(Z1)
dW1 = 1/m * np.dot(X.T, dZ1.T)
db1 = 1/m * np.sum(dZ1, axis=1, keepdims=True)

print("dW2:", dW2)
print("db2:", db2)
print("dW1:", dW1)
print("db1:", db1)

# 파라미터 업데이트
alpha = 0.1
W1 = W1 - alpha * dW1.T
b1 = b1 - alpha * db1
W2 = W2 - alpha * dW2.T
b2 = b2 - alpha * db2

print("Updated W1:", W1)
print("Updated b1:", b1)
print("Updated W2:", W2)
print("Updated b2:", b2)
  1. 샘플 데이터 및 초기화
  • 입력 데이터 $X$ 및 실제 레이블 $y$
    $$ X = \begin{bmatrix} 0.5 & 1.5 \ -1.5 & -0.5 \ 1.0 & 1.0 \ 1.5 & -0.5 \ 0.0 & 0.0 \end{bmatrix}, \quad y = \begin{bmatrix} 1 \ 0 \ 1 \ 1 \ 0 \end{bmatrix} $$
  • 초기 가중치 $W1$ 및 바이어스 $b1$
    $$ W1 = \begin{bmatrix} 1.764 & 0.400 & 0.979 \ 2.241 & 1.868 & -0.977 \end{bmatrix}, \quad b1 = \begin{bmatrix} 0 \ 0 \ 0 \end{bmatrix} $$
  • 초기 가중치 $W2$ 및 바이어스 $b2$
    $$ W2 = \begin{bmatrix} 0.950 \ -0.151 \ -0.103 \end{bmatrix}, \quad b2 = \begin{bmatrix} 0 \end{bmatrix} $$
  1. 순전파 (Forward Propagation)
    (1) 입력층에서 은닉층으로의 계산
  • 입력 데이터 $X$와 가중치 $W1$, 바이어스 $b1$를 사용하여 은닉층의 입력값 $Z1$를 계산
    $$ Z1 = W1^T \cdot X^T + b1 $$$$ Z1 = \begin{bmatrix} 2.384 & -0.560 & 2.164 & 1.764 & 0.000 \ 3.743 & -3.842 & 2.267 & 2.045 & 0.000 \ -0.225 & -1.367 & 0.001 & -0.486 & 0.000 \end{bmatrix} $$
  • $$ Z1 = \begin{bmatrix} 1.764 & 2.241 \ 0.400 & 1.868 \ 0.979 & -0.977 \end{bmatrix} \cdot \begin{bmatrix} 0.5 & -1.5 & 1.0 & 1.5 & 0.0 \ 1.5 & -0.5 & 1.0 & -0.5 & 0.0 \end{bmatrix} + \begin{bmatrix} 0 \ 0 \ 0 \end{bmatrix} $$
  • 은닉층의 활성화 값 $A1$을 계산 (시그모이드 함수)
    $$ A1 = \sigma(Z1) $$$$ A1 = \begin{bmatrix} 0.915 & 0.363 & 0.897 & 0.854 & 0.500 \ 0.977 & 0.021 & 0.906 & 0.885 & 0.500 \ 0.444 & 0.203 & 0.500 & 0.381 & 0.500 \end{bmatrix} $$
  • (2) 은닉
  • $$ A1 = \begin{bmatrix} \sigma(2.384) & \sigma(-0.560) & \sigma(2.164) & \sigma(1.764) & \sigma(0.000) \ \sigma(3.743) & \sigma(-3.842) & \sigma(2.267) & \sigma(2.045) & \sigma(0.000) \ \sigma(-0.225) & \sigma(-1.367) & \sigma(0.001) & \sigma(-0.486) & \sigma(0.000) \end{bmatrix} $$

층에서 출력층으로의 계산

  • 은닉층의 활성화 값 $A1$와 가중치 $W2$, 바이어스 $b2$를 사용하여 출력층의 입력값 $Z2$를 계산
    $$ Z2 = W2^T \cdot A1 + b2 $$$$ Z2 = \begin{bmatrix} 0.719 & 0.740 & 0.679 & 0.668 & 0.348 \end{bmatrix} $$
  • $$ Z2 = \begin{bmatrix} 0.950 & -0.151 & -0.103 \end{bmatrix} \cdot \begin{bmatrix} 0.915 & 0.363 & 0.897 & 0.854 & 0.500 \ 0.977 & 0.021 & 0.906 & 0.885 & 0.500 \ 0.444 & 0.203 & 0.500 & 0.381 & 0.500 \end{bmatrix} + \begin{bmatrix} 0 \end{bmatrix} $$
  • 출력층의 활성화 값 $A2$을 계산 (시그모이드 함수)
    $$ A2 = \sigma(Z2) $$$$ A2 = \begin{bmatrix} 0.672 & 0.677 & 0.663 & 0.661 & 0.586 \end{bmatrix} $$
  • $$ A2 = \begin{bmatrix} \sigma(0.719) & \sigma(0.740) & \sigma(0.679) & \sigma(0.668) & \sigma(0.348) \end{bmatrix} $$
  1. 비용 함수 계산

$$ J = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(A2^{(i)}) + (1 - y^{(i)}) \log(1 - A2^{(i)}) \right] $$

  • $m$: 샘플의 수 ($m = 5$)
    $$ J = -\frac{1}{5} \left[ 1 \log(0.672) + 0 \log(0.323) + 1 \log(0.663) + 1 \log(0.661) + 0 \log(0.414) \right] $$
  • $$ J \approx 0.746 $$
  1. 역전파 (Backward Propagation)
  2. (1) 출력층에서 은닉층으로의 기울기 계산
  • 출력층의 오차 $\delta^{[2]}$를 계산$$ \delta^{[2]} = \begin{bmatrix} 0.672 - 1 \ 0.677 - 0 \ 0.663 - 1 \ 0.661 - 1 \ 0.586 - 0 \end{bmatrix} = \begin{bmatrix} -0.328 \ 0.677 \ -0.337 \ -0.339 \ 0.586 \end{bmatrix} $$$$ dW2 = \frac{1}{5} \begin{bmatrix} 0.915 & 0.363 & 0.897 & 0.854 & 0.500 \ 0.977 & 0.021 & 0.906 & 0.885 & 0.500 \ 0.444 & 0.203 & 0.500 & 0.381 & 0.500 \end{bmatrix} \cdot \begin{bmatrix} -0.328 & 0.677 & -0.337 & -0.339 & 0.586 \end{bmatrix}^T $$$$ db2 = \frac{1}{5} \sum_{i=1}^{m} \begin{bmatrix} -0.328 \ 0.677 \ -0.337 \ -0.339 \ 0.586 \end{bmatrix} = 0.653 $$
  • (2) 은닉층에서 입력층으로의 기울기 계산
  • $$ dW2 = \begin{bmatrix} 0.339 \ 0.242 \ 0.171 \end{bmatrix} $$
  • $$ dW2 = \frac{1}{m} \sum_{i=1}^{m} A1^{(i)} \delta^{[2]T} $$
    $$ db2 = \frac{1}{m} \sum_{i=1}^{m} \delta^{[2]} $$
  • $$ \delta^{[2]} = A2 - y $$
  • 은닉층의 오차 $\delta^{[1]}$를 계산$$ \delta^{[1]} = \begin{bmatrix} 0.950 \ -0.151 \ -0.103 \end{bmatrix} \cdot \begin{bmatrix} -0.328 & 0.677 & -0.337 & -0.339 & 0.586 \end{bmatrix} \cdot \sigma'(Z1) $$$$ \sigma'(Z1) = \begin{bmatrix} 0.078 & 0.232 & 0.093 & 0.125 & 0.250 \ 0.022 & 0.020 & 0.085 & 0.101 & 0.250 \ 0.247 & 0.161 & 0.250 & 0.236 & 0.250 \end{bmatrix} $$$$ dW1 = \begin{bmatrix} -0.019 & 0.159 & -0.073 \ 0.026 & -0.095 & 0.120 \end{bmatrix} $$
    $$ db1 = \begin{bmatrix} 0.058 \ -0.128 \ 0.104 \end{bmatrix} $$
  • $$ dW1 = \frac{1}{m} \sum_{i=1}^{m} X^{(i)} \delta^{[1]T} $$
    $$ db1 = \frac{1}{m} \sum_{i=1}^{m} \delta^{[1]} $$
  • $$ \sigma'(z) = \sigma(z) \cdot (1 - \sigma(z)) $$
  • $$ \delta^{[1]} = W2 \cdot \delta^{[2]} \cdot \sigma'(Z1) $$
  1. 파라미터 업데이트

$$ W1 = W1 - \alpha \cdot dW1 $$
$$ b1 = b1 - \alpha \cdot db1 $$
$$ W2 = W2 - \alpha \cdot dW2 $$
$$ b2 = b2 - \alpha \cdot db2 $$

$$ W1 = \begin{bmatrix} 1.765 & 0.384 & 0.986 \ 2.238 & 1.877 & -0.989 \end{bmatrix} $$
$$ b1 = \begin{bmatrix} -0.006 \ 0.013 \ -0.010 \end{bmatrix} $$
$$ W2 = \begin{bmatrix} 0.916 \ -0.175 \ -0.120 \end{bmatrix} $$
$$ b2 = \begin{bmatrix} -0.065 \end{bmatrix} $$