머신러닝 기초 1 - 머신러닝의 기초 개념과 신경망
머신러닝의 구조 및 개념
- 노드
: 데이터를 처리하는 단위
: 입력노드 / 출력노드로 구분 (딥러닝의 경우 은닉층까지 추가)
- 가중치
: 노드의 중요도를 조절하는 값
: 노드에서 노드로 값을 전송할 때 입력된 값에 가중치가 곱하여 전송 됨
: ex) 날씨에 대해 예측할 때 습도, 온도, 광도를 입력 노드라고 가정한다면,
습도에 대해서 가중치를 더 주면 결과 값에 습도의 영향력이 커짐
- 편향
: 결과 값의 민감도를 조절하는 값
: 모든 노드의 값을 합한 값에 더하는 값
: ex) 날씨 예측을 위해 습도, 온도, 광도에 각각 가중치를 곱하고 합한 결과 값에 편향을 더하여
비가 올지, 눈이 올지 등을 조정
- 임계 값
: 계산한 결과 값을 통해 어떤 결과를 출력할지에 대한 기준이 되는 값
: ex) (노드1의 입력 값 * 가중치) + (노드2의 입력 값 * 가중치) + 편향 >= 11.5 = 1
(노드1의 입력 값 * 가중치) + (노드2의 입력 값 * 가중치) + 편향 < 11.5 = 0
=> 여기서 11.5가 임계 값임
- 활성화 함수
: 신호를 입력 받아 적절한 처리를 하여 출력해주는 함수
: 노드의 계층(Layer)가 깊어질수록 중간 계층의 노드의 값들을 조절해줄 필요가 있는데 이때 쓰이는 함수
: 일정조건 (임계 값)을 두어 이를 충족했을때 특정한 값을 출력하여 다음 계층 노드로 전달
머신러닝의 전체적인 흐름 (간단화)
1. 입력노드에 값이 입력되면 각 입력 값에 가중치가 곱해짐
2. 가중치가 곱해진 데이터들을 합하고 출력노드로 전송
3. 데이터의 합이 설정된 임계값 이상이면 1, 이하면 0을 출력
퍼셉트론 (Perceptron)
- 단층 신경망 알고리즘 (딥러닝의 기원)
: 다수의 신호를 입력받아 하나의 신호로 출력하는 구조
: 활성화 함수를 통과하고 연산되어 나온 결과를 0과 1로 출력
- 구조
: 입력노드 / 출력노드
단층 퍼셉트론 (Single Layer Perceptron) 파이썬 예제
# Single Layer Perceptron
import numpy as np
def AND(x1, x2): # AND 연산 노드
x = np.array([x1, x2]) # 입력 데이터
w = np.array([0.5, 0.5]) # 가중치
b = -0.7 # 편향
tmp = np.sum(w*x) + b # 결과 값 = (가중치*입력 데이터) + 편향
if tmp <= 0: # 임계 값과 결과 값을 비교하여 결과 출력
return 0
else:
return 1
def NAND(x1, x2): # NAND 연산노드
x = np.array([x1,x2]) # 입력 데이터
w = np.array([-0.5, -0.5]) # 가중치
b = 0.7 # 편향
tmp = np.sum(w*x) + b # 결과 값 = (가중치*입력 데이터) + 편향
if tmp <= 0 : # 임계 값과 결과 값을 비교하여 결과 출력
return 0
else:
return 1
# 이하 생략
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w*x) + b
if tmp<=0:
return 0
else:
return 1
def XOR(x1,x2): # XOR 연산 노드
s1 = NAND(x1,x2) # NAND 연산 노드의 출력 값을 입력 받음
s2 = OR(x1,x2) # OR 연산 노드의 출력 값을 입력 받음
y= AND(s1,s2) # NAND 노드와 OR노드의 출력 값을 AND 노드로 전달하여 데이터 출력
return y
print(" 0,0 : AND =", AND(0,0), "NAND =", NAND(0,0), "OR =", OR(0,0), "XOR =", XOR(0,0))
print(" 0,1 : AND =", AND(0,1), "NAND =", NAND(0,1), "OR =", OR(0,1), "XOR =", XOR(0,1))
print(" 1,0 : AND =", AND(1,0), "NAND =", NAND(1,0), "OR =", OR(1,0), "XOR =", XOR(1,0))
print(" 1,1 : AND =", AND(1,1), "NAND =", NAND(1,1), "OR =", OR(1,1), "XOR =", XOR(1,1))
- 퍼셉트론을 이용하여 AND, NAND, OR, XOR 연산을 하였다.
여기서 AND, NAND, OR 연산의 경우 1개 계층의 노드를 통해 값을 출력 받았는데,
XOR 연산의 경우 단층 퍼셉트론으로 구현할 수 없기 때문에 (한 계층의 노드 만으로는 연산불가)
NAND노드와 OR노드로 부터 출력된 값을 AND노드에 입력 값으로 전달하여
AND노드로 부터 값을 출력 받아 구현하였다.
즉,
여기서 구현한 XOR노드는 다층 퍼셉트론에 해당 한다.
신경망(Neural Network)
- 인간의 뉴런과 신경망을 본떠 만든 알고리즘
- 뉴런 : 두뇌의 가장 작은 정보처리 단위
- 신경망의 종류
: 전방신경망 (CNN), 순환신경망 (RNN)
: 얕은 신경망, 깊은 신경망 (Deep Learning)
: 결정론 신경망 (입력이 같으면 항상 같은 결과 출력) / 스토캐스틱 (매번 다른 결과 출력)
- 신경망의 구성
: 입력층 / 은닉층 / 출력층
: 입력층과 은닉층에서만 가중치를 가짐
- 표기법
(1) 레이어 번호
W
12 다음 노드 번호, 이전 노드 번호 (2에서 1로 이동함을 의미)
다층 퍼셉트론 (Multi Layer Perceptron)
- 여러 계층의 노드로 구성되어 있는 비선형적 특성의 퍼셉트론
: 위 퍼셉트론 예시에서 XOR이 다층 퍼셉트론에 속함
다층 퍼셉트론 파이썬 예제
# Multi Layer Perceptron
import numpy as np
def sigmoid(x):
return 1 / (1+ np.exp(-x))
def softmax(a):
m = np.max(a)
exp_a = np.exp(a-m) # overflow 방지
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
# input nodes
X = np.array([1.0,0.5]) # 입력값
# Layer1 nodes (1번 계층)
W1 = np.array([[0.1,0.3,0.5],
[0.2,0.4,0.6]]) # 가중치
B1 = np.array([0.1,0.2,0.3]) # 편향
A1 = np.dot(X,W1)+B1 # 출력 값 (입력 값 * 가중치) + 편향
Z1 = sigmoid(A1) # 활성화 함수 (시그모이드 함수 이용)
print("Layer 1 Z1 = ", Z1)
# Layer2 nodes (2번 계층)
W2 = np.array([[0.1,0.4], # 가중치
[0.2,0.5],
[0.3,0.6]])
B2 = np.array([0.1,0.2]) # 가중치
A2 = np.dot(Z1,W2)+B2 # 출력 값 (입력 값 * 가중치) + 편향
Z2 = sigmoid(A2) # 활성화 함수 (시그모이드 함수 이용)
print("Layer 2 Z2 = ", Z2)
# output Layer nodes (출력 계층)
W3 = np.array([[0.1,0.3],
[0.2,0.4]]) # 가중치
B3 = np.array([0.1,0.2]) # 편향
A3 = np.dot(Z2,W3) + B3 # 출력 값 (입력 값 * 가중치) + 편향
print("total = ", A3) # 최종 결과 값
print("softmax = ", softmax(A3)) # softmax 활성화 함수를 거친 출력 값
- 위 결과 값에서 Z1과 Z2는 1계층 노드와 2계층 노드의 결과 값을 의미하며
total의 경우 출력 계층까지 거친 결과 값을 뜻 한다.
softmax의 경우 softmax라는 활성화 함수를 거친 출력 값이다.
활성화 함수의 종류
- Sigmoid
: 0과 1의 출력 값을 가지는 활성화 함수
: 임계 값을 기준으로 0과 1사이의 값을 출력
- 계단함수
: 입력 값이 0을 넘으면 1을 출력하고 그 외의 값은 0을 출력하는 함수
- ReLU 함수
: 양수 값을 그대로 출력하는 활성화 함수
- softmax
: 계산결과를 확률로 표현하고, 가장 큰 값을 1로 나머지는 0으로 취급하는 함수
: 주로 분류 문제에 이용