π‘ 'Deep Learning from Scratch'λ₯Ό μ°Έκ³ νμ¬ μμ±
μ κ²½λ§μμ νμ΅(train)μ΄λ νμ΅ λ°μ΄ν°λ‘λΆν° κ°μ€μΉ 맀κ°λ³μ(weight parameter)μ μ΅μ κ°(optimal value)μ μλμΌλ‘ νλνλ κ²μ μλ―Έν©λλ€. μ΄λ² κ²μλ¬Όμμλ μ κ²½λ§μ νμ΅νκΈ° μν μ§ν, μμ€ ν¨μμ λνμ¬ μμλ³΄κ² μ΅λλ€.
1. λ°μ΄ν°μ νμ΅
μ κ²½λ§μ λ°μ΄ν°λ₯Ό ν΅ν΄ νμ΅ν©λλ€. λ°μ΄ν°λ₯Ό μ΄μ©νμ¬ νμ΅νλ€λ κ²μ λ°μ΄ν°λ₯Ό ν΅ν΄ κ°μ€μΉ 맀κ°λ³μμ κ°μ μλμΌλ‘ κ²°μ νλ€λ λ»μ λλ€. μ΄λ λͺ¨λ 맀κ°λ³μλ₯Ό μμμ μΌλ‘ κ²°μ ν΄μΌ νλ μ΄λ €μμ ν΄κ²°ν΄μ€λλ€.
1.1 λ°μ΄ν° μ£Όλ νμ΅
κΈ°κ³ νμ΅(machine learning)μ μλͺ μ λ°λ‘ λ°μ΄ν°μ λλ€. λ°μ΄ν°μμ λ΅μ μ°Ύκ³ λ°μ΄ν°μμ ν¨ν΄μ λ°κ²¬νκ³ λ°μ΄ν°λ‘ μ΄μΌκΈ°λ₯Ό λ§λλ κ²μ΄ λ°λ‘ κΈ°κ³ νμ΅μ λλ€. κΈ°κ³ νμ΅μ ν΅ν΄ μ¬λ μ€μ¬μ μ κ·Ό λ°©μμμ λ°μ΄ν°κ° μ΄λλ μ κ·Ό λ°©μμΌλ‘ λ³ννμμ΅λλ€.
κΈ°κ³ νμ΅μ μ¬λμ΄ μκ³ λ¦¬μ¦μ λ°λ°λ₯λΆν° μ€κ³νλ λμ , μ£Όμ΄μ§ λ°μ΄ν°λ₯Ό μ νμ©νμ¬ ν΄κ²°νλλ° μ§μ€ν©λλ€. μλ₯Ό λ€μ΄, μ΄λ―Έμ§μμ νΉμ§(feature)μ μΆμΆνκ³ κ·Έ νΉμ§μ ν¨ν΄μ νμ΅νλ λ°©λ²μ΄ μμ΅λλ€. μ¬κΈ°μ νΉμ§μ μ λ ₯ λ°μ΄ν°μμ λ³Έμ§μ μΈ λ°μ΄ν°(μ€μν λ°μ΄ν°)λ₯Ό μ ννκ² μΆμΆν κ²μ λ§ν©λλ€. νΉμ§μ μ΄μ©νμ¬ μ΄λ―Έμ§ λ°μ΄ν°λ₯Ό 벑ν°λ‘ λ³ννκ³ , λ³νλ 벑ν°λ₯Ό κ°μ§κ³ μ§λ νμ΅(supervised learning) λ°©μμ μ΄μ©ν μ μμ΅λλ€. κΈ°κ³ νμ΅μ ν¬κ² 2κ°μ§ μ κ·Ό λ°©λ²μΌλ‘ λλ©λλ€.
- λ¬Έμ μ λ°λΌ μ¬λμ΄ μ μ ν νΉμ§μ μκ°ν΄λ΄κ³ , κΈ°κ³ νμ΅μ νμ©νλ€.
- λ°μ΄ν°μ ν¬ν¨λ μ€μν νΉμ§ λͺ¨λ κΈ°κ³κ° μ€μ€λ‘ νμ΅νλ€.
첫 λ²μ§Έ λ°©λ²μ κ²½μ°, μ¬λμ΄ νΉμ§μ λν΄ μ μ νκ² μ€κ³ν¨μΌλ‘μ¨ μ’μ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. μ΄λ₯Ό μ§λ νμ΅μ΄λΌ ν©λλ€. λ λ²μ§Έ μ κ·Ό λ°©λ²μ νν λ₯λ¬λ(deep-learning) νΉμ μ κ²½λ§(neural network)μ΄λΌ λΆλ¦ λλ€. νν λ₯λ¬λμ end-to-end κΈ°κ³ νμ΅μ΄λΌκ³ λ ν©λλ€. μ΄λ 'μ²μλΆν° λκΉμ§' λ°μ΄ν°λ‘λΆν° λͺ©νν κ²°κ³Όλ₯Ό μ¬λμ κ°μ μμ΄ μ»λλ€λ λ»μ λ΄κ³ μμ΅λλ€. μ΄λ¬ν μ κ·Ό λ°©λ²μ μλμ κ·Έλ¦Ό 1μ νμΈνλ©΄ λ μ΄ν΄νκΈ° μ½μ΅λλ€.
1.2 νμ΅ λ°μ΄ν°μ ν μ€νΈ λ°μ΄ν°
κΈ°κ³ νμ΅ λ¬Έμ λ λ°μ΄ν°λ₯Ό νμ΅ λ°μ΄ν°μ ν μ€νΈ λ°μ΄ν°λ‘ λλ μλμ κ°μ΄ μννλ κ²μ΄ μΌλ°μ μ λλ€.
- νμ΅ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ νμ΅νλ©° μ΅μ μ 맀κ°λ³μλ₯Ό μ°Ύλλ€.
- ν μ€νΈ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ νμ΅ν λͺ¨λΈμ μ±λ₯μ νκ°νλ€.
νμ΅ λ°μ΄ν°μ ν μ€νΈ λ°μ΄ν°λ‘ λλλ μ΄μ λ λ²μ©μ μΌλ‘ μ¬μ©ν λͺ¨λΈμ λ§λ€κΈ° μν΄μμ λλ€. λ²μ© λ₯λ ₯μ μλ‘μ΄ λ°μ΄ν°μμλ λ¬Έμ λ₯Ό μ¬λ°λ₯΄κ² νμ΄λ΄λ λ₯λ ₯μ λ§ν©λλ€. μ΄ λ²μ© λ₯λ ₯μ νλνλ κ²μ΄ κΈ°κ³ νμ΅μ μ΅μ’ λͺ©νμ λλ€. λ°λΌμ λ°μ΄ν°μ (dataset) νλλ‘ νμ΅κ³Ό νκ°(evaluation)λ₯Ό μννλ©΄ μ¬λ°λ₯Έ νκ°κ° λ μ μμ΅λλ€. νΉνλ νλμ λ°μ΄ν°μ μ μ§λμΉκ² μ΅μ νλ μνλ₯Ό κ³Όμ ν©(overfitting)μ΄λΌκ³ ν©λλ€. κ³Όμ ν©μ νΌνλ κ²μ κΈ°κ³ νμ΅μ μ€μν κ³Όμ κ°μ΄λ° νλμ λλ€.
2. μμ€ ν¨μ
μ κ²½λ§ νμ΅μμ μ΅μ μ 맀κ°λ³μ κ°μ νμνκΈ° μν΄ μ¬μ©νλ μ§νλ μμ€ ν¨μμ λλ€. μμ€ ν¨μλ μ κ²½λ§ μ±λ₯μ 'λμ¨'μ λνλ΄λ μ§νμ λλ€. νμ¬μ μ κ²½λ§μ΄ νμ΅ λ°μ΄ν°λ₯Ό μΌλ§λ μ μ²λ¦¬νμ§ λͺ» νλλλ₯Ό λνλ λλ€.
2.1 μ€μ°¨μ κ³±ν©(Sum of Squares for Error, SSE)
μΌλ°μ μΌλ‘ κ°μ₯ λ§μ΄ μ¬μ©νλ μμ€ ν¨μλ μ€μ°¨μ κ³±ν©μ λλ€. μμμ μλμ κ°μ΅λλ€.
$$ E=\frac{1}{2}\sum_{k}{(y_k-t_k)^2} $$
- $ y_k $ : μ κ²½λ§μ μΆλ ₯(output), μΆμ κ°
- $ t_k $ : μ λ΅ λ μ΄λΈ, μ°Έκ°
- $ k $ : λ°μ΄ν°μ μ°¨μ μ
μ€μ°¨μ κ³±ν©μ κ° μμμ μΆλ ₯(μΆμ κ°)κ³Ό μ λ΅ λ μ΄λΈ(μ°Έκ°)μ μ°¨λ₯Ό μ κ³±νκ³ κ·Έ μ΄ν©μ ꡬν©λλ€. μ€μ°¨μ κ³±ν©μ $ \frac{1}{2} $μ΄ μλ κ²μ νμΈν μ μμ΅λλ€. μ΄λ κ²½μ¬νκ°λ²(gradient descent) κ°μ΄λ° νλμΈ λΈν κ·μΉ(Delta rule)μ κ³μ°νλ κ³Όμ μμ μ€μ°¨(error)κ° μ§λμΉκ² 컀μ§λ κ²μ λ§κΈ° μν΄μ μ λλ€. $ \frac{1}{2} $κ° κ³ μ μ μλμ§λ§, λΈν κ·μΉμ λμΆνλ κ³Όμ μμ μμ€ ν¨μλ₯Ό λ―ΈλΆνλλ° μ΄λ₯Ό νΈνκ² κ³μ°νκΈ° μν΄μλ‘ λ³΄μ λλ€. μ΄λ₯Ό ꡬννλ©΄ μλμ κ°μ΅λλ€.
def sum_squares_error(y: np.array, t: np.array) -> float:
return 0.5 * np.sum((y-t)**2)
μ΄λ₯Ό μ€μ λ‘ μλμ κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
sum_squares_error(np.array(y), np.array(t))
-> 0.09750000000000003
μ λ ₯κ°μ μ΄ν΄λ³΄λ©΄, yλ μννΈλ§₯μ€ ν¨μμ μΆλ ₯μ μλ―Έν©λλ€. μννΈλ§₯μ€ ν¨μμ μΆλ ₯μ νλ₯ κ°μΌλ‘ ν΄μν μ μμμ΅λλ€. μ¦, ν΄λΉ λ°μ΄ν°κ° 2λ² λ μ΄λΈμΌ νλ₯ μ 0.6μ΄λΌκ³ ν΄μν μ μμ΅λλ€. tλ μ λ΅ λ μ΄λΈμ μλ―Έν©λλ€. μ°Έκ°μ ν΄λΉνλ νλμ μμλ 1λ‘ νννκ³ κ·Έ μΈλ 0μΌλ‘ νννλ νκΈ°λ²μΈ μ-ν« μΈμ½λ©(one-hot encoding)μ μ¬μ©νμ΅λλ€.
2.2 νκ· μ κ³±ν©(Mean of Squares for Error, MSE)
κΈ°μ‘΄μ μ€μ°¨μ κ³±ν©μ λ°μ΄ν°μ ν¬κΈ°λ§νΌ λλ μ μ¬μ©νλ μμ€ ν¨μμ λλ€. μμμ μλμ κ°μ΅λλ€.
$$ E=\frac{1}{k}\sum_{k}{(y_k-t_k)^2} $$
μ€μ°¨μ κ³±ν©μ κ²½μ°, μ€μ°¨κ° μ»€μ§ λ λ°μ΄ν°μ μμ΄ λ§μμ 컀μ§λ κ²μΈμ§ νμΈνλλ° μ΄λ €μμ΄ μμ΅λλ€. νμ§λ§ νκ· μ κ³±ν©μ λ°μ΄ν°μ μ°¨μ μλ§νΌ μ€μ°¨λ₯Ό λλ μ€μΌλ‘μ¨ μ΄λ¬ν νκ³μ μ 극볡ν μ μμ΅λλ€. μ΄λ₯Ό ꡬννλ©΄ μλμ κ°μ΅λλ€.
def mean_squares_error(y: np.array, t: np.array) -> float:
return np.sum((y-t)**2) / len(y)
μ΄λ μλμ κ°μ΄ μ¬μ©ν μ μμ΅λλ€.
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
mean_squares_error(np.array(y), np.array(t))
-> 0.019500000000000007
2.3 κ΅μ°¨ μνΈλ‘νΌ μ€μ°¨(Cross Entropy Error, CEE)
κ΅μ°¨ μνΈλ‘νΌ μ€μ°¨μ μμμ μλμ κ°μ΅λλ€.
$$ E=-\sum_{k}{t_{k}\log{y_k}} $$
- $ y_k $ : μ κ²½λ§μ μΆλ ₯
- $ t_k $ : μ λ΅ λ μ΄λΈ, μ-ν« μΈμ½λ© λ°μ΄ν°
κ΅μ°¨ μνΈλ‘νΌ μ€μ°¨λ $ \log $λ₯Ό νμ©νμ¬ μ λ΅μΌ λμ μΆλ ₯μ΄ μ 체 κ°μ μ νκ² ν©λλ€. μ λ΅μ ν΄λΉνλ λ μ΄λΈμ μννΈλ§₯μ€ μΆλ ₯μ΄ μ»€μ§μλ‘ 0μ λ€κ°κ°λλ€. λ°λλ‘ μ λ΅μ ν΄λΉνλ λ μ΄λΈμ μΆλ ₯μ΄ μμμ§μλ‘ μ€μ°¨λ 컀μ§λλ€. μ΄λ₯Ό ꡬννλ©΄ μλμ κ°μ΅λλ€.
def cross_entropy_error(y: np.array, t: np.array) -> float:
delta = 1e-7
return -np.sum(t * np.log(y + delta))
μ½λμ λ§μ§λ§μ μμ£Ό μμ κ°μΈ deltaλ₯Ό λν κ²μ νμΈν μ μμ΅λλ€. μ΄λ μμ£Ό μμ κ°μ λν¨μΌλ‘μ¨, $ \log $ ν¨μ λ΄λΆκ° 0μ΄ λμ΄ λ¬΄νλλ‘ λ°μ°νλ κ²μ λ§κΈ° μν΄μ μ λλ€. μ΄λ₯Ό μ¬μ©ν κ²°κ³Όλ μλμ κ°μ΅λλ€.
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
cross_entropy_error(np.array(y), np.array(t))
-> 0.510825457099338
3. μμ€ ν¨μμ μ΄μ©
3.1 λ―Έλλ°°μΉ(mini-batch) νμ΅
κΈ°κ³ νμ΅μ νμ΅ λ°μ΄ν°μ λν μμ€ ν¨μμ κ°μ ꡬνκ³ , κ·Έ κ°μ μ΅λν μ€μ¬μ£Όλ 맀κ°λ³μλ₯Ό μ°Ύμλ λλ€. μ΄λ₯Ό μν΄μλ λͺ¨λ νμ΅ λ°μ΄ν°λ₯Ό λμμΌλ‘ μμ€ ν¨μμ κ°μ ꡬν΄μΌ ν©λλ€. κ°λ Ή, κ΅μ°¨ μνΈλ‘νΌ μ€μ°¨λ₯Ό μ΄μ©ν΄ λͺ¨λ νμ΅ λ°μ΄ν°μ λν μμ€ ν¨μμ ν©μ ꡬνλ λ°©λ²μ μκ°ν΄λ³΄κ² μ΅λλ€.
$$ E=-\frac{1}{N}\sum_{n}\sum_{k}{t_{nk}\log{y_{nk}}} $$
- $ N $ : λ°μ΄ν°μ κ°μ
- $ t_{nk} $ : $ n $λ²μ§Έ λ°μ΄ν°μ $ k $λ²μ§Έ κ°, μ λ΅ λ μ΄λΈ
- $ y_{nk} $ : μ κ²½λ§μ μΆλ ₯
μ΄μ μ μΈκΈνλ λ°μ΄ν° νλμ λν μμ€ ν¨μλ₯Ό $ N $κ°μ λ°μ΄ν°λ‘ νμ₯νμ΅λλ€. λν, λ§μ§λ§μ $ N $μΌλ‘ λλμ΄ μ κ·ν(normalization)λ₯Ό μ§ννμ¬ 'νκ· μμ€ ν¨μ'λ₯Ό ꡬνμ΅λλ€. μ΄λ κ² νκ· μ ꡬνμ¬ μ¬μ©νλ©΄ νμ΅ λ°μ΄ν°μ μκ΄ μμ΄ μΈμ λ ν΅μΌλ μ§νλ₯Ό μ»μ μ μλ°λ μ₯μ μ΄ μμ΅λλ€.
νμ§λ§ λͺ¨λ λ°μ΄ν°λ₯Ό λμμΌλ‘ μμ€ ν¨μμ ν©μ ꡬνκΈ°μλ μκ°μ΄ λ§μ΄ νμν©λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ λ°μ΄ν°μ μΌλΆλ₯Ό μΆλ € μ 체μ 'κ·Όμ¬μΉ'λ‘ μ΄μ©ν©λλ€. μ κ²½λ§ νμ΅μμλ νμ΅ λ°μ΄ν°λ‘λΆν° μΌλΆλ§μ κ³¨λΌ νμ΅μ μνν©λλ€. μ΄ μΌλΆλ₯Ό λ―Έλλ°°μΉλΌ λΆλ¦ λλ€. 무μμλ‘ λ°μ΄ν°λ₯Ό μ ννκ³ μ΄λ₯Ό μ΄μ©ν΄ νμ΅νλ λ°©λ²μ λ―Έλλ°°μΉ νμ΅μ΄λΌ ν©λλ€.
3.2 κ΅μ°¨ μνΈλ‘νΌ μ€μ°¨(λ°°μΉ)
λ°°μΉ λ°μ΄ν°λ₯Ό μ§μνλ κ΅μ°¨ μνΈλ‘νΌλ κΈ°μ‘΄μ ꡬνμμ μ‘°κΈλ§ μμ νλ©΄ λ©λλ€. μ¬κΈ°μμλ λ°μ΄ν°κ° νλμΈ κ²½μ°μ λ°°μΉλ‘ λ¬Άμ΄μ μ λ ₯νλ κ²½μ° λͺ¨λλ₯Ό μ²λ¦¬νλλ‘ κ΅¬ννμμ΅λλ€.
def cross_entropy_error(y: np.array, t: np.array) -> np.array:
if y.ndim == 1:
t = t.reshape(1, t.size)
y = y.reshape(1, y.size)
batch_size = y.shape[0]
delta = 1e-7
return -np.sum(t * np.log(y + delta)) / batch_size
λ§μ§λ§μ λ°°μΉμ ν¬κΈ°λ‘ λλμΌλ‘μ¨ μ κ·νλ₯Ό μ§ννκ³ , κ° λ°μ΄ν°μ νκ· κ΅μ°¨ μνΈλ‘νΌ μ€μ°¨λ₯Ό κ³μ°ν μ μμ΅λλ€.
3.3 μμ€ ν¨μλ₯Ό μ§νλ‘ μ¬μ©νλ μ΄μ
κΈ°κ³ νμ΅μ κΆκ·Ήμ μΈ λͺ©μ μ λμ 'μ νλ'λ₯Ό μ΄λμ΄λ΄λ 맀κ°λ³μ κ°μ μ°Ύλ κ²μ λλ€. κ·Έλ λ€λ©΄ μ 'μ νλ'λΌλ μ§νκ° μλ, 'μμ€ ν¨μμ κ°'μ΄λΌλ μ°νμ μΈ λ°©λ²μ νν κΉμ?
μ κ²½λ§ νμ΅μμ 'λ―ΈλΆ'μ μν μ μ£Όλͺ©ν΄λ³΄λ©΄ κ·Έ ν΄λ΅μ μ°Ύμ μ μμ΅λλ€. μ κ²½λ§ νμ΅μμλ μ΅μ μ 맀κ°λ³μ(κ°μ€μΉμ νΈν₯)λ₯Ό νμν λ, μμ€ ν¨μμ κ°μ κ°λ₯ν μκ² νλ 맀κ°λ³μ κ°μ μ°Ύμ΅λλ€. μ΄λ κΈ°μΈκΈ°(gradient)λ₯Ό κ³μ°νκ³ , μ΄λ₯Ό λ¨μλ‘ λ§€κ°λ³μμ κ°μ μμν κ°±μ νλ κ³Όμ μ λ°λ³΅νκ² λ©λλ€.
κΈ°μΈκΈ°λ₯Ό ꡬνκΈ° μν΄μλ 맀κ°λ³μμ λ―ΈλΆμ κ³μ°ν΄μΌ ν©λλ€. 맀κ°λ³μ κ°μ΄λ° κ°μ€μΉ 맀κ°λ³μ νλλ₯Ό λ μ¬λ €λ³΄κ² μ΅λλ€. ν΄λΉ κ°μ€μΉ 맀κ°λ³μμ λν μμ€ ν¨μμ λ―ΈλΆμ 'κ°μ€μΉ 맀κ°λ³μμ κ°μ μμ£Ό μ‘°κΈ λ³νμμΌ°μ λ, μμ€ ν¨μκ° μ΄λ»κ² λ³ννλ'λ₯Ό μλ―Έν©λλ€. μ΄μ λν λ³νλ μλμ κ°μ΅λλ€.
- λ―ΈλΆ κ° : μ → κ°μ€μΉ : μμ λ°©ν₯μΌλ‘ λ³ν
- λ―ΈλΆ κ° : μ → κ°μ€μΉ : μμ λ°©ν₯μΌλ‘ λ³ν
- λ―ΈλΆ κ° : 0 →κ°μ€μΉ : λ³ν μμ
μ¬κΈ°μ λ―ΈλΆ κ°μ΄ 0μ΄ λλ©΄ κ°μ€μΉ 맀κ°λ³μλ₯Ό μ΄λ μͺ½μΌλ‘ μμ§μ¬λ μμ€ ν¨μμ κ°μ λ³νμ§ μμ΅λλ€. μ¦, λ―ΈλΆ κ°μ΄ 0μΌ λ κ°μ€μΉ 맀κ°λ³μμ κ°±μ μ λ©μΆ₯λλ€. μ νλλ₯Ό μ§νλ‘ μΌμμ μ λλ μ΄μ λ μ νλμ λ―ΈλΆ κ°μ΄ λλΆλΆμ μ₯μμμ 0μ΄ λμ΄ λ§€κ°λ³μλ₯Ό κ°±μ ν μ μκΈ° λλ¬Έμ λλ€. μ νλλ₯Ό μ§νλ‘ μΌμΌλ©΄, κ°μ€μΉ 맀κ°λ³μλ₯Ό μ‘°κΈ μμ νλλΌλ μ νλκ° κ°μ λμ§ μκ³ μΌμ νκ² μ μ§λ©λλ€. μ νλλ 맀κ°λ³μμ λ―ΈμΈν λ³νμλ κ±°μ λ°μνμ§ μκ³ , λ°μμ΄ μλλΌλ κ·Έ κ°μ΄ λΆμ°μμ μΌλ‘ κ°μκΈ° λ³νν©λλ€. μ΄λ¬ν μ΄μ λλ¬Έμ μμ€ ν¨μλ₯Ό μ κ²½λ§ νμ΅μ μ§νλ‘ μ¬μ©ν©λλ€.
'κΈ°μ΄ > μΈκ³΅μ§λ₯' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ΅ν°λ§μ΄μ (Optimizer) (2/2) (0) | 2021.09.02 |
---|---|
μ΅ν°λ§μ΄μ (Optimizer) (1/2) (1) | 2021.08.31 |
μ€μ°¨μμ ν(Back-Propagation) (0) | 2021.08.29 |
νμ±ν ν¨μ(Activation function) (0) | 2021.08.26 |
νΌμ νΈλ‘ (Percetron) (0) | 2021.08.25 |