| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 인공신경망
- AP Computer Science A
- AP
- 인공지능 수학
- COVID
- 오류역전파
- 서열정렬
- 자바
- 바이오인포매틱스
- 바이오파이썬
- BLaST
- HMM
- CNN
- 인공지능
- SVM
- 생물정보학
- 생명정보학
- 파이썬
- bioinformatics
- RNN
- 시그모이드
- 딥러닝
- Java
- 블록체인
- MERS
- 이항분포
- ncbi
- Kaggle
- 캐글
- 결정트리
- Today
- Total
데이터 과학
오류역전파 예제 본문
오류역전파 예제에 대한 이야기입니다.
colab에서 실행이 가능합니다. colab 링크는 다음과 같습니다.
https://colab.research.google.com/
Google Colaboratory
colab.research.google.com
colab 설치하고 사용하는 방법은 아래 링크를 통해 확인할 수 있습니다.
구글 계정만 있으면 드라이브에 colab 소스 저장하고 언제든지 온라인으로 코딩할 수 있습니다.
도서관이나 카페에 앉아서도 소스 보면서 프로그래밍이 가능한 것이죠.
colab은 기본적으로 numpy는 사용할 수 있으며, 간단한 딥러닝까지 가능합니다.
연산 속도 문제로 딥러닝을 제대로 코딩하려면 인터프리터 다운받아서 로컬에서 프로그래밍 해야 합니다.
Colab에서의 파이썬
파이썬 코딩을 할때는 아나콘다 주피터노트북을 사용을 하는데, 지금 바로 실습해야 하는 컴퓨터에 아나콘다가 없다면 Colab을 사용하면 됩니다. https://colab.research.google.com/notebooks/intro.ipynb Welcom..
tsyoon.tistory.com
아나콘다에서 다운로드 받아서 주피터 노트북으로 열어서 코딩해도 됩니다.
아나콘다에서는 기본적으로 numpy 라이브러리가 지원되기에 별도로 라이브러리 설치할 필요가 없습니다.
아나콘다 설치하면서 keras 설치까지 마무리하는 것이 좋습니다.
케라스 설치 방법
딥러닝 프로그래밍 이전에 설치해야 할 텐서플로우, 케라스 설치 방법입니다. 먼저 해야 할일은 Anaconda를 다운로드 이후 설치하는 방법입니다. 아나콘다 설치를 위해서는 다음 사이트에 가서 운
tsyoon.tistory.com
이번 내용은 오류역전파만 실행해 보는 것이기에 케라스는 차후에 천천히 설치하면서 MNIST 정도 한번 실습해 보는 것으로 하고, 오류역전파를 colab에서 실행한 것을 보기로 해요.

