Data/ML

Deep Learning(딥러닝) - 1.딥러닝의 역사와 Perceptron(퍼셉트론)

뚱요 2021. 10. 13. 00:00
반응형

1. 딥러닝(Deep Learning)

인공지능(人工知能) / A.I. (Artificial Intelligence)
인간이 지닌 지적 능력의 일부 또는 전체, 혹은 그렇게 생각되는 능력을 인공적으로 구현한 것을 말한다.
기계 학습(機械學習) / 머신 러닝(영어: machine learning)
경험을 통해 자동으로 개선하는 컴퓨터 알고리즘의 연구이다. 인공지능의 한 분야로 간주된다. 컴퓨터가 학습할 수 있도록 하는 알고리즘과 기술을 개발하는 분야이다

인공신경망(人工神經網, 영어: artificial neural network, ANN)
기계학습과 인지과학에서 생물학의 신경망(동물의 중추신경계 중 특히 뇌)에서 영감을 얻은 통계학적 학습 알고리즘이다.
물학적 뇌가 동작하는 방식을 모티브로 뇌의 신경세포(뉴런)들이 서로 연결되어 입력 신호를 수상/가지 돌기(Dendrites)로 받으면 오른쪽의 축삭 말단까지(axon terminals)로 화학적 전기적 신호를 처리하고 전달한다
- 뉴론들이 서로 연결되어 입력에 따라 활성화되는 정도가 다름
딥 러닝(deep structured learning, deep learning 또는 hierarchical learning)
인공신경망(Artificial Neural Network, ANN)에 기반하여 3개이상의 히든 레이어로 이루어진 다층 퍼셉트론이다
여러 비선형 변환기법의 조합을 통해 높은 수준의 추상화(abstractions, 다량의 데이터나 복잡한 자료들 속에서 핵심적인 내용 또는 기능을 요약하는 작업)를 시도하는 ML학습 알고리즘의 집합으로 정의되며, 큰 틀에서 사람의 사고방식을 컴퓨터에게 가르치는 기계학습의 한 분야라고 이야기할 수 있다.
  • 딥러닝은 인공지능(Artificial Intelligence, AI), 머신러닝(Machine Learning, ML)의 하위 개념

특징

  • 스스로 데이터의 특성 학습
  • 지도, 비지도 학습 모두 가능
    • e.g. 활용 사례: 얼굴 인식, 번역, 강화학습, 자율주행 자동차

 

인공신경망의 역사

인공 신경망 모델의 역사

1.1 McCulloch-Pitts Neuron(MCP Neuron) or Threshold Logic Unit (TLU)

1943년에 초기 인공 신경 신경계 모델로 McCulloch Pitts에 의해 제안되었다.

  • 사람 뇌의 신경 시스템을 모방한 모델로 입출력 모두 0,1로 이우러 진 이진법적 모델.
    • 신경 활동은 All-or-None인 이진적이라고 가정했다.

Threshold Logic Unit (TLU)

0,1 로 이우어진 입력을 뉴런에서 입력받아서 함수에 의해서 0,1 값으로 출력한다. 

  • 활성화 함수(activation function)
    • 문지기 같은 역할로 세포체에서 계산된 값이 특정 임계값(threshold) 보다 크면 함수에 따라서 출력 값이 결정됩니다. 

자세한 내용과 구현은 그다음 퍼셉트론에서 다룬다.

1.2 퍼셉트론(Perceptron)

로젠블라트(Rosenblatt)에 의해서 위를 기반으로 출력 신호의 결정 여부를 결정하는 가중치를 학습하는 알고리즘을 (단층) 퍼셉트론(Perceptron)을 제안하였습니다. 가중치는 각 뉴런이 연결 강도를 조정하는 학습 과정의 방식으로 제시하였습니다. 

(1) 퍼셉트론의 기본 구조

  • 입력 (X)
  • 가중치(Weight):입력값의 신호(중요성) 세기 조절
  • 편향(Bias,θ): 뉴런이 얼마나 쉽게 활성화되는지의 정도
  • 출력 값(y)
    • 1 활성화
    • 0 비활성화
  • 활성화 함수(activation function) : step function
    • 활성화 함수를 사용하면 노이즈를 제거하고 복잡도를 낮춘다.

step function

