1. ๋ค์ด๊ฐ๋ฉฐ: ์ ์ง์ ๊ตฌํํ๋๊ฐ?
๋ฅ๋ฌ๋์ ๋ฐฐ์ฐ๋ ๊ณผ์ ์์ ์ฐ๋ฆฌ๋ 10์ 10์ TensorFlow๋ PyTorch ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค
๋ฌผ๋ก ์ด๋ค ํ๋ ์์ํฌ๋ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ด์ง๋ง, ์ฐ์ฐ ๊ณผ์ ์ด ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ถฐ์ ธ ์๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ๋ง์ด ์ค์ ๋ก ๋ฌด์์ ํ๋์ง ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ ์ด๋ ต๊ธฐ๋ ํ๋ค
๊ทธ๋์ ์ด๋ฒ ์ค์ต์์๋ NumPy๋ง ์ฌ์ฉํ์ฌ 2-layer Neural Network๋ฅผ ์ง์ ๊ตฌํํ๊ณ , Forward Pass์ Backpropagation์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด์๋ค
ํต์ฌ ๋ชฉํ: “์ฝ๋๊ฐ ๋์๊ฐ๋ ์ด์ ๋ฅผ ์ดํดํ๊ณ , ๋ชจ๋ ์ฐ์ฐ๊ณผ ๋ฏธ๋ถ ๊ณผ์ ์ด ๋์ ๋ณด์ด๋๋ก ํ์ต”
2. ๋ฐ์ดํฐ ์ค๋น: MNIST ์๊ธ์จ ์ด๋ฏธ์ง
๋ฐ์ดํฐ ํน์ง
- 28x28 ํฝ์ ํ๋ฐฑ ์ด๋ฏธ์ง
- Flattenํ์ฌ 784์ฐจ์ ๋ฒกํฐ๋ก ๋ณํ
- 0~9 ์ซ์ ์ด 10๊ฐ ํด๋์ค
- ๋ผ๋ฒจ์ ์-ํซ ์ธ์ฝ๋ฉ(One-Hot Encoding)
import numpy as np
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(-1, 784) / 255.0
X_test = X_test.reshape(-1, 784) / 255.0
Y_train = to_categorical(y_train, 10)
Y_test = to_categorical(y_test, 10)
- ์๋ X_train์ shape๋ (60000, 28, 28)
- reshape๋ก 0์ฐจ์์ -1๋ก ๋๊ณ ๋ค์ 2-3์ฐจ์ 28x28 = 784๋ก ์ฃผ์ด์ 3์ฐจ์์ 2์ฐจ์์ผ๋ก ์ถ์ํด์ค๋ค
- ์๋ Y_train์ ๋ฐ์ดํฐ ๊ฐ์๋งํผ ์ ๋ต๊ฐ์ด ํ์ค๋ก ์๋, (60000,) ํํ์ 1์ฐจ์ ๋ฒกํฐ์ด๋ค
- ๊ทธ๋ฌ๋ to_categorical์ ์ฌ์ฉํด์ฃผ๋ฉด ์ ๋ต๊ฐ์ด ์๋ ์ธ๋ฑ์ค๋ฅผ 1๋ก ํ๊ธฐํด์ฃผ๊ณ ๋๋จธ์ง๋ 0์ผ๋ก ํ๊ธฐํ๋, ์ํซ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค
- Y_train[0] : np.uint8(5), ์ซ์ 5๊ฐ ์ ๋ต
- to_categorical(Y_train, 10)[0] : array([0., 0., 0., 0., 0., 1., 0., 0., 0., 0.])
ํฌ์ธํธ
- ์ ๋ ฅ๊ฐ ์ ๊ทํ(0~1)
- ์-ํซ ๋ผ๋ฒจ ์ค๋น: Cross-Entropy ๊ณ์ฐ์ ํ์
3. ์ ๊ฒฝ๋ง ๊ตฌ์กฐ ์ค๊ณ
์ด๋ฒ ์ ๊ฒฝ๋ง์ 2๊ฐ์ ๋ ์ด์ด๋ฅผ ๊ฐ์ง๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ด๋ค:
- ์ ๋ ฅ์ธต: 28x28 ์ด๋ฏธ์ง๋ฅผ 784์ฐจ์ ๋ฒกํฐ๋ก ๋ณํ
- ํ๋ ์ธต: 100๊ฐ ๋ ธ๋, ํ์ฑํ ํจ์ Sigmoid ๋๋ ReLU
- ์ถ๋ ฅ์ธต: 10๊ฐ ๋ ธ๋, Softmax๋ก ํด๋์ค ํ๋ฅ ๊ณ์ฐ

