머신러닝, 딥러닝

[딥러닝] ANN(인공신경망)의 원리

powderblue0 2026. 2. 14. 22:02

이번 글에서는 딥러닝의 기본이 되는 ANN(Artificial Nerual Network, 인공신경망)의 원리에 대해 설명합니다. 사실 직관적으로 이해하기에 어려운 부분은 없는데, 많은 개념이 나오는 만큼 쉽게 까먹게 되는 것 같아서 정리해 두려고 합니다. 

 

딥러닝이란 건 결국 "생각하는 신경망"의 설계, 즉 생각하는 방법의 설계와도 같습니다. 이번 글의 경우

  • 딥러닝 모델을 실제로 만들 때 알고 있어야 하는 부분
  • 전체적인 학습의 흐름
  • 개념적으로 헷갈릴 수도 있는 부분들

위주로 정리하려고 합니다. 


목차

1. 데이터 준비: Feature Data와 Target Data

2. 데이터를 작은 단위로 나눈다. 

     2.1. Batch의 개념

     2.2. BGD, SGD, MGD의 차이 알기

     2.3. DataLoader를 이용한 코드

3. 레이어 통과

     3.1. ANN의 기본 구조

     3.2. 활성화함수의 필요성

4. 최종 예측값의 손실 계산

     4.1. 전체적인 학습 구조

     4.2. Loss Function과 Cost Function은 어떻게 다른가?

5. 파라미터의 업데이트

     5.1. 파라미터 업데이트 과정

     5.2. PyTorch 예시 코드

 

 

1. 데이터 준비: Feature Data와 Target Data

지도학습 모델을 만들기 전에 먼저 확실하게 정해두고 시작해야 하는 것이 있습니다. 

- 모델이 해결해야 하는 과제가 무엇인지 (과제정의, 회귀인지 분류인지)
- Feature와 Target이 각각 무엇인지

 

어떤 모델을 만들든, 얼마나 복잡한 과제를 해결하든, 어떤 데이터 (시계열데이터/ 텍스트데이터/ 이미지데이터/ 간단한 csv 파일 등등..) 든 이 두 가지는 항상 명확히 정해두고 시작해야 합니다. 

첫번째로 언급한 '모델이 해결해야 하는 과제'의 경우, 무언가를 시작할 때 그것의 목적을 정하는 과정을 뜻합니다. 

두번쨰로 언급한 'Featrue와 Target의 정의'는 쉽게 말해, 모델이 무엇을 받고 무엇을 내뱉을지를 명확히 해주어야 한다는 뜻입니다. 

 

  • Feature Data는 Input Data이다.
  • Target Data는 Output Data이다. 

정말 쉽게는 다음과 같이 생각하면 됩니다. 

 

Feature와 Target이 될 데이터들을 정의하고, 그에 맞게 데이터를 준비했다면, 데이터를 작은 단위로 나눠주는 과정을 거칩니다. 

 

 

2. 데이터를 작은 단위로 나눈다.

2.1. Batch의 개념

지도학습에서 Batch의 개념은, 

'데이터가 1000개 있을 때, 이 데이터를 하나하나 학습시킬 것인가?'의 질문에서 시작합니다. 

 

결론부터 이야기하자면 Batch는 모델의 파라미터를 한 번 업데이트하기 위해 사용되는 데이터의 묶음을 의미합니다. 

 

저는 지도학습의 개념을 설명할 때 수험생키우기에 주로 비유를 하곤 하는데,

기본적으로 '무언가를 배우는 과정' 즉 '학습'을 위해서는 '정답을 확인'하는 시간이 필요한데 (수험생이 틀렸는지 아닌지를 알기 위해 채점을 해야 수험생이 잘 배울 수 있는 것과 같은 논리입니다.)

 

이떄 Batch의 설정은 1000개의 문제를 풀 때, '몇 문제를 풀 때마다 정답지를 보고 채점을 할 것인지'를 정하는 과정에 해당합니다.

 

2.2. BGD, SGD, MGD의 차이 알기

위의서의 '몇 문제를 풀 때마다 정답지를 확인할지'에 대한 대답은 세 가지로 나눌 수 있습니다. 일일히 설명하는 건 시간낭비니까, 간단하게 표로 대체할게요..

