03. 신경망
이 글은 '밑바닥부터 시작하는 딥러닝' 이란 책으로 공부하며 작성했다.
3.1 퍼셉트론에서 신경망으로
은닉층: 사람의 눈에 보이지 않는 뉴런으로 구성
편향의 입력 신호는 항상 1이다. (항상 입력된다.)
활성화 함수: sum(입력신호)->출력신호, 활성화되는지 결정
단순 퍼셉트론: 단층 네트워크에서 계단함수로 활성화 결정
다층 퍼셉트론: 신경망. 시그모이드 함수 등 부드러운 활성화 함수 사용
3.2 활성화 함수
계단 함수: 임계값 경계로 출력 변화.
#-*- coding:utf-8 -*-
# 코드 내 한글이 있을 경우 에러가 발생해 위 코드를 추가한다.
import numpy as np
import matplotlib.pyplot as plt
# 데이터 준비
def step(x):
return np.array(x>0,dtype=np.int) # True면 1, False면 0. int형 return
x=np.arange(-8,8,0.1)
# (-8, -7, ..., 0, 0.1, 0.2, ..., 7.9)
y=step(x)
# 그래프 그리기
plt.plot(x,y,label="step",color="pink")
plt.ylim(-1,2)
plt.xlabel("x")
plt.ylabel("step(x)")
plt.title("step")
plt.legend()
plt.show()
시그모이드 함수: 신경망의 대표적인 활성화 함수.
#-*- coding:utf-8 -*-
# 코드 내 한글이 있을 경우 에러가 발생해 위 코드를 추가한다.
import numpy as np
import matplotlib.pyplot as plt
# 데이터 준비
def sigmoid(x):
return 1/(1+np.exp(-x)) # math를 import하면 오류가 난다.
x=np.arange(-8,8,0.1)
# (-8, -7, ..., 0, 0.1, 0.2, ..., 7.9)
y=sigmoid(x)
# 그래프 그리기
plt.plot(x,y,label="sigmoid",color="pink")
plt.ylim(-1,2)
plt.xlabel("x")
plt.ylabel("sigmoid(x)")
plt.title("sigmoid")
plt.legend()
plt.show()
시그모이드 함수와 계단 함수
#-*- coding:utf-8 -*-
# 코드 내 한글이 있을 경우 에러가 발생해 위 코드를 추가한다.
import numpy as np
import matplotlib.pyplot as plt
# 데이터 준비
def sigmoid(x):
return 1/(1+np.exp(-x))
def step(x):
return np.array(x>0,dtype=np.int)
x=np.arange(-8,8,0.1)
# (-8, -7, ..., 0, 0.1, 0.2, ..., 7.9)
y=sigmoid(x)
z=step(x)
# 그래프 그리기
plt.plot(x,y,label="sigmoid",color="pink")
plt.plot(x,z,label="step",color="purple",linestyle="--")
plt.ylim(-1,2)
plt.xlabel("x")
plt.ylabel("y")
plt.title("sigmoid & step")
plt.legend()
plt.show()
시그모이드의 출력값은 연속적으로 변화하는 실수이다.
시그모이드 | 계단 |
0에서 1로 연속적인 변화 0과 1 사이 실수 return |
0에서 1로 급격한 변화 0,1 만 return |
비선형 함수(직선X,다층 퍼셉트론에 효과적) |
위 내용을 배우니 y=x같이 심플한 함수를 조금 고치면 쓸만하겠다고 생각했다.
그에 맞는 ReLU함수가 최근에 사용되고 있다.
3.3 다차원 배열의 계산
#-*- coding:utf-8 -*-
# 코드 내 한글이 있을 경우 에러가 발생해 위 코드를 추가한다.
import numpy as np
x=np.array([[1,2,3,4],[5,6,7,8]])
y=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
z=np.dot(x,y)
print(x.shape) # (2,4)
print(y.shape) # (4,3)
print(z.shape) # (2,3)
print(z)
#[[ 70 80 90]
# [158 184 210]]
행렬 (AXB)과 행렬 (BXC)의 행렬곱은 (AXC)의 형태를 갖는다.
3.4 3층 신경망 구현하기
<신경망에서 사용하는 표기법>
<3층 신경망>
위 신경망을 보고 활성화 함수, 항등 함수, network 저장 함수, 신호 전환 함수로 구현할 수 있다.
import numpy as np
def sigmoid(x): # 활성화 함수
return 1/(1+np.exp(-x))
def identity_function(x): # 항등함수
return x
def init_network(): # 가중치, 편향 초기화. dic형인 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 foward(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 #0->1
z1=sigmoid(a1)
a2=np.dot(z1,w2)+b2 #1->2
z2=sigmoid(a2)
a3=np.dot(z2,w3)+b3 #2->3
y=identity_function(a3)
return y
network=init_network()
x=np.array([1.0,0.5])
y=foward(network,x)
print(y)
3.5 출력층 설계하기
기계학습
- 분류: 데이터가 속한 클래스 찾기, softmax 사용
- 회귀: 입력 데이터 내 연속 수치 예측하기 (이미 있는 데이터로 다음 예상하기), identity 사용
identity: 항등함수, 은닉층의 활성화 함수.
softmax: 모든 뉴런이 모든 입력 신호 전달받음, 통계적 확률 return
softmax 구현
import numpy as np
def softmax(a):
c=np.max(a)
exp_a=np.exp(a-c) # overflow를 막기 위해 max를 뺸다.
sum_exp_a=np.sum(exp_a)
y=exp_a/sum_exp_a
return y
a= np.array([0.3,2.9,4.0])
c=np.max(a) # a의 max
y=softmax(a)
print(y)
print(np.sum(y))
[ 0.01821127 0.24519181 0.73659691] # 1.8%, 24.5%, 73.7%
1.0 # 총합 100%
결과: 2번째 원소가 가장 확률이 높다!
a의 관계대로 softmax의 결과가 나온다.
따라서, 신경망으로 분류시 출력층의 softmax는 생략한다.
3.6 신경망 추론처리
순전파(foward propagation): 뉴럴 네트워크 모델의 입력층부터 출력층까지 순서대로 변수들을 계산하고 저장하는 것
신경망으로 추론을 수행하고, 분류의 정확도를 알 수 있다.
정규화: 데이터를 특정 범위로 변환
전처리: 신경망의 입력 데이터에 특정한 변환
백색화: 데이터를 균일하게 분포시킴
배치 처리(batch): 아래와 같이, 여러 데이터를 하나로 묶어 입력 데이터로 쓰는 것. ex) 1개씩 세는 것보다, 10개씩 세는 게 빠르다.
(작은 배열 잦은 계산보다 큰 배열을 1번 계산이 빠름)
참고자료
ko.d2l.ai/chapter_deep-learning-basics/backprop.html
[카카오AI리포트]딥러닝과 데이터
신정규 | 텍스트큐브 개발자 | 데이터는 기하급수적으로 늘어났다. 단위 연산당 비용은 엄청나게 줄어들었다. 그 결과 인공 신경망 기반의 기계 학습 분야가 각광받고 있다. 과거 인공 신경망
brunch.co.kr
3.14. 순전파(forward propagation), 역전파(back propagation), 연산 그래프 — Dive into Deep Learning documentation
ko.d2l.ai