728x90
반응형

신경망의 추론 전체 그림

  • 신경망은 간단하게 말하면 '함수'라 할 수 있다.
  • 예) 2차원 데이터를 입력해 3차원 데이터를 출력하는 함수
    • 입력층(input layer)에는 뉴런2개, 출력층(output layer)에는 3래를 각각 준비
    • 은닉층(hidden layer)혹은 중간층에도 적당한 수의 뉴런을 배치한다.

 

신경망의 예

[그림1] 신경망의 예

  • 화살표에는 가중치(weight)가 존재하며, 그 가중치와 뉴런을 각각 곱해서 그 합이 다음 뉴런의 입력으로 쓰인다.(정확히 그 합에 활성화 함수(activation function)를 적용한 값이 다음 뉴런의 입력이 된다.)
  • 이때 각 층에서는 이전 뉴런의 값에 영향받지 않는 '정수'도 더해진다.
    • 이 정수는 편향(bias)라고 한다.
  • 신경망은 인접하는 층의 모든 뉴런과 연결(화살표로 이어짐)되어 있다는 뜻에서 완전연결계층(fully connected layer)라고 한다.

 

신경망이 수행하는 계산 수식

 

은닉층의 첫 번째 뉴런

[그림2] 은닉층의 첫 번째 뉴런

  • 은닉층의 뉴런은 가중치의 합으로 계산된다.

[그림3] 완전연결 계층 수행하는 변환 수식

 

위의 식 간소화

[그림4] 간소화

  • x는 입력, h는 은닉층의 뉴런, W는 가중치, b는 편향

 

 

완전연결계층에 의한 변환의 미니배치 버전

# 완전연결계층에 의한 변환의 미니배치 버전

W1 = np.random.randn(2,4) # 가중치
b1 = np.random.randn(4) # 편향
x = np.random.randn(10, 2) # 입력
h = np.matmul(x, W1) + b1
# 10개의 샘플 데이터 각각을 완전연결계층으로 변환
# x의 첫 번째 차원이 각 샘플 데이터에 해당한다.
# x[0]은 0번째 입력 데이터, x[1] 은 첫 번째 입력 데이터
# h[0]은 0번째 은닉층 뉴런
# b1의 덧셈은 브로드캐스트 b1의 형상은 (4,) 이지만 자동으로 (10,4)로 복제
  • 완전연결계층에 의한 변환은 '선형' 변환이다.
  • '비선형' 효과를 부여하는 것이 바로 활성화 함수다.
    • 활성화 함수를 이용함으로 신경망의 표현력을 높일 수 있다.
    • 여기서는 시그모이드 함수(sigmoid function)를 사용 - 'S'자 모양의 곡선 함수

[그림5] 시그모이드 함수 

 

시그모이드 함수의 그래프

[그림6] 시그모이드 함수의 그래프

 

def sigmoid(x):
    return 1/(1 + np.exp(-x))
  • 시그모이드 함수는 임의의 실수를 받아 0에서 1사이의 실수를 출력한다.
a = sigmoid(h)
  • 활성화 함수의 출력 a(활성화(activation)라고 한다.) 또 다른 완전연결계층에 통과시켜 반환한다.

 

종합

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

W1 = np.random.randn(2,4)
b1 = np.random.randn(4)
x = np.random.randn(10, 2)
W2 = np.random.randn(4,3)
b2 = np.random.randn(3)

h = np.matmul(x, W1) + b1
a = sigmoid(h)
s = np.matmul(a, W2) + b2

 

 

계층으로 클래스화 및 순전파 구현

  • 신경망에서 하는 처리를 계층(layer)로 구현
  • 완전연결계층에 의한 변환 Affine 계층
  • 시그모이드 함수에 의한 변환을 Sigmoid 계층으로 구현
  • 완전연결계층에 의한 변환은 기하학에서 아핀(affine) 변환에 해당하기 때문에 Affine 계층이라고 이름 지음
  • 기본 변환을 수행하는 메서드 이름 forward()

 

순전파(forward propagation)

  • 신경망 추론 과정에서 하는 처리
  • 그대로 입력층에서 출력층으로 향하는 전파
  • 각 계층이 입력으로부터 출력 방향으로 처리 결과를 차례로 전파해간다.

 

Sigmoid 계층과 Affine 계층

class Sigmoid:
    def __init__(self):
        self.params = []
        
    def forward(self, x):
        return 1/(1+np.exp(-x))
    

class Affine:
    def __init__(self,W,b):
        self.params = [W,b] # 가중치와 편향, 신경망이 학습될 때 수시로 갱신
        
    def forward(self, x):
        W, b = self.params
        out = np.matmul(x, W) + b
        return out
  •  Affine 계층은 초기화될 때 가중치와 편향을 받는다. - 가중치와 편향은 Affine 매개변수며 신경망이 학습될 때 수시로 갱신된다.

 

구현해볼 신경망의 계층 구성

[그림7] 구현해볼 신경망의 계층 구성

 

class TwoLayerNet:
    def __init__(self, input_size, hidden_size, output_size):
        I, H, O = input_size, hidden_size, output_size
        
        #가중치와 편향 초기화
        W1 = np.random.rand(I, H) # 입력층, 은닉층
        b1 = np.random.rand(H) # 은닉층
        W2 = np.random.rand(H, O) # 은닉층, 출력층 
        b2 = np.random.rand(O) # 출력층
        
        # 계층 생성
        
        self.layers = [
            Affine(W1,b1),
            Sigmoid(),
            Affine(W2, b2)
        ]
        
        # 모든 가중치 리스트에 모으기
        self.params = []
        for layer in self.layers:
            self.params += layer.params
            
    def predict(self, x):
        for layer in self.layers:
            x = layer.forward(x)
        return x
x = np.random.rand(8,2)
model = TwoLayerNet(2, 4, 3)
s = model.predict(x)


 

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

https://www.hanbit.co.kr/store/books/look.php?p_code=B8950212853

 

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

이 책은 『밑바닥부터 시작하는 딥러닝』에서 다루지 못했던 순환 신경망(RNN)을 자연어 처리와 시계열 데이터 처리에 사용하는 딥러닝 기술에 초점을 맞춰 살펴본다. 8장 구성으로 전체를 하나

www.hanbit.co.kr

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기