반응형



안녕하세요~


오늘은 XOR(다층 퍼셉트론)신경망 활성화 함수(activation function) 에 대해 알아보겠습니다.



우선, 이전 포스팅 퍼셉트론에 이어


XOR에 대해 먼저 알아보도록 하겠습니다.


[ XOR 진리표 ]


XOR 게이트는 단층 퍼셉트론으로 구현이 되지 않습니다.


따라서, 다층 퍼셉트론으로 구현해야합니다.



" 단층 퍼셉트론 vs 다층 퍼셉트론 "


"단층 퍼셉트론"이란,

AND, OR, NAND 게이트와 같이


입력층에 가중치를 곱해 바로 출력되는 퍼셉트론입니다.


아래와 같이 표현할 수 있습니다. 




"다층 퍼셉트론"이란,

퍼셉트론을 층으로 쌓은 것으로,


입력층과 출력층 사이 은닉층이 존재하는 것입니다.




위와 같은 다층 퍼셉트론으로 XOR 게이트를 구현할 수 있습니다.



XOR 게이트는 아래와 같이 AND, OR, NAND를 조합해서 만들 수 있습니다.






※ 참고: 각각의 게이트는 아래와 같은 의미 갖고 있습니다.




이제 XOR 진리표를 완성해볼까요?




문제1. XOR 게이트를 파이썬으로 구현해보세요








활성화 함수란?


입력신호의 총합을 출력신호로 변환하는 함수를 일반적으로 활성화 함수라고 합니다.

활성화 함수는 입력신호의 총합이 활성화를 일으키는지 정하는 역할을 합니다.


출처: Deep Learning from Scratch



" 활성화 함수의 종류 3가지 "


1. 계단함수(Step Function) : 0 또는 1 의 값을 출력하는 함수


2. 시그모이드 함수(Sigmoid Function) : 0 ~ 1 사이의 실수를 출력하는 함수


3. ReLu(Rectified Linear Units) : 입력이 0이 넘으면 그 입력값을 그대로 출력하고 0 이하이면 0을 출력하는 함수




이제 각각의 특징을 알았으니, 파이썬으로 구현해보도록 하겠습니다.




1. 계단함수 (Step Function)


" 퍼셉트론에서는 활성화 함수로 계단함수를 이용한다. "



" numpy로 계단함수 구현하기 "

import numpy as np


def step_function(x_data): # return [0 if x<=0 else 1 for x in x_data ]

# np.array.astype(np.int): bool type을 정수로 변환하기 return (x_data > 0).astype(np.int)


문제2. 위에서 만든 계단함수를 이용해서, 아래와 같이 그래프를 그리시오







2. 시그모이드 함수 (Sigmoid Function)



※ 계단함수와 시그모이드 함수의 공통점 & 차이점


[공통점]


둘다 0과 1 사이의 데이터만 출력한다

비선형 함수이다.


[차이점]


계단함수는 숫자 1 과 0만 출력하는데 시그모이드 함수는 0과 1사이의 실수를 출력한다.



[시그모이드 함수식]

sigmoid



" 통계학에서 성공할 확률이 실패할 확률보다 얼마나 큰지를 나타내는 오즈비율이라는 값이 있다. "



오즈비율(Odds ratio) = 성공 / 실패 = P / (1 - P)



성공할 확률 P를 0에서 1사이의 값으로 나타내면,

실패할 확률은 (1 - P)이다.


위에 그래프에서 확인할 수 있듯이,

P(성공할 확률)가 1에 가까워지면 오즈 비율 값이 급격히 커지는 현상이 발생한다.



그러한 현상을 방지하기 위해, 로그를 취한 Logit이라는 함수를 만든다.



로그를 사용하는 이유: 큰 숫자를 작은 숫자로 표현하기 위해





Logit Function = log(P/(1-P)) = wx + b



이 로짓 함수를 뉴런의 출력값에 따라 확률 P를 구하기 쉽도록 지수 함수 형태로 바꾸면,


위에서 확인한 시그모이드 함수가 됩니다.



