• 딥러닝 개념
  • 신경망의 기본 원리
  • 인공 신경망
  • 회고

 


☑️ 딥러닝 개념

🔎딥러닝이란?

  • 딥러닝은 인공신경망(Artificial Neural Networks)을 기반으로 한 기계 학습의 한 분야입니다.
  • 다층 신경망을 사용하여 데이터로부터 특징을 자동으로 학습하고, 이를 통해 복잡한 문제를 해결합니다.
  • 입력 데이터에서 중요한 패턴을 추출하고, 이를 바탕으로 예측, 분류, 생성 등의 다양한 작업을 수행할 수 있습니다.
  • 머신러닝에서 중요한 패턴은 큰영향을 주는 데이터를 말한다.(문제해결을 위해 가장 잘 동작하는 특징)

🔎딥러닝의 특징

  • 비선형 추론: 딥러닝은 비선형 추론을 통해 복잡한 데이터의 패턴을 학습할 수 있습니다.
  • 다층 구조: 여러 층의 신경망을 사용하여 데이터의 고차원 특징을 학습합니다.
  • 자동 특징 추출: 데이터로부터 중요한 특징을 자동으로 추출하여 별도의 특징 공학(feature engineering) 과정이 필요 없습니다.

🔎머신러닝과의 차이 

  • 머신러닝: 데이터 전처리를 통하여 중요한 데이터를 추출해서 사용
  • 딥러닝: 데이터만 줘도 자동으로 추출, 작동까지 가능

🔎딥러닝 활용(대표적)

  • 이미지 인식
  • 자연어 처리
  • 음성인식
  • 의료 분야

☑️ 신경망의 기본 원리

🔎 신경망이란? (사람의 뇌)

  • 인공 신경망이란 퍼셉트론으로 이루어진 네트워크 

🔎 퍼센트론이란?(뇌속의 뉴런)

  • 퍼셉트론(Perceptron)은 인공 신경망의 가장 기본적인 단위로, 하나의 뉴런을 모델링한 것입니다.
  • 퍼셉트론은 입력 값을 받아 가중치(weight)를 곱하고, 이를 모두 더한 후 활성화 함수(activation function)를 통해 출력 값을 결정합니다.
  • 곱하고 더하고 함수적용시켜 출력

🔎 다층 퍼센트론이란?

  • 다층 퍼셉트론(Multi-Layer Perceptron, MLP)은 여러 층의 퍼셉트론을 쌓아 올린 신경망 구조입니다.
  • MLP는 입력층(input layer), 은닉층(hidden layer), 출력층(output layer)으로 구성되며, 각 층의 뉴런들이 서로 연결되어 있습니다
  • 입력 레이어(Input Layer) : 외부 데이터가 신경망에 입력되는 부분입니다. 입력 레이어의 뉴런 수는 입력 데이터의 특징 수와 동일합니다.
  • 은닉 레이어(Hidden Layer) : 은닉 레이어는 입력 레이어와 출력 레이어 사이에 위치한 층으로, 입력 데이터를 처리하고 특징을 추출하는 역할을 합니다. 은닉 레이어의 뉴런 수와 층 수는 모델의 복잡성과 성능에 영향을 미칩니다.
  • 출력 레이어(Output Layer) : 출력 레이어는 신경망의 마지막 층으로, 최종 예측 값을 출력합니다. 출력 레이어의 뉴런 수는 예측하려는 클래스 수 또는 회귀 문제의 출력 차원과 동일합니다.

 

🔎 활성화 함수란?

  • 활성화 함수는 신경망의 각 뉴런에서 입력값을 출력값으로 변환하는 역할을 합니다.
  • 활성화 함수가 없다면 신경망은 단순 선형변환만 수행하게 되어 복잡한 패턴을 학습할 수 없습니다.
  • 활성화 함수는 비 선형성을 도입하여 신경망이 복잡한 패턴을 학습할 수 있게합니다.
  • ReLU (Rectified Linear Unit): 계산이 간단하고, 기울기 소실 문제 완화
  • Sigmoid: 확율을 나타내기 적합
  • Tanh (Hyperbolic Tangent)

 

