3_1_신경망
신경망 배우는 이유
퍼셉트론 관련 좋은 소식과 나쁜 소식
- 좋은 소식
: 퍼셉트론으로 복잡한 함수도 표현할 수 있다는 것
ex. (이론상) 컴퓨터의 복잡한 수행 - 나쁜 소식
: 원하는 결과를 출력하도록 가중치 값을 적절히 정하는 작업은 여전히 사람이 수동으로 한다는 것
하지만, 신경망이 이 나쁜 소식을 해결해줄 수 있다.
무슨 말이냐고?
가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력이 신경망의 중요한 성질이기 때문이다.
(물론 다음 장에서 나온다)
퍼셉트론에서 신경망으로
이번 챕터에서는 퍼셉트론과 다른 점을 중심으로 신경망의 구조를 설명한다.
신경망의 예
가장 왼쪽 줄을 입력층(0층), 중간 줄을 은닉층(1층), 가장 오른쪽 줄을 출력층(2층)
은닉층의 뉴런은 다른 층과 달리 사람 눈에는 보이지 않는다.
그림만 봐서는 퍼셉트론과 딱히 달라 보이지 않는다.
실제로 뉴런이 연결되는 방식은 퍼셉트론에서 달라진 것이 없다.
그럼 신경망에서는 신호를 어떻게 전달할까?
퍼셉트론 복습
우선, 신경망의 신호 전달 방법을 알기 전에 퍼셉트론을 복습해보자.
b는 편향을 나타내는 매개변수, 뉴런이 얼마나 쉽게 활성화되느냐를 제어한다.
w1과 w2는 각 신호의 가중치를 나타내는 매개변수, 각 신호의 영향력을 제어한다.
퍼셉트론의 동작은 x1, x2, 1이라는 3개의 신호가 뉴런에 입력되어, 각 신호에 가중치를 곱한 후, 다음 뉴런에 전달된다.
다음 뉴런에서는 이 신호들의 값을 더하여, 그 합이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.
위 식을 쉽게 바꾸면?
0을 넘으면 1을 출력하고, 0을 넘지 못하면 0을 출력하는 조건 분기의 동작을 하나의 함수 h(x)로 나타냈다.
즉, 입력 신호의 총합이 h(x)라는 함수를 거쳐 변환되고, 그 변환된 값이 y의 출력이 됨을 보여준다.
h(x) 함수는 입력이 0을 넘으면 1을 돌려주고, 그렇지 않으면 0을 돌려준다.
이를 활성화 함수라고 한다.
활성화 함수의 등장
등장했던 h(x)처럼 입력 신호의 총합을 출력 신호로 변환하는 함수를 활성화 함수(activation function)이라 한다.
입력 신호의 총합이 활성화를 일으키는지 정하는 역할을 한다.
가중치가 달린 입력 신호와 편향의 총합을 계산하고 이를 a라고 칭한다면
이런 식이 완성된다.
그리고 a를 h()에 넣어 y를 출력하는 흐름의 식이다.
지금까지 만든 식을 뉴런으로 표현하면 이렇다.
보다시피 큰 뉴런 안에 활성화 함수의 처리 과정을 그려 넣었다.
즉, 가중치 신호를 조합한 결과가 a라는 노트가 되고, 활성화 함수 h()를 통과하여 y라는 노드로 변환되는 과정이 그려져있다.
일반적으로 활성화 처리 과정을 명시하며 위 그림처럼 그리지 않지만, 신경망의 동작을 더 명확히 드러내고자 할 때 종종 그리기도 한다.
- 단순 퍼셉트론 : 단층 네트워크에서 계단(임계값을 경계로 출력이 바뀌는 함수)를 활성화 함수로 사용한 모델
- 다층 퍼셉트론 : 신경망(여러 층으로 구성되고 시그모이드 함수 등의 매끈한 활성화 함수를 사용하는 네트워크)
활성화 함수
h(x)는 임계값(0)을 경계로 출력이 바뀌는데, 이런 함수를 계단 함수(step function)이라 한다.
즉, 퍼셉트론에서는 활성화 함수의 여러 후보 중에서 계단함수를 사용한다고 할 수 있다.
그럼 계단 함수가 아닌 다른 함수를 쓰면 어떻게 되나?
이게 바로 신경망이다.
계단 함수
step function
입력이 0을 넘으면 1을 출력하고, 그 외에는 0을 출력하는 함수
계단 함수 코드
def step_function(x):
if x>0:
return 1
else:
return 0
하지만 이 코드의 한계는 넘파이 배열을 인수로 넣을 수 없다는 것이다.
그걸 넘파이로 해결해보자면,
def step_function(x):
y = x > 0:
return y.astype(np.int)
# return np.array(x>0, dtype=np.int) 로 바꿀 수 있음
여기서 y는 원소 각각이 0보다 크면 True, 0 이하면 False로 변환한 bool 배열이다.
그걸 다시 astype 함수로 int형으로 바꿔 반환한다.
시그모이드 함수
sigmoid function
(예전에) 신경망에서 많이 사용하는 활성화 함수
신경망에서는 활성화 함수로 시그모이드 함수를 이용한다. (물론 다른 함수를 쓸 때도 있음)
시그모이드 함수를 이용하여 신호를 변환하고, 그 변환된 신호를 다음 뉴런에 전달한다.
사실 퍼셉트론과 신경망의 주된 차이는 이 활성화 함수뿐이다.
그 외에 뉴런이 여러 층으로 이어지는 구조와 신호를 전달하는 방법은 기본적으로 퍼셉트론과 같다.
시그모이드 함수 코드
def sigmoid(x):
return 1 / (1 + np.exp(-x))
계단 함수와 시그모이드 함수 비교
차이점
- 매끄러움의 차이
시그모이드 함수는 입력에 따라 출력이 연속적으로 변화하는 부드러운 곡선이다.
계단 함수는 0을 경계로 출력이 갑자기 바뀐다.
시그모이드 함수의 이 매끈함이 신경망 학습에서 아주 중요한 역할을 한다. - 계단 함수는 0과 1 중 하나의 값만 반환, 시그모이드는 실수를 반환
즉, 퍼셉트론은 뉴런 사이에 0 혹은 1만 흘렀다면, 신경망에서는 연속적인 실수가 흐른다.
비유하자면,
계단 함수는 물을 쏟아내거나(1) 쏟아내지 않는(0) 두 가지의 움직임만 보여준다.
시그모이드 함수는 흘러온 물의 양에 비례해 흐르는 물의 양을 조절한다.
공통점
- 큰 관점에서 보면 둘은 같은 모양
둘 다 입력이 작을 때는 출력은 0에 가깝고, 입력이 커지면 출력이 1에 가까워지는 구조다.
즉, 둘 다 입력이 중요하면 큰 값을 출력하고, 입력이 중요하지 않으면 작은 값을 출력한다. - 입력에 상관없이 0에서 1 사이의 값을 출력
- 비선형 함수
시그모이드는 곡선, 계단 함수는 구부러진 직선
신경망에서는 활성화 함수로 비선형 함수를 사용해야 한다.
선형 함수를 사용하면 안 된다.
왜일까?
그 이유는 선형 함수를 이용하면 신경망의 층을 깊게 하는 의미가 없어지기 때문이다.
선형 함수의 문제는 층을 아무리 깊게 해도 '은닉층이 없는 네트워크'로 똑같은 기능을 할 수 있다는 것이다.
ex) h(x) = c*x, 3층 네트워크
y(x) = h(h(h(x)))
= cccx
즉, y(x) = ax 와 같다. (a = c^3)
즉, 은닉층이 없는 네트워크로 표현할 수 있게 된다.
ReLU 함수
Rectified Linear Unit, 렐루
(최근에) 신경망에 주로 사용하는 함수
렐루는 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력하는 함수다.
렐루 함수 코드
def relu(x):
return np.maximum(0,x)
Author And Source
이 문제에 관하여(3_1_신경망), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@homingsea/31신경망저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)