- 뉴런과 시냅스
- 뉴런 : 신경계를 구성하는 세포
- 시냅스 : 뉴런과 뉴런을 연결(입력에 의해 자극을 받아 다른 뉴런으로 정보 전달)
- 입력 : 여러개의 자극들로 구성
- 입력들은 기준치 이상을 달성해야 전달함(모두 전달하는 건 아님)
로지스틱 회귀 == 퍼셉트론
y = ax + b ➡️ y = wx + b(w는 가중치, b는 바이어스)
- 가중치(weight) :
- 바이어스(bias) : 편향
- 가중합(weighted sum) : 입력값 x와 가중치 w를 곱하고 바이어스 b를 더함
- 활성화 함수(activation) : 가중합의 결과를 보고 0과 1을 판단
- 은닉층이 평면을 왜곡시키는 결과를 가져옴
- 단일 퍼셉트론의 값 계산
n1 = σ(x1w11 + x2w21+b1)
n2 = σ(x1w12 + x2w22 + b2)- 출력층의 값 계산
- 각각의 가중치와 바이어스
import numpy as np
w11 = np.array([-2,-2])
w12 = np.array([2,2])
w2 = np.array([1,1])
b1 = 3
b2 = -1
b3 = -1
def MLP(x,w,b): #퍼셉트론 함수
y = np.sum(w*x)+b
if y <= 0:
return 0
else:
return 1
def NAND(x1, x2):
return MLP(np.array([x1,x2]), w11, b1)
def OR(x1, x2):
return MLP(np.array([x1, x2]), w12, b2)
def AND(x1, x2):
return MLP(np.array([x1, x2]), w2, b3)
def XOR(x1, x2):
return AND(NAND(x1,x2), OR(x1,x2))
for x in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(x[0], x[1])
print("입력 값: " + str(x) + " 출력 값: " + str(y))
def MLP2(x, w, b):
ws = x.dot(w) + b
return ws > 0
w1 = np.array([[-0.5,0.5],[-0.5,0.5]])
w2 = np.array([0.5,0.5])
b1 = np.array([0.7,-0.2])
b2 = np.array([-0.7])
X = np.array([(0, 0), (1, 0), (0, 1), (1, 1)])
for x in X:
n = MLP2(x, w1, b1)
y = MLP2(n, w2, b2)
print("입력 값: " + str(n) + " 출력 값: " + str(y))
- 임의의 가중치 선언 후 결괏값을 이용해 오차를 구함. ➡️ 오차가 최소의 지점으로 계속해서 이동시킴
- 오차가 최소가 되는 지점 : 우리가 찾는 정답임
1️⃣ 단층 퍼셉트론 : 입력층, 출력층으로만 구성
2️⃣ 다층 퍼셉트론 : 은닉층 존재 ➡️ 결괏값 오차를 토대로 하나 앞선 가중치를 차례로 거슬러 올라가며 조정
- 절차
- 1️⃣ 임의의 초기 가중치(W)를 준 뒤 결과(y) 계산
- 2️⃣ 계산 결과와 원하는 값 사이의 오차 구하기
- 3️⃣ 경사 하강법을 이용해 바로 앞 가중치를 오차가 작아지는 방향으로 업데이트
- 기울기가 0이 되는 방향으로 이동
- 가중치에서 기울기를 뺐을 때 가중치의 변화가 전혀 없는 상태
- 4️⃣ 위 과정을 오차가 더이상 줄어들지 않을 때까지 반복
1️⃣ 환경 변수 지정 : 입력값, 타깃 결과값이 포함된 데이터셋, 학습률 등 포함. 또한, 활성화 함수, 가중치 등도 선언
2️⃣ 신경망 실행 : 초깃값을 입력하여 활성화 함수와 가중치를 거쳐 결괏값이 나오게 함
3️⃣ 결과를 실제 값과 비교 : 오차 측정
4️⃣ 역전파 실행 : 출력층과 은닉층 가중치 수정
5️⃣ 결과 출력
- 기울기 소실 문제(vanishing gradient)
- 가중치 수정하려면 미분 값(기울기) 필요
- 층이 늘어나면 역전파를 통해 전달되는 기울기 값들이 점차 작아져서 맨 처음층까지 도달 시 기울기가 소실되는 문제 발생
➡️ 활성화 함수가 시그모이드 함수이기 때문 : 미분값이 1보다 작아지기 때문에 지속적으로 곱할 경우 0에 가까워짐.
✔️ 다양한 활성화 함수 도입
keras.optimizers.SGD(lr=0.1)
keras.optimizers.SGD(lr=0.1, momentum=0.9)
keras.optimizers.SGD(lr=0.1, momentum=0.9, nesterov=True)
keras.optimizers.Adagrad(lr=0.01, epsilon=1e-6)
keras.optimizers.RMSProp(lr=0.01, rho=0.9, epsilon=1e-6, decay=0.0)
keras.optimizers.Adam(lr=0.01, beta_1 = 0.9, beta_2=0.999, epsilon=1e-6, decay=0.0)