4. Weight ์ด๊ธฐํ ์ ๋ต: Xavier vs He
Xavier Initialization
- Sigmoid๋ Tanh์ ์ ํฉ
He Initialization
- ReLU ๊ณ์ด ํ์ฑํ ํจ์์ ์ ํฉ
์จ์ดํธ ์ด๊ธฐํ์ ๊ด๋ จ๋ ๊ธ์ ์ด์ ์ ์ ๋ฆฌํ ์ ์ด ์๋ค
ํํํ์์ Easy! ๋ฅ๋ฌ๋ - ๊ธฐ์ธ๊ธฐ ๋ฌธ์ ๋ถํฐ ๋ฐฐ์น & ๋ ์ด์ด ์ ๊ทํ๊น์ง
ํํํ์์ Easy! ๋ฅ๋ฌ๋ - ๊ธฐ์ธ๊ธฐ ๋ฌธ์ ๋ถํฐ ๋ฐฐ์น & ๋ ์ด์ด ์ ๊ทํ๊น์ง
Easy! ๋ฅ๋ฌ๋ใEasy! ๋ฅ๋ฌ๋ใ์ ๋ฅ๋ฌ๋์ ์ฒ์ ์ ํ๋ ๋ ์๋ค์ ์ํ ํ์ ๊ฐ์ด๋๋ก, ์ธ๊ณต์ง๋ฅ์ ๊ธฐ์ด ๊ฐ๋ ๋ถํฐ CNN, RNN ๋ฑ ๋ฅ๋ฌ๋์ ์ฃผ์ ์ฃผ์ ๋ฅผ ํญ๋๊ฒ ๋ค๋ฃจ๊ณ ์๋ค. KAIST ๋ฐ์ฌ์ด์ ์ ํ๋ฒ๋ก ํ๋
bh-kaizen.tistory.com