θ(theta)가 임계값을 0으로 나타내는 경우

y= step_function(WX+b)=step_function(w0+w1*x1+w2*x2+b)

예. y= step_function(0.5* 1+0.5*0 - 0.6)= step_function(-0.1) = 0 

y=0이므로 비활성화 된다.

 

def perceptron(w, x, b):
    
    output= sum([x_i *w_i for x_i,w_i in zip(x,w)])+b
    y = step_function(output)
    
    return y
    
def step_function(values):
    return 1 if values >=0 else 0

#1차원 리스트의 가중치, bias값 임의 설정
x = [1,2,3,4]

w = [.3,.5,.1,.7]
b = -2

y = perceptron(w,x,b)
print(y)

(2) 단층 퍼셉트론 - 선형 분류기

  • 선형 분류기로 선 하나로 데이터를 구분한다.
  • AND gate, OR gate, NAND, NOR 게이트와 같은 선형 분류 문제는 퍼셉트론으로 해결할 수 있다.
Input1 Input2 AND Output OR Output NAND Output NOR Output
0 0 0 0 1 1
0 1 0 1 1 0
1 0 0 1 1 0
1 1 1 1 0 0

 

import numpy as np

def AND_gate(x1, x2):
    
    x = np.array([x1, x2])
    
    weight = np.array([0.5,0.5])
    
    bias = -0.6
    
    y = np.matmul(x,weight)+bias
    
    return Step_Function(y)
    
def OR_gate(x1, x2):
    
    x = np.array([x1, x2])
    
    weight = np.array([0.5,0.5])
    
    bias = -0.1
    
    y = np.matmul(x,weight)+bias
    
    return Step_Function(y)

def NAND_gate(x1, x2):
    
    x = np.array([x1,x2])
    
    weight = np.array([-.5,-.5])
    
    bias = 0.6
    
    y = np.matmul(x,weight)+bias
    
    return Step_Function(y)

def NOR_gate(x1, x2):
    
    x = np.array([x1,x2])
    
    weight = np.array([-.5,-.5])
    
    bias = 0.1
    
    y = np.matmul(x,weight)+bias
    
    return Step_Function(y) 

def Step_Function(y):
    
    return 0 if y <0 else 1

def main():
    array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    print('AND Gate')
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ',AND_gate(x1, x2))
    
    print('\\nOR Gate')
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ',OR_gate(x1, x2))
    print('NAND Gate'    
    for x1, x2 in array:
        print('Input: ',x1, x2, ' Output: ',NAND_gate(x1, x2))
    
    print('\\nNOR Gate')   
    for x1, x2 in array:
        print('Input: ',x1, x2, ' Output: ',NOR_gate(x1, x2))

if __name__ == "__main__":
    main()

(3) 한계 : 비선형 Exclusive-OR(XOR, 배타적 논리합) 문제

하나의 선으로 주어진 데이터들을 분류할 수 없는 비선형 문제로 대표적으로 XOR Gate가 있다. 실제 세상의 대부분의 예시는 비선형이다. 

XOR Gate는 입력값이 (0,1), (1,0) 일 때 출력 값이 1이다. Perceptrons by Minsky and Parpert(1969)에서 퍼셉트론의 한계를 명확하게 지적하면서 신경망 연구 다층 퍼셉트론이 나오기 전까지  첫 번째 AI 겨울이 찾아오게 됩니다.

import numpy as np

def XOR_gate(x1, x2):
    
    x = np.array([x1,x2])
    
    weight = np.array([.5,.5])
    
    bias = 0
    
    y = np.matmul(x,weight)+bias
    
    return Step_Function(y)

def Step_Function(y):
    
    return 1 if y >=0 else 0

def main():
    
    Input = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])        
    Output = np.array([[0], [1], [1], [0]])
    
    print('XOR Gate 출력')
    XOR_list = []
    
    for x1, x2 in Input:
        print('Input: ',x1, x2, ' Output: ', XOR_gate(x1, x2))
        XOR_list.append(XOR_gate(x1, x2))
    
    hit = 0
    for i in range(len(Output)):
        if XOR_list[i] == Output[i]:
            hit += 1

if __name__ == "__main__":
    main()

 

