데이터 과학

기초 인공신경망 - 순방향 네트워크 본문

인공지능/기초 인공신경망

기초 인공신경망 - 순방향 네트워크

티에스윤 2023. 3. 29. 16:16

수학에서의 행렬과 함수 이론을 배웠으면 이를 적용하여 간단한 순방향 학습 이론을 만들어 낼 수 있습니다. 

 

행렬과 시그모이드 함수를 이용하여 이를 파이썬으로 구현할 수 있으며 프로그래밍을 하면서 기초 인공신경망 이론에 대해 학습해 봅시다. 

 

 

행렬 관련 예제를 통해 간단한 행렬 이론에 대해 학습하고 행렬 이론을 전반적으로 이해하고 입력값과 웨이트값(가중치)을 어떻게 연산하는지를 그림으로 표현도 해 봅시다. 

 

https://tsyoon.tistory.com/144

 

인공신경망에서 행렬

인공 신경망에서 행렬 이론은 중요한 역할을 합니다. 인공 신경망에서 입력 데이터와 가중치를 행렬로 표현하고, 이를 행렬 곱셈을 통해 계산하는 것이 기본적인 방법 중 하나입니다. 이를 통해

tsyoon.tistory.com

 

numpy (넘버 파이썬) 라이브러리의 기본적인 함수 사용방법도 알아보고 파이썬의 기본적인 문법에 대한 학습을 해야 합니다. 

 

https://tsyoon.tistory.com/141

 

파이썬 numpy

넘파이(numpy)는 파이썬의 대표적인 과학 계산 패키지로, 대규모 다차원 배열과 행렬 연산에 사용됩니다. 이 패키지는 과학 기술 분야에서 데이터 분석과 처리에 필요한 다양한 함수들을 제공합

tsyoon.tistory.com

 

이러한 과정을 어느정도 끝나고 이해가 되었으면 활성화 함수에 대해 학습을 해야 하는데, 활성화 함수를 사용하는 방법에 대해 학습해야 합니다. 

활성화 함수를 왜 사용해야 할까요? 한번 생각해 봅시다. 

 

https://tsyoon.tistory.com/46

 

인공신경망에서 시그모이드 함수

인공신경망에 대해서 공부하려면 함수(function)의 의미에 대해 이해를 해야 합니다. 퍼셉트론을 사용할 때 함수의 개념을 이용하여 경계를 기준으로 값을 변환시키는 형태로 알고리즘을 작성하

tsyoon.tistory.com

 

이 정도 학습을 했으면 순방향에 대해 한번 프로그래밍을 해 봅시다. 

 

 

 

순방향 예제를 작성하기 위해서는 우선적으로 인공신경망을 구성하는데 필요한 라이브러리인 NumPy를 import 해야 합니다. 아래는 간단한 순방향 인공신경망의 예제 코드입니다.


import numpy as np

# 활성화 함수(시그모이드)
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 인공신경망 클래스
class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        
        # 가중치 초기화
        self.w1 = np.random.randn(self.input_size, self.hidden_size)
        self.w2 = np.random.randn(self.hidden_size, self.output_size)
        
    def forward(self, x):
        # 입력층 -> 은닉층
        z1 = np.dot(x, self.w1)
        a1 = sigmoid(z1)
        
        # 은닉층 -> 출력층
        z2 = np.dot(a1, self.w2)
        y = sigmoid(z2)
        
        return y



위 코드에서는 인공신경망 클래스 NeuralNetwork를 정의하고, __init__() 메소드에서 입력층의 크기, 은닉층의 크기, 출력층의 크기를 받아서 가중치를 초기화합니다. forward() 메소드에서는 입력값 x를 받아서 순방향으로 전파하면서 출력값 y를 계산합니다. 이때, 활성화 함수로는 시그모이드 함수를 사용합니다.

 

 

파이썬으로 작성한 코드인데 중간에 class가 들어가 있어서 조금 어렵게 느껴집니다. 전체적인 프로그램의 구조는 괜찮은데 파이썬에서의 class 개념은 좀 후반부에 나오기 때문에 좀 더 쉬운 예제를 통해 설명해 볼까 합니다. 

 

 

import numpy as np

# 입력값과 가중치를 초기화합니다.
inputs = np.array([1.0, 2.0, 3.0])
weights = np.array([[0.2, 0.8, -0.5], [0.5, -0.91, 0.26], [-0.26, -0.27, 0.17]])

# 히든 레이어의 값 계산
hidden_layer_input = np.dot(inputs, weights)
hidden_layer_output = 1 / (1 + np.exp(-hidden_layer_input))

# 출력 레이어의 값 계산
output_layer_weights = np.array([[0.1, -0.14], [-0.5, 0.12], [0.0, -0.3]])
output_layer_input = np.dot(hidden_layer_output, output_layer_weights)
output_layer_output = 1 / (1 + np.exp(-output_layer_input))

# 출력값 출력
print(output_layer_output)

 

 

출력값은 

[0.49780731 0.43616427]

 

으로 결과가 나옵니다. 

 

이 예제에서 사용되는 내용은 입력값 3개에 대한 행렬과 은닉층에서의 3*3의 행렬입니다. 

 

은닉층에서의 계산을 위해 numpy의 dot(내적) 연산을 사용해서 입력층과 은닉층에 대한 연산을 하였으며 

이를 hidden_layer_output = 1 / (1 + np.exp(-hidden_layer_input)) 에서 시그모이드 함수에 넣어서 활성화 함수 연산을 하여 발산 하였습니다. 

 

은닉층에서의 값과 은닉층과 출력층의 가중치 값인 [0.1, -0.14], [-0.5, 0.12], [0.0, -0.3] 의 연산값을 통해 다시 한번 dot(내적)연산을 합니다. 이후 활성화 함수인 시그모이드 함수에 넣어서 발산하면 되는데 그 결과는 [0.49780731 0.43616427] 입니다. 

 

 

순방향으로 인공신경망에 대한 이해 어렵지가 않죠. 파이썬과 같이 학습하면 쉽게 이해 할 수 있습니다.