neuralNetwork

Neural Network

: 신경망은 각 측의 λ‰΄λŸ°λ“€μ΄ λ‹€μŒ 측의 λ‰΄λŸ°μœΌλ‘œ μ‹ ν˜Έλ₯Ό μ „λ‹¬ν•œλ‹€λŠ” μ μ—μ„œ νΌμ…‰νŠΈλ‘ μ΄λž‘ κ°™λ‹€ ν•˜μ§€λ§Œ λ‰΄λŸ°μœΌλ‘œ 갈 λ•Œ μ‹ ν˜Έλ₯Ό λ³€ν™”μ‹œν‚€λŠ” ν™œμ„±ν™” ν•¨μˆ˜μ— 큰 차이점이 μžˆλ‹€. μ‹ κ²¬λ§μ—μ„œλŠ” λ§€λ„λŸ½κ²Œ λ³€ν™”ν•˜λŠ” μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ₯Ό, νΌμ…‰νŠΈλ‘ μ—μ„œλŠ” κ°‘μžκΈ° λ³€ν™”ν•˜λŠ” 계단 ν•¨μˆ˜λ₯Ό ν™œμ„±ν™” ν•¨μˆ˜λ‘œ μ‚¬μš©ν•œλ‹€.

  • 신경망과 νΌμ…‰νŠΈλ‘ μ˜ λ‹€λ₯Έμ μ€ νΌμ…‰νŠΈλ‘ μ€ μ‚¬λžŒμ΄ μˆ˜λ™μœΌλ‘œ κ°€μ€‘μΉ˜λ₯Ό μ„€μ •ν•˜λŠ” μž‘μ ‘ (μ›ν•˜λŠ” κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λ„λ‘ κ°€μ€‘μΉ˜ 값을 적절히 μ •ν•˜λŠ” μž‘μ—…)을 ν•œλ‹€. ν•˜μ§€λ§Œ 신경망은 κ°€μ€‘μΉ˜ 맀개 λ³€μˆ˜μ˜ μ μ ˆν•œ 값을 λ°μ΄ν„°λ‘œλΆ€ν„° μžλ™μœΌλ‘œ ν•™μŠ΅ν•˜λŠ” λŠ₯λ ₯이 μžˆλ‹€

NeuralNetwork
  • 신경망을 그림을 κ°„λ‹¨νžˆ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό 같이 λœλ‹€.

  • μ€λ‹‰μΈ΅μ˜ λ‰΄λŸ°μ€ (μž…λ ₯μΈ΅μ΄λ‚˜ 좜λ ₯μΈ΅κ³Ό 달리) μ‚¬λžŒ λˆˆμ—λŠ” 보이지 μ•ŠλŠ”λ‹€.

ν™œμ„±ν™” ν•¨μˆ˜μ˜ λ“±μž₯

: μž…λ ₯ μ‹ ν˜Έμ˜ 총합을 좜λ ₯ μ‹ ν˜Έλ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό 일반적으둜 ν™œμ„±ν™” ν•¨μˆ˜(activation function)이라 ν•œλ‹€

  • ν™œμ„±ν™”λΌλŠ” 이름이 말해주듯 ν™œμ„±ν™” ν•¨μˆ˜λŠ” μž…λ ₯ μ‹ ν˜Έμ˜ 쒅합이 ν™œμ„±ν˜Έλ₯Ό μΌμœΌν‚€λŠ”μ§€λ₯Ό μ •ν•˜λŠ” 역할을 역할을 ν•œλ‹€

  • κ°€μ€‘μΉ˜κ°€ κ³±ν•΄μ§„ μž…λ ₯ μ‹ ν˜Έμ˜ 총합을 κ³„μ‚°ν•˜κ³ , κ·Έ 합을 ν™œμ„±ν™” ν•¨μˆ˜μ— μž…λ ₯ν•΄ κ²°κ³Όλ₯Ό λ‚΄λŠ” λ‹¨κ³„λ‘œ 처리

  • κ·Έλž˜μ„œ a = b + w1x1 + w2x2, y = h(a)λΌλŠ” κ°€μ€‘μΉ˜κ°€ 달린 μž…λ ₯ μ‹ ν˜Έμ™€ 편ν–₯의 총합을 κ³„μ‚°ν•˜κ³  이λ₯Ό a라 ν•œλ‹€

  • 그리고 aλ₯Ό ν•¨μˆ˜ h()에 λ„£μ–΄ yλ₯Ό 좜λ ₯ν•˜λŠ” 흐름이닀

    activationFunction]

  • ν™œμ„±ν™” ν•¨μˆ˜μ˜ 처리λ₯Ό 보면, κ°€μ€‘μΉ˜ μ‹ ν˜Έλ₯Ό μ‘°ν•©ν•œ κ²°κ³Όκ°€ aλΌλŠ” λ…Έλ“œκ°€ 되고, ν™œμ„±ν™” ν•¨μˆ˜ h()λ₯Ό ν†΅ν™”ν•˜μ—¬ yλΌλŠ” λ…Έλ“œλ‘œ λ³€ν™˜λœλ‹€

