http://cafe.naver.com/telcosn/554 주소복사 게시글분석

강의를 듣기 시작했다.

강의를 2강의 쯤 들었을때 수학이 필요하겠다라는 생각이 들었다.

텐서플로우는 파이썬 기반으로 개발이 된듯 하다. 파이썬으로 가벼운 프로그램 만들 수 있는 수준이라면

강의 듣는데는 문제가 생기진 않는다.

수학 공부를.. 제대로 하지 않은 나로서는 고민이 많이 되었다.  필요한 수학을 먼저 공부하고 들을지

아니면 어차피 제공되는 TensorFlow API를 쓰면 되는거라 대략 이해되면 넘어갈지.


고민하던차에, 먼저 강의를 쭈욱 들어보기로 했다. 현재 섹션 7까지 들었다.

섹션 4까지는 그리큰 시간을 투자하지 않아도 언급되는 수학 수식에 대한 이해가 그렇게 어렵지는 않았다.

Logistic (Regression) Classification에서 부터는 어려움을 느꼈고, 수식이 정확히 이해되지 않아도 큰 그림과 설명하는 의도가 이해가 되면, 그냥 넘어가면서 섹션 7까지 왔다.


섹션7까지 오면서, 점점 더 언급되는 수식이라도 정확히 이해하고 강의를 듣고 싶은 마음이 들었다. 수식을 이해하고 있다면 좀더 재미를 느낄 수 있지 않을까 라는 생각이 들기도 한다.

그래서 잠시.. 갈길을 멈추고, 수식을 먼저 공부하고자 한다.



섹션 0. 오리엔테이션
수업 소개와 개요 미리보기 00:10:00
섹션 1. 머신러닝의 개념과 용어
기본적인 Machine Learnnig 의 용어와 개념 설명 미리보기 00:12:00
TensorFlow의 설치및 기본적인 operations (new) 00:17:00
섹션 2. Linear Regression 의 개념
Linear Regression의 Hypothesis 와 cost 00:13:00
Tensorflow로 간단한 linear regression을 구현 (new) 00:15:00
섹션 3. Linear Regression cost 함수 최소화
Linear Regression의 cost 최소화 알고리즘의 원리 00:16:00
Linear Regression 의 cost 최소화의 TensorFlow 구현(new) 00:15:00
섹션 4. 여러개의 입력(feature)의 Linear Regression
multi-variable linear regression (new) 00:17:00
lab 04-1: multi-variable linear regression을 TensorFlow에서 구현하기 미리보기 00:08:00
lab 04-2: TensorFlow로 파일에서 데이타 읽어오기 (new) 00:06:00
섹션 5. Logistic (Regression) Classification
Logistic Classification의 가설 함수 정의 00:15:00
Logistic Regression의 cost 함수 설명 00:14:00
TensorFlow로 Logistic Classification의 구현하기(new) 00:15:00
섹션 6. Softmax Regression (Multinomial Logistic Regression)
Multinomial 개념 소개 00:10:00
Cost 함수 소개 00:15:00
lab 06-1: TensorFlow로 Softmax Classification의 구현하기 (new) 00:12:00
lab 06-2: TensorFlow로 Fancy Softmax Classification의 구현하기 (new) 00:16:00
섹션 7. ML의 실용과 몇가지 팁
학습 rate, Overfitting, 그리고 일반화 (Regularization) 00:14:00
Training/Testing 데이타 셋 00:09:00
lab 07-1: training/test dataset, learning rate, normalization (new) 00:11:00
lab 07-2: Meet MNIST Dataset (new) 00:13:00

 

Posted by 이성윤

퍼셉트론은(Perceptron)은 프랑크 로젠블라트(Frank Rosenblatt)가 1957년에 고안한 알고리즘이다.

이 알고리즘은 퍼셉트론이 신경망(딥러닝)의 기원이 되는 알고리즘이기 때문에 꼭 알아야 하는 개념이라고 생각한다.


1. 퍼셉트론이란?

퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력한다. 여기서 말하는 신호란 전류나 강물처럼 흐름이 있다는 것을 생각하면 된다. 전류가 전선을 타고 흐르는 전자를 내보낸듯, 퍼셉트론 신호도 흐름을 만들고 정보를 앞으로 전달한다. 다만, 실제 전류와 달리 퍼셉트론 신호는 '흐른다/안 흐른다(1 or 0)'의 두 가지 값을 가질 수 있다.

 

 

입력신호: x1,x2

가중치: w1,w2

출력신호:y

원: 뉴런 또는 노드

 

입력 신호가 뉴런에 보내질때는 각각 고유한 가중치가 곱해진다. 뉴런에서 보내온 신호의 총합이 임계치를 넘어설 때만 1을 출력한다.

 

이를 수식으로 나타내면 아래와 같다.

 

세타(θ)를 -b로 치환하면 아래와 같은 식이 된다.

※ b는 편향(bias)이라 하며, w1과w2는 가중치이다. 퍼셉트론은 입력신호에 가중치를 곱한 값과 편향을 더하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다. 가중치는 각 입력신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수고, 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수이다.

 

퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여한다.  가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다. 가중치가 클 수록 해당 신호가 그만큼 더 중요하다는것을 뜻한다.

 

※ 가중치는 전류에서 말하는 저항에 해당한다. 저항은 전류의 흐름을 억제하는 매개변수로, 저항이 낮을수록 큰 전류가 흐른다. 한편 퍼셉트론의 가중치는 그 값이 클수록 강한 신호를 흘려보낸다. 이처럼 서로 작용하는 방향은 반대지만, 신호가 얼마나 잘(혹은 어렵게) 흐는가를 통제한다는 점에서 저항과 가중치는 같은 기능을 한다.

