์ต๊ทผ์ ๊ณต๋ถํ๋ฉด์ ๊ฐ์ฅ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ์ด ๋ฐ๋ก ์์ค ํจ์์ ๋ฏธ๋ถ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ดํ ์๊ทธ๋ชจ์ด๋ ๋ฏธ๋ถ → ๊ฐ์ค์น ์ ๋ฐ์ดํธ ๊ณผ์ ์ด์๋ค์ฒ์์๋ error = y - pred ๊ฐ์ ์ฝ๋๊ฐ ์ ๋ง๋์ง, ์ X.T @ error ๊ฐ์ ์ฐ์ฐ์ด ๋์ค๋์ง ์ดํด๊ฐ ์ ์ ๊ฐ๋ค
๊ทธ๋์ ์์ ํ์ ์ญ์ ํ ๊ณผ์ ์ ํ๋์ฉ ํ์ด๊ฐ๋ฉด์ ์ ๋ฆฌํ๋ค
1. ์์ ํ (Forward Pass)
์์ ํ๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ์ ๋ฃ์ด์ ์์ธก๊ฐ๊ณผ ์์ค (loss)์ ๊ณ์ฐํ๋ ๊ณผ์ ์ด๋ค.
1. ์
๋ ฅ ๋ฐ์ดํฐ์ ์ ๋ต
$ X = [[1, 2], [3, 4], [5, 6]] $
$ y = [1, 0, 1] $
2. ๊ฐ์ค์น์ ํธํฅ ์ด๊ธฐ๊ฐ
$ beta = [0, 0] $
$ b = 0 $
3. ๋ก์ง ๊ณ์ฐ
$$ z=Xβ+b $$
4. ์๊ทธ๋ชจ์ด๋ ํ์ฑํ
$$ \hat{y} = \sigma(z) $$
์์ ๊ฐ: $ [0.8, 0.3, 0.4] $
5. ์์ค (MSE)
$$ L = \frac{1}{n}\sum (y - \hat{y})^2 $$
# ---------- ํ์ฑํ ํจ์ ----------
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
# ---------- ์์ค ํจ์ ----------
def mse_loss(y_true, y_pred):
return np.mean(0.5 * (y_true - y_pred)**2)
def forward(X, beta, b):
"""
Forward pass:
z = X @ beta + b
y_pred = sigmoid(z)
loss = MSE(y, y_pred)
"""
z = X @ beta + b
y_pred = sigmoid(z)
return z, y_pred
์ฌ๊ธฐ๊น์ง๋ ์ดํดํ๋๋ฐ ๋ฌด๋ฆฌ๊ฐ ์์๋ค
์ ๋ ฅ ๋ฐ์ดํฐ X๊ฐ ๊ฐ์ค์น w์ ํธํฅ b, $ y = wx + b $ ์ฐ์ฐ์ ๊ฑฐ์ณ ๋์จ ๊ฐ์ด ์๊ทธ๋ชจ์ด๋๋ฅผ ํต๊ณผํ๋ฉด์ 0๊ณผ 1์ฌ์ด์ ํ๋ฅ ๊ฐ, ์์ธก๊ฐ์ด ๋์จ๋ค
๊ทธ๋ฆฌ๊ณ ์ด ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ ์ฌ์ด์ MSE ์์ค ํจ์๋ฅผ ํตํด loss๊ฐ์ด ๋์ค๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ
์ฝ๋๋ก ์ดํด๋ณด์๋ ์ง๊ด์ ์ด๊ณ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค
2. ์ญ์ ํ (Backward Pass)
์ด์ ์์ค๊ฐ์ ๊ฐ์ค์น์ ํธํฅ์ ๋ํด ๋ฏธ๋ถํด์ ๊ธฐ์ธ๊ธฐ(gradient) ๋ฅผ ๊ตฌํ๋ค
์ด๋ ์ฒด์ธ๋ฃฐ(์ฐ์๋ฒ์น) ์ ์ด์ฉํ๋ค
1. ์์ค → ์์ธก๊ฐ
$$ \frac{\partial L}{\partial \hat{y}} = ( \hat{y} - y) $$
์์: [0.2, -0.3, 0.6]
2. ์์ธก๊ฐ → ๋ก์ง (์๊ทธ๋ชจ์ด๋ ๋ฏธ๋ถ)
$$ \frac{\partial \hat{y}}{\partial z} = \hat{y}(1 - \hat{y}) $$
์์: [0.16, 0.21, 0.24]
3. ์์ค → ๋ก์ง
$$ \frac{\partial L}{\partial z} = ( \hat{y} - y) \cdot \hat{y}(1 - \hat{y}) $$
์์: [0.032, -0.063, 0.144]
4. ๋ก์ง → ๊ฐ์ค์น
๋ก์ง: $ z = X\beta + b $
๋ฏธ๋ถ: $ \frac{\partial z}{\partial \beta} = X $
๋ฐ๋ผ์: $ \beta\_{grad} = X^T error $
๊ณ์ฐ ๊ฒฐ๊ณผ: [-0.563, -0.676]
5. ๋ก์ง → ํธํฅ
$$ b\_{grad} = -\text{mean}(error) = -0.0377 $$
# ---------- ์ญ์ ํ (Backward) ----------
def backward(X, y_true, y_pred):
"""
Backward pass (MSE + sigmoid):
dL/dy = (y_pred - y_true)
dL/dz = dL/dy * y_pred * (1 - y_pred)
dL/dbeta = X.T @ dL/dz
dL/db = mean(dL/dz)
"""
dL_dy = y_pred - y_true # (N,1)
dL_dz = dL_dy * y_pred * (1 - y_pred) # (N,1)
beta_grad = X.T @ dL_dz # (f,1)
b_grad = np.mean(dL_dz) # scalar
return beta_grad, b_grad
์์ ๋ด์ฉ๊ณผ ์ฝ๋๊ฐ ์ดํด๊ฐ๋๊ฐ? ๋ ๋ชจ๋ฅด๊ฒ ๋ค...
์ ์ญ์ ํ๋ฅผ ๊ตฌํ๋๋ฐ ์ ๋ ฅ ๋ฐ์ดํฐ X, ํ๊ฒ๊ฐ y_true ๋ ์์ธก๊ฐ y_pred ์ด ๋ค์ด๊ฐ๋์ง..
์ ์ฝ๋๋ y_pred = y_true๊ฐ ๋์ค๋์ง... ์๋์์ ์ ๋ dL/dy * y_pred * (1 - y_pred) ์ด๋ ๊ฒ ๊ณฑํด์ฃผ๊ณ ์๋์ง...
beta_grad๊ฐ ๊ธฐ์ธ๊ธฐ์ธ๊ฑฐ ๊ฐ์๋ฐ ์ X์ ํธ๋์คํฌ์ฆ๋ฅผ ํด์ฃผ๋๋ฐ? ์ผ์์... ๐
์ ์ฝ๋์ ์์, ๊ทธ๋ฆฌ๊ณ ์์ ์์๋ค์ ์ดํดํ๋ ค๋ฉด ๋จผ์ ์ฒด์ธ๋ฃฐ๋ก ์ด๋ค ํํ๋ก ์ด๋ฃจ์ด์ ธ ์๋์ง๋ฅผ ์ดํด ํด์ผํ๋ค
์์ธํ ์ค๋ช ์ ํ์ง ์๊ณ , ์ด๋ค ํํ์ธ์ง๋ง ์ดํด๋ณด๊ฒ ๋ค
๋จผ์ , ์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผํ๋ ๊ธฐ์ธ๊ธฐ๋ beta์ ๋ํ ๊ธฐ์ธ๊ธฐ์ด๋ค
ํ์ง๋ง ์์ ํ์์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฏ์ด, ์ญ์ ํ์์ beta๊น์ง ๋ฐ๋ก ๊ฐ๊ธฐ์๋ ์ค๊ฐ์ ์ฌ๋ฌ ๋จ๊ณ๋ค์ด ์กด์ฌํ๋ค
์์ ํ๋ฅผ ์ผ๋ จ์ ๊ณผ์ ์ผ๋ก ๋ณด๊ธฐ์ข๊ฒ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค
์์ ํ (forward pass)
์ ๋ ฅ $X$ ๋ฅผ ๋ฐ์์ ์ ํ ๊ฒฐํฉ $z=Xβ+b$
$z$ → ์๊ทธ๋ชจ์ด๋ ํต๊ณผ → ์์ธก๊ฐ $\hat{y} = \sigma(z)$
์์ค $L = \text{loss}(y, \hat{y})$ : $L = \frac{1}{2}(y - \hat{y})^2$
์ ํ ํจ์ ํ๋ ๊ฑฐ์น๊ณ ํ์ฑํ ํจ์๋ ํ๋ ๊ฑฐ์น๊ณ ๊ทธ๋ฆฌ๊ณ ์์ค ํจ์๋ ๊ฑฐ์น๋ค?
โ ๊ทธ๋๋ก ๊ฑฐ๊พธ๋ก ํ๋์ฉ ๊ฑฐ์น๋ฉด ๋๋ค. ์์คํจ์ - ํ์ฑํ ํจ์ - ์ ํ ํจ์ ์์ผ๋ก.
์ญ์ ํ (backward pass)
์์ค $L$ ์ ํ๋ผ๋ฏธํฐ $(β,b)$ ์ ๋ํด ๋ฏธ๋ถ → gradient ๊ตฌํ๊ธฐ
์ฒด์ธ๋ฃฐ์ ๊ฐ ๋จ๊ณ๋ณ๋ก ํ์ด์ฐ๋ฉด ์๋์ ๊ฐ๋ค
$$ \frac{\partial L}{\partial \beta} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial \beta} $$
์ค.. ํ๋์ฉ ๋ณผ๊น??
$$ \frac{\partial L}{\partial \beta} $$
- ์ค์ฐจ, ์์คํจ์ L์ ๋ํ ๊ฐ์ค์น beta ํธ๋ฏธ๋ถ๊ฐ
- ์ง๊ธ ๋์จ ์ค์ฐจ์ ๋ํด์ ๊ฐ์ค์น ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ณ์ฐํ๊ฒ ์ด์ ํ๋ ๊ฒ
$$ \frac{\partial L}{\partial \hat{y}} $$
- ํ์ง๋ง beta์ ๋ํด์ ๋ฐ๋ก ๊ณ์ฐํ ์๋ ์๋ค
- ๊ทธ๋์ ๊ฐ์ฅ ๊ฐ๊น์ด์ ์ฐ๊ฒฐ๋์ด ์๋ y-hat ๊ฐ์ ๋ํด ๋ฏธ๋ถ๊ฐ์ ๊ตฌํ๋ค
- ์์ ํ์์ ์ ๋ ฅ์ด ์๊ทธ๋ชจ์ด๋๋ฅผ ํต๊ณผํ ํ๋ฅ , ์์ธก๊ฐ์ด๊ณ ์ถ๋ ฅ์ loss๊ฐ
- ์ด๊ฑธ ๊ฑฐ๊พธ๋ก ๋ค์ง์ผ๋ฉด ๋๋ค. ์์ ์์คํจ์! ์์ MSE ์์ ๋ฏธ๋ถํ๋ค!!!
๊ทธ๋ผ ์ MSE ์์ด ๋ฏธ๋ถ๋์ด์
$$ L = \frac{1}{2}\sum (y - \hat{y})^2 $$
์๋์ฒ๋ผ ๋์ค๊ฒ๋๋ค ( ๋ฏธ๋ถ ๊ณผ์ ์ ์๋ต.. )
$$ \frac{\partial L}{\partial \hat{y}} = ( \hat{y} - y) $$
๊ทธ๋ผ ์ด์ ๊ฐ์ด ์กํ๋ค!! ์ฒด์ธ๋ฃฐ์ ์๋๊ฑฐ ํ๋์ฉ ์ด๋ค ์์ธ์ง ํ์ธํ๊ณ ๋ฏธ๋ถํด์ค์ ์น ๊ณฑํด์ฃผ๋ฉด ๋๋ค!!!
y-hat - y..? ์ด... ์ด๊ฑฐ ์ด๋์ ๋ดค๋๋ฐ..?
dL_dy = y_pred - y_true
$$ \frac{\partial \hat{y}}{\partial z} $$
- ์์ ํ์์ ์ด ๋ถ๋ถ์ด ๋ญ์์๊น?
- ์ ํ ํจ์ z๋ฅผ ๊ฑฐ์ณ ๋์จ ๊ฐ์ด ์๊ทธ๋ชจ์ด๋๋ฅผ ํต๊ณผํ์ฌ y-hat์ด ๋์จ ๋ถ๋ถ์ด๋ค
- ๊ทธ๋ผ ์ฌ๊ธฐ๋ ์๊ทธ๋ชจ์ด๋ ํจ์์ ๋ํด ๋ฏธ๋ถํด์ฃผ๋ฉด ๋๋ค

