
μΌλ°μ μΌλ‘ νλ ¨ μνμ κ°μλ μμ£Ό λ§λ€.
νλ°°μΉ νμ΅ (full batch learning)μ¨λΌμΈ νμ΅ (online learning)λ―Έλλ°°μΉ νμ΅ (mini batch learning)
ν λ°°μΉ νμ΅μ μ κ²½λ§ νμ΅μμ λͺ¨λ νλ ¨ μνμ ν λ²μ μ²λ¦¬νλ λ°©μμ΄λ€.
μ΄ λ°©λ²μ νκ· κ·ΈλλμΈνΈλ₯Ό κ³μ°νμ¬ κ°μ€μΉλ₯Ό μ
λ°μ΄νΈνλ λ°©μμΌλ‘ μ§νλλ€.
νμ§λ§, λ§μ μνμ νλ²μ μ²λ¦¬νκΈ° λλ¬Έμ μκ°μ΄ λ§μ΄ κ±Έλ¦¬κ³ κ³μ°μ΄ λ릴 μ μλ€.
κ°μ€μΉμ λ°μ΄μ΄μ€λ₯Ό 0λΆν° 1 μ¬μ΄μ λμλ‘ μ΄κΈ°ν.
μλ ΄ν λκΉμ§ λͺ¨λ κ°μ€μΉμ λν΄ λ€μμ λ°λ³΅.
λͺ¨λ νλ ¨ μνμ μ²λ¦¬νμ¬ νκ· κ·ΈλλμΈνΈ
κ°μ€μΉ μ λ°μ΄νΈ:
μ¨λΌμΈ νμ΅μ νλ ¨ μν μ€μμ 무μμλ‘ νλμ μνμ μ ννμ¬ κ°μ€μΉλ₯Ό μ
λ°μ΄νΈνλ λ°©μμ΄λ€.
μ΄ λ°©λ²μ κ³μ°μ΄ μ½κ³ μνλ§λ€ λΉ λ₯΄κ² νμ΅μ΄ κ°λ₯νμ§λ§, μν μ νμ λ°λΌ μ°μμ’μνκΈ° μ½λ€.
κ°μ€μΉμ λ°μ΄μ΄μ€λ₯Ό 0λΆν° 1 μ¬μ΄μ λμλ‘ μ΄κΈ°ν.
μλ ΄ν λκΉμ§ λͺ¨λ κ°μ€μΉμ λν΄ λ°λ³΅.
νλ ¨ μν μ€μμ 무μμλ‘ iλ²μ§Έ μνμ μ ν.
κ·ΈλλμΈνΈ κ³μ°:
κ°μ€μΉ μ λ°μ΄νΈ: $w(t+1) = w(t) - \eta \cdot \frac{\partial E}
λ―Έλλ°°μΉ νμ΅μ ν λ°°μΉμ μ¨λΌμΈ νμ΅μ μ€κ° ννλ‘, νλ ¨ μνμ Bκ°μ© λ¬Άμ΄μ μ²λ¦¬νλ λ°©μμ΄λ€.
λΉ λ₯΄κ² κ³μ°νλ©΄μλ μμ μ μΈ νμ΅μ ν μ μλ€.
κ°μ€μΉμ λ°μ΄μ΄μ€λ₯Ό 0λΆν° 1 μ¬μ΄μ λμλ‘ μ΄κΈ°ν.
μλ ΄ν λκΉμ§ λ°λ³΅.
νλ ¨ μν μ€μμ 무μμλ‘ Bκ°μ μνμ μ ν.
κ·ΈλλμΈνΈ κ³μ°:
κ°μ€μΉ μ λ°μ΄νΈ:


import numpy as np
import tensorflow as tf
# λ°μ΄ν°λ₯Ό νμ΅ λ°μ΄ν°μ ν
μ€νΈ λ°μ΄ν°λ‘ λλλ€.
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
data_size = x_train.shape[0]
batch_size = 12 # λ°°μΉ ν¬κΈ°
# λ°°μΉ ν¬κΈ° λ§νΌ λλ€νκ² μ ν
selected = np.random.choice(data_size, batch_size)
print(selected)
x_batch = x_train[selected]
y_batch = y_train[selected]
# λ―Έλ λ°°μΉ μ¬μ©ν κ²½μ° MSE ν¨μ
def MSE(t, y):
size = y.shape[0]
return 0.5 * np.sum((y - t) ** 2) / size
[58298 3085 27743 33570 35343 47286 18267 25804 4632 10890 44164 18822]
XOR μ°μ° νμ΅μ μν μ κ²½λ§ μ€κ³:

νλ ¬κ³μ°:
β
β‘
β’