중요한 건 BGD → SGD → MGD 순으로 발전해왔고, 요즘은 MGD(Mini-Batch GD)를 사용한다는 것입니다. 그래서 보통 '데이터를 배치 단위로 나눈다'라고 하면 MGD를 사용한다는 뜻이 됩니다. 

 

헷갈릴 수 있는데, 그러니까 BGD(Batch Gradient Descent)는 이름과는 달리 실제로 배치 단위로 데이터를 나누는 건 아니라는 뜻이 됩니다. 이는 Batch라는 용어가 초기 하나의 데이터셋을 지칭하는 용어에서 데이터의 묶음을 지칭하는 용어로 변화했기 때문...이지만 이런 건 중요하진 않고, 중요한 건 MGD니까 그것만 기억하면 됩니다. 

 

주로 사용되는 용어는 다음과 같습니다. 

  • Batch Size(배치 사이즈): 한 번에 학습할 데이터의 개수
  • iteration: 전체 데이터를 한 번 다 훑기 위해 배치를 몇 번 돌렸는가?
  • epoch: 전체 데이터셋을 총 몇 번 반복해서 보았는가?

예를 들어 1000개 데이터에서 Batch Size가 32라면 1000개의 데이터를 담고 있는 데이터셋을 한 번 학습하기 위해서는 1000÷32 = 31.25 , 즉 올림하여 32회의 iteration이 필요한 것이 됩니다. 

32회의 iteration을 돌면 그것이 1 epoch가 됩니다.

 

2.3. DataLoader를 이용한 코드

파이토치의 경우 DataLoader를 이용하여 데이터를 간단하게 나눌 수 있습니다. 가장 간단한 코드는 다음과 같고

from torch.utils.data import DataLoader
loader = DataLoader(dataset=data, batch_size=32, shuffle=True)

 

보통은 train 데이터와 test 데이터를 구분하다 보니 다음과 같이 사용하게 됩니다.

from torchl.utils.data import DataLoader
train = DataLoader(dataset=train, batch_size=32, shuffle=True)
test = DataLoader(dataset=test, batch_size=32, shuffle=False)

이때 test 데이터는 shuffle=False로 설정해 줍니다. 왜냐하면 각기 다른 모델의 성능을 비교할 때, 매번 같은 순서로 test 데이터를 돌려야 같은 기준으로 평가가 가능하기 때문입니다. 

 

 

3. 레이어 통과

3.1. ANN의 기본 구조

ANN의 가장 작은 단위인 노드(node)부터 설명을 하기에는 제가 지식도 부족하고 하니, 이번 글에서는 꼭 알아야 한다 싶은 것들만(Layer부터) 정리해두려고 합니다. 노드부터 시작되는 개념은 아래 링크 참고해주세요.

https://insoobaik.tistory.com/663

 

ANN(Artificial Neural Network)에 대하여

■ ANN(Artificial Neural Network) ANN은 생물학적 신경망을 본떠 만든 컴퓨팅 시스템으로, 데이터 처리와 패턴 인식에 사용된다. ANN은 뉴런으로 불리는 노드의 집합으로 구성되며, 뉴런은 층(layer)로 조

insoobaik.tistory.com

 

ANN 기반의 모델은 여러 레이어(Layer)로 구성됩니다. 가장 간단한 형태의 레이어를 보자면 다음과 같습니다.

ANN을 구성하는 레이어라는 건 쉽게 말하면, Input을 받아서 Output을 출력하는 하나의 층입니다. Output을 계산할 때는 위의 이미지와 같이, 우선 각 Input에 적절한 가중치 weight(w)를 곱한 값을 모두 더한 후, 적절한 bias(b)를 더한 가중합을 계산합니다. 

 

레이어를 여러 층으로 겹치면 이런 느낌이 됩니다.

 

3.2. 활성화함수의 필요성

그렇다면 '각 Input의 가중치와, 적절한 bias를 계산하는 것을 반복하는 것만으로 우너하는 Task를 수행하는 모델을 만들 수 있는가?' 라는 질문을 던질 수 있습니다. 대답은 No입니다.

 

