본문 바로가기
머닝러신 아니고 머신러닝

신경망 이론 퍼셉트론 누구세요

by jnhn 2023. 3. 30.

딥러닝 그게뭔데...

도저히 학원 수업만으로 따라가는게 벅차서 혼자 공부해야겠다 => 공부블로그 만들어야겠다 => 티스토리블로그 만들어야겠다고 감히 다짐하게 만든너 딥러닝

출처:https://terms.naver.com/entry.naver?docId=3484358&cid=43667&categoryId=43667
출처: 밑바닥부터 시작하는 딥러닝

여기서 x1, x2는 입력신호 y는 출력신호 w1,w2는 가중치(weigth)를 의미한다. 그림의 원을 뉴런, 노드라고 부르고, 입력신호가 뉴런에 보내질때 각각의 고유한 가중치가 곱해진다. 이렇게 보내온 신호의 총합이 정해진 한계(임계점 θ theta 세타)를 넘어설 때만 1을 출력(= 뉴런이 활성화한다.) 퍼셉트론은 복수의 입력신호 각각에 고유한 가중치를 부여하기 때문에 각 신호가 결과에 주는 형향력을 조절하는 요소이다. 가중치가 클수록 해당신호가 그만큼 더 중요하다는 것을 의미한다. 

출처: 밑바닥부터 시작하는 딥러닝

 

65. 신경망 이론(빅분기책 p.337)


신경망이론목차

65.1 컴퓨터로 퍼셉트론의 가중치 값 한 번에 알아내기

65.2 파이썬으로 and 퍼셉트론 구현하기(빅분기 339페이지)

65.3 활성화함수의 종류(빅분기 p340~1)

 

인공신경망? 인간의 두뇌신경세포인 뉴런을 기본으로 한 기계학습 기법으로 하나의 뉴런이 다른 뉴런들과 연결되어 신호를 전달, 처리하는 구조를 말한다. 입력데이터가 신경망에 들어오면 신호의 강도에 따라 가중치가 처리되고 활성화함수를 통해 출력이 계산되는데 학습을 거쳐 원하는 결과가 나오게끔 가중치가 조정된다는 점이 주요 특징입니다.

인공지능 신경망의 시초가 된 것이 바로 “퍼셉트론”

오늘날 우리가 이 수학식을 컴퓨터로 구현한 것이자 1958년 로젠플래트왈“뇌의 뉴런세포 한 개를 수학식으로 구현”

퍼셉트론 Perceptron: 뇌세포 하나를 수학으로 재현한 것 / 다수의 값을 입력받아 하나의 값으로 출력하는 알고리즘 

뜻 : 지각하다, 인지하다, 기계에게 지능을 부여하는게 가능한가?

 

아니.. 티스토리 사진이 왜 안옮겨져 야생의 네이버블로거에게 닥친 시련

이렇듯 가중치를 설정하는 것이 중요한데 말이지

65.1 컴퓨터로 퍼셉트론의 가중치 값 한 번에 알아내기

● 순서

#1 필요한 패키지를 임폴트합니다
#2 데이터를 준비합니다
#3 신경망 모델을 생성합니다
#4 단층 퍼셉트론을 구현합니다
#5 모델을 어떻게 학습시킬지 정합니다
#6 모델을 학습시킵니다.

● 최종코드

#1. 필요한 패키지를 임폴트 합니다
import  tensorflow  as   tf

tf.random.set_seed(777)  # 시드를 설정한다.
import  numpy  as  np
from  tensorflow.keras.models  import  Sequential   # 신경망 모델 구성
from  tensorflow.keras.layers  import  Dense  # 완전 연결계층 
from  tensorflow.keras.optimizers  import   SGD  # 경사감소법 
from  tensorflow.keras.losses   import   mse    #  오차함수 

#2. 데이터를 준비합니다
x = np.array([[0,0],[1,0],[0,1],[1,1]])
y = np.array([[0],[0],[0],[1]])

