본문 바로가기

Deep Learning

[밑바닥부터 시작하는 딥러닝] Ch1. 파이썬 & Ch2. 퍼셉트론

대학 4학년 때 인공지능 과목 교재였는데 그 당시에는 사지 않았고(교재 없어도 인터넷에 자료가 많아서..), 

인턴 동기가 딥러닝 기초 다지기에 좋다고 추천하기도 해서 다시 제대로 읽어볼까 싶은 마음에 구매했다.


Chapter 1. 헬로 파이썬

파이썬 기본 문법에 대한 단원이다. 클래스에 대한 부분만 복습 겸 발췌했다.

클래스

class Man: # 클래스 이름
  def __init__(self, name): # 생성자. (name: 인수)
    self.name = name # self.name : 인스턴스 변수
    print("Initialized!")

  def hello(self): # 메서드
    print("Hello "+ self.name)

m = Man("Seula") # m: 인스턴스(객체)
m.hello()

 

  • init 메서드 : 클래스를 초기화하는 방법을 정의. 생성자라고도 함. 클래스의 인스턴스가 만들어질 때 한번만 불림.
  • 파이썬에서는 메서드의 첫번째 인수로 자신(자신의 인스턴스)을 나타내는 self를 명시적으로 씀.

Chapter 2. 퍼셉트론

2.1 퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다.

퍼셉트론 신호는 '흐른다/안 흐른다(1이나 0)'의 두가지 값을 가질 수 있다.

 

입력이 2개인 퍼셉트론

  • $x_{1}$과 $x_{2}$는 입력신호, $y$는 출력신호, $w_{1}$과 $w_{2}$는 가중치를 뜻한다.
  • 그림의 원을 뉴런 혹은 노드라고 부른다.
  • 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. ($w_{1}x_{1}$, $w_{2}x_{2}$)
  • 뉴런에서 보내온 신호의 총합이 정해진 한계(임계값, $\theta$)를 넘어설 때만 1을 출력한다. (= '뉴런이 활성화한다')

$$ y =\begin{cases}0 & (w_{1}x_{1} + w_{2}x_{2} \leq \theta )\\1 & (w_{1}x_{1} + w_{2}x_{2} > \theta )\end{cases} $$

  • 가중치가 클수록 해당 신호가 그만큼 더 중요함을 뜻한다.

2.2 단순한 논리 회로

AND 게이트

두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0을 출력한다.

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    tmp = x1 * w1 + x2 * w2

    if tmp <= theta :
        return 0
    else:
        return 1

print(AND(0, 0)) # 0
print(AND(1, 0)) # 0
print(AND(0, 1)) # 0
print(AND(1, 1)) # 1

NAND 게이트와 OR 게이트

NAND는 Not AND를 의미하며, 그 동작은 AND 게이트의 출력을 뒤집은 것이 된다.
두 입력이 모두 1일 때만 0을 출력하고, 그 외에는 1을 출력한다.

2.3 퍼셉트론 구현하기

가중치와 편향 구현

$$ y =\begin{cases}0 & (b + w_{1}x_{1} + w_{2}x_{2} \leq 0 )\\1 & (b + w_{1}x_{1} + w_{2}x_{2} > 0 )\end{cases} $$

  • b를 편향(bias)이라 한다.

  • $w_{1}$과 $w_{2}$는 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수

  • 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수

AND

import numpy as np

def AND(x1, x2):
    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

print(AND(0, 0)) # 0
print(AND(1, 0)) # 0
print(AND(0, 1)) # 0
print(AND(1, 1)) # 1

NAND

import numpy as np

def NAND(x1, x2):
    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

print(NAND(0, 0)) # 1
print(NAND(1, 0)) # 1
print(NAND(0, 1)) # 1
print(NAND(1, 1)) # 0

OR

import numpy as np

def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.4
    tmp = np.sum(w * x) + b

    if tmp <= 0:
        return 0
    else:
        return 1

print(OR(0, 0)) # 0
print(OR(1, 0)) # 1
print(OR(0, 1)) # 1
print(OR(1, 1)) #1

2.4 퍼셉트론의 한계

XOR 게이트는 배타적 논리합이라는 논리 회로이다.
두 입력 중 한쪽이 1일 때만 1을 출력한다.
퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다.
단층 퍼셉트론으로는 XOR 게이트를 구현할 수 없다.

2.5 다층 퍼셉트론이 출동한다면

AND, NAND, OR게이트를 조합해 구현한 XOR 게이트

XOR

def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)

    return y

print(XOR(0, 0)) # 0
print(XOR(0, 1)) # 1
print(XOR(1, 0)) # 1
print(XOR(1, 1)) # 0

 

 

XOR의 퍼셉트론

  • AND, OR가 단층 퍼셉트론인 데 반해, XOR은 2층 퍼셉트론이다.
  • 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 한다.
  • 단층 퍼셉트론으로는 표현하지 못한 것을 층을 늘려 구현할 수 있다.

'Deep Learning' 카테고리의 다른 글

[밑바닥부터 시작하는 딥러닝] Ch3. 신경망  (0) 2021.01.16