MOOC
[딥러닝 이론1] 인공신경망 기본 이론
ParkS2
2024. 5. 30. 11:40
1. 인공신경망이란?
인공신경망은 인간의 뇌를 모방하여 만든 컴퓨터 모델이다. 우리 뇌의 뉴런이 서로 연결되어 신호를 주고받는 것처럼, 인공신경망도 노드(뉴런)들이 연결되어 데이터를 처리한다.

2. 인공신경망의 구성
- 인공신경망은 주로 입력층, 은닉층, 출력층으로 구성된다.
- 입력층: 데이터를 받는 부분이다. 예를 들어, 이미지 인식에서는 이미지의 픽셀값이 입력된다.
- 은닉층: 입력층과 출력층 사이에 위치하며, 데이터를 처리하고 변환한다. 이 층이 많을수록 신경망이 깊어져서 "딥러닝"이라고 한다.
- 출력층: 최종 결과를 내는 부분이다. 예를 들어, 이미지가 고양이인지 개인지 판단하는 결과를 출력한다.
은닉층이란?
은닉층은 인공신경망에서 입력층과 출력층 사이에 있는 층이다. 은닉층의 주된 역할은 입력 데이터를 처리하고 변환하여 더 유용한 특징을 추출하는 것이다.

은닉층의 역할
은닉층의 역할은 입력 데이터를 더 복잡하고 추상적인 형태로 변환하는 것이다. 각 은닉층의 노드는 이전 층의 출력을 받아 가중치를 곱하고, 활성화 함수를 통해 비선형 변환을 수행한다. 이를 통해 신경망은 단순한 선형 모델보다 더 복잡한 패턴을 학습할 수 있다.
은닉층의 구성
은닉층은 여러 개의 노드로 구성되며, 이 노드들은 서로 연결되어 있다. 각 노드는 다음과 같은 과정으로 동작한다:
- 가중치와 바이어스: 각 입력값에 가중치를 곱하고 바이어스를 더한다. 이는 노드의 선형 결합을 나타낸다.
- 활성화 함수: 이 선형 결합 값을 비선형으로 변환하는 함수이다. 활성화 함수는 모델의 표현력을 높이는 데 중요한 역할을 한다.
은닉층에서 일어나는 과정
- 이전 층의 출력값을 받음: 은닉층의 각 노드는 이전 층의 출력값을 입력으로 받는다.
- 가중치 곱하기: 각 입력값에 해당하는 가중치를 곱한다.
- 바이어스 더하기: 각 노드마다 바이어스 값을 더한다.
- 활성화 함수 적용하기: 가중치와 바이어스를 더한 결과값을 활성화 함수에 넣어 비선형 변환을 수행한다.
활성화 함수
활성화 함수는 은닉층의 출력을 비선형으로 변환하여, 신경망이 복잡한 데이터를 더 잘 학습할 수 있게 한다. 많이 사용되는 활성화 함수는 다음과 같다:
- ReLU (Rectified Linear Unit): f(x) = max(0, x)로, 입력이 0보다 작으면 0을 출력하고, 그렇지 않으면 입력을 그대로 출력한다. 계산이 간단하고, 깊은 신경망에서 잘 작동한다.
- 시그모이드 함수 (Sigmoid): f(x) = 1 / (1 + exp(-x))로, 출력을 0과 1 사이의 값으로 변환한다. 주로 출력층에서 사용된다.
- 하이퍼볼릭 탄젠트 (Tanh): f(x) = tanh(x)로, 출력을 -1과 1 사이의 값으로 변환한다. 시그모이드 함수보다 출력 범위가 넓어 학습이 더 잘 될 수 있다.

은닉층의 깊이와 너비
- 깊이 (Depth): 은닉층의 수를 말한다. 신경망이 깊을수록 더 복잡한 패턴을 학습할 수 있다. 하지만 너무 깊으면 학습이 어려워질 수 있고, 과적합(overfitting)이 발생할 수 있다.
- 너비 (Width): 각 은닉층의 노드 수를 말한다. 너비가 넓을수록 더 많은 정보를 처리할 수 있지만, 계산 비용이 증가할 수 있다.
은닉층의 학습
은닉층의 가중치와 바이어스는 학습 과정에서 조정된다. 학습은 다음과 같은 과정으로 이루어진다:
- 순전파 (Forward Propagation): 입력 데이터가 입력층에서 시작해 은닉층을 거쳐 출력층으로 전달된다. 각 은닉층에서 입력값에 가중치를 곱하고 바이어스를 더한 후 활성화 함수를 적용한다.
- 손실 함수 (Loss Function): 출력값과 실제 값의 차이를 계산한다. 이 차이를 최소화하는 것이 목표이다.
- 역전파 (Backward Propagation): 손실을 최소화하기 위해 가중치와 바이어스를 조정한다. 오차를 역전파하여 각 은닉층의 가중치와 바이어스를 업데이트한다.

