๐ง ์ค๋์ ํญํด: ๋จธ์ ๋ฌ๋์ ๋ฐ๋ค๋ก ๋ ๋๋ค
์ค๋์ ๋จธ์ ๋ฌ๋์ ๊ทผ๊ฐ์ด ๋๋ ๋ถ๋ฅ(Classification) ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋๋ณด๋ ์๊ฐ์ ๊ฐ์ก๋ค. ํนํ ์ธ๊ณต์ง๋ฅ์ ์์ด๋ผ๊ณ ํ ์ ์๋ ํผ์ ํธ๋ก (Perceptron) ๊ณผ ๊ทธ ์งํํ์ธ ์๋ฌ๋ฆฐ(ADALINE) ์ ์ธ๊ณ๋ก ๋ ๋, ์ด๋ค์ด ์ด๋ป๊ฒ ๋์ํ๊ณ ํ์ตํ๋์ง ์ง์ ์ฝ๋๋ฅผ ์ง๋ณด๋ฉฐ ๊น์ด ์ดํดํด๋ณด์๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ๋ค์ ์ฐ๋ฆฌ๊ฐ ํํ ์๋ ๋ฅ๋ฌ๋์ ๋ฟ๋ฆฌ์ด๊ธฐ๋ ํ๋ค. ์ค๋์ ํ์ต์ ๋ง์น ๋จธ์ ๋ฌ๋์ด๋ผ๋ ๋ฐ๋ค์ ์ฒซ ํญํด๋ฅผ ๋ ๋๋ ๊ธฐ๋ถ์ด์๋ค.
โ๋ถ๋ฅ๋ ์ ์ด๋ ๊ฒ ์ค์ํ๊ฐ์?โ
๋จธ์ ๋ฌ๋์ ํต์ฌ ์์ ์ค ํ๋์ธ ๋ถ๋ฅ๋, ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ โ์ด๊ฒโ ํน์ โ์ ๊ฒโ์ผ๋ก ๋๋๋ ์์ ์ด๋ค. ์ด๋ฉ์ผ์ด ์คํธ์ธ์ง ์๋์ง, ์ข ์์ด ์์ฑ์ธ์ง ์ ์ฑ์ธ์ง ํ๋ณํ๋ ๊ฒ ๋ชจ๋๊ฐ ๋ฐ๋ก โ๋ถ๋ฅโ์ด๋ค. ์ด๋ ์ฐ์ ์ ๋ฐ์ ๊ฑธ์ณ ํ์ฉ๋๊ณ ์์ผ๋, ๊ทธ ์ค์์ฑ์ ๋งํ ๊ฒ๋ ์๋ค.
๐งฎ ์ธ๊ณต ๋ด๋ฐ: ํผ์ ํธ๋ก ๊ณผ ์๋ฌ๋ฆฐ
์ํ์ ์ ์
- ํผ์ ํธ๋ก ๊ณผ ์๋ฌ๋ฆฐ ๋ชจ๋ ์ ๋ ฅ ์ ํธ์ ๊ฐ์คํฉ์ ๊ณ์ฐํ๋ค.
- ์์: $ z = w_1x_1 + w_2x_2 + \cdots + w_mx_m = \boldsymbol{w}^T\boldsymbol{x} $
- $\boldsymbol{w}$: ๊ฐ์ค์น ๋ฒกํฐ
- $\boldsymbol{x}$: ์ ๋ ฅ ๋ฒกํฐ
- $z$: ์ต์ข ์ ๋ ฅ (net input)
๊ฒฐ์ ํจ์ (ํผ์ ํธ๋ก )
- ํผ์ ํธ๋ก ์ ๊ณ๋จ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ข ์ถ๋ ฅ์ ๊ฒฐ์ ํ๋ค.
- ์์: $\phi(z)=\begin{cases}1 & z \ge 0 \ -1 & \text{๊ทธ ์ธ} \end{cases}$
- ์ด ํจ์๋ ์ต์ข ์ ๋ ฅ $z$๊ฐ ์๊ณ๊ฐ 0 ์ด์์ด๋ฉด 1, ์๋๋ฉด -1์ ์ถ๋ ฅํ๋ค. ๋ง์น โ์ค์์นโ์ฒ๋ผ ๋์ํ์ฃ !
ํ์ฑํ ํจ์ (์๋ฌ๋ฆฐ)
- ์๋ฌ๋ฆฐ์ ์ฐ์์ ์ธ ๊ฐ์ ๊ฐ๋ ์ ํ ํ์ฑํ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
- ์์: $\phi(z) = z$
- ์ด๋ ์ต์ข ์ ๋ ฅ $z$๋ฅผ ๊ทธ๋๋ก ์ถ๋ ฅํ๋ค. ์ด ์ฐ์์ ์ธ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํด๋์ค๋ฅผ ๋๋๋ค.
ํ์ต ๊ท์น (ํผ์ ํธ๋ก )
- ํผ์ ํธ๋ก ์ ํ์ต ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์์: $\Delta w_j = \eta(y^{(i)} - \hat{y}^{(i)})x_j^{(i)}$
- $\eta$: ํ์ต๋ฅ
- $y^{(i)}$: ์ค์ ๊ฐ
- $\hat{y}^{(i)}$: ์์ธก ๊ฐ
- $x_j^{(i)}$: $j$๋ฒ์งธ ํน์ฑ์ $i$๋ฒ์งธ ์ํ ๊ฐ
- ์ด ๊ท์น์ ์์ธก์ด ํ๋ ธ์ ๋๋ง ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ํ์ตํ๋ค.
๋น์ฉ ํจ์ (์๋ฌ๋ฆฐ)
- ์๋ฌ๋ฆฐ์ ์ฐ์์ ์ธ ์ถ๋ ฅ์ ์ฌ์ฉํ๋ฏ๋ก, ์ฐ์์ ์ธ ์ค์ฐจ๋ฅผ ์ค์ด๋ ๋ฐฉ์์ผ๋ก ํ์ตํ๋ค.
- ์ด์ ์ฌ์ฉ๋๋ ๊ฒ์ด ๋น์ฉ ํจ์ (Cost Function) ์ด๋ค.
- ์์: $J(\boldsymbol{w}) = \dfrac{1}{2}\sum_i\left(y^{(i)} - \phi(z^{(i)})\right)^2$
- ์ด ํจ์๋ ์ค์ ๊ฐ๊ณผ ์์ธก ๊ฐ์ ์ฐจ์ด์ ์ ๊ณฑํฉ์ผ๋ก, ์ด ๊ฐ์ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ํ์ตํ๋ค.
๊ตฌ๋ถ | ํผ์ ํธ๋ก | ์๋ฌ๋ฆฐ |
---|---|---|
ํ์ฑํ ํจ์ | ๊ณ๋จ ํจ์ (๋น์ฐ์) | ์ ํ ํจ์ (์ฐ์) |
ํ์ต ๋ฐฉ๋ฒ | ์ค๋ถ๋ฅ ์ ๊ฐ์ค์น ์ ๋ฐ์ดํธ | ๋น์ฉ ํจ์ ์ต์ํ (๊ฒฝ์ฌ ํ๊ฐ๋ฒ) |
์ถ๋ ฅ | 1 ๋๋ -1 | ์ฐ์์ ์ธ ์ค์ ๊ฐ |
๐ ํ์ด์ฌ์ผ๋ก ํผ์ ํธ๋ก ํ์ต ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
๊ฐ์ฒด ์งํฅ ํผ์ ํธ๋ก API
class Perceptron:
def __init__(self, eta=0.001, n_iter=50, random_state=1):
self.eta = eta
self.n_iter = n_iter
self.random_state = random_state
def fit(self, X, y):
rgen = np.random.RandomState(self.random_state)
self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
self.errors_ = []
for _ in range(self.n_iter):
errors = 0
for xi, target in zip(X, y):
update = self.eta * (target - self.predict(xi))
self.w_[1:] += update * xi
self.w_[0] += update
errors += int(update != 0.0)
self.errors_.append(errors)
return self
def net_input(self, X):
return np.dot(X, self.w_[1:]) + self.w_[0]
def predict(self, X):
return np.where(self.net_input(X) >= 0.0, 1, -1)
๋ถ๊ฝ ๋ฐ์ดํฐ์ ์์ ํผ์ ํธ๋ก ํ๋ จ
-
Iris-setosa
์Iris-versicolor
๋ ํด๋์ค๋ฅผ ์ ํํ์ฌ ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ๋ก ๋ง๋ค์๋ค. -
sepal length
์petal length
๋ ๊ฐ์ง ํน์ฑ๋ง ์ฌ์ฉํ๋ค. - ํผ์ ํธ๋ก ๋ชจ๋ธ์ ํ๋ จ์ํจ ํ, ๊ฒฐ์ ๊ฒฝ๊ณ(Decision Boundary)๋ฅผ ์๊ฐํํ๋ค.
- ๋ฐ์ดํฐ๊ฐ ์ ํ ๋ถ๋ฆฌ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ํผ์ ํธ๋ก ์ ์ ์๋ํ๋ค. ๐
์ฝ๋ | ์ค๋ช | ํน์ง |
---|---|---|
ppn = Perceptron() |
ํผ์ ํธ๋ก ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค. | ํ์ต๋ฅ , ์ํฌํฌ ์ ๋ฑ์ ์ง์ ํ ์ ์์ต๋๋ค. |
ppn.fit(X, y) |
๋ชจ๋ธ์ ํ๋ จํฉ๋๋ค. | ํ๋ จ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ์ค์ด๋๋์ง ํ์ธํ ์ ์์ต๋๋ค. |
ppn.predict(X_new) |
์๋ก์ด ๋ฐ์ดํฐ์ ๋ํด ์์ธกํฉ๋๋ค. | 1 ๋๋ -1์ ๋ฐํํฉ๋๋ค. |
๐ ์ ์ํ ์ ํ ๋ด๋ฐ (ADALINE)๊ณผ ํ์ต์ ์๋ ด
๊ฒฝ์ฌ ํ๊ฐ๋ฒ (Gradient Descent)
- ์๋ฌ๋ฆฐ์ ์ฐ์์ ์ธ ์ค์ฐจ๋ฅผ ์ต์ํํ๊ธฐ ์ํด ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์ฌ์ฉํ๋ค.
- ๋น์ฉ ํจ์ $J(\boldsymbol{w})$์ ๊ธฐ์ธ๊ธฐ(Gradient)๋ฅผ ๋ฐ๋ผ ๊ฐ์ค์น $\boldsymbol{w}$๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- ์์: $\boldsymbol{w} := \boldsymbol{w} + \Delta \boldsymbol{w}$, where $\Delta \boldsymbol{w} = \eta \sum_i (y^{(i)} - \phi(z^{(i)}))x^{(i)}$
ํ์ด์ฌ์ผ๋ก ์๋ฌ๋ฆฐ ๊ตฌํ
class AdalineGD:
def __init__(self, eta=0.001, n_iter=50, random_state=1):
self.eta = eta
self.n_iter = n_iter
self.random_state = random_state
def fit(self, X, y):
rgen = np.random.RandomState(self.random_state)
self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
self.cost_ = []
for i in range(self.n_iter):
net_input = self.net_input(X)
output = self.activation(net_input)
errors = (y - output)
self.w_[1:] += self.eta * X.T.dot(errors)
self.w_[0] += self.eta * errors.sum()
cost = (errors**2).sum() / 2.0
self.cost_.append(cost)
return self
def net_input(self, X):
return np.dot(X, self.w_[1:]) + self.w_[0]
def activation(self, X):
return X # ์ ํ ํ์ฑํ
def predict(self, X):
return np.where(self.activation(self.net_input(X)) >= 0.0, 1, -1)
ํน์ฑ ์ค์ผ์ผ ์กฐ์ (Feature Scaling)
- ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์ ๋ ฅ ํน์ฑ์ ์ค์ผ์ผ์ ๋งค์ฐ ๋ฏผ๊ฐํ๋ค.
- ํน์ฑ ๊ฐ ์ค์ผ์ผ์ด ์ฐจ์ด๊ฐ ํฌ๋ฉด ํ์ต์ด ๋๋ ค์ง๊ฑฐ๋ ์๋ ดํ์ง ์์ ์ ์๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์คํ (Standardization) ๋ฅผ ์ฌ์ฉํ๋ค.
- ์์: $xโ_j = \dfrac{x_j - \mu_j}{\sigma_j}$
- $\mu_j$: $j$๋ฒ์งธ ํน์ฑ์ ํ๊ท
- $\sigma_j$: $j$๋ฒ์งธ ํน์ฑ์ ํ์ค ํธ์ฐจ
๋ฐ์ดํฐ์ ์ค์ผ์ผ์ ๋ง์ถฐ์ฃผ๋ ํ์คํ๋ ์ ๋ง ์ค์ํ๋ค! ์ด๊ฑธ ํ์ง ์์ผ๋ฉด ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ด ์ ๋๋ก ์๋ ดํ์ง ์์ ์๋ ์์ด์. ๐ฑ
ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ (Stochastic Gradient Descent, SGD)
- ๋ฐฐ์น ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ๋ชจ๋ ํ๋ จ ์ํ์ ์ฌ์ฉํด ํ ๋ฒ์ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ค.
- ํ๋ฅ ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ํ ๋ฒ์ ํ๋์ ์ํ๋ง ์ฌ์ฉํด ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ค.
- ์ด๋ ๋ ๋น ๋ฅด๊ณ , ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ ํฉํ๋ฉฐ, ์จ๋ผ์ธ ํ์ต(์ค์๊ฐ ํ์ต)๋ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
class AdalineSGD:
# ... (์ ์ฝ๋ ์ฐธ์กฐ)
def _update_weights(self, xi, target):
"""SGD ํ์ต ๊ท์น์ ์ ์ฉํ์ฌ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค"""
output = self.activation(self.net_input(xi))
error = (target - output)
self.w_[1:] += self.eta * xi.dot(error)
self.w_[0] += self.eta * error
cost = 0.5 * error**2
return cost
โจ ์ค๋์ ํ๊ณ
์ค๋์ ๋จธ์ ๋ฌ๋์ ์์ด์ธ ํผ์ ํธ๋ก ๊ณผ ์๋ฌ๋ฆฐ์ ์ง์ ๊ตฌํํด๋ณด๋ฉฐ, ๊ทธ ์๋ฆฌ๋ฅผ ๊น์ด ์ดํดํ ์ ์์๋ค. ํผ์ ํธ๋ก ์ ๋จ์ํ์ง๋ง ๊ฐ๋ ฅํ ์์ด๋์ด, ๊ทธ๋ฆฌ๊ณ ์๋ฌ๋ฆฐ์ ์ฐ์์ ์ธ ํ์ต ๋ฐฉ์๊ณผ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ํ์ฉ๊น์ง, ๋จธ์ ๋ฌ๋์ ํต์ฌ ๊ฐ๋ ๋ค์ ์ง์ด๋ณด๋ ๊ฐ์ง ์๊ฐ์ด์๋ค. ํนํ, ํน์ฑ ์ค์ผ์ผ ์กฐ์ ์ ์ค์์ฑ์ ์ง์ ์ฝ๋๋ก ํ์ธํ๋ฉด์ โ์ด๊ฒ ์ ํ์ํ ๊ฑฐ์ง?โ ์ถ์๋ ์๋ฌธ์ด ๊น๋ํ๊ฒ ํ๋ ธ๋ค. ๐
๋ค์ ํ์ต์์๋ ์ด ์๊ณ ๋ฆฌ์ฆ๋ค์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ ๋ณต์กํ ๋ถ๋ฅ๊ธฐ, ์๋ฅผ ๋ค์ด ๋ก์ง์คํฑ ํ๊ท๋ ์ํฌํธ ๋ฒกํฐ ๋จธ์ (SVM) ๋ฑ๋ ์ ํด๋ณผ ์์ ์ธ๋ฐ, ์ค๋์ ๊ธฐ์ด๊ฐ ํํํด์ ๊ธฐ๋๊ฐ ๋๋ค! ๋ ๋ง์ ๋ฐ์ดํฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค๋ฃจ๋ค ๋ณด๋ฉด ์ธ์ ๊ฐ ์ง์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋ง๋ค ์ ์๋ ๋ ๋ ์ฌ ๊ฒ ๊ฐ๋ค! ๐งจ