π Gradient Descent
κ²½μ¬ νκ°λ²μ΄λ?β
κ²½μ¬ νκ°λ²μ λ¨Έμ λ¬λμμ μ΅μ ν λ¬Έμ λ₯Ό ν΄κ²°νλ λ° μ¬μ©λλ μΌλ°μ μΈ κΈ°μ
κ²½μ¬ νκ°λ²μ κΈ°λ³Έ κ°λ β
κ²½μ¬ νκ°λ²μ μμ€ ν¨μμ κΈ°μΈκΈ°λ₯Ό κ³μ°νμ¬ μ΅μννλ λ°©λ²μ μ 곡ν©λλ€. μ΄ κΈ°μ μ λ¨Έμ λ¬λ λͺ¨λΈμ νλΌλ―Έν°λ₯Ό μ‘°μ νμ¬ μμ€ ν¨μλ₯Ό μ΅μννλ κ³Όμ μ ν¬ν¨ν©λλ€.
κ²½μ¬ νκ°λ²μ μμβ
κ²½μ¬ νκ°λ²μ μμμ λ€μκ³Ό κ°μ΅λλ€.
$$ \theta = \theta - \eta \nabla J(\theta) $$
μ¬κΈ°μ $\theta$λ λͺ¨λΈμ νλΌλ―Έν°, $\eta$λ νμ΅λ₯ , $\nabla J(\theta)$λ μμ€ ν¨μμ κΈ°μΈκΈ°μ λλ€.
κ²½μ¬ νκ°λ² python μ½λ μμβ
import numpy as np
# νμ±ν ν¨μλ‘ μκ·Έλͺ¨μ΄λ ν¨μ μ μνκΈ°
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# μκ·Έλͺ¨μ΄λ ν¨μμ λν¨μ
def sigmoid_prime(x):
return sigmoid(x) * (1 - sigmoid(x))
# μμ μ
λ ₯κ°
X = np.array([0.5, 0.8])
# λͺ©νκ°
y = 0.2
# μΆλ ₯ κ°μ€μΉμ μ
λ ₯
np.random.seed(42)
weights = np.random.rand(2)
# νμ΅λ₯
learning_rate = 0.5
# μ κ²½λ§ μΆλ ₯ (y-hat)
h = np.dot(X, weights)
nn_output = sigmoid(h)
# μΆλ ₯ μ€μ°¨ (y - y-hat)
error = y - nn_output
# μΆλ ₯ κΈ°μΈκΈ° (μ€μ°¨κ° κΈ°μΈκΈ°μ λ―ΈμΉλ μν₯ sigmoidλ₯Ό λ―ΈλΆνμ¬ κ³μ°)
output_gradient = error * sigmoid_prime(h)
# κ²½μ¬ νκ°λ²
del_w = learning_rate * output_gradient * X
# κ°μ€μΉ μ
λ°μ΄νΈ
weights += del_w
print(weights)