์์ ๊ทธ๋๋ก ๊ตฌํํด๋ณด๋ฉด ์๋์ ์ฝ๋์ ๊ฐ๋ค
def init_params(input_dim, hidden_dim, output_dim, method="xavier"):
if method == "xavier":
limit1 = np.sqrt(6 / (input_dim + hidden_dim))
limit2 = np.sqrt(6 / (hidden_dim + output_dim))
elif method == "he":
limit1 = np.sqrt(6 / input_dim)
limit2 = np.sqrt(6 / hidden_dim)
W1 = np.random.uniform(-limit1, limit1, (input_dim, hidden_dim)) # shape : (input_dim, num_hiddens) == (784, 100)
b1 = np.zeros(hidden_dim) # shape : (num_hiddens,) == (100,)
W2 = np.random.uniform(-limit2, limit2, (hidden_dim, output_dim)) # shape : (num_hiddens, num_classes) == (100, 10)
b2 = np.zeros(output_dim) # shape : (num_classes,) == (10,)
return {"W1": W1, "b1": b1, "W2": W2, "b2": b2}
์ด๊ธฐํ์ ๋ฐ๋ผ ํ์ต ์๋์ ์์ ์ฑ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค
5. Forward Pass ๊ตฌํ
ํต์ฌ ์์
$$ z_{1} = XW_{1} + b_{1} $$
$$ a_1 = \text{activation}(z_1) $$
$$ z_2 = a_1W_2 + b_2 $$
$$ y = \text{softmax}(z_2) $$
์ฃผ์
- ํ๋ ฌ ๊ณฑ์ ์์์ shape๊ฐ ํต์ฌ
- Bias๋ ๊ฐ ๋ฐฐ์น๋ง๋ค ๋ธ๋ก๋์บ์คํ ๋จ
- Sigmoid๋ 0~1 ๋ฒ์, ReLU๋ 0~๋ฌดํ
์ถ๋ ฅ๊ฐ ํ์ธ
- Softmax ๊ฒฐ๊ณผ: ๊ฐ ์ํ๋ณ 10์ฐจ์ ํ๋ฅ ๋ฒกํฐ
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def softmax(x):
exp_x = np.exp(x - np.max(x, axis=1, keepdims=True))
return exp_x / np.sum(exp_x, axis=1, keepdims=True)
def forward(X, params):
z1 = X @ params["W1"] + params["b1"] # (32, 784) x (784, 100) => (32, 100) + (100,)
a1 = sigmoid(z1) # (32, 100)
z2 = a1 @ params["W2"] + params["b2"] # (32, 100) x (100, 10) => (32, 10) + (10,)
y_hat = softmax(z2) # (32, 10)
cache = {"X": X, "z1": z1, "a1": a1, "z2": z2, "y_hat": y_hat}
return y_hat, cache
์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ X์ ๊ฐ์ค์น์ ํ๋ ฌ ๊ณฑ ์ฐ์ฐ ์ ์ shape๊ฐ ์ ํํ ์ผ์นํ๋์ง ์ ํ์ธํด์ผํ๋ค
6. Loss ๊ณ์ฐ: Cross-Entropy์ Softmax
์์
$$
L = - \frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c})
$$
๋ฏธ๋ถ
Softmax + Cross-Entropy์ ์กฐํฉ์์ ๋ฏธ๋ถ:
- ๋ฏธ๋ถ๊ณผ์ ์ ๊ฑฐ์น๊ณ ๋๋ฉด ์๋์ฒ๋ผ ์์ธก ํ๋ฅ ์์ ์ค์ ๋ผ๋ฒจ์ ๋นผ๋ ๊ฐ๋จํ ํํ๋ก ๋์จ๋ค
$$
\frac{\partial L}{\partial z_i} = \hat{y}_i - y_i
$$
7. Backpropagation ๊ตฌํ
์ดํดํ๋๋ฐ ๊ฐ์ฅ ์ค๋ ๊ฑธ๋ ธ๋ ๋ถ๋ถ
$ z_{1} = XW_{1} + b_{1} $
$ a_1 = \text{activation}(z_1) $
$ z_2 = a_1W_2 + b_2 $
$ y = \text{softmax}(z_2) $
์์ Forward ์ ์๋ ์์๋ค ๊ทธ๋๋ก ์๋์์ ์๋ก ํธ๋ฏธ๋ถ์ ํด์ฃผ๋ฉด์ ์ฌ๋ผ๊ฐ๋ฉด ๋๋ค
Loss → z2 → W2, b2 → a1 → z1 → W1, b1 ์์ผ๋ก ์งํํ๋ค
์ฒด์ธ๋ฃฐ ์ ์ฉ
์ถ๋ ฅ์ธต:
$ y = \text{softmax}(z_2) $
- ์์ธก๊ฐ y_hat์ ๋ํ ๋ฏธ๋ถ๊ฐ์ ๋ฐ๋ก ์์ Softmax + Cross-Entropy์ ์กฐํฉ์์ ๋ฏธ๋ถ์ ์ฐธ๊ณ ํ๋ฉด ๋๋ค
- ๊ทธ๋ผ ์์ธก๊ฐ - ์ค์ ๊ฐ์ด๋ผ๋ ๊ฐ๋จํ ์์ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ์๋์ ๊ฐ๋ค
- ๋ฐฐ์น ์ฌ์ด์ฆ๋ฅผ 32์ด๋ผ ๊ฐ์ , ๋์ค๋ shape๋ (32, 10)
dl_dz2 = y_hat - Y
ํ๋ ์ธต:
$ z_2 = a_1W_2 + b_2 $
- ํด๋น ์์ ์๋ a1, W2, b2์ ๋ํด์ ํธ๋ฏธ๋ถ์ ํตํด ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ค
- ์ด ๋ ์์ ์ถ๋ ฅ์ธต์์ ๊ตฌํ ๊ธฐ์ธ๊ธฐ์ ํ๋ ฌ๊ณฑ์ด ๋๊ธฐ์ ์์์ ์ฃผ์ํ ๊ฒ
- ์์๋ ํธ๋ฏธ๋ถ์ ํ์ ๋ ์ด๋๊ฐ ๋จ๋์ง๋ฅผ ์ ์ดํด๋ณด๋ฉด ๋๋ค
- ์๋ฅผ ๋ค์ด dl_dW2 ๋ W2์ ๋ํด ํธ๋ฏธ๋ถ ํ์ ๋ a1์ด ์์ ๋จ๊ณ ๋ค์ ์ฒด์ธ๋ฃฐ๋ก ์์์ ๊ตฌํ ๊ธฐ์ธ๊ธฐ๊ฐ ๊ณฑํด์ง๊ธฐ์
dl_dW2 = a1.T @ dl_dz2 ์ด๋ฐ ์์ด ๋์ค๊ฒ ๋๋ค
Weight/ํธํฅ ๊ธฐ์ธ๊ธฐ:
dl_dW2 = a1.T @ dl_dz2
dl_db2 = np.sum(dl_dz2, axis=0)
dl_da1 = dl_dz2 @ W2.T
- ์์์ ๋์จ a1์ shape๋ (32, 100)
- dl_dz2์ shape๋ (32,10)
- (32, 100) x (32, 10) : shape ๋ถ์ผ์น โ ๋ฐ๋ผ์ ์์ a1์ ํธ๋์คํฌ์ฆ ์ทจํด์ค๋ค
- (100, 32) x (32, 10) โ
ํ์ฑํ ํจ์:
$ a_1 = \text{sigmoid}(z_1) $
Sigmoid์ ๊ฒฝ์ฐ
- ์ด์ ๊ธ์์ ๋ณด์๋ฏ์ด ์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ๋ฏธ๋ถํ๋ฉด sigmoid(x) * (1 - sigmoid(x)) ๋ผ๋ ํํ๊ฐ ๋์จ๋ค
- a1์ ์๊ทธ๋ชจ์ด๋๋ฅผ ํต๊ณผํ ๊ฐ. ๋ฐ๋ผ์ ํธ๋ฏธ๋ถ์ a1์ ์ฌ์ฉํ๋ค
- ์์ ์๊ทธ๋ชจ์ด๋ ์์ z1์ ๋ํด ํธ๋ฏธ๋ถํ๋ฉด ์ฒด์ธ๋ฃฐ์ ์ํด ์ด์ ๊ธฐ์ธ๊ธฐ dl_da1๊ณผ ์๊ทธ๋ชจ์ด๋ ๋ฏธ๋ถ, sigmoid(x) * (1 - sigmoid(x)) ์ด ๊ณฑํด์ง ํํ๊ฐ ๋์ค๊ฒ ๋๋ค
dl_dz1 = dl_da1 * a1 * (1 - a1)
ReLU์ ๊ฒฝ์ฐ
- ReLU๋ ์์๋ y = x, 0๊ณผ ์์๋ 0์ผ๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ด์ ๊ธฐ์ธ๊ธฐ๊ฐ์ด ์์๋ ์์๋์ ๋ฐ๋ผ ๊ธฐ์ธ๊ธฐ๊ฐ ์ ๋ฌ๋๊ฑฐ๋ 0์ผ๋ก ์ ๋ฌ๋์ง ์๋๋ค
- ์์๋ผ๋ฉด y = x์ ๊ธฐ์ธ๊ธฐ๋ 1, ์ด์ ๊ธฐ์ธ๊ธฐ๊ฐ ๊ทธ๋๋ก ์ ๋ฌ๋๋ฉฐ 0์ดํ์ผ ๊ฒฝ์ฐ 0์ผ๋ก ๋ง๋ ๋ค
- z1 > 0 ์ด๋ผ๋ ์กฐ๊ฑด์์ bool๋ก 0, 1์ ๊ณฑํ์ฌ ํํฐ๋ง์ ํด์ฃผ๋ ์์ด๋ค
dl_dz1 = dl_da1 * (z1 > 0)
ํฌ์ธํธ
- ๊ฐ ํ๋ ฌ ๊ณฑ๊ณผ ์ฐจ์ ํ์ธ
- ํ์ฑํ ํจ์ ๋ฏธ๋ถ ์ ์ฉ ํ์
์์ ๋ด์ฉ๋ค์ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค
def backward(Y, cache, params):
m = Y.shape[0]
dz2 = (cache["y_hat"] - Y) / m
dW2 = cache["a1"].T @ dz2
db2 = np.sum(dz2, axis=0)
da1 = dz2 @ params["W2"].T
dz1 = da1 * cache["a1"] * (1 - cache["a1"]) # sigmoid ๋ฏธ๋ถ
dW1 = cache["X"].T @ dz1
db1 = np.sum(dz1, axis=0)
return {"dW1": dW1, "db1": db1, "dW2": dW2, "db2": db2}
8. Gradient Descent๋ฅผ ํตํ ํ์ต
Mini-batch ํ์ต
- Batch size: 32
- ํ์ต๋ฅ : 0.001
์ ๋ฐ์ดํธ
- ์๋น์ ๋๋ ์นด์ด๋ฐ ํ ์ด๊ธฐํ๋ฅผ ํตํด ์ค์ ํ ๊ฐ์ค์น์์ ์ญ์ ํ๋ฅผ ํตํด ๊ฐ๊ฐ ๊ตฌํ๋ ๊ธฐ์ธ๊ธฐ์ ํ์ต๋ฅ ์ ๊ณฑํ์ฌ ๋บ์ผ๋ก์จ ์ ๋ฐ์ดํธ๋ฅผ ํด์ค๋ค
def update_params(params, grads, lr=0.1):
for key in params.keys():
params[key] -= lr * grads["d" + key]
return params
---
self.params['W2'] = self.params['W2'] - lr * grad['dl_dW2']
self.params['b2'] = self.params['b2'] - lr * grad['dl_db2']
self.params['W1'] = self.params['W1'] - lr * grad['dl_dW1']
self.params['b1'] = self.params['b1'] - lr * grad['dl_db1']
- ์ฌ๊ธฐ์ params์ key๋ค์ ๊ฐ์ค์น ์ด๊ธฐํ๋ฅผ ํด์ ์ค์ ํ W1, W2, b1, b2
9. ๋ชจ๋ธ ๊ฒ์ฆ (Evaluate)
์์์ ์์ ํ-์ญ์ ํ, ๊ฐ์ค์น ์ ๋ฐ์ดํธ ๋ฟ ์๋๋ผ epoch๋ง๋ค ๋ชจ๋ธ์ ์ง์์ ์ธ ์ฑ๋ฅ ํ์ธ์ด ํ์ํ๋ค
์์ ํ๋ฅผ ํตํด ์ป์ ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ๋ง ์๋ค๋ฉด ์ด๋ ์ ๋์ ์ ํ๋๋ฅผ ๊ฐ์ง๋์ง ์ธก์ ํ ์ ์๋ค
def evaluate(Y, Y_hat):
# Accuracy ๊ณ์ฐ
pred = np.argmax(Y_hat, axis=1)
true = np.argmax(Y, axis=1)
accuracy = np.mean(pred == true)
return accuracy
์์์ ์ฐ๋ฆฌ๋ to_categorical ๋ฉ์๋๋ฅผ ํตํด ๋ผ๋ฒจ๊ฐ๋ค์ 10๊ฐ ์ค ์์นํ ์ธ๋ฑ์ค๋ฅผ ํ์ํ๋ ์-ํซ ์ธ์ฝ๋ฉ์ ํด์ฃผ์๋ค
1. np.argmax๋ก ์์ธก๊ฐ ๋ณํ
Y_hat์ ๋ชจ๋ธ ์ถ๋ ฅ์ผ๋ก, softmax๋ฅผ ํตํด ๊ฐ ํด๋์ค์ ๋ํ ํ๋ฅ ๋ถํฌ ํํ์ด๋ค
์๋ฅผ ๋ค์ด, ํ ์ํ์ Y_hat์ด ์๋์ ๊ฐ๋ค๋ฉด:
y_hat_sample = [0.05, 0.01, 0.88, 0.03, 0.01, 0.01, 0.01, 0.0, 0.0, 0.0]
- softmax ํ๋ฅ ์์ ๊ฐ์ฅ ๋์ ๊ฐ(0.88)์ ์ธ๋ฑ์ค๋ฅผ ์์ธก ํด๋์ค๋ผ๊ณ ํ๋จ
- np.argmax(y_hat_sample) → 2 (ํด๋์ค 2๋ฅผ ์์ธก)
2. ์ ๋ต ๋ผ๋ฒจ ๋ณํ
Y๋ ์-ํซ ์ธ์ฝ๋ฉ ํํ๋ก ๋์ด ์๋ค. ์๋ฅผ ๋ค์ด ํด๋์ค 2๊ฐ ์ ๋ต์ด๋ฉด:
Y_sample = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
- np.argmax(Y_sample) → 2 (์ ๋ต ํด๋์ค)
3. ๋น๊ต ๋ฐ ํ๊ท
pred == true
- ์์ธก ํด๋์ค์ ์ค์ ํด๋์ค๊ฐ ์ผ์นํ๋ฉด True, ์๋๋ฉด False
- ์ฌ๋ฌ ์ํ์ ์ฒ๋ฆฌํ ๋ np.mean()๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฒด ์ผ์น ๋น์จ = accuracy
์์:
| pred | true | pred == true |
| 2 | 2 | True |
| 0 | 0 | True |
| 4 | 3 | False |
- Accuracy = (2/3) = 0.6667
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ๋ด์ฉ์ ์ฌ์ค์ ์ด์ ์ ์ ๋ฆฌํ ๊ธ, "MSE Loss์ ์๊ทธ๋ชจ์ด๋์์์ ์ญ์ ํ ์ดํดํ๊ธฐ" ์ ๋น์ทํ ๋ด์ฉ์์๋ ๋ถ๊ตฌํ๊ณ ์ดํดํ๋๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค
์ด์ ์๋ ์ญ์ ํ ์ผ๋ถ๋ง ๋ค๋ฃจ์๋ค๋ฉด ์ด๋ฒ์๋ ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ฐ์ค์น์ ํธํฅ๋ถํฐ ์ง์ ์ค์ ํ๊ณ ์ด๊ฑธ ์์ ํ์ ์ญ์ ํ๋ฅผ ํ ๋ ์ด๋ค ์์๋ค์ ์ ์ ํ๊ฒ ์ฌ์ฉํด์ผํ๋์ง, ๋ ํ์ฅ๋ ๋ด์ฉ์ด์๊ธฐ์ ์ ๋ฅผ ๋จน์๋ ๊ฒ ๊ฐ๋ค
๋ค์ ๊ณต๋ถ๋ค์ด ๋ฐ๋ ธ์ง๋ง.. ์ฌ๊ธฐ์ ๋ฐฐ์ด ๊ฒ๋ค์ด ์ ๋ง ๊ธฐ๋ณธ์ ์ด๊ณ ๊ทผ๋ณธ์ด ๋๋ ๋ด์ฉ์ด๊ธฐ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋๋ผ๋ ์ต๋ํ ์ดํดํ๊ณ ๋์ด๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ์ฌ ์ ๋ฆฌํด๋ณด์๋ค
์ฐธ๊ณ ์๋ฃ
https://humankind.tistory.com/59
[๋ฐ๋ฐ๋ฅ๋ฅ๋ฌ๋] 10. ์ค์ฐจ์ญ์ ํ๋ฒ(backpropagation) ๊ตฌํ(1)
๋ณธ ๊ฒ์๊ธ์ ํ๋น๋ฏธ๋์ด ใ๋ฐ๋ฐ๋ฅ๋ถํฐ ์์ํ๋ ๋ฅ๋ฌ๋, ์ฌ์ดํ ๊ณ ํค, 2020ใ์ ๋ด์ฉ์ ์ฐธ์กฐํ์์์ ๋ฐํ๋๋ค. ์ง๋ ์ฅ์์๋ ๋ง์ ๋ ธ๋์ ๊ณฑ์ ๋ ธ๋์์์ ์์ ํ์ ์ญ์ ํ ๋ฐฉ๋ฒ์ ๋ํด์ ์ด
humankind.tistory.com
์ด ๊ธ ๋ด์ฉ๋ ๊ด์ฐฎ์๋ค. ๋ฐ๋ฐ๋ฅ์ ๋ณด๊ณ ์ถ์ง๋ง.. ๋ด์ฉ์ด ๋ง์ด ๊ฒน์น๊ธฐ๋ ํ๊ณ ๋ค ๋ณผ ์๋ ์์ด์ ํจ์ค. ๋์ ํํ๋ Easy ๋ฅ๋ฌ๋ ์ฑ ๋ณํํ๋ฉด์ ์ถ์ ์ ๊น์ง๋ ๊ผญ ๋ค๋ณด์
'๊ณต๋ถ๊ธฐ๋ก > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| MSE Loss์ ์๊ทธ๋ชจ์ด๋์์์ ์ญ์ ํ ์ดํดํ๊ธฐ (0) | 2025.09.12 |
|---|