" numpy로 Sigmoid 함수 구현하기"


import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x))


문제3. 위에서 만든 시그모이드 함수를 이용해서, 아래와 같이 그래프를 그리시오





3. ReLu 함수( RectifiedLinearUnits Function)


" 최근에는 활성화 함수로 ReLU(렐루)함수를 주로 이용합니다 "


이유는 이후 포스팅에 설명하겠습니다.



"numpy로 ReLU 함수 구현하기"

import numpy as np

def relu(x):
# if x <= 0: # return 0 # return x

# maximum 은 두 입력 중 큰 값을 선택해 반환하는 함수이다.
return np.maximum(0,x)


문제4. 위에서 만든 렐루(ReLU)함수를 이용해서, 아래와 같이 그래프를 그리시오







오늘은 여기까지!!


다음 주에는 신경망으로 돌아올게요!!

반응형
반응형



안녕하세요~


오늘은 신경망의 기본! 퍼셉트론에 대해 알아보겠습니다~


퍼셉트론이란? 다수의 신호를 입력받아 하나의 신호를 출력하는 알고리즘입니다.



1943년 미국 신경외과 의사인 워렌 멕컬록에 의해서 발단이되었고


1957년 프랑크 로젠 블라트가 퍼셉트론 알고리즘을 고안했습니다.


사람의 뇌의 동작을 전기 스위치의 on / off 로 흉내낼 수 있다는 이론을 증명하였습니다.


간단히 말하면, 인간의 신경 세포 하나를 흉내낸 것으로

기본 가정은 아래와 같습니다.




1. 자극(simulus)   2. 역치(threshold)  3. 반응(response)



" 특정 자극이 있다면 그 자극이 어느 역치(theta: 임계값) 이상이어야지만 세포가 반응한다. "




입력신호의 연결강도가 가중치(Weight)인데,


입력신호가 뉴런에 보내질 때는 각각의 고유한 가중치가 곱해집니다.



퍼셉트론은 n 개의 이진수가 하나의 뉴런을 통과해서


가중치의 합이 0보다 크면 활성화되는 가장 간단한 신경망입니다.



문제1. 위의 식을 파이썬 Numpy 패키지로 구현하시오.



가정: theta = 0 ; x1 = 0; x2 = 1; w1 = 0.5; w2 = 0.5





퍼셉트론으로 단순한 논리 회로 4가지를 구현해보도록 하겠습니다.



1. AND 게이트




def AND(x1, x2): x = np.array([x1,x2]) w = np.array([0.5,0.5]) theta = 0.7 if np.sum(w*x) <= theta: return 0 else: return 1



inputData = np.array([[0,0],[1,0],[0,1],[1,1]])

for x in inputData: print(x[0],", ",x[1]," ==> ",AND(x[0],x[1]), sep = '')



2. OR 게이트




def OR(x1,x2): x = np.array([x1,x2]) w = np.array([?,?]) # 채워넣으세요~ theta = ? # 채워넣으세요~ if np.sum(w*x) <= theta: return 0 else: return 1


inputData = np.array([[0,0],[1,0],[0,1],[1,1]]) for x in inputData: print(x[0],", ",x[1]," ==> ",OR(x[0],x[1]), sep = '')





3. NAND 게이트




def NAND(x1,x2): x = np.array([x1,x2]) w = np.array([?,?]) # 채워넣으세요~ theta = ? # 채워넣으세요~ if np.sum(w*x) <= theta: return 0 else: return 1

inputData = np.array([[0,0],[1,0],[0,1],[1,1]]) for x in inputData: print(x[0],", ",x[1]," ==> ",NAND(x[0],x[1]), sep = '')





4. XOR 게이트




XOR 게이트를 퍼셉트론으로 해결해보세요!


결과는 다음 포스팅에서!





오늘은 여기까지~


다음 포스팅은

활성함수로 돌아오겠습니다!

반응형
반응형

 

 

이제 마지막 관문 파이썬으로 딥러닝하기!입니다.

 

 

우선, 딥러닝이란 무엇일까요?

 

 

