3.1 퍼셉트론에서 신경망으로
3.1.1 신경망의 예
가장 왼쪽에서부터 입력층, 출력층, 은닉층이라고한다. 은닉층에는 사람 눈에 보이지 않고, 입력층부터 0층, 1층, 2층이라고 한다.
3.1.2 퍼셉트론 복습
퍼셉트론의 수식을 다른 형태로 만들어 보면, 조건 분기의 동작을 하나의 함수로 나타낸다. 이 함수를 h(x)라고 한다. 이 식에서는 입력 신호의 총합이 h(x)라는 함수로 거쳐 변환되어 그 값이 y의 출력됨을 보여준다.
3.1.3 활성화 함수의 등장
활성화 함수는 입력 신호의 총합을 출력 신호로 변환하는 함수. 입력 신호의 총합이 활성화를 일으키는지 정하는 역할을 한다.
3.2 활성화 함수
활성화 함수는 임계값을 경계로 출력이 바뀌는데 이를 계단 함수라고 한다. 그러므로 퍼셉트론에서sms 활성화 함수로 계단 함수를 이용한다라고 할 수 있다.
3.2.1 시그모이드 함수
신경망에서 자주 사용되는 함수이고,
신경망에선 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고 그 변환된 신호를 뉴런에 전달한다.
3.2.2 계단함수 구현하기
계단 함수는 입력이 0을 넘으면 1을 출력, 그 외에는 0 출력.
def step_function(x):
y>0
return y.astype(np.int)
- 넘파이 배열의 자료형을 변환할 때 astype() 사용. 파이썬에서는 bool을 int로 변환하면 True는 1, False는 0으로 변환된다.
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()
- np.arrange(-5.0, 5.0, 0.1) : -5.0에서 5.0전 까지 0.1 간격의 넘파이 배열을 만든다.
3.2.3 계단 함수의 그래프
3.2.4 시그모이드 함수 구현하기
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()
3.2.5 시그모이드 함수와 계단 함수 비교
같은 모양. 입력이 중요하면 큰 값을 출력하고 입력이 중요하지 않으면 작은 값을 출력한다. 출력값은 0에서 1사이.
시그모이드 함수는 곡선, 입력에 따라 출력이 연속적으로 변화. 실수값을 돌려준다.
계단함수 : 0을 경계로 출력이 갑자기 바뀌고 있다. 0,1 중 하나의 값만 돌려준다.
3.2.6 비선형함수
계단함수, 시그모이드 함수 모두 비선형함수. 신경망에서는 활성화 함수로 비선형함수를 사용해야 한다. 선형함수를 사용하면 신경망의 층을 깊게 하는 의미가 없어진다.
3.2.7 ReLU 함수
최근에 많이 사용하는 함수. 입력이 0을 넘으면 그 입력을 그대로 출력하고, 0 이하이면 0을 출력한다.
def relu(x):
return np.maximum(0, x)
3.3 다차원 배열의 계산
3.3.2 행렬의 내적
- np.dot(a, b) 이용
3.4 3층 신경망 구현하기
3.4.1 표기법 설명
W(1)12 : (1)층의 가중치이고, 12에서 1은 다음층의 1번째 뉴런, 2는 앞층의 두 번째 뉴런임을 나타낸다.
3.4.2 각 층의 신호 전달 구현하기
편향을 뜻하는 뉴런 1이 추가되었다.
여기에서 행렬의 내적을 이용하면 1층의 ‘가중치 부분’을 다음과 같이 나타낼 수 있다.
은닉층에서 가중치의 합을 a로 표기하고 활성화함수 h()로 변환된 신호를 z로 표기한다. 여기서 활성화 함수로 시그모이드 함수를 사용하기로 한다.
이제 1층에서 2층으로 신호를 전달해보고 2층에서 출력층으로 신호를 전달해보자.
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)
return y
network=init_network()
x=np.array([1.0, 0.5])
y=forward(network, x)
print(y)
3.5 출력층 설계하기
회귀에는 항등 함수, 분류에는 소프트맥스 함수 사용
3.5.1 항등 함수와 소프트맥스 함수 구현하기
항등함수는 입력 그대로 출력.
소프트맥스 함수의 분자는 입력 신호의 지수함수, 분모는 입력 신호의 지수 함수의 합으로 구성. 소프트맥스의 출력은 모든 입력 신호로부터 화살표를 받는다. 출력층의 각 뉴런이 모든 입력 신호에서 영향을 받는다.
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
3.5.2 소프트맥스 함수 구현 시 주의점
소프르맥스 함수는 지수 함수를 사용하는데, 지수함수는 쉽게 아주 큰 값을 나타낸다. 이런 큰 값끼리 나눗셈을 하면 결과 수치가 불안정해진다. 이를 개선해보면,
소프트맥스 함수의 출력은 0에서 1.0 사이 실수, 출력 총합은 1이다. 그래서 소프트맥스 함수의 출력을 확률로 해석할 수 있다.
3.5.4 출력층의 뉴런 수 정하기
만약, 숫자 0부터 9 중 하나로 분류하는 문제라면 출력층의 뉴런을 10개로 설정한다.
3.6 손글씨 숫자 인식
추론 과정을 신경망의 순전파라고 한다.
3.6.1 MNIST 데이터셋
데이터셋은 0부터 9까지의 숫자 이미지로 구성된다. 훈련 이미지를 사용하여 모델을 학습하고 학습한 모델로 시험 이미지를 얼마나 정확하게 분류하는지 평가한다.
3.6.2 신경망의 추론 처리
'Today I Learned > 밑바닥부터 시작한 딥러닝' 카테고리의 다른 글
밑바닥부터 시작하는 딥러닝1,2를 공부하며,,, (0) | 2020.03.01 |
---|---|
밑바다부터 시작하는 딥러닝1-4장 신경망 학습 (0) | 2020.02.03 |
밑바닥부터 시작하는 딥러닝1-7장 CNN (0) | 2020.01.28 |
밑바닥부터 시작하는 딥러닝1 2장-퍼셉트론 (0) | 2020.01.19 |