전체 과정의 예
- 순전파:
- 입력값 xx가 입력층을 통해 전달된다.
- 은닉층에서 가중치 ww와 바이어스 bb를 사용하여 변환된다.
- 활성화 함수 ff가 적용된다.
- 출력층에서 최종 예측값 y^\hat{y}가 생성된다.
- 손실 계산:
- 손실 함수 LL을 사용해 예측값 y^\hat{y}와 실제 값 yy의 차이를 계산한다. L=(y−y^)2L = (y - \hat{y})^2
- 역전파:
- 출력층에서 오차를 계산하고, 이를 은닉층으로 역전파한다.
- 각 층의 가중치와 바이어스를 기울기를 사용해 조정한다.
5. 인공신경망의 종류
다양한 종류의 신경망이 있다.
단층 퍼셉트론(Single-layer Perceptron): 입력층과 출력층만 있는 간단한 구조이다.

다층 퍼셉트론(Multi-layer Perceptron, MLP): 은닉층이 여러 개 있는 구조로, 더 복잡한 문제를 해결할 수 있다.

컨볼루션 신경망(Convolutional Neural Network, CNN): 이미지 인식에 주로 사용되며, 필터를 이용해 특징을 추출한다.

이미지는 컨볼루션 신경망(CNN)의 구조를 보여주는 다이어그램이다. 이 다이어그램은 자동차를 인식하는 CNN의 전형적인 과정을 설명하고 있다.
- 입력(Input): 자동차 이미지가 입력으로 사용된다.
- 컨볼루션 + ReLU: 입력 이미지에 컨볼루션 필터들을 적용하여 특징 맵을 생성하고, ReLU 활성화 함수를 사용하여 비선형성을 추가한다.
- 풀링(Pooling): 특징 맵의 크기를 줄이면서 중요한 정보를 유지한다.
- 컨볼루션 + ReLU: 또 다른 컨볼루션과 ReLU 활성화 단계를 거친다.
- 플래튼(Flatten): 특징 맵을 일렬로 펼치는 과정이다.
- 완전 연결(Fully Connected): 펼쳐진 데이터를 하나의 벡터로 처리하여 출력에 가까운 형태로 변환한다.
- 소프트맥스(Softmax): 최종적으로 소프트맥스 함수를 통해 각 클래스(자동차, 트럭, 밴, 자전거)에 속할 확률을 계산한다.
이러한 과정을 통해, 네트워크는 이미지 내의 자동차의 유형을 분류할 수 있다.
예시 코드
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, ReLU, Softmax
# 모델 생성
model = Sequential()
# 첫 번째 컨볼루션 레이어: 입력층
model.add(Conv2D(filters=32, kernel_size=(3, 3), padding='same', input_shape=(64, 64, 3)))
model.add(ReLU())
# 풀링 레이어
model.add(MaxPooling2D(pool_size=(2, 2)))
# 두 번째 컨볼루션 레이어
model.add(Conv2D(filters=64, kernel_size=(3, 3), padding='same'))
model.add(ReLU())
# 두 번째 풀링 레이어
model.add(MaxPooling2D(pool_size=(2, 2)))
# 플래튼 레이어
model.add(Flatten())
# 완전 연결 레이어
model.add(Dense(128))
model.add(ReLU())
# 출력 레이어
model.add(Dense(4)) # 4개의 출력 클래스
model.add(Softmax())
# 모델 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 모델 요약
model.summary()
순환 신경망(Recurrent Neural Network, RNN): 시계열 데이터나 자연어 처리에 사용되며 , 이전 상태를 기억할 수 있다.
각 타임스텝에서 이전 타임스텝의 정보를 현재 타임스텝에 전달함으로써 시퀀스 데이터의 문맥을 이해하고 처리