#3. 신경망 모델을 생성합니다.
model =Sequential() #순차적으로 데이터가 처리되는 신경망을 만들겠다.

#4. 단층 퍼셉트론을 구현합니다
model.add(Dense(1, input_shape=(2, ), activation ='linear'))

#5. 모델을 어떻게 학습시킬지 정합니다
model.compile(optimizer =SGD(), loss=mse, metrics =['acc'])

#6. 모델을 학습시킵니다
model.fit(x, y, epochs= 500)

#7. 모델의 예측값을 출력합니다
result = model.predict(x)
print(result.round()) #[[-0.][ 0.][ 0.][ 1.]]

#8. 모델의 가중치를 뽑아냅니다.
print(model.get_weights())


#2 설명: 데이터를 넘파이배열로 만들어야 신경망에 데이터를 입력할 수 있습니다(행렬 계산을 쉽고 빠르게 해주는 모듈)

#4 설명: input_shape=(2, ) 입력데이터는 1행 2열 (0,0),(1,0), (0,1), (1,1) 로 입력
#4 설명: activation =’linear’: 활성화 함수를 linear이라는 함수로 쓰겠다.


#5. 설명: 경사하강법의 종류중에 하나를 지정, 오차함수를mean square error를 사용하여 정확도로 평가지표를 삼겠다.


#6. 설명: epochs=500 입력신호 돌리는 거 500번시킴

- 출력:


● 방금 학습시킨 데이터를 and 진리 연산표 였습니다 오늘의 마지막 문제 or 진리 연산표로 단층 신경망을 학습시키세요


#1. 필요한 패키지를 임폴트 합니다
import  tensorflow  as   tf

tf.random.set_seed(777)  # 시드를 설정한다.
import  numpy  as  np
from  tensorflow.keras.models  import  Sequential   # 신경망 모델 구성
from  tensorflow.keras.layers  import  Dense  # 완전 연결계층 
from  tensorflow.keras.optimizers  import   SGD  # 경사감소법 
from  tensorflow.keras.losses   import   mse    #  오차함수 

#2. 데이터를 준비합니다
x = np.array([[0,0],[1,0],[0,1],[1,1]])
y = np.array([[0],[1],[1],[1]])

#3. 신경망 모델을 생성합니다.
model =Sequential() #순차적으로 데이터가 처리되는 신경망을 만들겠다.

#4. 단층 퍼셉트론을 구현합니다
model.add(Dense(1, input_shape=(2, ), activation ='linear'))

#5. 모델을 어떻게 학습시킬지 정합니다
model.compile(optimizer =SGD(), loss=mse, metrics =['acc'])

#6. 모델을 학습시킵니다
model.fit(x, y, epochs= 500)

#7. 모델의 예측값을 출력합니다
result = model.predict(x)
print(result.round()) #[[0.][ 1.][ 1.][ 1.]]

#8. 모델의 가중치를 뽑아냅니다.
print(model.get_weights())
- 어디가 바뀌었는지 체크해보기
- 출력
[[0.] [1.] [1.] [1.]] [array([[0.47819105], [0.38128167]], dtype=float32), array([0.33334246], dtype=float32)]

 

65.2 파이썬으로 and 퍼셉트론 구현하기(빅분기 339페이지)

import  numpy  as  np

a = [ 0, 0, 1, 0, 0, 1, 1, 1 ]
b = [ 0, 0, 0, 1 ]
c = [ 0.3, 0.4, 0.1 ]
d = [ -1, -1, -1, -1 ]
inputs = np.array(a).reshape(4,2)  # 입력값 행렬
target = np.array(b).reshape(4,1)  # 정답 행렬
x0 = np.array(d).reshape(4,1)       # 절편에 해당하는 x0 행렬
new_inputs = np.hstack((x0, inputs) )  #  입력값과 x0 을 하나로 생성
w = np.array(c).reshape(3,1)           # 가중치 행렬 생성