※ 편향이라는 용어는 "한쪽으로 치우쳐 균형을 깬다"라는 의미를 담고 있다.

 

 

1.1 AND 게이트

                                                         [AND 게이트 진리표]

 

AND 게이트를 퍼셉트론으로 표현하려면 어떻게 해야할까? W1, W2, θ 값을 정하여 조건을 충족하는 퍼셉트론을 만들어야 한다.

Ex) 0.5*x1+0.5*x2 > 0.7

       0.5*x1+0.5*x2 > 0.8

 

AND 게이트 조건을 만족하는 매개변수 조합은 무수히 많다.

 

and_gate.py

 

# coding: utf-8
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

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = AND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

 

1.2 NAND 게이트

                                                         [NAND 게이트 진리표]

 

NAND게이트는 AND 게이트를 구현하는 매개변수의 부호를 반전

Ex) -0.5*x1-0.5*x2 > -0.7
       -0.5*x1-0.5*x2 > 0.8

 

NAND 게이트 조건을 만족하는 매개변수 조합은 무수히 많다.

 

nand_gate.py

# coding: utf-8
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

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = NAND(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

 

1.3 OR 게이트

                                                         [OR 게이트 진리표]

 

입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로

Ex) 0.5*x1+0.5*x2 > 0.3
       0.5*x1+0.5*x2 > 0.4

 

OR게이트 조건을 만족하는 매개변수 조합은 무수히 많다.

 

or_gate.py

# coding: utf-8
import numpy as np


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

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = OR(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

 

※ 퍼셉트론의 매개변수 값을 정하는 것은 컴퓨터가 아니라 사람이 하는 것이다. 사람이 직접 진리표라는 '학습 데이터'를 보면서 매개변수의 값을 생각했다. 기계학습 문제는 이 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하도록 한다. 학습이란 적절한 매개변수 값을 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)를 고민하고 컴퓨터에 학습할 데이터를 주는 일을 한다.

 

1.4 XOR 게이트

                                                         [XOR 게이트 진리표]

 

 

                  [OR 게이트]                                             [XOR 게이트]

 

 OR게이트는 0을 원(○)으로 1을 삼각형(△)으로 나타낸 네 점을 직선으로 나누는데 문제가 없다. 하지만 XOR 게이트는 원과 삼각형을 직선으로 나누는 영역을 만드는것이 불가능하다.

 

1.5 선형과 비선형

직선하나로는 원과 삼각형을 나눌 수 없다. 하지만 '직선'이라는 제약을 없앤다면 가능하다. 퍼셉트론은 직선하나로 나눈 영역만 표시할 수 있다는 한계가 있다. 곡선을 표현 할 수 없다는 말이다. 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.

 

 

1969년에 Marvin Minsky 교수가, 이 문제를 해결 하는 방법으로 Perceptron을 다중으로 겹치면 이 문제를 해결할 수 있음을 증명하였다.

 

 

2. 다층퍼셉트론

퍼셉트론으로는 XOR게이트를 표현할 수 없다. 퍼셉트론의 장점은 층을 쌓아 "다층 퍼셉트론(Multi-Layer Perceptron)"을 만들 수 있다.

 

 

2.1 기존 게이트 조합하기

XOR 게이트를 만드는 방법은 다양하며, 그중 AND, NAND, OR 게이트를 조합하는 방법이 있다.

 

 

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

x1과 x2는  NAND와 OR 게이트의 입력이 되고, NAND와 OR의 출력이 AND 게이트의 입력으로 이어진다.

논리회로(NAND Gate)로 만든 XOR와 퍼셉트론으로 만든 XOR함수의 관계는?

- Multi-Layer (Cascaded)

 Multi-Layer Perceptron이 갖는 장점?

- 비선형성!

 

2.2 조합한 XOR 게이트

 

xor_gate.py

# coding: utf-8
from and_gate import AND
from or_gate import OR
from nand_gate import NAND


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

if __name__ == '__main__':
    for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
        y = XOR(xs[0], xs[1])
        print(str(xs) + " -> " + str(y))

 

XOR게이트의 퍼셉트론

 

 

a. 0층의 듀 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다.

b. 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 이 입력 신호를 바탕으로 y를 출력한다.

 

 

3. 정리

- 퍼셉트론은 입출력을 갖춘 알고리즘이다. 입력을 주면 정해진 규칙에 따른 값을 출력한다.

- 퍼셉트론에서는 '가중치'와 '편향'을 매개변수로 설정한다.

- 퍼셉트론으로 AND, OR 게이트 등의 논리 회로를 표현할 수 있다.

- XOR게이트는 단츤 퍼셉트론으로 표현할 수 없다.

- 2층 퍼셉트론을 이용하면 XOR게이트를 표현할 수 있다.

- 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현할 수 있다.

- 다층 퍼셉트론은 (이론상) 컴퓨터를 표현 할 수 있다.

 

Github: https://github.com/hwauni/MachineLearning/tree/master/ML_alg/Perceptron

 

- 밑바닥부터 시작하는 딥러닝 -

 

'머신러닝&딥러닝 > 알고리즘' 카테고리의 다른 글

계단 함수(Step Function)  (0) 2017.12.18
인공 신경망  (0) 2017.12.18
Posted by 이성윤