예시 코드
import torch
import torch.nn as nn
class SimpleRNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleRNN, self).__init__()
self.hidden_size = hidden_size
self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
self.i2o = nn.Linear(hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, input, hidden):
combined = torch.cat((input, hidden), 1)
hidden = torch.tanh(self.i2h(combined))
output = self.i2o(hidden)
output = self.softmax(output)
return output, hidden
def initHidden(self):
return torch.zeros(1, self.hidden_size)
# Parameters
input_size = 10 # Example input size
hidden_size = 20 # Example hidden size
output_size = 5 # Example output size
# Initialize the RNN
rnn = SimpleRNN(input_size, hidden_size, output_size)
# Example input (batch_size=1, input_size=10)
input = torch.randn(1, input_size)
hidden = rnn.initHidden()
# Forward pass
output, next_hidden = rnn(input, hidden)
print("Output:", output)
print("Next Hidden State:", next_hidden)
1. 각 신경망의 구조적 차이
단층 퍼셉트론과 다층 퍼셉트론(MLP):
- 단층 퍼셉트론은 입력층과 출력층만 있는 간단한 구조이다. 따라서 선형 분류 문제만 해결할 수 있다.
- 다층 퍼셉트론은 여러 개의 은닉층을 가지고 있으며, 비선형 활성화 함수를 사용해 비선형 문제를 해결할 수 있다.
컨볼루션 신경망(CNN):
- CNN은 입력 이미지의 특징을 추출하기 위해 컨볼루션 레이어와 풀링 레이어를 사용한다. 이 구조는 이미지의 공간적인 관계를 효과적으로 학습할 수 있게 한다.
- 컨볼루션 레이어는 필터를 사용해 이미지의 특정 부분을 처리하고, 풀링 레이어는 공간적 크기를 줄여 연산을 효율적으로 만든다.
순환 신경망(RNN):
- RNN은 순환 구조를 가지고 있어, 이전 상태를 현재 입력과 함께 처리할 수 있다. 이는 시계열 데이터나 순차적인 데이터에서 유용하다.
- 기본 RNN은 장기 의존성 문제(Long-term dependency problem)가 있을 수 있으며, 이를 해결하기 위해 LSTM(Long Short-Term Memory)나 GRU(Gated Recurrent Unit) 같은 변형 구조가 사용된다.
2. 학습 방식의 차이
단층 퍼셉트론과 다층 퍼셉트론(MLP):
- 단층 퍼셉트론은 단순한 가중치 업데이트 규칙을 따르며, 은닉층이 없기 때문에 복잡한 패턴을 학습할 수 없다.
- 다층 퍼셉트론은 역전파 알고리즘을 통해 가중치와 바이어스를 업데이트하며, 여러 은닉층을 통해 복잡한 패턴을 학습할 수 있다.
컨볼루션 신경망(CNN):
- CNN은 컨볼루션 연산을 통해 입력 데이터의 국소적인 패턴을 학습한다. 이는 이미지의 엣지, 코너 등과 같은 특징을 추출하는 데 유리하다.
- 또한, 풀링 레이어를 통해 데이터의 차원을 줄여 연산량을 줄이고, 중요한 특징만을 학습할 수 있게 한다.
순환 신경망(RNN):
- RNN은 시간에 따라 순차적으로 입력 데이터를 처리하며, 이전 상태를 기억하여 현재 상태를 업데이트한다.
- 이는 시간 종속적인 패턴을 학습하는 데 매우 유용하지만, 기본 RNN은 장기 의존성 문제를 겪을 수 있다. 이를 해결하기 위해 LSTM이나 GRU 같은 변형이 사용된다.
3. 처리할 수 있는 데이터의 차이
단층 퍼셉트론과 다층 퍼셉트론(MLP):
- 주로 구조화된 데이터나 단순한 비구조화 데이터를 처리하는 데 사용된다.
컨볼루션 신경망(CNN):
- 주로 이미지 데이터나 2D/3D 형태의 데이터를 처리하는 데 사용된다. 이는 이미지 분류, 객체 탐지, 이미지 생성 등에 활용된다.
순환 신경망(RNN):
- 주로 시계열 데이터, 텍스트 데이터, 음성 데이터 등 순차적인 데이터를 처리하는 데 사용된다. 이는 텍스트 생성, 기계 번역, 음성 인식 등에 활용된다.