tip) 일반적으둜 λ‹¨μˆœ νΌμ…‰νŠΈλ‘ μ€ 단측 λ„€νŠΈμ›Œν¬μ—μ„œ 계단 ν•¨μˆ˜(μž…κ³„κ°’μ„ κ²½κ³„λ‘œ 좜λ ₯이 λ°”λ€ŒλŠ” ν•¨μˆ˜)λ₯Ό ν™œμ„±ν™” ν•¨μˆ˜λ‘œ μ‚¬μš©ν•œ λͺ¨λΈμ„ 가리킀고, λ‹€μΈ΅ νΌμ…‰νŠΈλ‘ μ€ 신경망(μ—¬λŸ¬ 측으둜 κ΅¬μ„±λ˜κ³  μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜ λ“±μ˜ λ§€λˆν•œ ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λ„€νŠΈμ›Œν¬)을 가리킨닀

ν™œμ„±ν™” ν•¨μˆ˜

  • νΌμ…‰νŠΈλ‘ μ—μ„œλŠ” ν™œμ„±ν™” ν•¨μˆ˜λ‘œ 계단 ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©°, μ‹ κ²½λ§μ—μ„œλŠ” ν™œμ„±ν™” ν•¨μˆ˜λ₯Ό κ³„λ‹¨ν•¨μˆ˜μ—μ„œ λ‹€λ₯Έ ν•¨μˆ˜λ‘œ λ³€κ²½ν•˜λŠ” 것이닀

계단 ν•¨μˆ˜

  • μž…λ ₯이 0을 λ„˜μœΌλ©΄ 1을 좜λ ₯ν•˜κ³ , κ·Έμ™Έμ˜ 0을 좜λ ₯ν•˜λŠ” ν•¨μˆ˜

import numpy as np
def step_function(x):
    y = x > 0
    return y.astype(np.int)
import numpy as np
import matplotlib.pylab as plt

def step_function(x):
    return np.array(x > 0, dtype = np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) 
plt.show()
stepFunction
  • step_function()은 인수둜 받은 λ„˜νŒŒμ΄ λ°°μ—΄μ˜ μ›μ†Œ 각각을 인수둜 계단 ν•¨μˆ˜ μ‹€ν–‰ν•΄, κ·Έ κ²°κ³Όλ₯Ό λ‹€μ‹œ λ°°μ—΄λ‘œ λ§Œλ“€μ–΄ μ€€λ‹€

  • 계단 ν•¨μˆ˜λŠ” 0을 κ²½κ³„λ‘œ 좜λ ₯이 0μ—μ„œ 1(λ˜λŠ” 1μ—μ„œ 0)둜 바뀐닀.

μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜

sigmoidfunction
  • μ‹ κ²½λ§μ—μ„œλŠ” ν™œμ„±ν™” ν•¨μˆ˜λ‘œ μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ μ‹ ν˜Έλ₯Ό λ³€ν™˜ν•˜κ³ , κ·Έ λ³€ν™˜λœ μ‹ ν˜Έλ₯Ό λ‹€μŒ λ‰΄λŸ°μ— μ „λ‹¬ν•œλ‹€

  • μ‹œκ·Έλͺ¨μ΄λ“œ(sigmoid) = s자 λͺ¨μ–‘

import numpy as np
import matplotlib.pylab as plt

def sigmoid(x):
    return 1  / (1 + np.exp(-x))

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1) 
plt.show()
NNsigmoid

μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ™€ 계단 ν•¨μˆ˜ 비ꡐ

  • λ§€λ„λŸ¬μ›€μ˜ 차이, μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λŠ” λΆ€λ“œλŸ¬μš΄ 곑석이며,μž…λ ₯에 따라 좜λ ₯이 μ—°μ†μ μœΌλ‘œ λ³€ν™”ν•œλ‹€. ν•œνŽΈ 계단 ν•¨μˆ˜λŠ” 0을 κ²½κ³„λ‘œ 좜λ ₯이 κ°‘μžκΈ° 바뀐닀.

  • μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ˜ 이 λ§€λˆν•¨μ΄ 신견망 ν•™μŠ΅μ—μ„œ μ•„μ£Ό μ€‘μš”ν•œ 역할을 ν•œλ‹€

  • λ‘˜λ‹€ μž…λ ₯이 μž‘μ„ λ•Œμ˜ 좜λ ₯은 0에 가깝고, μž…λ ₯이 컀지면 좜λ ₯이 1에 κ°€κΉŒμ›Œμ§€λŠ” ꡬ쑰인것이 곡톡점이닀.

  • λ˜ν•œ μ€‘μš”ν•œ 곡톡점은 λ‘˜λ‹€ λΉ„μ„ ν˜• ν•¨μˆ˜μ΄λ‹€. μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜λŠ” 곑선, 계단 ν•¨μˆ˜λŠ” κ³„λ‹¨μ²˜λŸΌ κ΅¬λΆ€λŸ¬μ§„ μ§μ„ μœΌλ‘œ λ‚˜νƒ€λ‚œλ‹€

  • λΉ„μ„ ν˜• ν•¨μˆ˜ : 문자 κ·ΈλŒ€λ‘œ μ„ ν˜•μ΄ μ•„λ‹Œ ν•¨μˆ˜λ‘œ, 직선 1κ°œλ‘œλŠ” 그릴 수 μ—†λŠ” ν•¨μˆ˜

  • μ‹ κ²¬λ§μ—μ„œ λΉ„μ„ ν˜• ν•¨μˆ˜λ‘œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 이유?

  • μ„ ν˜• ν•¨μˆ˜μ˜ λ¬Έμ œλŠ” 측을 아무리 깊게 해도 은닉측이 μ—†λŠ” λ„€νŠΈμ›Œν¬λ‘œλ„ λ˜‘κ°™μ€ κΈ°λŠ₯을 ν•  수 μžˆλ‹€λŠ”λ° μžˆλ‹€. 즉, μ„ ν˜• ν•¨μˆ˜λŠ” μ΄μš©ν•΄μ„œλŠ” μ—¬λŸ¬ 측으둜 κ΅¬μ„±ν•˜λŠ” 이점을 살릴 수 μ—†λ‹€.

ReLU ν•¨μˆ˜

: μž…λ ₯이 0을 λ„˜μœΌλ©΄ κ·Έ μž…λ ₯을 κ·Έλž˜λ„ 좜λ ₯ν•˜κ³ , 0μ΄ν•˜λ©΄ 0을 좜λ ₯ν•˜λŠ” ν•¨μˆ˜

  • μ΅œκ·Όμ—λŠ” μ‹œκ·Έλͺ¨μ΄λ“œ ν•¨μˆ˜μ—μ„œ ReLU(REctified Linear Unit, 렐루)λ₯Ό 주둜 μ΄μš©ν•œλ‹€

import numpy as np
import matplotlib.pylab as plt

def relu(x):
    return np.maximum(0, x)

x = np.arange(-6.0, 6.0, 0.1)
y = relu(x)
plt.plot(x, y)
plt.ylim(-1, 6) 
plt.show()
ReLU
  • μ—¬κΈ°μ—μ„œλŠ” λ„˜νŒŒμ΄μ˜ maximum ν•¨μˆ˜λ₯Ό μ‚¬μš©, maximum은 두 μž…λ ₯ 쀑 큰 값을 선택해 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

μ‹ κ²½λ§μ—μ„œμ˜ ν–‰λ ¬ κ³±

: λ‹€μΉ˜μ› λ°°μ—΄μ˜ μŠ€μΉΌλΌκ³±μ„ κ΅¬ν•΄μ£ΌλŠ” np.dot ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ κ²°κ³Όλ₯Ό κ΅¬ν• μˆ˜ μžˆλ‹€. NNarray

import numpy as np

x = np.array([1, 2])
w = np.array([[1, 3, 5], [2, 4, 6]])
y = np.dot(x, w)

print(y) # [ 5 11 17]

좜λ ₯μΈ΅ 섀계

