3. 딥러닝의 시작, 신경망

김민지·2024년 3월 24일

데이터패턴인식

목록 보기
3/13

퍼셉트론(Perceptron)

  • 입력값을 여러개 받아 가중치와 곱한 것의 전체 sum을 활성화함수를 거쳐서 0 혹은 1의 값으로 바꾸어 예상값을 출력함. 이 때, 예상값과 실제 값의 차이(오차)에 따라 가중치를 update함.

퍼셉트론의 한계: XOR(Exclusive OR)

  • 그래프에서와 같이, XOR 개념은 선으로 1과 0 값을 가진 점들을 분류할 수 없음.
  • 인공지능의 겨울 시작.
  • 해결책: 다층 퍼셉트론(Multilayer perceptron), 오차 역전파(back propagation)

다층 퍼셉트론(Multilayer perceptron)

  • 성냥개비 여섯개로 정삼각형 네개를 만들 수 있는가? 2차원 평면에서는 불가하나, 피라미드 모형으로 성냥개비를 쌓아올리면 가능함.
  • 이처럼 XOR 문제를 해곃하기 위해, XOR 그래프가 그려진 평면을 대각선으로 휘어서 선 두개를 동시에 긋는 방법으로 해결함

은닉층 (Hidden Layer)

  • Truth table에서, 결괏값만 같으면 equal한 연산이므로 더 복잡한 연산이 단순한 연산을 대신할 수도, 그 반대도 가능하다.
  • 예를 들어, A xor B == (A nand B) and (A or B)
  • 이 때, 괄호 안의 연산(xor, nand)이 은닉층이고, 괄호 밖의 연산(and)이 출력층이 된다.

다층퍼셉트론 구조

  • 이 그림에는 표시되지 않았지만, 선마다 각자 다른 weight(w)가 할당되어있음.

  • a1 = f(x1 * w11 + x2 + w21 + ... + xn * wn1 + b1)

  • output 도 동일하게 a1부터 an까지를 x1...xn처럼 처리해서 구함.

  • 1 로 표시된 부분들은 bias 처리 부분임

  • weight들은 2차원 행렬로, bias들은 1차원 행렬로 표현이 가능함.

  • XOR 문제 해결 코드

import numpy as np

# weight, bias 설정(임의로 정함)
w11 = np.array([-2, -2)]
w12 = np.array([2, 2)]
w2 = np.array([1, 1)]
b1 = 3
b2 = -1
b3 = -1
# perceptron
def MLP(x, w, b): 
	y = np.sum(w*x)+b
    if y <= 0: 
    	return 0
    else: 
    	return 1
# nand gate
def NAND(x1, x2): 
	return MLP(np.array([x1, x2], w11, b1)
# or gate
def OR(x1, x2): 
	return MLP(np.array([x1, x2], w12, b2)
    # nand gate
#and gate
def NAND(x1, x2): 
	return MLP(np.array([x1, x2], w2, b3)
# xor gate
def XOR(x1, x2): 
	return AND(NAND(x1, x2), OR(x1, x2))
    
# x값 임의로 정하기
for x in [(0, 0), (1, 0), (0, 1), (1, 1)]
	y = XOR(x[0], x[1])
    print("입력값: " + str(x) + "출력값: " + str(y))
  • 인공지능의 겨울 이유:
    (1) 은닉층에 들어있는 가중치를 데이터를 통해 학습하는 방법의 부재
    ➡️ Geoffrey Hinton prof.가 오차역전파로 극복함
    (2) SVM, logistic regression model 생성함

오차 역전파(Error Back Propagation)

  • 역할: 은닉층에 포함된 가중치를 업데이트 할 방법
    앞서 XOR 문제의 해결은 불완전해 모델링이라고 부를 수 없음 (input, output을 알고 있는 상태에서 weight와 bias를 미리 알아본 후 대입하는 방식이니까 .. )
  • 은닉층의 가중치를 update하는 것에서의 기존의 문제점은, 예측값과 비교할 실제값이 존재하지 않는다는 것임.
    ➡️ 해결책: 출력층의 오차를 이용해 델타식 세우기
    ➡️ 추가 문제: 깊은 모델을 구축하다보니 가중치 업데이트가 처음층까지 전달되지 않음.
    이유: 시그모이드모델을 미분했을 때의 최댓값이 0.25이므로 계속 곱하다보면 0에 수렴가고, 따라서 여러 층을 거칠 수록 기울기가 사라져 가중치를 수정하기 어려움
    ➡️ 대체 함수들: ReLU, Hyperbolic Tangent(tanh), softplus

경사하강법(Optimizer) 개선안들 ➡️ 속도,정확도 문제 개선

확률적 경사 하강법(SGD: Stochastic Gradient Descent)

  • 기존 경사하강법은 한번 미분할 때마다 전체 데이터를 미분하므로, 속도가 느리고 최적해를 찾기 전에 최적화 과정이 멈출 수도 있음.
  • 전체 데이터를 사용하지 않고, 랜덤하게 추출한 일부 데이터만 사용하도록 개선해서 빠르고 더 빈번하게 update할 수 있도록 함.

모멘텀 확률적 경사 하강법 (momentum SGD)

  • 경사하강법과 마찬가지로 매번 기울기를 구하지만, 이를 통해 오차를 수정하기 바로 앞 수정값과 방향을 참고해 같은 방향으로 일정한 비율만 수정되도록 함. 따라서 수정 방향이 +, -를 오가며 이리저리 수정되는 현상을 방지하고 이전 이동 값을 고려해 일정 비율만큼 다음 값을 결정하므로 관성효과 가능

Adam

  • 최근 가장 빈번하게 쓰이는 경사하강법

정리

  • 다층 퍼셉트론, 오차 역전파 ➡️ XOR 문제 해결

0개의 댓글