반응형



안녕하세요~ 오늘은 드디어! 신경망에 대해 살짝 맛보도록 하겠습니다!



우선, 퍼셉트론과 신경망의 차이부터 알아봅시다!


퍼셉트론을 모른다면 "퍼셉트론(Perceptron)이란?" 을 참고하세요!



1. 퍼셉트론은 원하는 결과를 출력하도록 사람이 직접 가중치를 정해줘야 합니다!


AND, OR, NAND 게이트를 만들때 가중치를 채워 넣는 문제를 냈습니다!


어떻게 찾으셨나요? 저는 직접 숫자를 대입해보며 찾았답니다!


 혹시 더 쉽게 찾는 방법을 아시나요? 아신다면 댓글로 공유해주세요!



2. 신경망은 가중치 매개변수의 적절한 값을 기계가 데이터로부터 학습해서 자동으로 알아냅니다!





" 신경망 학습하기 "




이전 포스팅에서 신경망에 들어가는 함수


계단함수, 시그모이드 함수, 렐루 함수에 대해 알아보았습니다!



좀더 자세히 말하자면 위의 3가지 함수는


은닉층에 들어가는 함수 중 3가지를 의미합니다.




그렇다면 마지막 출력층에 들어가는 함수는 어떻게 될까요?


출력층 함수란,


그동안 흘러온 확률의 숫자를 취합해 결론을 내는 함수입니다.



신경망으로 구현하고자 하는 문제에 따라 사용하는 출력층 함수가 다릅니다.



1. 회귀(Regression)의 경우, 항등함수를 사용합니다.


항등함수란, 어떤 변수도 자기 자신을 함수값으로 하는 함수입니다.


[파이썬코드]

def identity(x): return x

간단하죠?




2. 분류(Classfication) 의 경우, 두 가지로 나뉘는데요.


2-1) 시그모이드(Sigmoid) 함수 : 2클래스 분류에서 사용합니다. ( ex, 개 vs 고양이 분류)


2-2) 소프트맥스(Softmax) 함수 : 다중 클래스 분류 (ex, 정상 폐사진 vs 폐결절, 폐혈증... 등 분류)



시그모이드는 은닉층의 활성화 함수에서 알아봤으니,



새로운 함수인, 소프트맥스 함수에 대해 더 자세히 알아보겠습니다.


소프트 맥스(Softmax) 함수란?


0과 1사이의 숫자를 출력하는 함수로, 출력하는 값은 확률입니다.


[파이썬 코드]


def softmax(a): C = np.max(a) exp_a = np.exp(a-C) sum_a = np.sum(exp_a) return exp_a / sum_a


[소프트 맥스 함수식]


e%203.10.png



소프트 맥스 함수식과 위의 파이썬 코드가 조금 다르죠?


그 이유는, overflow때문입니다!



우선, 소프트 맥스 함수는 지수함수를 사용하는데 이 지수함수라는 것은 아주 쉽게 아주 큰 값을 내뱉습니다.



예를 들어


exp == e (무리수: 자연상수)


e ^10 > 20000: 자연상수의 10승은 20000보다 크고


e ^1000 == inf : 자연상수의 1000승은 무한대(inf)를 나타냅니다.



따라서 표현할 수 없는 큰 값을 해결하기위해 아래와 같은 식으로 변형을 해서 사용합니다.




지수함수와 로그함수를 잘 모르겠다면 "여기"를 참고하세요!






" 이제, 아래의 신경망을 직접 구현해보도록 하겠습니다!"





import numpy as np # 신경망 함수 def sigmoid(x): return 1 / (1 + np.exp(-x)) def identity(x): return x def init_network(): network = {} network['W1'] = np.array([[1,3,5],[2, 4, 6]]) # weight 은 관습적으로 W라고 합니다. network['W2'] = np.array([[1,2],[3,4],[5,6]]) network['W3'] = np.array([[1,2],[3,4]]) return network

# 신경망 구현 def forward(network, x): W1, W2, W3 = network['W1'], network['W2'], network['W3'] y = np.dot(x, W1) y_hat = sigmoid(y) k = np.dot(y_hat, W2) k_hat = sigmoid(k) j = np.dot(k_hat, W3) j_hat = identity(j) # identity 대신 softmax함수를 사용할 수 있습니다. return j_hat network = init_network() x = np.array([1,2]) # 입력 y = forward(network, x) # 출력 print(y)





오늘은 여기까지!


신경망 학습 방법은 다음 포스팅에서 더 자세히 다루겠습니다!


좋은 하루 보내세요! 

반응형
반응형



안녕하세요~


오늘은 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 게이트를 퍼셉트론으로 해결해보세요!


결과는 다음 포스팅에서!





오늘은 여기까지~


다음 포스팅은

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

반응형

+ Recent posts