수 많은 우문은 현답을 만든다

퍼셉트론과 딥러닝 본문

인공지능/머신러닝

퍼셉트론과 딥러닝

aiden.jo 2024. 1. 12. 13:26

안녕하세요, 조영호입니다.
이전 챕터에서 미분이 딥러닝 알고리즘의 구현을 크게 단순화하는 것을 공부했는데, 이 기울기가 심층 신경망에서는 어떻게 계산되는지에 대해 자세히 살펴보겠습니다.

 

    1. 퍼셉트론
      입력 값에 대해 출력 값이 어떻게 나올지 예측하는 [입력 > 연산 > 출력] 시스템이다. 퍼셉트론은 사람 뇌의 단일 뉴런이 작동하는 방법을 흉내내기 위해 환원 접근법(reductionist approach)을 이용한다. 초기 가중치를 임의의 값으로 정의하고 예측값의 활성 함수 리턴값과 실제 결과값의 활성 함수 리턴값이 동일하게 나올 때까지 가중치의 값을 계속 수정하는 방법이다.

    2. 단층 퍼셉트론
      아래 그림에서 원을 뉴런 혹은 노드라고 부르며, 입력 신호가 뉴런에 보내질 때는 각각 고유한 가중치가 곱해진다. (w1,w2) 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용한다. 즉, 가중치가 클 수록 해당 신호가 그만큼 더 중요함을 뜻한다. 그 신호를 받은 다음 뉴런은 이전 뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력한다. 그 한계를 보통 임계 값 (theta)이라 한다. 가중치를 갖는 층이 한 층이기 때문에 단층 퍼셉트론이라고 부른다.
    3. 다층 퍼셉트론(multilayer perceptrons)
      단층 퍼셉트론은 직선형 영역만 표현할 수 있어서 데이터들의 차이가 확연히 두드러지지 않는다면 두 가지의 종류조차도 분류하지 못할 수도 있다는 말과 같다. 그래서 다층 퍼셉트론은 중간에 은닉층(hidden layer)이라 불리는 층을 더 가지고있는데, 선형 분류만으로 풀기 못했던 문제를 비선형적으로 풀 수 있게 된다

    4. 심층 신경망 (Deep Neural Network, DNN)
      은닉층이 2개 이상인 신경망을 심층 신경망이라 하며, 복잡한 문제를 해결할때 깊은 층수를 쌓는데 경우 역전파(Backpropagtion) 학습과정에서 데이터가 사라져 학습이 잘 되지 않는 현상인 Vanishing Gradient 문제가 발생할 수 있다. 이러한 한계를 극복한 인공신경망을 딥러닝 (Deep Learning)이라고 한다

    5. Propagation
      Forward propagation은 예측을 수행하고, Backward propagation은 이 예측의 오차를 이용하여 모델을 학습시킵니다. 이 두 과정이 반복되면서 모델은 입력과 출력 간의 관계를 학습하고 최적화됩니다.
      1. Forward Propagation
        Forward propagation은 신경망이 입력 데이터를 받아 출력까지의 과정을 나타냅니다. 이 과정에서 입력 데이터가 각 층을 거쳐 출력까지 전달됩니다. 각 층은 가중치(weight)와 편향(bias)을 사용하여 입력을 가중치 합산하고 활성화 함수를 통과시킵니다. 이러한 과정을 통해 신경망은 입력에서 출력까지의 예측을 수행합니다.

        1. Forward Propagation의 단계
          1. 입력층(Input Layer): 입력 데이터를 받아오는 층
          2. 가중치 합산과 활성화 함수: 각 은닉/출력층에서 입력과 가중치의 합에 편향을 더한 후, 활성화 함수를 적용
          3. 출력층(Output Layer): 최종 예측 값을 생성하는 층으로, 일반적으로 활성화 함수를 적용하지 않거나, 분류 문제에서는 소프트맥스(softmax) 활성화 함수를 사용
      2. Backward Propagation
        Backward propagation은 신경망의 가중치와 편향을 학습하기 위해 사용되는 과정입니다. 이 과정에서는 손실 함수(loss function)를 최소화하기 위해 각 파라미터에 대한 기울기(gradient)를 계산하고, 이를 사용하여 가중치와 편향을 업데이트합니다.

        1. Backward Propagation의 단계
          1. 손실 함수 계산: 출력과 실제 값 간의 차이를 나타내는 손실 함수를 계산
          2. 기울기 계산: 손실 함수의 각 파라미터에 대한 기울기(편미분)를 계산. 이는 오차 역전파(backpropagation) 알고리즘을 사용하여 수행
          3. 가중치와 편향 업데이트: 경사 하강법(Gradient Descent)이나 다른 최적화 알고리즘을 사용하여 가중치와 편향을 업데이트

    6. 수치 안정성(Numerical Stability and Initialization)
      수치 안정성은 수학적 알고리즘이 입력의 작은 변동이나 변경에 대해 얼마나 민감한지를 나타냅니다. 딥러닝에서는 수치 안정성이 중요하며, 훈련 중 수행되는 계산이 overflow, underflow 또는 정밀도 손실과 같은 문제를 겪지 않도록 보장해야 합니다.
        그래디언트는 각 변수에 대한 변화율을 모아놓은 벡터이기 때문에, 벡터의 크기와 방향을 통해 함수의 증가 방향과 정도를 알 수 있습니다. 일부 경우에는 역전파 중 그래디언트가 극히 작아지는 경우(소멸 - Vanishing) 또는 극히 커지는 경우(폭주 - Exploding Gradients)가 발생할 수 있습니다. 이는 불안정한 훈련을 유발하고 모델이 효과적으로 학습하는 데 어려움을 줄 수 있습니다.

    7. 딥러닝(Deep Learning)
      인공 신경망을 기반으로 한 모델들을 사용하여 복잡한 패턴과 특징을 학습하는 데 중점을 둔 방법론입니다. 딥러닝은 대규모의 데이터를 사용하여 다양한 계층으로 이루어진 신경망을 훈련시킴으로써 높은 수준의 성능을 달성할 수 있습니다. 딥러닝 아키텍처를 4가지 정도 간단히 나열해보겠습니다.
      1.  인공 신경망 (Artificial Neural Networks - ANN): 가장 기본적이고 기초적인 형태의 딥러닝 모델입니다. 입력층, 은닉층, 출력층으로 구성되어 있으며, 각 뉴런은 가중치와 활성화 함수를 사용하여 연결되어 있습니다.

      2. 합성곱 신경망 (Convolutional Neural Networks - CNN): 주로 이미지 인식과 관련된 작업에 사용되며, 합성곱 연산과 풀링 연산을 통해 이미지의 지역적인 패턴을 인식합니다.

      3. 순환 신경망 (Recurrent Neural Networks - RNN): 순서가 있는 데이터, 예를 들면 시계열 데이터나 자연어 처리와 같은 작업에 사용됩니다. 순환 구조를 가지고 있어 이전의 정보를 기억하고 활용할 수 있습니다.

      4. 트랜스포머 (Transformer): 자연어 처리 분야에서 주로 사용되는 모델로, 시퀀스 전체를 한 번에 처리하는 구조를 가지고 있어 RNN의 단점을 극복합니다.
    8. Dropout
      드롭아웃은 딥러닝에서 과적합(overfitting)을 방지하고 모델의 일반화 성능을 향상시키기 위한 규제(regularization) 기법 중 하나입니다. 특히, 신경망이 크고 복잡한 경우에 효과적으로 사용됩니다. Dropout은 훈련 중에 신경망의 일부 뉴런을 랜덤하게 선택하여 비활성화시키는 과정을 말합니다. 간단히 말하면, 각 훈련 반복(iteration)에서 각 뉴런이 "드롭아웃"될 확률을 가집니다. 이는 모델이 특정 뉴런에 과도하게 의존하지 않도록 하며, 다양한 특징을 학습하도록 도와줍니다.
      MLP before and after dropout

      Dropout은 주로 완전 연결층(fully connected layer)에서 사용되지만, 합성곱 신경망(Convolutional Neural Network, CNN)이나 순환 신경망(Recurrent Neural Network, RNN)과 같은 다른 유형의 층에서도 적용할 수 있습니다.
      1. Dropout을 수행하는 방법
        1. 랜덤 드롭아웃: 각 훈련 반복에서 각 뉴런이 드롭아웃될 확률을 가지고 무작위로 선택합니다. 이는 모델의 매번 다른 부분 집합에서 학습하게 만듭니다.
        2. 확률 설정: 보통 0.2에서 0.5 사이의 드롭아웃 확률이 사용됩니다. 이 값은 하이퍼파라미터로 조절할 수 있습니다.

      2. PyTorch를 사용해 드롭아웃을 구현하면 다음과 같습니다.
        import torch
        import torch.nn as nn
        
        class MyModel(nn.Module):
            def __init__(self):
                super(MyModel, self).__init__()
        		# fc는 fully connected layer를 의미
                self.fc1 = nn.Linear(in_features=input_size, out_features=hidden_size)
                self.dropout = nn.Dropout(p=0.5)  # 드롭아웃 확률은 0.5로 설정
                self.fc2 = nn.Linear(in_features=hidden_size, out_features=output_size)
        
            def forward(self, x):
                x = self.fc1(x)
                x = torch.relu(x)
                x = self.dropout(x)  # 드롭아웃을 적용
                x = self.fc2(x)
                return x

        1. x = self.fc1(x)
          입력 데이터
          x를 첫 번째 fully connected layer인 fc1에 통과시키면 입력 데이터의 선형 변환을 수행하고, 가중치와 편향을 사용하여 새로운 형태로 변환된 출력을 생성합니다.
        2. x = torch.relu(x)
          ReLU(Rectified Linear Unit) 활성화 함수를 적용합니다. ReLU는 음수를 0으로 변환하고 양수는 그대로 두는 활성화 함수로, 비선형성을 도입하여 모델이 더 복잡한 패턴을 학습할 수 있도록 합니다.
        3. x = self.dropout(x)
          드롭아웃은 학습 중에 랜덤하게 선택된 뉴런들을 비활성화시켜 과적합을 방지하는 정규화(regularization) 기법입니다. self.dropout은 드롭아웃을 나타내는 PyTorch의 모듈로, 훈련 중에만 활성화됩니다.
        4. x = self.fc2(x)
          이제 드롭아웃이 적용된 출력을 두 번째 fully connected layer인 fc2에 통과시킵니다. 이는 이전 층의 출력을 다시 선형 변환하고 최종 출력을 생성합니다.
        5. return x
          최종 출력을 반환합니다. 이 출력은 모델이 입력 데이터에 대해 만든 예측값입니다. 예측값에 대해 예를 들어보자면, 모델이 10개의 클래스로 이미지를 분류하는 경우, x는 10차원 벡터일 것이고, 소프트맥스 함수를 적용하여 10개 클래스 각각에 속할 확률이 나오게 됩니다.
      3. 전체 코드
        가상의 데이터에 대한 모델의 예측을 나타내는 샘플코드입니다. 참고로 forward 함수는 model 생성시 데이터가 전달되면서 자동으로 수행됩니다.
        import torch
        import torch.nn as nn
        import torch.nn.functional as F
        
        class MyModel(nn.Module):
            def __init__(self, input_size, hidden_size, output_size):
                super(MyModel, self).__init__()
                self.fc1 = nn.Linear(in_features=input_size, out_features=hidden_size)
                self.dropout = nn.Dropout(p=0.5)
                self.fc2 = nn.Linear(in_features=hidden_size, out_features=output_size)
        
            def forward(self, x):
                x = self.fc1(x)
                x = torch.relu(x)
                x = self.dropout(x)
                x = self.fc2(x)
                return x
        
        # 모델 객체 생성
        model = MyModel(input_size=10, hidden_size=20, output_size=5)  # 예시로 input_size, hidden_size, output_size 설정
        # 가상의 이미지 데이터 생성 (예시)
        input_data = torch.randn(1, 10)  # 예시로 10차원의 입력 데이터 생성
        # 모델에 입력 데이터 전달하여 예측값 얻기 (forward 함수 자동 호출)
        output_probs = model(input_data)
        # 소프트맥스 함수를 적용하여 클래스별 확률 얻기
        output_probs = F.softmax(output_probs, dim=1)
        # 예측된 클래스는 가장 확률이 높은 클래스
        predicted_class = torch.argmax(output_probs, dim=1)
        # 결과 출력
        print("Class probabilities:", output_probs)
        print("Predicted class:", predicted_class.item())


    9. From Fully Connected Layers to Convolutions
      완전 연결된 층(Fully Connected Layers)에서 합성곱(Convolution)으로의 전환에 대해 알아보겠습니다. 이러한 전환은 이미지 및 비전 관련 작업에서 특히 중요하며, 컨볼루션 신경망(Convolutional Neural Networks, CNNs)의 등장과 관련이 있습니다.
      1. Fully Connected Layers
        완전 연결된 층은 데이터 간의 전체적인 상호작용이 중요한 경우에 유용합니다. 예를 들어, 특정 열들 간의 복잡한 상관관계가 중요한 경우, 문장에서 단어 간의 복잡한 의미적 관계를 학습하는 경우 등 작은 규모의 데이터셋이나 모델이 복잡한 구조를 필요로하지 않는 경우에 자주 사용합니다.

      2. Convolutions
        반면 합성곱 층은 지역적 패턴 및 구조를 인식하는 데 특화되어 있습니다. 각 뉴런이 입력 데이터의 작은 지역 영역과만 연결되어 있으며, 이를 통해 공간적인 구조를 보다 효율적으로 학습할 수 있습니다. 또한, 합성곱 층은 가중치를 공유함으로써 파라미터의 수를 효과적으로 줄일 수 있습니다.

    10. padding and stride
      합성곱 신경망(Convolutional Neural Network, CNN)에서 사용되는 두 가지 중요한 개념은 "패딩(Padding)"과 "스트라이드(Stride)"입니다. 이 두 가지 요소는 합성곱 연산의 특성을 조절하고 출력의 크기를 조절하는 데 사용됩니다.
      1. 패딩(Padding)
        성곱 연산을 수행할 때 입력 데이터 주변에 추가적인 값(일반적으로 0)을 채우는 것을 말합니다.
      2. 스트라이드(Stride)
        합성곱 연산을 수행할 때 필터(커널)가 입력 데이터를 얼마나 이동할지를 나타냅니다.

    11. Multiple Input and Multiple Output Channels
      1. 다중 입력 채널(Multiple Input Channels)
        이미지나 다른 입력 데이터가 여러 개의 채널로 구성되어 있을 때 사용됩니다. 각 입력 채널은 입력 데이터의 특정 부분이나 특징을 나타냅니다. 예를 들어, 컬러 이미지는 일반적으로 빨간(R), 초록(G), 파란(B)의 세 가지 채널로 구성됩니다.
      2. 다중 출력 채널(Multiple Output Channels)
        합성곱 연산의 결과로 생성되는 특징 맵(feature map)이나 출력이 여러 개의 채널을 가질 때 사용됩니다. 각 출력 채널은 특정 유형의 특징을 감지하는 데 사용됩니다. 이로써 네트워크는 입력에서 다양한 특징이나 패턴을 학습할 수 있습니다.

        예를 들어, 컬러 이미지를 처리하는 합성곱 층은 각 입력 채널에 대해 필터(커널)를 사용하여 다중 출력 채널을 생성합니다. 각 출력 채널은 서로 다른 시각적 특징을 나타내며, 이러한 다양한 특징을 조합하여 전체 이미지의 의미를 추출합니다.
    12. Pooling
      풀링은 합성곱 층의 출력에 적용되며 주로 두 가지 목적을 가지고 사용됩니다.
      1. 공간적 차원 축소(Spatial Dimension Reduction)
        특징 맵의 공간적인 크기를 줄여 계산 효율성을 높입니다.
      2. 중요한 정보 강조(Feature Emphasis)
        풀링은 주로 가장 강한 특징을 강조하고 불필요한 정보를 제거하여 모델이 중요한 특징에 민감하게 반응하도록 돕습니다.
    13. Convolutional Neural Networks (LeNet)
      Convolutional Neural Networks (CNNs)은 주로 이미지 처리와 패턴 인식 작업에 사용되는 딥러닝 모델 중 하나입니다. LeNet은 CNN의 초기 구조 중 하나로, 손글씨 숫자를 인식하는 작업에 사용되었습니다.



감사합니다.