🔎 손실 함수

  • 손실 함수(Loss Function)는 모델의 예측 값과 실제 값 사이의 차이를 측정하는 함수입니다.
  • 손실 함수는 모델의 성능을 평가하고, 최적화 알고리즘을 통해 모델을 학습시키는 데 사용됩니다.
  • 회귀문제에서 주로 사용 된다.

🔎 최적화 알고리즘

  • 최적화 알고리즘(Optimization Algorithm)은 손실 함수를 최소화하기 위해 모델의 가중치를 조정하는 방법입니다.
  • 최적화 알고리즘은 손실 함수의 기울기를 계산하고, 이를 바탕으로 가중치를 업데이트합니다.

🔎 역전파 

  • 연쇄 법칙(Chain Rule)을 사용해 손실함수의 기울기를 계산합니다.
  • 각 층의 기울기는 이전 층의 기울기와 현재 층의 기울기를 곱하여 계산합니다.
  • 이를 통해 신경망의 모든 가중치가 업데이트 됩니다

☑️ 인공 신경망(ANN)

🔎 인공 신경망(ANN)

  • 인공 신경망(Artificial Neural Network, ANN)은 생물학적 신경망을 모방하여 설계된 컴퓨팅 시스템입니다
  • ANN은 입력층(Input Layer), 은닉층(Hidden Layer), 출력층(Output Layer)으로 구성되며, 각 층은 뉴런(Neuron)으로 이루어져 있습니다.
  • 입력층: 입력 데이터를 받아들이는 층. 입력층의 뉴런수는 입력데이터 피펴수와 동일
  • 은닉층 : 입력데이터를 처리하고 특징을 처리하는 층.은닉층의 뉴런수와 층수는 모델의 복잡성과 성능에 영향
  • 출력층 : 최종 예측값을 출력하는 층. 출력층의 뉴런수는 예측하려는 클래스 수 또는 회귀문제 출력차원과 동일

🔎 동작방식

  1. 순전파 (Forward Propagation)
    • 입력 데이터를 통해 각 층의 뉴런이 활성화되고, 최종 출력 값을 계산합니다.
    • 각 뉴런은 입력 값에 가중치(weight)를 곱하고, 바이어스(bias)를 더한 후 활성화 함수(activation function)를 통해 출력 값을 결정합니다.
  2. 손실 계산 (Loss Calculation)
    • 예측 값과 실제 값의 차이를 손실 함수(Loss Function)로 계산합니다.
  3. 역전파 (Backpropagation)
    • 손실 함수의 기울기를 출력층에서 입력층 방향으로 계산하고, 이를 바탕으로 가중치를 업데이트합니다.
     

 

🔎 출력 레이어의 유형

  1. 회귀 문제 (Regression):
    • 출력 레이어의 뉴런 수는 예측하려는 연속적인 값의 차원과 동일합니다.
    • 활성화 함수로는 주로 선형 함수(linear function)를 사용합니다.
  2. 이진 분류 문제 (Binary Classification):
    • 출력 레이어의 뉴런 수는 1입니다.
    • 활성화 함수로는 시그모이드 함수(Sigmoid Function)를 사용하여 출력 값을 0과 1 사이의 확률로 변환합니다.
  3. 다중 클래스 분류 문제 (Multi-Class Classification):
    • 출력 레이어의 뉴런 수는 예측하려는 클래스 수와 동일합니다.
    • 활성화 함수로는 소프트맥스 함수(Softmax Function)를 사용하여 각 클래스에 대한 확률을 출력합니다.

 

📚  PyTorch 및 필요한 라이브러리 임포트

import torch #핵심 라이브러리 

