✳ Neural Network¶

✅ Perceptron to Neural Network¶

▶ Concept¶

  • 신경망은 가중치 매개변수의 적절한 값을 자동으로 학습
  • image.png
  • 0층(input layer), 1층(hidden layer), 2층(output layer)
    • 총 3층이지만, weight을 가진 층은 2개이기 때문에 2층 신경망 이라고 부름

▶ Perceptron¶

$ y = \begin{cases}0 \;if\;b + w_1x_1 + w_2x_2 <= 0\\ 1 \;if\; b + w_1x_1 + w_2x_2 > 0\end{cases} $

  • $b(bias)$ : 뉴런이 얼마나 쉽게 활성화되는가
  • $w_1, w_2$ : 각 신호의 영향력 제어

🔽 더 간결한 형태의 식¶

$ y = h(b + w_1x_1 + w_2x_2) $

$ h(x) = \begin{cases}0 \;if\;x <= 0\\ 1 \;if\; x > 0\end{cases} $

▶ Activation function¶

  • 활성화 함수(Activation function) : 입력신호의 총합을 출력신호로 변환하는 함수

🔽 두 단계로 나눈 식¶

  • <단계 1> $a = b + w_1x_1 + w_2x+2$
  • <단계 2> $y = h(a)$ ➡ 가중치가 곱해진 입력신호의 총합을 먼저 구하고(1단계), 총합을 활성화 함수에 입력하여 결과값 도출(2단계) : 가중치 신호가 조합한 결과 a 노드를 활성화 함수 h()에 통과하여 y라는 노드로 변환된다

✅ Activaton function¶

▶ Sigmoid function¶

$h(x) = \frac{1}{1 + exp(-x)}$

  • $exp(-x)$ 는 $e^{-x}$ 를 의미

▶ Step function¶

In [1]:
import numpy as np
x = np.array([-1.0, 1.0, 2.0])
print(x)
y = x > 0
y = y.astype(np.int64)
print(y)
[-1.  1.  2.]
[0 1 1]
In [2]:
import numpy as np
import matplotlib.pylab as plt
def step_function(x):
    return np.array(x > 0, dtype=np.int64)

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()

▶ Sigmoid vs Step¶

In [5]:
# sigmoid function
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.array([-1.0, 1.0, 2.0])
print(sigmoid(x))
[0.26894142 0.73105858 0.88079708]
  • numpy 의 broadcast 로 기능 : numpy 배열과 scala 연산을 배열의 원소 각각과 scala값의 연산으로 바꾸어 수행하는 것

🔽 Sigmoid function graph

In [6]:
x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()

🔽 step function과 sigmoid function의 차이 image.png

  • step은 0을 경계로 출력이 급격히 변화하고 sigmoid는 비교적 값이 연속적으로 변화
  • step은 결과값이 0 또는 1이지만 sigmoid는 실수값(0.731, 0.808 등) 도 반환

🔽 step function과 sigmoid function의 공통점

  • 그래프를 큰 관점에서 바라보면 두 함수 모두 input값이 작을 때는 0에 가까워지고, input이 클 때는 1에 가까워짐
  • input값과 관련없이 언제나 0~1 사이의 output을 도출

▶ 비선형 함수 (Non-linear function)¶

  • 신경망에서는 활성화함수로 비선형 함수만을 사용해야 함
    • -> 선형 함수를 사용하면 신경망을 깊게 하는 의미가 없기 때문
    • 선형 함수는 층을 아무리 깊에 해도 은닉층이 없는 네트워크로 표현할 수 있기 때문에 메리트가 없음
    • $h(x) = cx$를 활성화 함수로 한 3층 네트워크는 $y(x) = h(h(h(x)))$로 표현 가능
      • 그러나 이 식은 사실상 $y(x) = ax$와 같다. 왜냐하면 $y(x) = c * c* c* x = c^3$ 이기 때문
      • 그래서 선형 함수를 활성화 함수로 사용하는 것은 무의미하다

▶ ReLU(Rectified Linear Unit) function¶

  • ReLU함수는 0이 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력
  • $ h(x) = \begin{cases}x \;if\;x > 0\\ 0 \;if\; x <= 0\end{cases} $
In [ ]:
def relu(x):
    return np.maximum(0, x)