logo

[딥러닝] 뉴런과 퍼셉트론

 

뉴런이란 무엇인가?

생물학적 뉴런의 구조와 기능

생물학적 뉴런은 인간 뇌를 포함한 동물의 중추 및 말초 신경계에서 기본적인 정보 처리 단위입니다. 각 뉴런은 세 가지 주요 부분으로 구성됩니다: 세포체(핵이 포함된 부분), 수상돌기(뉴런으로부터 신호를 받는 부분), 축삭(신호를 다른 뉴런이나 근육 등으로 전달하는 부분). 수상돌기는 세포체에 도착한 신호를 수집하고, 이들 신호가 충분히 강하면 뉴런은 축삭을 통해 다른 뉴런이나 몸의 다른 부분으로 신호를 전달하는 전기적 활동일 일으킵니다. 이 과정을 "화학적 시냅스를 통한 신호 전달"이라고 합니다.

신경망에서의 뉴런: 입력과 출력

인공 신경망에서의 뉴런은 생물학적 뉴런에서 영감을 받아 디자인되었습니다. 각 인공 뉴런은 하나 이상의 입력을 받아 각각의 입력에 가중치를 곱하고, 그 결과들을 합한 다음 활성화 함수를 통과시켜 결과(출력)를 다른 뉴런으로 전달합니다. 수식으로 표현하면, 뉴런의 출력 yy는 다음과 같습니다.

y=f(w1x1+w2x2++wnxn+b) y = f(w_1x_1 + w_2x_2 + \cdots + w_nx_n + b)

여기서, xix_i는 i번째 입력, wiw_i는 i번째 입력의 가중치, bb는 편향(bias), ff는 활성화 함수를 의미합니다.

뉴런 간의 연결 방식

뉴런들은 서로 다양한 방식으로 연결될 수 있습니다. 대표적으로 피드포워드 신경망에서의 뉴런들은 한 방향으로만 연결되어 있습니다. 이는 각 레이어의 뉴런들이 오직 다음 레이어의 뉴런들과만 연결되어 있음을 의미합니다. 반면 순환 신경망(RNN)에서의 뉴런들은 이전 상태의 정보를 저장하는 연결도 포함하여, 정보가 순환적으로 처리될 수 있게 합니다.

 

예시 코드: PyTorch를 이용한 간단한 인공 뉴런 구현

PyTorch를 사용하여 간단한 인공 뉴런을 구현하는 과정을 아래에 나타냈습니다. 이 예시에서는 선형 계층(입력에 대한 선형 변환)과 활성화 함수로 시그모이드 함수를 사용합니다.

import torch
import torch.nn as nn

# 신경망에서의 하나의 뉴런 정의
class SingleNeuron(nn.Module):
    def __init__(self):
        super(SingleNeuron, self).__init__()
        # 선형 계층: 입력 차원 1, 출력 차원 1
        self.linear = nn.Linear(in_features=1, out_features=1)
        # 활성화 함수로 시그모이드 사용
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = self.linear(x)
        x = self.sigmoid(x)
        return x

# 인공 뉴런 생성
neuron = SingleNeuron()

# 임의의 입력 값
input_tensor = torch.tensor([[1.0], [2.0], [3.0]])

# 뉴런을 통해 입력 처리
output = neuron(input_tensor)

print("입력:", input_tensor.numpy())
print("출력:", output.detach().numpy())

이 코드는 torch의 nn.Module 클래스를 상속받아 SingleNeuron 클래스를 정의하고, 이를 통해 인공 뉴런의 기본적인 동작을 구현합니다. forward 메소드는 인공 뉴런이 입력을 받아 출력을 생성하는 과정을 정의합니다.


 

퍼셉트론의 기본 개념

퍼셉트론은 인공신경망을 구성하는 가장 기초적인 단위로, 프랑크 로젠블라트(Frank Rosenblatt)에 의해 1957년에 처음 소개되었습니다. 이는 인간 뇌의 뉴런 작동 방식을 모방하여 설계되었으며, 단순하지만 강력한 선형 분류기로 작용합니다.

 

퍼셉트론의 구조