: μ‹ κ²½λ§μ—μ„œλŠ” λΆ„λ₯˜μ™€ νšŒκ·€ λͺ¨λ‘μ— μ΄μš©μ„ ν•  수 μžˆλ‹€. λ‹€λ§Œ λ‘˜ 쀑 μ–΄λ–€ λ¬Έμ œλƒμ— 따라 좜λ ₯μΈ΅μ—μ„œ μ‚¬μš©ν•˜λŠ” ν™œμ„±ν™” ν•¨μˆ˜κ°€ 달닀진닀. 일반적으둜 νšŒκ·€μ—λŠ” ν•­λ“± ν•¨μˆ˜λ₯Ό, λΆ„λ₯˜μ—λŠ” μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

tip) κΈ°κ³„ν•™μŠ΅ λ¬Έμ œλŠ” λΆ„λ₯˜(classification)와 νšŒκ·€(regression)둜 λ‚˜λ‰©λ‹ˆλ‹€. λΆ„λ₯˜λŠ” 데이터가 μ–΄λŠ ν΄λž˜μŠ€μ— μ†ν•˜λŠλƒλŠ” λ¬Έμ œμž…λ‹ˆλ‹€. 사진 속 인물의 성별을 λΆ„λ₯˜ν•˜λŠ” λ¬Έμ œκ°€ 여기에 μ†ν•œλ‹€. ν•œνŽΈ νšŒκ·€λŠ” μž…λ ₯ λ°μ΄ν„°μ—μ„œ (연속적인) 수치λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 사진 속 인물의 λͺΈλ¬΄κ²Œλ₯Ό μ˜ˆμΈ κ°€λŠ” λ¬Έμ œκ°€ νšŒκ·€μ΄λ‹€.

ν•­λ“± ν•¨μˆ˜(identity function)

: μž…λ ₯κ³Ό 좜λ ₯이 항상 κ°™λ‹€λŠ” 뜻이며 μž…λ ₯을 κ·ΈλŒ€λ‘œ 좜λ ₯ν•œλ‹€. κ·Έλž˜μ„œ 좜λ ₯μΈ΅μ—μ„œ ν•­λ“± ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ μž…λ ₯ μ‹ ν˜Έκ°€ λ“œλž˜κ³  좜λ ₯ μ‹ ν˜Έκ°€ λœλ‹€ identityFunction

μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜ (softmax function)

: softmax

  • expλŠ” μ§€μˆ˜ ν•¨μˆ˜μ΄λ©°, n은 좜λ ₯측의 λ‰΄λŸ°μˆ˜ ykλŠ” 그쀑 k번째 좜λ ₯μž„μ„ 뜻

    softmaxFunction

def softmax(a):
    exp_a = np.exp(a) # μ§€μˆ˜ ν•¨μˆ˜
    sum_exp_a = np.sum(exp_a) # μ§€μˆ˜ ν•¨μˆ˜μ˜ ν•©
    y = exp_a / sum_exp_a

    return y
  • μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜ κ΅¬ν˜„μ‹œ 주의점

    : μ†Œν”„νŠΈλ§₯슀λ₯Ό μ»΄ν“¨ν„°λ‘œ 계산할 λ•Œμ˜ 결함은 μ˜€λ²„ν”Œλ‘œ λ¬Έμ œμ΄λ‹€

    μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜λŠ” μ§€μˆ˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ€λ°, μ§€μˆ˜ν•¨μˆ˜λž€ 것이 μ‰½κ²Œ μ•„μ£Ό 큰값을 λ‚΄λ±‰λŠ”λ‹€.

    이런 큰 값끼리 λ‚˜λˆ—μ…ˆμ„ ν•˜λ©΄ κ²°κ³Ό μˆ˜μΉ˜κ°€ λΆˆμ•ˆμ •ν•΄μ§„λ‹€

    • μ˜€λ²„ν”Œλ‘œ(overflow) : μ»΄ν“¨ν„°λŠ” 수λ₯Ό 4λ°”μ΄νŠΈλ‚˜ 8λ°”μ΄νŠΈμ™€ 같이 크기가 μœ ν•œν•œ λ°μ΄ν„°λ‘œ 닀룬닀, λ‹€μ‹œ 말해 ν‘œν˜„ν•  수 μžˆλŠ” 수의 λ²”μœ„κ°€ ν•œμ •λ˜μ–΄ λ„ˆλ¬΄ 큰 값을 ν‘œν˜„ν•  수 μ—†λ‹€λŠ” λ¬Έμ œκ°€ λ°œμƒν•œλ‹€

      softmaxRefresh

    • μ†Œν”„νŠΈλ§₯슀의 μ§€μˆ˜ ν•¨μˆ˜λ₯Ό 계산할 λ•Œ μ–΄λ–€ μ •μˆ˜λ₯Ό 더해도 (ν˜Ήμ€ 빼도) κ²°κ³ΌλŠ” λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€λŠ” 것이닀

    • μ˜€λ²„ν”Œλ‘œλ₯Ό 막을 λͺ©μ μœΌλ‘œλŠ” μž…λ ₯ μ‹ ν˜Έ 쀑 μ΅œλŒ“κ°’μ„ μ΄μš©ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c) # μ˜€λ²„ν”Œλ‘œ λŒ€μ±…
    sum_exp_a = np.sum(exp_a) 
    y = exp_a / sum_exp_a

    return y