import torch.nn as nn #신경망 구축을 위한 네트워크들이 포함 되어있다

import torch.optim as optim #최적화 (어떤 함수들의 최소나 최대로 만드는 변수를 찾는 것)

import torchvision #이미지처리 라이브러리

import torchvision.transforms as transforms #데이터 전처리를 위한 라이브러리

 

📚  데이터셋 로드 및 전처리

#데이터셋 전처리

# transform 이라는 분분은 여러 부분을 순차적으로 변환 시켜준다.

# transforms.ToTensor() 이미지를 tensor라고 하는 파이토치에서 사용하는 기본 자료구조로 변환.

# transforms.Normalize 이미지를 정규화 해준다.평균을 0.5, 표준편차를 0.5로 설정했다.

transform = transforms.Compose([

            transforms.ToTensor(),

            transforms.Normalize((0.5,), (0.5,))

])

 

정규화란

data의 평균(data가 어떤 값을 가지냐)과 분산(data가 얼마나 퍼졌있냐)

예시)

키 0~3m

나이 0~200세

재산 0~1000억

ax+b 형태로 페셉트론이 형성 된다

x가 0~200일때랑 0~1000억일때 어느쪽이 더 영향력이 큰가 재산이다. 그런데 재산이 문제를 해결하기 위해 키나 나이보다 중요한 의미를 가질까? 아닐 수 있다(재산이 너무 크면 키나 나이가 반영이 안될 수 있다,). 그래서 각각의 표준과 평균을 맞춰 주는게 학습을 원활하게 해준다.

 

 

#MNIST 데이터셋 로드 

# sorchvision.datasets.MNIST 토치비젼에있는MNIST를 다운로드 한다.

# root='./data 다운로드 하기 위한 경로

# train=True train셋인지 본다.

# download=True 다운로드 할것인지 본다.

# transform=transform transform을 전달해주면서 데이터를 전처리 한상태로 다운로드 해주는 것

trainset = sorchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)

trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,suffle=True)

# torch에 utils에 data에 DataLoader를 가져온다.

# batch_size는 데이터를 쪼개준다 (학습속도를 높이기 위해)

# suffle 데이터를 쪼갤때 손상이 갈 수 있어 섞어서 batch를 만들게해준다.

testset = torchvision.datasets.MNIST(root='./data', train=False, downlad=True, transform=transform)

testloader = torch.utils.dataDataLoader(testset, batch_size=64, shuffle=False)

 

📚 간단한 ANN 모델 정의

class SimpleANN(nn.Module): #클래스 정의 이름정하기 nn.module 상속받기 (nn.module을 상속받음으로써 딥러닝모델을 만들기 위한 기본기능을 사전에 가져오는 것)
#class가 생성되는 순간 model을 만들고  그때 자동으로 호출 된다 

#부모 클래스에서 기능을 작동하는 super함수를 불러준다.

   def __init__(self): 
        super(SimpleANN, self).__init__()
       #  self.fc1 레이어를 만들어준다.

       # nn.Linear(28 * 28, 128) ANN모델을 설정해준다. 28*28은 data의 크기/128은 fc2의128로 64는 fc3의 64로

        self.fc1 = nn.Linear(28 * 28, 128)  # 입력층에서 은닉층으로
        self.fc2 = nn.Linear(128, 64)       # 은닉층에서 은닉층으로
        self.fc3 = nn.Linear(64, 10)        # 은닉층에서 출력층으로

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 입력 이미지를 1차원 벡터로 변환
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

 

📚 모델 학습

#모델 초기화
model = SimpleANN()