딥러닝이란,

 

간단히 말하자면, 머신러닝의 신경망 알고리즘보다 더 deep하고 더 wide한 신경망으로

 

보다 느리지만 보다 정확한 결과를 얻을 수 있는 알고리즘입니다!

 

 

 

머신러닝이 궁금하신분은 아래의 링크를 타고 가시면 됩니다!

 

R로 머신러닝하기에서 머신러닝이란?

 

 

 

본격적인 딥러닝에 앞서,

딥러닝을 하기위해 필요한 numpy, matplotlib 패키지에 대해 알아보겠습니다.

 

 

[numpy 패키지란?]

 

1. 숫자배열 연산을 위한 라이브러리입니다.

 

2. numpy array는 파이썬 리스트보다 속도가 빠르며 리스트간 연산에 편의성을 제공합니다.

 

3. sorting이나 indexing, intersection을 찾는 경우에도 속도가 빠릅니다.

 

4. 평균, 중앙값, 최빈값, 사분위수, 분산, 표준편차를 찾는 경우에도

리스트보다 훨씬 코드가 간단하고 속도가 빠릅니다.

 

 

문제1. 아래의 행렬을 numpy로 만드시오

 

1 2

3 4

 

더보기

import numpy as np

 

print(np.array([[1,2],[3,4]]))

 

 

 

문제2. 아래의 행렬연산을 numpy로 수행하시오.

 

1 3 7              0 0 5

  + 

1 0 0              7 5 0

 

 

더보기

import numpy as np

 

a = np.array([[1,3,7],[1,0,0]])

b = np.array([[0,0,5],[7,5,0]])

 

print(a+b)

 

 

 

만약, 위의 문제와 달리,

행렬의 shape(차원, 원소개수)가 다르면 어떻게 연산을 해야할까요?

 

 

numpy 패키지에는 broadcasting라는 특징이 있습니다.

 

The term broadcasting describes how numpy treats arrays with different shapes during arithmetic operations.

Subject to certain constraints, the smaller array is “broadcast” across the larger array so that they have compatible shapes.

 

출처ㅣ SciPy.org

 

broadcasting이란 산술 연산시 다른 shape의 배열을 처리하는 방법으로

 

특정 제약 조건에 따라, 작은 배열을 큰 배열 와 서로 호환되도록

아래와 같이 작은 배열이 큰 배열에 크기를 맞추는 것을 브로드캐스트라고 합니다.

 

 

 

[broadcasting]

 

 

문제3. 위의 braodcasting 그림을 파이썬으로 구현하시오

 

더보기

import numpy as np

 

a = np.array([[1,2],[3,4]])

 

print(a * 10)

 

 

 

문제4. 아래의 배열의 원소들의 평균값을 구하시오

 

import numpy as np

 

a = np.array([1,2,4,5,5,7,10,13,18,21])

 

더보기

print(np.mean(a))

 

※ 참고:

 

중앙값: np.median(a)

 

최대값: np.max(a)

 

최소값: np.min(a)

 

표준편차: np.std(a)

 

분산: np.var(a)

 

 

문제5. 아래의 행렬식을 numpy로 구현하고 아래의 요소에서 15 이상인것만 출력하시오

 

51 55

14 19

0    4

 

더보기

a = np.array([[51,55],[14,19],[0,4]])

 

print(a[a>=15])

 

 

 

[ matplotlib 패키지란? ]

 

딥러닝 실험에서는 그래프 그리기와 데이터 시각화가 중요합니다.

 

matplolib은 파이썬으로 그래프를 그릴 때 유용한 라이브러리 입니다.

 

 

"백문이 불여일타"

 

우선 그래프를 그려볼까요?

 

import numpy as np

import matplotlib.pyplot as plt

 

a = np.array([1,2,4,5,5,7,10,13,18,21])

 

plt.plot(a)

plt.show()

 

다음으로

 

제목, x 라벨, y 라벨을 추가해볼까요?

 

단, matplotlib 라이브러리의 경우 한글 폰트를 지원하지 않습니다.

 

