πŸ’»/ML

[λͺ¨λ‘λ₯Ό μœ„ν•œ λ”₯λŸ¬λ‹] ν•™μŠ΅κ³„μˆ˜, 데이터 ν‘œμ€€ν™”, 과적합

ruhz 2020. 8. 4. 22:44
# ν•™μŠ΅κ³„μˆ˜(ν•˜κ°•κ°„κ²©)을 μ„€μ •ν•œλ‹€.
learning_rate = 0.1

# ν•΄λ‹Ή μ§€μ μ˜ 기울기λ₯Ό κ³„μ‚°ν•œλ‹€.
gradient = tf.reduce_mean((W * X - Y) * X)

# κΈ°μšΈκΈ°μ— ν•˜κ°•κ°„κ²©μ„ κ³±ν•œ 값을 W에 λΉΌμ€˜μ„œ ν•˜κ°•ν•œλ‹€.
descent = W - learning_rate * gradient

# ν•΄λ‹Ή ν…μ„œμ— μ—…λ°μ΄νŠΈ ν•΄μ€€λ‹€.
update = W.assign(descent)

# tf.GradientDescentOptimizer(learning_rate=0.01)

ν•™μŠ΅κ³„μˆ˜

이전에 "[3] ν…μ„œν”Œλ‘œμš° 기초, μ„ ν˜•νšŒκ·€" μ—μ„œ 'ν•˜κ°• 간격을 μ‘°μ •ν•˜κΈ° μœ„ν•œ μƒμˆ˜' 쯀으둜 μ–ΈκΈ‰ν•˜κ³  λ„˜μ–΄κ°”μ—ˆλ˜ κ°œλ…μ΄λ‹€. μœ„μ˜ 과정은 ν…μ„œν”Œλ‘œμš°μ— κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” μ˜ˆμœν•¨μˆ˜ GradientDescentOptimizer()의 과정을 ν’€μ–΄μ“΄ 것이닀. λ³΄λ‹€μ‹œν”Ό 타고 λ‚΄λ €κ°ˆ κΈ°μšΈκΈ°μ— κ³±ν•΄μ§€λ©΄μ„œ λ‚΄λ €κ°ˆ 간격을 μ‘°μ •ν•˜κ³  μžˆλ‹€. λ‹¨μˆœν•˜κ²Œ μƒκ°ν–ˆμ„ λ•Œ, 산을 내렀가도 성큼성큼 λ‚΄λ €κ°€λ©΄ 더 빨리 λ‚΄λ €κ°ˆ 수 μžˆμ„κΉŒ 생각할 수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ μ΄λŠ” μ˜€λ²„μŠˆνŒ…(Overshooting)을 μ•ΌκΈ°ν•œλ‹€. λ¬Όλ‘  계산식을 λ”°μ Έλ³Ό μˆ˜λ„ μžˆκ² μ§€λ§Œ, 그림으둜 λŠλ‚Œμ„ μ΄ν•΄ν•˜κ³  ν•™μŠ΅κ³„μˆ˜λ₯Ό 크게 μ‘°μ •ν•΄λ³΄μž. λͺ‡ 번 값을 좜λ ₯ν•˜λ”λ‹ˆ 이내 None만 μ°λŠ”λ‹€. κ·Έλ ‡λ‹€κ³  λ„ˆλ¬΄ ν•™μŠ΅κ³„μˆ˜λ₯Ό μž‘κ²Œ μ„€μ •ν•œλ‹€λ©΄, κ·Έ λ˜ν•œ μ‹œκ°„μ΄ λ„ˆλ¬΄ 였래 κ±Έλ¦¬κ±°λ‚˜, λ¬΄μ‹œν•  수 μžˆλŠ” μ •λ„μ˜ κ·Έλž˜ν”„ μ€‘κ°„μ˜ ꡴곑에 μˆ˜λ ΄ν•΄λ²„λ¦΄ μˆ˜λ„ μžˆλ‹€. μ½”λ“œλ₯Ό 돌렀보며 μ μ ˆν•œ ν•™μŠ΅κ³„μˆ˜λ₯Ό μ„€μ •ν•˜λŠ” 것은 μ€‘μš”ν•˜λ‹€.

 

 

데이터 ν‘œμ€€ν™”