def   and_pcn(ni, w): 
    # 정답 데이터 구성
    t = [ 0, 0, 0, 1 ]
    target = np.array(t).reshape(4,1)

    for  m  in  range(3):
        for  i  in  range( 4 ): # i=0, i=1, i=2, i=3 일때 
            k = np.dot(ni[ i, : ] , w )   # 입력값과 가중치의 곱의 합을 구해서
            k_prime =  step_function(k)  # 계단함수에 넣고 예측값을 출력한후에
            cost = target[i] - k_prime   # 정답과 차이인 오차를 cost 에 담는다.

            if  cost != 0 :   # 오차가 0 이 아니면
                for  j  in  range(3) :  # 가중치 w0, w1, w2 를 갱신해야합니다.
                    w[j] = w[j] + 0.05 * ni[ i, j ] * cost
            print(w) 


and_pcn( new_inputs, w )
 

65.3 활성화함수의 종류(빅분기필기책 p340~1)

계단함수/ 시그모이드 함수/렐루함수

활성화함수란? 뉴런에 입력되는 신호를 다음 신호로 보낼지 말지를 결정하는 함수를 말한다. 가령 생물시간에 배운 역치(짠맛을 느끼는 임계치)같은 것을 말한다. 입력신호의 총합을 출력 신호로 변환한는 함수를 일반적으로 활성화함수 activation function이라고 함

활성화 함수의 종류에는 계단함수, 시그모이드 함수, 렐루함수가 있다.

첫째로, 계단함수란  입력신호의 총합이 임계치를 넘느냐 안넘느냐를 숫자 1과 0으로 리턴하는 함수로 입력되는 값이 0보다 크면 1을 리턴하고 0보다 작으면 0을 리턴한다. 단층 퍼셉트론은 이 함수로 학습이 가능하다. 그러나 다층으로 가게 되면 즉 층이 여러개면 계단함수로 학습할 수 없다. ex) f(0.3) = 1, f(-0.2) = 0

다시 딥러닝으로 돌아오자면 말그대로 깊은 신경망

선생님의 귀여운 고양이 그림

가령 고양이 사진을 넣으면 계단형인 경우 0 아니면 1로 들어가기 때문에 은닉층에서 어려움 은닉층에 들어가는 함수 가 활성화 함수고양이사진을 넣었을때 0.7 0.1일 경우 0.7이 크니까 0.7에 해당하는 것으로 출력됨

 

둘째로, 시그모이드 함수 계단함수는 무조건 0 아니면 1을 리턴하지만 시그모이드 함수는 0~1 사이의 연속적인 술수값을 리턴합니다. 시그모이드함수의 문제점? 신경망의 층이 아주 깊어지면 신경망 학습이 제대로 안되는 문제(기울기 소실)가 시그모이드 함수를 사용했을때 발생합니다.

예: f(6) = 0, f(-1) = 0.1

※ 다층 신경망일때는 계단함수로 사용하면 학습이 안됩니다. 반드시 시그모이드 함수나 렐루 함수 또는 다른 함수들을 사용해야합니다.

 

셋째로, 렐루(Relu: 정류장)함수: 시그모이드 함수의 문제점을 개선한 함수 렐루함수는 입력값을 받아서 입력값이 음수이면 0을 리턴하고 양수이면 그 값을 그대로 리턴하는 함수(현업에서 가장 많이 쓰는 함수)

오차 역전파가 전달이 안되고 있음 입력값, 순전파

기울기 소실? 신경망이 깊어지면서 오차가 앞층까지 잘 전달되지 못하는 현상을 말합니다.

  •  
  •  

솔직히 아직 잘 모르겠는데 일단 정리해봄 어쩌겠음 시작했으면 해야지~~~

'머닝러신 아니고 머신러닝' 카테고리의 다른 글

k-means 케이평균 군집분석 정리  (0) 2023.04.04