colab에서 실행해서 나온 결과입니다.
간단하고 명료한 예제여서 오류역전파를 이해하기에 어렵지는 않을 것입니다.
import numpy as np
# numpy 라이브러리를 다운 받아서 설치해야 합니다. 다운로드한 numpy와 python은 버전이 같아야 합니다.
# https://tsyoon.tistory.com/49
import math
# Sigmoid Function
def act(x):
return 1/(1+np.exp(-x))
# 시그모이드 함수 진행, x값을 입력하면 리턴으로 1/(1+np.exp(-x)) 진행합니다.
# datasets
x = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]]) # x1 and x2 in the same aisle is a set input node
# 4*3 행렬로 구성합니다.
# print (x.shape)를 하면 결과는 (4,3)으로 나타납니다.
# 이 상태에서 shape[0]을 하면 4로 결과가 나타나고 shape [1]을 하면 3으로 결과가 나타나겠죠.
y = np.array([[0, 1, 1, 0]]).T # xor의 연산 결과가 0 1 1 0입니다. (exclusive OR 연산 진리표 참고)
# parameters
input_size = x.shape[1] # original input + bias
# shape 함수를 이용해서 입력값 2개와 바이어스 값 1개를 입력함
# x.shape[1]을 하면 3의 값이 입력
hidden_size = 4
# hidden size는 임의로 설정함
output_size = 1
alpha = 0.1
# learning rate , 학습률입니다. 학습률이 너무 작으면 오버 트레이닝이 일어납니다. 너무 크면 어떤 현상이 일어날까요?
# weights
w1 = np.random.randn(input_size, hidden_size)
# 랜덤 함수를 이용하여 랜덤 값을 설정합니다.
# rand 명령은 0과 1사이의 난수를 발생시키는 명령으로 인수로 받은 숫자 횟수만큼 난수를 발생시킵니다.
# np.random.randn(m, n)이면 평균 0, 표준편차 1인 표준 정규분포 난수를 matrix array(m, n) 생성합니다.
# np.random.randn(3, 2)를 예를 들면
#array ([[ 1.65238966, -0.78901221],
# [ 0.23567634, -1.25463721],
# [-1.59076766, 3.34223817]])
# w1은 입력에서 hidden까지의 웨이트 값을 나타냅니다.
w2 = np.random.randn(hidden_size, output_size)
#w2은 hidden에서 output까지의 웨이트값을 나타냅니다.
#웨이트 값들은 나중에 역전파를 통해 값이 변하게 됩니다.
i=0
# 학습을 몇 번 하는지 카운트입니다. 초기값을 설정해야 합니다.
while True:
# forward, 그냥 순방향 연산
z1 = np.dot(x, w1)
# dot은 행렬에서 연산입니다. 입력값과 첫 번째 웨이트 값의 연산이겠죠.
a1 = act(z1) # act는 시그모이드 함수입니다. z1은 매개변수 값을 함수에 넣는 것입니다.
# a1은 시그모이드에 들어간 z1의 결과를 받는 변수입니다.
z2 = np.dot(a1, w2) # z2는 히든 레이어에서 발산되는 a1과 두 번째 웨이트 값의 행렬 연산입니다.
Y = act(z2) # Y는 시그모이드 함수로 계산된 z2 결과를 받는 변수이겠죠.
# back propagation
delta2 = (Y-y) * (Y * (1-Y)) # 여기가 어려운 부분일까요? 천천히 이해하면 전혀 아닙니다.
# 첫 번째는 Y-y는 오차입니다. Y는 계산된 결과이고, y는 xor의 원래 결괏값입니다.
# Y-y는 단순한 오차입니다.
# (Y * (1-Y)는 무엇이냐면 시그모이드 미분한 결과입니다. 변화량이죠.
# 시그모이드 미분을 해서 변화량을 반영해 주어야겠죠. delta는 의미가 변화량입니다.
# delta2라고 변수 이름을 붙인 것은 2번째 웨이트 값에 영향을 주는 것이어서 그렇습니다.
delta1 = np.dot(delta2, w2.T) * (a1 * (1-a1))
# 또 다른 변화량 값을 구해야겠죠. delta1 이것은 첫 번째 웨이트 값에 영향을 줍니다.
w2 -= alpha * np.dot(a1.T, delta2)
# 두 번째 웨이트 값이 변화량을 통해 바뀌었습니다.
w1 -= alpha * np.dot(x.T, delta1)
# 첫 번째 웨이트 값이 변화량을 통해 바뀌었습니다.
i+=1 # 학습 횟수를 세어야죠.
if math.sqrt(sum((Y-y)**2)/4) < 0.05: # math 함수를 여기서 쓰네요. sqrt는 스퀘어 루트입니다.
# 오차가 **2이라는 것은 제곱승이죠. 제곱승으로 계산하고 4로 나눈 결과가 0.05보다 작으면 학습을 멈춥니다.
break
# test, 지금까지 학습한 결과가 맞는지 테스트해 보는 내용입니다. xor를 학습했으니 xor 를 테스트해 보아야겠죠.
z1 = np.dot(x, w1)
a1 = act(z1)
z2 = np.dot(a1, w2)
Y = act(z2)
print Y
print "Total Iteration is ", i
큰 문제없이 결과가 잘 나올 겁니다.
시그모이드 미분에 대해 이해가 잘 안 되면 아래 내용을 참고해 주세요.
인공지능, 접선의 기울기와 경사하강법
인공신경망을 공부하다보면 필연적으로 마주쳐야 하는 이론이 경사하강법(gradient desendent) 이론입니다. 가중치 값에 대한 변화율을 만들기 위해 변화된 값을 찾는 방법으로 오류역전파 알고리즘
tsyoon.tistory.com
여기까지 이해가 잘 안 되면 다시 한번 천천히 공부해 봅시다.
오류역전파의 간단한 원리
인공 신경망에서의 오류역전파는 입력과 은닉층(Hidden layer)의 연산의 결과와 활성화 함수(activate function)의 발산으로 구성되어 있다. 1. 입력값과 은닉층의 연산의 결과 2. 연산의 결과에 대한 활
tsyoon.tistory.com
'인공지능 > 기초 인공신경망' 카테고리의 다른 글
| 인공신경망과 자바 예제 (0) | 2023.03.19 |
|---|---|
| 인공지능 기호주의와 연결주의 (1) | 2023.03.16 |
| 인공신경망에서 시그모이드 함수 (0) | 2022.03.16 |
| 인공지능 알고리즘 (0) | 2022.03.14 |
| 멀티레이어 퍼셉트론 (0) | 2022.03.13 |