한글 폰트를 넣어주어야합니다.

 

import numpy as np

import matplotlib.pyplot as plt

from matplotlib import font_manager, rc    # 한글 폰트 설정font_name = font_manager.FontProperties(fname="C:/Windows/Fonts/H2PORM.TTF").get_name()rc('font', family=font_name)
x = np.array([0,1,2,3,4,5,6,7,8,9])

y = np.array([1,2,4,5,5,7,10,13,18,21])

 

plt.plot(x,y)

 

plt.title('으니's 소득증가추이')

plt.xlabel('년')

plt.ylabel('연평균 소득(단위:천만)')

plt.show()

 

 

하나의 화면에 여러개의 그래프를 중첩해서 그리고 싶을 때는 어떻게 할까요?

 

import matplotlib.pyplot as plt

from matplotlib import font_manager, rcimport pandas as pd

 

chi = pd.read_csv("창업건수.csv", engine='python')

pae = pd.read_csv("폐업건수.csv", engine='python')

chi = chi.T

 

y = chi.loc['치킨집']

x = chi.iloc[0]

 

pae['년도'] = pae['Unnamed: 0']

px = pae['년도']

py = pae['치킨집']

 

plt.figure(figsize=(6,4))

# 하나의 화면에 여러개의 그래프를 중첩해서 그릴 때

 

plt.plot(x,y)

plt.plot(px,py, color = "Hotpink")

 

plt.xlabel('년도')

plt.ylabel('치킨집 창업 건수')

plt.title('"치킨집 년도별 현황"')

 

plt.show()

 
 

참고 데이터:


창업건수.csv
다운로드
폐업건수.csv
다운로드

 


 

오늘은 여기까지~

 

다음은

 

퍼셉트론으로 돌아올게요~

 

 

반응형
반응형

안녕하세요!



오늘은


신경망에서 오차 역전파에서 사용되는


지수함수와 로그함수에 대해 알아보겠습니다.





고등학교 수학시간때 들었지만


저는 기억이 가물가물... 열심히 하지 않았나봐요..



그래서 딥러닝을 위해 다시 공부해보도록 하겠습니다!




우선,


지수란?


2 x

 

이러한 거듭제곱의 형태를 말합니다.



그렇다면,


지수함수란?


y = 2 x


위와 같이 y= 을 붙여서 짝을 지어주는 것을 말합니다.


이것을 밑이 2인 지수함수라고 합니다.



이러한 지수함수는 밑이 1보다 큰 경우와


밑이 0보다 크고 1보다 작은 경우로 나눌 수 있습니다.



그래프로 비교해 볼까요?




(1 < 밑)  y =  x  함수의 그래프





(0 < 밑 < 1) y =  (1/2) x 함수의 그래프




따라서


 y =  x 그래프와 y = (1/2) x 그래프는 Y축 대칭입니다.


 y =  x 는 증가함수 그래프의 형태를


y = (1/2) x 는 감소함수 그래프의 형태를 띄게됩니다.


(위의 그래프는 구글에서 직접 그려보실 수 있습니다.)




로그 함수란?


y = loga x (a > 0, a != 1, x > 0)


이것을 a를 밑으로 하는 로그함수라고 말합니다.


여기서 x는 진수입니다.


로그함수는 지수함수의 역함수입니다.



이러한 로그함수도 밑이 1보다 큰 경우와


밑이 0보다 크고 1보다 작은 경우로 나눌 수 있습니다.




그래프로 확인해 볼까요?



(1 < 밑) 일 때, 아래의 그래프 형태를 띕니다.




(0 < 밑 < 1) 일 때, 아래의 그래프 형태를 띕니다.





따라서 


y = logx  그래프와  y =  a x 그래프는 Y = X축 대칭입니다.


y = x 라는 것은 x 대신 y, y 대신 x 의 값을 갖는 다는 것입니다.





오늘은 여기까지!


이 원리를 이용하는 신경망 오차 역전파 방법은 파이썬에서 활용해보도록 해보겠습니다.

반응형

+ Recent posts