κ°μ€μΉ μ λ°μ΄νΈ:
μνμ΄ 4κ° μ΄λ―λ‘ 4λ‘ λλμ΄μ νκ· gradientλ₯Ό κ³μ°νκ³ μ¬κΈ°μ νμ΅λ₯ μ κ³±νμ¬ λ₯Ό μ λ°μ΄νΈνλ€.
import numpy as np
# μκ·Έλͺ¨μ΄λ ν¨μ
def actf(x):
return 1 / (1 + np.exp(-x))
# μκ·Έλͺ¨μ΄λ ν¨μμ λ―ΈλΆμΉ
def actf_deriv(x):
return x * (1 - x)
# μ
λ ₯μ λ, μλμ λ λ° μΆλ ₯μ λμ κ°μ
inputs, hiddens, outputs = 2, 2, 1
learning_rate = 0.5
# νλ ¨ μ
λ ₯κ³Ό μΆλ ₯
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
T = np.array([[0], [1], [1], [0]])
# κ°μ€μΉλ₯Ό β1.0μμ 1.0 μ¬μ΄μ λμλ‘ μ΄κΈ°ννλ€.
W1 = 2 * np.random.random((inputs, hiddens)) - 1
W2 = 2 * np.random.random((hiddens, outputs)) - 1
B1 = np.zeros(hiddens)
B2 = np.zeros(outputs)
# μλ°©ν₯ μ ν κ³μ°
def predict(x):
layer0 = x # μ
λ ₯μ layer0μ λμ
νλ€.
Z1 = np.dot(layer0, W1) + B1 # νλ ¬μ κ³±μ κ³μ°νλ€.
layer1 = actf(Z1) # νμ±ν ν¨μλ₯Ό μ μ©νλ€.
Z2 = np.dot(layer1, W2) + B2 # νλ ¬μ κ³±μ κ³μ°νλ€.
layer2 = actf(Z2) # νμ±ν ν¨μλ₯Ό μ μ©νλ€.
return layer0, layer1, layer2
# μλ°©ν₯ μ ν κ³μ°
def fit():
global W1, W2, B1, B2
for i in range(60000):
layer0, layer1, layer2 = predict(X)
layer2_error = layer2 - T
layer2_delta = layer2_error * actf_deriv(layer2)
layer1_error = np.dot(layer2_delta, W2.T)
layer1_delta = layer1_error * actf_deriv(layer1)
W2 += -learning_rate * np.dot(layer1.T, layer2_delta) / 4.0
W1 += -learning_rate * np.dot(layer0.T, layer1_delta) / 4.0
B2 += -learning_rate * np.sum(layer2_delta, axis=0) / 4.0
B1 += -learning_rate * np.sum(layer1_delta, axis=0) / 4.0
# ν
μ€νΈ ν¨μ
def test():
for x, y in zip(X, T):
x = np.reshape(x, (1, -1)) # νλμ¬λ 2μ°¨μ ννμ΄μ΄μΌ νλ€.
layer0, layer1, layer2 = predict(x)
print(x, y, layer2)
# νμ΅ λ° ν
μ€νΈ μ€ν
fit()
test()
[[0 0]] [0] [[0.0124954]]
[[0 1]] [1] [[0.98683933]]
[[1 0]] [1] [[0.9869228]]
[[1 1]] [0] [[0.01616628]]
νμ΅λ₯ μ μ κ²½λ§ νμ΅μμ κ°μ€μΉλ₯Ό μΌλ§λ ν¬κ² λ³κ²½ν μ§ κ²°μ νλ κ°μ΄λ€.
λ무 ν° νμ΅λ₯ μ μ€λ²μν
μ λ°μμμΌ μ΅μ μ μ μ§λμΉκ² λ μ μλ€.
λ무 μμ νμ΅λ₯ μ νμ΅ μλκ° λλ €μ§λ©°, μ§μ μ΅μκ°μ λΉ μ§ μνμ΄ μλ€.
μ μ ν νμ΅λ₯ μ μ€μ νλ©΄ μ΅μ ν κ³Όμ μ΄ μννκ² μ§νλλ€.

λͺ¨λ©ν
μ μ΄μ κ°μ€μΉ λ³νλμ λ°μνμ¬ κ°μλλ₯Ό μΆκ°νλ λ°©λ²μ΄λ€.
μ΄ λ°©λ²μ ν΅ν΄ κ°μ€μΉκ° μ§μ μ΅μκ°μ λ²μ΄λ μ μ μ΅μκ°μ μ°Ύλ λ° λμμ΄ λλ€.

κ°λ³ νμ΅λ₯ μ μ¬μ©νλ λ°©λ²μΌλ‘ SGD λ°©λ²μ κ°λν μ΅μ ν λ°©λ²μ΄λ€.νμ΅λ₯ κ°μ (learning rate decay)μ΄λ€.κΈ°μΈκΈ°λ€μ λμ ν κ°μ λ°λΉλ‘νμ¬μ μ€μ νλ€.μ§μ κ°μ€ μ΄λ νκ· μ μ¬μ©νλ€.κ°μ₯ μΈκΈ° μλ μ΅μ ν μκ³ λ¦¬μ¦ μ€μ νλμ΄λ€.
νμ΅ λ°©λ²κ³Ό νμ΅λ₯
ν λ°°μΉλ μ 체 λ°μ΄ν°λ₯Ό μ²λ¦¬ν ν κ°μ€μΉλ₯Ό μ λ°μ΄νΈνλ©° μμ μ μ΄μ§λ§ λ리λ€.
SGDλ νλμ μνλ§ λ³΄κ³ μ λ°μ΄νΈνλ―λ‘ λΉ λ₯΄μ§λ§ λΆμμ νλ€.
λ―Έλ λ°°μΉλ κ·Έ μ€κ°μΌλ‘, μ¬λ¬ μνμ λ¬Άμ΄ κ· ν μ‘ν νμ΅μ μ§ννλ€.
νμ΅λ₯ μ ν΅μ¬ νμ΄νΌνλΌλ―Έν°μ΄λ©°, RMSprop, Adamκ³Ό κ°μ μκ³ λ¦¬μ¦μ μ μμ μΌλ‘ νμ΅λ₯ μ μ‘°μ νλ€.