왜냐하면 수학적으로 "Input에 가중치를 곱한 후 모두 더하는" 과정을 여러 번 반복해도 결국엔 선형적 결합으로만 남기 때문입니다. 선형대수학적으로 설명한다면 '걸국 선형 관계는 선형 관계인 채로 남을 뿐'이라는 것입니다.

그래서 이를 해결하고 비선형성을 추가해 이 선형 관계를 비틀어주기 위해 비선형 활성화함수(Activation Function)이 필요한 것입니다. 우선은 '비선형성 확보를 위해 활성화함수가 필요하다'까지만 정리하고, 자세한 내용은 다음에 기회가 되면 정리하도록 하겠습니다.

 

활성화함수도 여러 종류가 있는데, 더 궁금하신 분은 아래 글 참고해주세요.

https://wikidocs.net/250622

 

3. 활성화 함수: 종류와 선택 기준

활성화 함수는 인공신경망에서 입력 신호를 출력 신호로 변환하는 역할을 한다. 활성화 함수는 신경망의 비선형성을 도입하여 복잡한 문제를 해결할 수 있도록 도와준다. 이 장에서는 …

wikidocs.net

 

 

4. 최종 예측값의 손실 계산

4.1. 전체적인 학습 구조

데이터 준비 → 데이터를 작은 단위로 나눈다 → 레이어를 통과한다

까지 설명했는데, 실제로 모델이 어떻게 '학습'을 하는지, 즉 어떻게 배워나가는지의 구조는 다음과 같습니다. 

 

일단 레이어를 통과시켜서 답(y-hat)을 내고, 이것을 정답인 y와 비교해서 "얼마만큼 차이가 나는지"를 계산한 뒤, 이에 맞춰서 각 레이어의 파라미터 (그러니까 weight와 bias)를 업데이트 하는 과정으로 학습을 하게 됩니다.

 

여기서 정답과 얼마만큼 차이나는지는 단순 뺼셈으로 계산하는 것이 아니라 모델의 Task에 따라 적절한 Loss Function을 계산하는 과정을 거칩니다. 다시 말해, Loss Function 이라는 건 특정한(고정된) 공식을 가진 함수가 아니라, "정답과 얼마만큼 차이나는지" 즉 예측갑솨 실제값의 차이를 표현하는 지표라고 볼 수 있습니다. 

 

실제로 Task에 따라 서로 다른 Loss Function을 계산합니다.

https://hyoung-2y.tistory.com/36

 

Loss function 이란?

손실 함수는 비용함수(Cost Function)이라고도 불린다. 손실 함수는 '인공지능' 과목에 포함되는 Machine Learning 최적화의 기본 원리이며 기초적인 개념이다. 위의 그림은 일반적인 통계학적 모델의 형

hyoung-2y.tistory.com

 

4.2. Loss Function과 Cost Function은 어떻게 다른가?

위에서 설명한 모델의 학습 원리의 핵심은, 모델이 예측한 값(y-hat)과 실제 정답값(y)가 얼마나 다른지를 계산해서, 그 값을 토대로 파라미터를 개선시켜 나간다는 것입니다.

 

이때 손실 계산을 위해 사용되는 Loss Function의 개념과 Cost Function의 개념은 혼용해서 사용하는 경우가 있는데, 둘은 엄연히 말하면 다른 개념입니다. 

표에서와 같이, Loss Function은 하나의 데이터에 대해 오차를 계산하는 것을 뜻하고, Cost Function은 전체 데이터셋에서 각 데이터에 대해 오차를 계산하여 평균을 낸 것입니다. 즉, Loss Function은 '지금 이 데이터가 얼마나 틀렸는지'를 나타내고, Cost Function은 '모델이 해당 데이터셋을 전체적으로 이해하고 있는지'를 나타냅니다. 

 

그러니까 모델이 학습을 할 때 줄여나가는 값은 Cost Function이라는 것입니다. 이걸 Loss Function으로 설명하는 경우도 있는데, 정확히는 Cost Function.

 

 

5. 파라미터의 업데이트

5.1. 파라미터 업데이트 과정