#학습 전 결과 출력 (비교를 위해)
correct = 0
total = 0
#no_grad는 메모리 효율성을 위해 사용
#no_grad는 평가단계에서 기울기를 계산하지 않는다 지정(오차함수를 줄이는 방향으로 업데이트 한다는 의미)
#no_gard 동안에는 학습을 진행하지 않는다.
with torch.no_grad():
    #학습을 진행하지 않는 상황에서 데어로더에서 데이터를 하나씩 꺼내서
    for data in testloader:
        #데이터의 이미지와 레이블을 본다
        images, labels = data
        #그뒤 모델에 전달해서 예측 값을 본다(outputs).
        outputs = model(images)
        #torch.max를 통해서 가능성의 최대값을 찾는다.
        _, predicted = torch.max(outputs.data, 1)
        #레이블의 사이즈를 total에 더해준다
        total += labels.size(0)
        #batch의 크기를 반환해서 실제 데이터를 알수있는 상태
        #예측값과 실제값이 일치하는 샘플을 찾는거다.
        correct += (predicted == labels).sum().item()

print(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')

 

# 손실 함수와 최적화 알고리즘 정의
#CrossEntropyLoss는 분류모델에서 성능을 확인하기 위한 손실함수
criterion = nn.CrossEntropyLoss()
#SGD는 최적화에서 기울기(가중치)를 업데이트를 할 때 사용
#전체를 보게하면 너무 느리니 일부만 보게해서 기울기 계산
#lr 학습율 정하기 (가중치 변화량 조절) 값은 적당히 작게하고 문제와 데이터크기에 따라 달라서 실험적으로 정해야한다.
#parameters 업데이트를 하기 위한 파라미터 지정
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

#epoch 전체데이터를 몇번 반복할건지를 말한다.
#range(10) 10번 선택
for epoch in range(10):
    #손실함수가 어느정도 발생했는지 보기 위함?
    running_loss = 0.0
    #i는 인덱스
    #data는 data
    for i, data in enumerate(trainloader,0):
        inputs, labels = data
        
        #optimizer는 연쇄계산이라 기울기 초기화
        optimizer.zero_grad()
        
        #순전파로 계산
        outputs = model(inputs)
        #loss계산
        loss = criterion(outputs, labels)
        #loss를 다시 뒤로 전달해서 각각의 loss가 어떻게 반영해야 되는지 알려준다
        #기울기를 찾는다.
        loss.backward()
        #기울기를 바탕으로 가중치를 업데이트
        optimizer.step()
        
        #loss출력
        running_loss += loss.item()
        #100개의 미니배치마다 출력
        if i%100 == 99:
            print(f'[Epoch {epoch + 1}, Batch{i + 1}] loss: {running_loss / 100:.3f}')
            running_loss = 0.0
            
print('Finished Training')

 

 


☑️ 회고

오늘은 고민이 해결 되는 날이였다.

 

내용은 어렵다 보니 집중력이 떨어져 많은 공부를 하지 못했지만

 

이때까지 내가 근본적으로 궁금해했지만 그걸 어떻게 설명해야할지 모르겟던 질문이 생각났고 답을 찾게 되었다.

 

그 질문은 바로

 

이렇게 머신러닝 딥러닝 코드를 짜고 학습시켜서 이미지 분류하는 모델를 만든다고 했지만 실제로는 어떻게 적용시켜? 뭐 할 때 써?

 

질문 자체가 이걸 내가 왜 배우고있어? 이런 뉘앙스여서 여태 쉽게 정의 하지 못한듯하다.

 

하지만 정말 간단했고 답을 찾았을 땐 시원했다. (이제는 나를 불편하게 했던 녀석이 없어졌기 때문!!)

 

위 질문의 해답은 MNIST나 비슷한 모델들이 사용 되고있는 실제사례를 알게 되었고

 

가장 궁금했던 어떻게 적용하고 쓰냐 이건데

 

복잡한 과정이 많아 보이지만 짧게 정리한다면

 

로컬환경(어플리케이션 등)을 만들어서 학습모델 코드를 집어넣어 작동시키는 것이였다.

 

모델도 만들고 그것을 사용하기 위한 환경도 만든다니 너무 어려워 보이지만

 

매우 기대가 된다.

+ Recent posts