DeepLearning/딥러닝 기초

[딥러닝 기초] 신경망의 기본 구조

헬로희 2024. 12. 12. 21:55
728x90

1. 인공신경망

인공신경망(Artificial Neural Networks)은 인간의 두뇌가 정보를 처리하는 방식을 본 떠 설계된 컴퓨터 알고리즘이다.
기본적으로 입력(Input), 은닉층(Hidden Layers), 출력(Output)으로 구성된 계층적 네트워크이다.

인공신경망에 들어가기 앞서 기본 내용인 퍼셉트론에 대해 알아보자.


2. 퍼셉트론(Perceptron)
: 인공신경망의 가장 기본적인 형태로 단층신경망(Single-Layer Neural Network)이다.

  • 퍼셉트론은 지도학습을 통해 학습한다.
  • 가중치와 바이어스를 무작위로 초기화한다.
  • 주어진 입력데이터를 통해 예측값 y를 계산한다.
  • 예측값과 실제값의 차이를 기반으로 가중치를 업데이트 한다.

  • 모든 데이터를 반복하며 가중치를 수정한다.

1) 퍼셉트론의 구조

Perceptron

 

  • Input(입력): X0, X1, X2, ..., Xn
  • Weights(가중치): W0, W1, W2, ..., Wn
  • Bias(바이어스): b, 특정 방향으로 이동하도록 추가되는 상수 값
  • Weighted Sum(가중합): 모든 입력과 가중치의 곱을 더한 값
  • Activation Function(활성함수): 가중합 결과를 기반으로 출력값을 결정하는 함수

2) 퍼셉트론의 동작원리

  • 입력 신호를 가중치와 곱하고 모두 합산한다.

  • 결과 z에 계단 함수(Step Function)를 적용하여 출력값을 계산한다.

계단 함수(Step Function)

즉 퍼셉트론은 결과가 0 또는 1로 2개의 클래스로 분류하는 모델이다.


3) 퍼셉트론의 특징

  • 간단한 구조여서 구현하기 쉽다. (선형분류)
  • 다중 클래스로 분류할 수 없다. (다층 퍼셉트론; Multi-Layer Perceptron 에서 해결 가능)
  • 계단 함수만 사용하기 때문에 출력이 불연속적이다. (미분 불가)

3. 다층 퍼셉트론(Multi-Layer Perceptron, MLP)
: 퍼셉트론의 확장된 형태로 하나 이상의 은닉층(Hidden Layer)를 추가하여 더 복잡한 데이터를 학습할 수 있는 인공신경망으로 딥러닝의 기초이다.

  • 가중치와 바이어스를 무작위로 초기화한다.
  • 입력데이터를 통해 각 층의 출력을 계산한다.
  • 출력값과 실제값 차이를 손실함수로 계산한다.
  • 손실값 기반으로 가중치를 업데이트한다.
  • 여러 Epoch동안 위 과정을 반복한다.

1) 다층 퍼셉트론의 구조

  • 입력층(Input Layer): 데이터를 받아들이는 층으로 입력데이터 차원에 따라 뉴런 수가 결정된다.
  • 은닉층(Hidden Layer)
    - 패턴을 학습하는 곳으로 층의 개수와 각 층의 뉴런 수는 모델 설계에 따라 다르다.
    - 활성함수를 통해 입력신호를 처리한다.
  • 출력층(Output Layer): 최종 예측 결과를 출력하는 층이다.
    - 출력 뉴런의 개수는 Classification의 경우 클래스 수에 따라, Regression의 경우 보통 하나의 출력뉴런이 있다
 

활성 함수(Activation Function) 정의 및 종류

: 뉴런의 출력값을 결정하는데 사용1. 역할비선형성 추가- 입력과 출력의 관계를 비선형으로 만들어 신경망이 복잡한 데이터 분포를 학습할수 있게 만듦- 비선형 함수가 없으면 여러 층의 뉴런

hello-heehee.tistory.com


2) 다층퍼셉트론의 동작원리

  • 입력 데이터를 계층을 따라 전파하며 각 뉴런의 가중합과 활성 함수 결과를 계산한다. (순전파;Forward Propagation) 

  • 출력값과 실제 값 간의 차이를 손실함수(Loss Function)을 사용해 계산한다.
  • 손실값을 최소화하기 위해 가중치와 바이어스를 조정한다. (역전파; Back Propagation)
    - 기울기(Gradient)를 계산하여 경사하강법(Gradient Descent)으로 가중치를 업데이트 한다.

순전파와 역전파 참고

 

순방향 알고리즘(Forward Propagation) vs 역전파 알고리즘(Back Propagation)

1. 순방향 알고리즘(Forward Propagation): 주어진 입력 데이터를 기반으로 예측 값을 계산하는 과정1) 특징입력층 -> 은닉층 -> 출력층 순으로 계산 (간단하고 직관적인 과정) 예측, 학습 과정에서 사용

hello-heehee.tistory.com


3) 다층 퍼셉트론의 활성함수(Activation Function)

 