Scikit-laern로 퍼셉트론 구현하기

  • max_iter : 모델 학습 최대 횟수
  • eta0 : 모델에 사용되는 가중치가 업데이트되는 속도 (default = 1)
import numpy as np
from visual import *
from sklearn.linear_model import Perceptron

np.random.seed(100)     #고정
#10 hidden layers , 5 perceptrons
clf =  Perceptron(max_iter = 20, eta0 = 1e-6)
clf.fit(X, Y)
score= clf.score(X_test,Y_test)    #accuracy 0<= acc<= 1.0 
pred = perceptron.predict(X_test) #예측값

1.3 다층 퍼셉트론(Multi-layers Perceptron)

제프리 힌튼, 데이비드 럼멜 하트, 노스이스턴 대학의 로널드 윌리엄스가 오류역전파를 다층 퍼셉트론에 적용, 학습에 성공하면서(최초 아님) 침체기가 끝나게 됩니다. 오류 역전파(Back-propagation)는 출력층의 오차를 거꾸로 입력층의 방향으로 보내면서, 은닉층의 노드 사이의 가중치를 재조정한다. 오류 역전파는 다음에 다룬다.

Input1 Input2 AND Output OR Output NAND Output XOR Output
0 0 0 0 1 0
0 1 0 1 1 1
1 0 0 1 1 1
1 1 1 1 0 0

단층 퍼셉트론을 여러 개 쌓은 것이다. OR, NAND를 AND로 쌓아주면 XOR문제가 해결된다.

 

import numpy as np

def AND_gate(x1,x2):
    
    x = np.array([x1,x2])
    
    weight = np.array([.5,.5])
    
    bias = -.6
    
    y = np.matmul(x,weight)+bias
    
    return Step_Function(y) 

def OR_gate(x1,x2):
    
    x = np.array([x1,x2])
    
    weight = np.array([.5,.5])
    
    bias = -.1
    
    y = np.matmul(x,weight)+bias
    
    return Step_Function(y) 

def NAND_gate(x1,x2):
    
    x = np.array([x1,x2])
    
    weight = np.array([-.5,-.5])
    
    bias = .6
    
    y = np.matmul(x,weight)+bias
    
    return Step_Function(y) 

def Step_Function(y):
    
    return 0 if y<0 else 1

def XOR_gate(x1, x2):
    
    nand_out=NAND_gate(x1,x2)
    or_out=OR_gate(x1,x2)
    
    return AND_gate(nand_out,or_out)

def main():
     array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    print('XOR Gate')
    
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ', XOR_gate(x1, x2))

if __name__ == "__main__":
    main()

 

Scikit-laern 다층퍼셉트론 구현하기

싸이킷런에서 이미 구현되어 있는 다층 퍼셉트론을 이용해서 해당 문제 해결해보기

  • hidden_layer_sizes: 은닉층 수와 퍼셉트론 수
import numpy as np
from visual import *
from sklearn.neural_network import MLPClassifier

np.random.seed(100)     #고정
clf = MLPClassifier(hidden_layer_sizes=(10, 5))
clf.fit(X, Y)
score= clf.score(X_test,Y_test)    #accuracy 0<= acc<= 1.0 
pred = perceptron.predict(X_test) #예측값

 

두 모델을 직접적으로 비교할 수는 없지만 비슷한 정확도 나오도록 해보았다.

import numpy as np

from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Perceptron
from sklearn.neural_network import MLPClassifier

np.random.seed(100)

iris = load_iris()

X = iris.data[:,2:4]
Y = iris.target

X_train, X_test, Y_train, Y_test =train_test_split(X,Y,test_size=.2, random_state=0)
perceptron = Perceptron(max_iter = 20, eta0 = 1e-6)
perceptron.fit(X_train,Y_train)

pred = perceptron.predict(X_test)
accuracy=perceptron.score(X_test,Y_test)
print("Perceptron's accuracy:",accuracy)

mlp = MLPClassifier(hidden_layer_sizes=(100, 50))
mlp.fit(X_train, Y_train)
score= mlp.score(X_test,Y_test)    #accuracy 0<= acc<= 1.0 
pred = mlp.predict(X_test) #예측값
print("MLPClassifier's accuracy:",score)
#Perceptron's accuracy: 0.9333333333333333
#MLPClassifier's accuracy: 0.9666666666666667

 

출처:

반응형