μ†Œν”„νŠΈ λ§₯슀의 νŠΉμ§•

  • μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜μ˜ ν’€λ ₯은 0μ—μ„œ 1.0μ‚¬μ΄μ˜ μ‹€μˆ˜μ΄λ‹€.

  • μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜ 좜λ ₯의 총합은 1이닀. 이 μ„±μ§ˆ 덕뢄에 μ†Œν”„νŠΈ λ§₯슀 ν•¨μˆ˜μ˜ ν™•λ₯ λ‘œ 해석할 수 μžˆλ‹€

    즉, μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜λ₯Ό μ΄μš©ν•¨μœΌλ‘œμ¨ 문제λ₯Ό ν™•λ₯ μ (톡계적)으둜 λŒ€μ‘ν•  수 μžˆλ„λ‘ λ§Œλ“ λ‹€

  • 신경망을 μ΄μš©ν•œ λΆ„λ₯˜μ—μ„œλŠ” 일반적으둜 κ°€μž₯ 큰 좜λ ₯을 λ‚΄λŠ” λ‰΄λŸ°μ— ν•΄λ‹Ήν•˜λŠ” 클래슀둜만 μΈμ‹ν•œλ‹€.

    그리고 μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜λ₯Ό μ μš©ν•΄λ„ 좜λ ₯이 κ°€μž₯ 큰 λ‰΄λŸ°μ˜ μœ„μΉ˜λŠ” 달라지지 μ•ŠλŠ”λ‹€. 결과적으둜 μ‹ κ²½λ§μœΌλ‘œ λΆ„λ₯˜ν•  λ•ŒλŠ” 좜λ ₯측의 μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜λ₯Ό μƒλž΅ν•΄λ„ λœλ‹€

Tip) κΈ°κ³„ν•™μŠ΅μ˜ 문제 ν’€μ΄λŠ” ν•™μŠ΅κ³Ό μΆ”λ‘ (inference)의 두 단계λ₯Ό 거쳐 이루어진닀. ν•™μŠ΅ λ‹¨κ³„μ—μ„œ λͺ¨λΈμ„ ν•™μŠ΅ν•˜κ³ (직업 ν›ˆλ ¨μ„ λ°›κ³ ), μΆ”λ‘  λ‹¨κ³„μ—μ„œ μ•žμ„œ ν•™μŠ΅ν•œ λͺ¨λΈλ‘œ λ―Έμ§€μ˜ 데이터에 λŒ€ν•΄μ„œ μΆ”λ‘ (λΆ„λ₯˜)λ₯Ό μˆ˜ν–‰ν•œλ‹€. μΆ”λ‘ λ‹¨κ³„μ—μ„œλŠ” 좜λ ₯측의 μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜λ₯Ό μƒλž΅ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€. ν•œνŽΈ 신경망을 ν•™μŠ΅μ‹œν‚¬λ•ŒλŠ” 좜λ ₯μΈ΅μ—μ„œ μ†Œν”„νŠΈλ§₯슀 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€

좜λ ₯측의 λ‰΄λŸ° 수 μ •ν•˜κΈ°

  • 좜λ ₯측의 λ‰΄λŸ° μˆ˜λŠ” ν’€λ €λŠ” λ¬Έμ œμ— 맞게 적절히 μ •ν•΄μ•Ό ν•œλ‹€. λΆ„λ₯˜μ—μ„œλŠ” λΆ„λ₯˜ν•˜κ³  싢은 클래슀 수둜 μ„€μ •ν•˜λŠ” 것이 μΌλ°˜μ μ΄λ‹€

Last updated

Was this helpful?