손실 계산에 대해서도 설명했으니, 학습 과정에서의 마지막 부분(Backpropagation과 Optimizer)에 대해 설명해보겠습니다.

"그래서 실제로 파라미터를 어떻게 업데이트 할 것인가?" 에 해당하는 부분입니다. 

 

근데 여기서부터는 다양한 방법론이 존재하고, 수학적인 원리도 나오기 때문에 나오는 용어들이 급증하기 때문에 많이 복잡해집니다. 그래서 필요없는 것들은 제쳐두고 핵심만 정리해두겠습니다. 

 

(1) Backpropagation (역전파)

우선, 상식적으로 '파라미터를 업데이트하려면, 업데이트할 파라미터를 알아야 한다'는 사실부터 출발합니다. 파라미터 업데이트의 가장 첫 과정은 먼저 각 레이어의 weight를 계산하는 것입니다. 

 

이떄 '정답에서부터 얼마나 틀렸는지'를 보고 계산하는 것이기 때문에 (가장 정확히 설명하자면, 손실함수의 기울기를 보고 각 레이어의 weight의 미분값을 구합니다.)

weight를 계산하는 방향은 Input에서 Output을 향하는 방향이 아니라, Output에서 Input을 향하는 "반대" 방향 순서로 레이어들을 봅니다. 

 

그래서 이 과정을 역(Back)전파라고 부릅니다. 

정확한 원리를 따지자면 미분의 Chain Rule까지도 설명해야 하지만, 그게 무슨 개념인지는 알테니 스킵하겠습니다. 궁금하면...찾아보시던가요.

 

(2) Gradient Descent (경사하강법)

역전파를 통해 각 레이어의 weight를 계산하고 나면, '그러면 이걸 이제 어떻게 업데이트 할 건데?'라는 질문이 남게 됩니다.

 

여기서 "어떻게"에 대한 대답이 Gradient Descent입니다. 그러니까 경사하강법이라는 것은, 하나의 원리입니다. 더 정확히 말하면, 경사 하강법 알고리즘이라는 표현이 가장 정확합니다. 

원리를 조금 설명해보자면, 손실함수의 가장 가파른 내리막길의 방향으로 파라미터를 한 걸음 이동하는 원리입니다.

 

(3) Optimizer (옵티마이저)

Gradient Descent가 "원리"에 해당했다면, Optimizer는 실제로 파라미터를 업데이트하는 "주체"라고 설명하는 것이 적절할 것 같습니다. 실제로 코드에서도 그러한 흐름을 보입니다. (코드는 밑에 있어요)

 

경사하강법이라는 원리를 사용하여, Optimizer가 실제로 파라미터를 "얼마나 큰 보폭으로 (lr, Learning Rate)", "어느 방향으로" 이동시킬지 결정하기 때문에, '주체'가 되는 것입니다. 

 

 

5.2. PyTorch 예시 코드

실제로 코드에서는 Backpropagation을 통해 계산한 각 weight을 .grad에 저장합니다. 

이후 옵티마이저가 .grad에 저장한 값들을 꺼내서, 그 값들을 업데이트합니다. 

 

사실 Optimizer에도 여러 종류가 있는데, 그 종류를 하나하나 따져가면서 모델을 만드실 게 아니라면, 그냥 통상적으로는 Adam을 씁니다. 자세히 알려고 하지 마세요. 그냥 Adam 쓰세요~

 

전체 코드는 다음과 같습니다. 

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F  

criterion = nn.MSELoss()      
optimizer = optim.Adam(model.parameters(), lr=0.001)
epochs = 1000 

for epoch in range(epochs + 1):

    pred = model(x)
    loss = criterion(pred, y) 

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

 

위에서 Optimizer가 파라미터를 업데이트하는 주체라고 설명한 것은 보이는 것과 같이 실제로도 코드가 그렇게 돌아가기 때문입니다. 

 

위 코드의 일부분을 뜯어보자면

import torch
import torch.optim as optim
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

다음과 같이 Optimizer를 선언한 다음 그 변수가 주체가 되어

optimizer.step()

과 같이 작동하는 것을 볼 수 있습니다.