퍼셉트론은 크게 네 부분으로 구성됩니다:

  1. 입력층(Input Layer): 외부에서 들어오는 입력값(x1,x2,...,xnx_1, x_2, ..., x_n)을 받는 부분입니다.
  2. 가중치(Weights): 각 입력값에 부여되는 가중치(w1,w2,...,wnw_1, w_2, ..., w_n)입니다. 이 값들은 학습 과정에서 조정됩니다.
  3. 활성화 함수(Activation Function): 가중치가 적용된 입력값의 합이 활성화 함수를 거쳐 변환되며, 이를 통해 최종 출력이 결정됩니다.
  4. 출력층(Output Layer): 활성화 함수를 거쳐 나온 최종 출력값(yy)입니다.
 

단층 퍼셉트론

단층 퍼셉트론(Single-layer Perceptron)은 입력층과 출력층만으로 구성된 가장 간단한 형태의 퍼셉트론입니다. 이는 선형적으로 분리 가능한 문제를 해결하는 데 적용될 수 있습니다.

단층 퍼셉트론의 정의와 한계

단층 퍼셉트론은 입력층에서 받은 입력값에 대해 가중치를 곱하고 모두 합한 뒤, 활성화 함수를 통해 출력값을 내는 구조입니다. 대표적인 활성화 함수로는 스텝 함수가 사용되며, 이를 통해 이진 분류 문제를 해결할 수 있습니다. 그러나 단층 퍼셉트론은 XOR 문제와 같은 비선형 분리 문제를 해결할 수 없다는 한계를 가지고 있습니다.

OR, AND, NOT 문제 해결

단층 퍼셉트론은 간단한 논리 회로 문제인 OR, AND, NOT 연산을 해결하는 데 효과적입니다. 각 입력값과 이에 대한 가중치를 조절함으로써 해당 연산의 진리 테이블을 만족하는 출력값을 얻을 수 있습니다.

XOR 문제와 비선형 분리 문제

XOR 문제는 단층 퍼셉트론으로는 해결할 수 없는 대표적인 문제입니다. XOR 연산은 입력값이 서로 다를 때만 참(True)이 되는 연산으로, 선형으로 분리할 수 없는 문제에 해당합니다. 이 문제의 해결을 위해 다층 퍼셉트론(Multi-layer Perceptron)이나 다른 비선형 모델이 필요합니다.

 

PyTorch를 이용한 단층 퍼셉트론 예시 코드

다음은 PyTorch를 사용하여 단층 퍼셉트론 모델을 구현하고, 간단한 AND 연산을 학습시키는 예시 코드입니다.

import torch

# 입력 값과 타겟 값
X = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=torch.float)
Y = torch.tensor([[0], [0], [0], [1]], dtype=torch.float)

# 가중치와 편향 초기화
weights = torch.randn(2, 1, dtype=torch.float, requires_grad=True)
bias = torch.randn(1, dtype=torch.float, requires_grad=True)

# 학습률과 에폭(전체 데이터셋에 대한 반복 학습 횟수)
learning_rate = 0.1
epochs = 1000

# 학습 시작
for epoch in range(epochs):
    # 선형 조합 계산
    weighted_sum = X.mm(weights) + bias
    # 활성화 함수 적용 (여기서는 스텝 함수 대신 시그모이드 함수 사용)
    activations = torch.sigmoid(weighted_sum)

    # 손실 계산 (이진 교차 엔트로피 손실)
    loss = torch.nn.functional.binary_cross_entropy(activations, Y)

    # 손실에 대한 가중치와 편향의 기울기 계산
    loss.backward()

    # 가중치 조정
    with torch.no_grad():
        weights -= learning_rate * weights.grad
        bias -= learning_rate * bias.grad

    # 기울기 초기화
    weights.grad.zero_()
    bias.grad.zero_()

    if epoch % 100 == 0:
        print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item()}')

# 최종 학습된 가중치와 편향 출력
print(f'Learned Weights: {weights}, Learned Bias: {bias}')

이 코드는 PyTorch를 사용하여 단층 퍼셉트론을 구현하고, AND 연산을 학습시키는 간단한 예시입니다. 실제 적용에서는 보다 복잡한 구조와 다양한 문제에 적용될 수 있습니다.

Previous
딥러닝