활성 함수(Activation Function) 정의 및 종류

: 뉴런의 출력값을 결정하는데 사용1. 역할비선형성 추가- 입력과 출력의 관계를 비선형으로 만들어 신경망이 복잡한 데이터 분포를 학습할수 있게 만듦- 비선형 함수가 없으면 여러 층의 뉴런

hello-heehee.tistory.com

다층퍼셉트론에서는 ReLU, Sigmoid, Tanh가 주로 사용된다.


4) 다층 퍼셉트론의 특징

  • 이미지분류, 자연어처리, 회귀분석 등 여러 분야에 활용가능하다. (비선형데이터 처리 가능)
  • 은닉층과 뉴런수를 늘려 복잡한 패턴 학습 가능하다.
  • 은닉층이 많아질수록 시간이 길어지고 자원이 많이 필요하다.
  • 모델이 너무 복잡해지면 모델이 학습데이터에 지나치게 적합해지는 Overfitting(과적합)이 발생할 수 있다.
    - 과적합 해결방법은 Regularization(정규화), Dropout, Data Augmentation 등이 있다.
  • 최적의 성능을 얻을 수 있는 Hyper-Prameter 설정이 어렵다.

5) 다층 퍼셉트론 코드

import torch
import torch.nn as nn
import torch.optim as optim

# 데이터 정의
X = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=torch.float32)
y = torch.tensor([[0], [1], [1], [0]], dtype=torch.float32)  # XOR 문제

# MLP 모델 정의
class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.hidden = nn.Linear(2, 5)  # 은닉층
        self.output = nn.Linear(5, 1)  # 출력층
        self.activation = nn.Sigmoid()  # 활성 함수

    def forward(self, x):
        x = torch.relu(self.hidden(x))  # 은닉층 활성화
        x = self.activation(self.output(x))  # 출력층 활성화
        return x

# 모델 초기화
model = MLP()
criterion = nn.BCELoss()  # 이진 크로스 엔트로피 손실
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 학습
for epoch in range(1000):
    optimizer.zero_grad()
    outputs = model(X)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 100 == 0:
        print(f"Epoch [{epoch+1}/1000], Loss: {loss.item():.4f}")

# 예측
with torch.no_grad():
    print("Predictions:", model(X).round())

4. 퍼셉트론과 다층퍼셉트론의 차이

퍼셉트론은 단일층으로 구성된 단순한 구조로 선형분리 문제만 해결가능하다면,
다층 퍼셉트론은 은닉층이 추가된 구조로, 비선형 활성함수(ReLU, Sigmoid등)를 사용하여 복잡한 데이터 학습이 가능하고,
역전파 알고리즘을 사용해 학습한다.


퍼셉트론에 대해 알았으니, 본론인 인공신경망에 대해 알아보자

5. 인공신경망 특징

인공신경망은 다층퍼셉트론의 동작원리와 특징을 가지고 있다. 따라서 입력층, 은닉층, 출력층으로 구성되어 있다.

  • 대규모 데이터(빅데이터) 처리가 가능하다.
  • 복잡한 패턴에 대해 학습이 가능하다.
  • 많은 데이터가 필요하고 높은 계산비용이 든다.
  • 학습된 모델의 내부 작동 방식에 대해 해석하기 어렵다.

인공신경망의 주요 유형은 Convolution Neural Network과 Recurrent Neural Network이 있다. (다음에 다루도록 하겠습니다!)

6. 인공신경망 예시코드

import torch
import torch.nn as nn
import torch.optim as optim

# XOR 데이터 정의
X = torch.tensor([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=torch.float32)  # 입력 데이터
y = torch.tensor([[0], [1], [1], [0]], dtype=torch.float32)  # 출력 데이터

# 인공신경망 모델 정의
class ANN(nn.Module):
    def __init__(self):
        super(ANN, self).__init__()
        self.hidden = nn.Linear(2, 4)  # 은닉층 (입력: 2, 출력: 4)
        self.output = nn.Linear(4, 1)  # 출력층 (입력: 4, 출력: 1)
        self.activation = nn.Sigmoid()  # 활성 함수

    def forward(self, x):
        x = torch.relu(self.hidden(x))  # 은닉층: ReLU 활성화 함수 사용
        x = self.activation(self.output(x))  # 출력층: Sigmoid 활성화 함수 사용
        return x

# 모델 초기화
model = ANN()
criterion = nn.BCELoss()  # 손실 함수: 이진 크로스 엔트로피
optimizer = optim.SGD(model.parameters(), lr=0.1)  # 옵티마이저: SGD

# 학습 루프
epochs = 1000
for epoch in range(epochs):
    # 순전파
    outputs = model(X)
    loss = criterion(outputs, y)  # 손실 계산

    # 역전파 및 가중치 업데이트
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # 진행 상황 출력
    if (epoch + 1) % 100 == 0:
        print(f"Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}")

# 예측 결과 확인
with torch.no_grad():
    predictions = model(X).round()  # 예측값을 반올림하여 클래스화
    print("Predictions:")
    print(predictions)

 

728x90