[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$
- 첫 번째 반복
- 모델 예측
$$ 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] $$ - 비용 함수 계산
$$ 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 $$ - 기울기 계산
$$ 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 $$ - 파라미터 업데이트
$$ 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] $$
- 이진 분류의 경우, 로지스틱 회귀와 동일하게 로그 손실 (Log Loss)을 사용합니다.
- 비용 함수 정의
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)
- 샘플 데이터 및 초기화
- 입력 데이터 $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} $$
- 순전파 (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} $$
- 비용 함수 계산
$$ 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 $$
- 역전파 (Backward Propagation)
- (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) $$
- 파라미터 업데이트
$$ 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} $$
'IT > 인공지능' 카테고리의 다른 글
[LLM][RAG] RAG(Retrieval-Augmented Generation) 소개 및 설명 (1) | 2024.06.04 |
---|---|
[AI][NLP] 한국어 요약 모델 개발 코드 및 최적화 방법 (0) | 2024.05.15 |
[LLM][프롬프트엔지니어링] CoT(Chain of Thought) (0) | 2024.05.07 |
[LLM] ReALM: Reference Resolution As Language Modeling 논문 리뷰 (0) | 2024.04.21 |
[LLM] Social Skill Training with Large Language Models 논문 리뷰 (0) | 2024.04.10 |