λ¬Όλ‘  μ μ ˆν•œ ν•™μŠ΅κ³„μˆ˜λ₯Ό μ„€μ •ν•˜λŠ” 것도 μ€‘μš”ν•˜μ§€λ§Œ, 데이터 μžμ²΄κ°€ μ˜€λ²„μŠˆνŒ…μ΄ λ„ˆλ¬΄ μ‰½κ²Œ μΌμ–΄λ‚˜λŠ” κ²½μš°λ„ μžˆλ‹€. μœ„μ˜ κ·Έλž˜ν”„μ—μ„œ ν•œ 차원을 더 ν™•μž₯ν•΄μ„œ H(x) = W1 * X1 + W2 * X2 와 같은 경우λ₯Ό μƒκ°ν•΄λ³΄μž. 이제 λΉ„μš©(cost)은 W1, W2에 μ˜ν•΄ κ²°μ •λ˜λŠ” ν•¨μˆ˜κ°€ 되고 x, y좕에 W1, W2λ₯Ό, z좕에 cost(W1, W2)λ₯Ό 놓을 수 μžˆλ‹€. 2μ°¨μ›μ—μ„œ λ°₯κ·Έλ¦‡μ˜ λ°‘λ°”λ‹₯을 찾듯이 3μ°¨μ›μ—μ„œλ„ ꡬ덩이의 λ°”λ‹₯을 찾으면 λœλ‹€. ν•˜μ§€λ§Œ 이 ꡬ덩이가 λ„ˆλ¬΄ μ–‡κ±°λ‚˜ μ•„μŠ¬μ•„μŠ¬ν•˜κ²Œ 생겼닀면 μ–΄λ–¨κΉŒ? μ™„λ§Œν•˜κ³  넓은 ꡬ덩이λ₯Ό λ‚΄λ €κ°€λŠ”κ±΄ νŠ€μ–΄λ‚˜κ°€κΈ° μ–΄λ ΅μ§€λ§Œ, 쒁은 ν˜‘κ³‘μ„ λ‚΄λ €κ°€κΈ°μ—λŠ” 쑰금만 간격이 넓어도 νŠ€μ–΄λ‚˜κ°€κΈ° 쉽닀.

 

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό ν‘œμ€€ν™”ν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€. 고등학ꡐ λ•Œ ν†΅κ³„λ‹¨μ›μ—μ„œ λ°°μ› λ˜ 것이 어렴풋이 μƒκ°λ‚œλ‹€. 
$$\frac{x-m}{\sigma }$$

x = (x_data - np.mean(x_data, axis=0)) / np.std(x_data, axis=0)

 

 

 


과적합, μ •κ·œν™”

과적합은 λ„ˆλ¬΄ ν•™μŠ΅λ°μ΄ν„°μ— λ”± 맞게만 ν•™μŠ΅ν•΄μ„œ μš°λ¦¬κ°€ μ–»κ³ μž ν•˜λŠ” κ²°λ‘ μ—μ„œ 였히렀 λ©€μ–΄μ§€λŠ” 것을 μ˜λ―Έν•œλ‹€.
ν•΄κ²° 방법은 ν•™μŠ΅ 데이터λ₯Ό 더 많이 μ œκ³΅ν•˜κ±°λ‚˜, μ •κ·œν™”λ₯Ό ν•΄μ£Όλ©΄ λœλ‹€. μ •κ·œν™”λŠ” λ„ˆλ¬΄ 큰 κ°€μ€‘μΉ˜λŠ” 갖지 μ•Šλ„λ‘ ν•΄μ£ΌλŠ” 과정이닀. 계산식은 λ‹€μŒκ³Ό κ°™λ‹€.

reg_strength = 0.001
cost = reg_strength * tf.reduce_sum(tf.square(W))

 

 

μ•žμ„  κ²Œμ‹œλ¬Όμ— λ§ν¬ν–ˆλ˜ 'λͺ¨λ‘λ₯Ό μœ„ν•œ λ”₯λŸ¬λ‹' κ°•μ˜λ₯Ό λ“£κ³  ν•„κΈ°ν•œ λ…ΈνŠΈμ—
μΆ”κ°€μ μœΌλ‘œ κ³΅λΆ€ν•œ 것을 더해 μž‘μ„±ν•œ κ²Œμ‹œκΈ€μž…λ‹ˆλ‹€.