์๊ทธ๋ชจ์ด๋๋ฅผ ๊ฑฐ์น๋ฉด ๋์ค๋ ๊ฐ์ด y-hat์ด๋๊น ์์ธก๊ฐ.. ์ด..?
y_pred * (1 - y_pred)
$$ \frac{\partial z}{\partial \beta} $$
- ๋๋์ด ์ฐ๋ฆฌ๊ฐ ๋ชฉํ๋ก ํ๋ beta๊น์ง ์๋ค. ์ด๋ฒ์๋ ์ ํํจ์์ด๋ค
- ์์ ์์ ๋ค์ ํ์ธํด๋ณด๋ฉด $ z=Xβ+b $
- ์ด์ z๋ฅผ β ์ ๋ํด ๋ฏธ๋ถํ๋ฉด ๋ฌด์์ด ๋จ๋์ง ์ดํด๋ณด์.
$$ \frac{\partial z}{\partial \beta} = X $$
- ์ ํํจ์์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ฅ๊ฐ X๊ฐ ๊ทธ๋๋ก ๋จ๋๋ค. ๊ทธ๋์ ์ญ์ ํ์์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ณ์ฐํ ๋ ์ ๋ ฅ ๋ฐ์ดํฐ X๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์ด๋ค
- ํ์ง๋ง ๊ทธ๋๋ก ๊ณฑํ ์๋ ์๋ค
- ํ์ง๋ง ์ฌ๋ฌ ์ํ์ ๋ฐฐ์น ๋จ์๋ก ํ์ตํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, ์ง๊ธ๊น์ง ๊ณ์ฐํ ๊ธฐ์ธ๊ธฐ ๊ฐ๋ค์ ๋ฒกํฐ๋ ํ๋ ฌ ํํ๋ก ์์ฌ ์๋ค.
- ์ด ์ํ์์ ์ฒด์ธ๋ฃฐ๋ก ์์ฐจ์ ์ผ๋ก ๊ณฑํด์ง ๊ธฐ์ธ๊ธฐ์ ๋ง์ง๋ง XX๋ฅผ ๊ณฑํ๋ ค๋ฉด, shape(ํ๋ ฌ ์ฐจ์)์ ๋ง์ถฐ์ฃผ์ด์ผ ํ๋ค.
- ๋ฐ๋ผ์ ํธ๋์คํฌ์ฆ๋ฅผ ์ฌ์ฉํด ํ๋ ฌ๊ณฑ์ ์ํํ๊ฒ ๋๋ ๊ฒ์ด๋ค
b_grad = np.mean(dL_dz)
์ด๋ ๊ฒ ๊ตฌํ ๊ธฐ์ธ๊ธฐ๊ฐ์ ์๋์ ํ์ต๋ฅ ๊ณผ ๊ณฑํด์ ๊ธฐ์กด์ ๊ฐ์ค์น์ ์ ๋ฐ์ดํธํด์ฃผ๋ฉด ๋๋ค!
++์ถ๊ฐ๋ก ์์คํจ์ L์ ๋ํด y-hat ๋ฏธ๋ถํ์ ๋ y_true - y_pred๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ์๋์์ ๋ง์ด๋์ค ๋ถ์ฌ์ฃผ๋ฉด ๋๊ฐ๋ค
์ข ์ข ํผ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ ๋ถํธ ์ฃผ์ํ ๊ฒ.
dL_dy = y_true - y_pred # (N,1)
dL_dz = dL_dy * y_pred * (1 - y_pred) # (N,1)
beta_grad = - X.T @ dL_dz # (f,1)
3. ํ๋ผ๋ฏธํฐ ์ ๋ฐ์ดํธ (SGD)
ํ์ต๋ฅ $η=0.1 $ ์ผ ๋,
- ๊ฐ์ค์น ์
๋ฐ์ดํธ:
$ \beta \leftarrow \beta - \eta * \beta\_{grad} $ - ํธํฅ ์
๋ฐ์ดํธ:
$ b \leftarrow b - \eta * b\_{grad} $
์ ๋ฐ์ดํธ ๊ฒฐ๊ณผ:
β = [0.0563, 0.0676]
b = 0.00377
4. ๋ง๋ฌด๋ฆฌ
- ์์ ํ: ์ ๋ ฅ ๋ฐ์ดํฐ → ๊ฐ์ค์น/ํธํฅ → ๋ก์ง → ์๊ทธ๋ชจ์ด๋ → ์์ธก๊ฐ → ์์ค
- ์ญ์ ํ: ์์ค → ์์ธก๊ฐ → ์๊ทธ๋ชจ์ด๋ → ๋ก์ง → (X, ๊ฐ์ค์น, ํธํฅ)
- ๊ฒฐ๊ตญ beta_grad = X.T @ error๋ ์ฒด์ธ๋ฃฐ์ ๋๊น์ง ์ ์ฉํ ๊ฒฐ๊ณผ๋ค.
- ์ฌ๊ธฐ์ X๊ฐ ๋ฑ์ฅํ๋ ์ด์ ๋, ๋ก์ง $ z=Xβ+b $ ์์ ๊ฐ์ค์น์ ๋ํ ๋ฏธ๋ถ๊ฐ์ด ๋ฐ๋ก X์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฒ์ ๊ณต๋ถํ๋ฉด์ ์ฝ๋ ๋ณด๋๋ฐ ๋ญ์ง...? ์ถ์ด์ ์ด์ ์ค๋ ๊ฑฐ์ ์ดํ ๋์ ์ด ๋ถ๋ถ๋ง ๊ณ์ ์ดํดํ๋ ค๊ณ ์ฐพ์๋ณธ ๊ฒ ๊ฐ๋ค
“์ X.T @ error์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค” ์ถ์๋ ๊ฒ, ์ฌ์ค์ ์์ ํ ์์ ์ญ์ผ๋ก ์ถ์ ํด๊ฐ๋ฉด์ ์ฒด์ธ๋ฃฐ์ ์ ์ฉํ ๊ฒฐ๊ณผ์๋ค
์ด ๊ณผ์ ์ ์ดํดํ๋๊น ์ํ์ ์ธ ๋ถ๋ถ์ด ์ด๋ป๊ฒ ์ฝ๋๋ก ๊ตฌํ๋์๋์ง ์ ์๊ฒ ๋์๋ค
์์งํ ์๊ฐ์ ์๊ฐ๋ณด๋ค ๋ง์ด ์ฐ๊ฒ ๋์ ๋ค๋ฅธ ๊ณต๋ถ๋ค๋ ๋ฐ๋ฆฌ๊ธด ํ์ง๋ง... ์์ ์ ๋์ถฉ ๋ณด๊ณ ๋์ด๊ฐ๋ ๊ฐ๋ ์ ์ดํดํ ๋๊น์ง ํ๋ณด๊ณ ์ดํดํ๋ค๋ ์ ์์ ์ถฉ๋ถ์ ์ ์๋ฏธํ ์๊ฐ๋ค์ด์๋ค!
'๊ณต๋ถ๊ธฐ๋ก > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| NumPy ๋ง์ผ๋ก 2-Layer Neural Network์ Backpropagation ๊ตฌํํด๋ณด๊ธฐ (0) | 2025.09.18 |
|---|