본문 바로가기
ML&DATA/밑바닥부터 시작하는 딥러닝

3. 신경망

by sun__ 2020. 9. 8.
2.7 퍼셉트론

 

퍼셉트론은 다수의 입력을 받아 하나의 신호를 출력한다. 

 

XOR 게이트는 단층 퍼셉트론으로는 표현할 수 없다.

 

 

2층 퍼셉트론으로 XOR 게이트를 표현할 수 있다.

 

다층 퍼셉트론만으로 모든 논리연산을 구현할 수 있다. 

 


 

3. 신경망

퍼셉트론으로 모든 연산을 표현할 수 있다. 하지만 가중치를 설정하는 작업은 사람이 수동으로 설정해야 한다는 문제가 있다.

 

신경망이 이 문제를 해결해준다. 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 능력을 가지고 있다. 

 


 

3.1 퍼셉트론에서 신경망으로

 

퍼셉트론

 

신경망은 편향을 의미하는 노드도 추가하고, 가중치가 곱해진 입력 신호의 총합을 활성화 함수 $h$에 넣어 나온 결과 값을 가지고 신호를 출력한다.

신경망

 


 

3.2 활성화 함수

퍼셉트론과 신경망의 주된 차이는 활성화 함수 뿐이다.

 

활성화 함수의 예로 시그모이드 함수와 계단 함수, ReLU 소개.

더보기

ReLU함수는 가중치가 곱해진 입력 신호의 총합과 0 중에 최대값을 반환한다.

 

신경망에선 활성화 함수로 선형 함수를 사용하면 안된다.(신경망의 층을 깊게 하는 의미가 없어지기 때문)

 

 

3.4 3층 신경망 구현하기

각 층마다 가중치와 편향, 활성화 함수를 직접 지정해서 신경망을 구현한 코드.

def init_network():
    network = {}
    network['W1'] = np.array([[0.1,0.3,0.5], [0.2,0.4,0.6]])
    network['b1'] = np.array([0.1,0.2,0.3])
    network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
    network['b2'] = np.array([0.1,0.2])
    network['W3'] = np.array([[0.1,0.3], [0.2,0.4]])
    network['b3'] = np.array([0.1,0.2])
    return network

def forward(network, x):
    W1, W2, W3 = network['W1'], network['W2'], network['W3']
    b1, b2, b3 = network['b1'], network['b2'], network['b3']
    
    a1 = np.dot(x,W1) +b1
    z1 = sigmoid(a1)
    a2 = np.dot(z1,W2) +b2
    z2 = sigmoid(a2)
    a3 = np.dot(z2, W3) +b3
    y = identity_function(a3) #항등함수 구현해둔것. x받아서 x그대로 리턴해주는 함수
    
    return y

network = init_network()
x = np.array([1.0, 0.5])
y = forward(network,x)
print(y)
#[0.31682708 0.69627909]

 


 

3.5 출력층 설계하기

출력층에서 사용하는 활성화 함수를 정하는 것이 중요하다. 회귀엔 항등함수, 이진분류엔 시그모이드, 멀티라벨분류엔 소프트맥스 함수를 주로 사용한다.

 

<항등함수>

생략

<시그모이드>

생략

 

 

<소프트맥스 함수>

softmax함수 식은 다음과 같다. exp의 오버플로우 문제 때문에 식을 변형한 아래 식을 보통 사용한다.

$$y_k = \frac{exp(a_k)}{\sum{}{}exp(a_i)}$$

$$y_k = \frac{exp(a_k+C)}{\sum{}{}exp(a_i+C)}$$

 

def sortmax(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

 

소프트맥스 함수의 출력 총합은 1이다. 이 성질 덕분에 소프트맥스 함수의 출력을 '확률'로 해석할 수 있다.

 

지수함수는 단조증가 함수이므로 a의 원소들 사이의 대소 관계와 y의 원소들 사이의 대소관계로 그대로 이어진다. 따라서 가장 큰 출력을 내는 뉴런에 해당하는 클래스로만 인식하므로 추론단계에선 굳이 소프트맥스 함수를 사용하지 않는 경우가 많다. (당연히 신경망을 학습시킬 땐 소프트맥스 함수를 사용한다.)

 

 


 

'ML&DATA > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

7 - CNN  (0) 2020.10.07
5 - 오차역전파법  (0) 2020.09.18
4 - 신경망 학습  (0) 2020.09.10