ㅅㅇ

딥러닝 _03_1_DNN (Deep Neural Network) 신경망 구조 본문

AI_STUDY/딥러닝

딥러닝 _03_1_DNN (Deep Neural Network) 신경망 구조

SO__OS 2022. 7. 13. 22:35

플레이데이터 빅데이터캠프 공부 내용 _ 7/12

딥러닝 _03_DNN (Deep Neural Network) 신경망 구조 (1)

1.  Neural Network 신경망 :  가장  기본적인 Deep Learning 모델 구조

      MSP(Multi Layer Perceptron)
                Multi Layer = Deep,     Neural Network = Perceptron

 

2. 신경망 구성요소

 

- 층(Layer) : Network를 구성하는 Layer(층)


  = >  각각의 layer 는 parameter(모델 학습할 대상 - 학습을 통해 찾아야 파라미터) 를 가지고 있다.
       - feature 과 label 를 가지고 

        둘의 관계를 말하는 함수를 찾기위해 각 layer의 parameter 를 찾아 식을 완성하는 게 학습에서 하는 '예측'이다.

        이때 파라미터는 'loss 함수 연산' 을 통해

        예측과 정답 간의 오차가 가장 적은 최적의 값을 찾아 파라미터를 업데이트한다. = > '최적화'

 

- 학습
    - 모델( 구조 - 우리가 정의(하이퍼파라미터) ) : 예측
    - 손실( 오차 ) 계산 Loss 함수(컴파일 시 설정)
    - 최적화( 파라미터 - 가중치 업데이트)  : Optimizer (옵티마이저 - 컴파일시 설정)

 

(1)  모델 :  예측하는 함수
    - 기본식을 가지고 조정값 설정 

                                     = > 우리가 정의하는 하이퍼 파라미터

 

(2) 손실함수(loss function) : 가중치를 어떻게 업데이트할 지 예측결과와 Ground truth(실제정답) 사이의 차이를 정의

 

(3) optimizer : 가중치(학습 파라미터)를 업데이트하여 모델의 성능을 최적화 = > 경사하강법

       - 학습을 할 때 parameter (가중치) 가 틀렸으니 오차가 발생한 것이다.

         손실함수로 오차를 구해 오차가 최소화되도록 가중치를 업데이트를 한다.

 

 

- 학습에서 위 처리들이 필요하기에

  모델 생성에서 layer들을 만들어주고,

  컴파일 단계를 통해 손실함수와 옵티마이저를 셋팅해준 것이다.

 

 

3. Train(학습) 프로세스

 

- 데이터가 들어가면, 1) 예측- 모델      2) 오차(loss 손실) -loss함수      3) parameter update-옵티마이저 

- 60000개 중에 100개가 input 으로 들어간다. 

각각의 모델 layer 처리로 예측을 하여 예측값이 나오면 정답과 비교를 해 loss 함수로 오차를 구한다.

100개 데이터에 대한 100개의 오차가 나오는데 이를 평균을 낸다. 

- 평균 오차를 0으로 만들기 위해 옵티마이저가 각각의 모델들의 parameter(가중치) 를 update 한다. (=>1step) 

- 그리고 그다음 100개로 동일한 단계를 거친다(2step). 또 100개로 처리한다.(3step) ...

   60000개 데이터 다하면 1epoch

 

 == > 60000개를 100개씩 끊어서 학습하는데, 1epoch 당 600 step

          == > 600 개의 parameter update를 하는 것이다. => 많이 할 수록  train 성능 올라감!

 

- 10epoch : 이 처리들을 10번 하라는 것

 

 

4. 유닛/노드/뉴런 (Unit, Node, Neuron)

 

- logistic regression 모델 하나를 뜻한다.     (머신러닝에서 logistic regression 설명함.)

- Tensor를 입력받아 처리후 tensor를 출력하는 데이터 처리 모듈  :  Input   - >  Output


- 각 입력 값에 각 Weight(가중치)를 곱하고 bias(편향)을 더한 결과 𝕨𝑇𝕩+𝑏  를

   Activation 함수  𝜎(𝑧)  에 넣어 최종 결과를 출력하는 계산을 처리한다

 

5. 각 레이어/층(layer) 설명

 

레이어/층(Layer) :   unit 을 모아놓아 한 단계를 표현한 것.

 

- 대부분 Layer들은 학습을 통해 최적화할 Paramter를 가짐 
           - Dropout, Pooling Layer와 같이 Parameter가 없는 layer도 있다.

 

- Layer들의 연결한 것을 Network 라고 한다.

       - 딥러닝은 Layer들을 깊게 쌓은 것을 말한다.   (여러 Layer들을 연결한 것)

 

 

1) Input Layer(입력층)


    - 입력값들을 받아 Hidden Layer에 전달하는 노드들로 구성된 Layer.
    - 역할 : 입력 데이터의 shape을 설정
         

         - 학습과 관련된 처리를 하는 layer가 아니라 그저 입력을 받아 전달하는데, 이 layer는 왜 필요할까?

 

            한 유닛에 여러 feautre 가 input 으로 들어가면,

            하나의 feature 에 하나의 weight 를 구한다.

            즉, 각각의 feature에 곱해질 가중치가 준비되야 하는 것이다.

            이렇게, feature (shape) Input 에 맞춰 가중치  W 값들을 랜덤하게 준비되어야 하므로 Input layer 가 필요한 것.

 

   - koras.layers.InputLayer((28,28)) 

        - data 의 Feature shape 을 알려주고 있다.

                (28,28) => 2차원 배열, 0 축:28, 1축 :28 값으로 구성되어 있다고 알려줌.


                 train_image(X).shape = (60000, 28,28)

                      : 60000는 데이터 개수, (28,28) 는 1개 데이터의 shape 라는 뜻이다.

 

 

2) Output Layer(출력층)


    - 모델의 최종 예측결과를 출력하는 노드들로 구성된 Layer


    - model.add(keras.layers.Dense(10, activation='softmax'))

            - unit 개수  : 출력 결과의 개수. 정답 클래스 개수

 

                - ex) 현 예제 데이터셋가 다중 분류. class 0 ~ 9 총 10개이라면?

                          => 각 클래스 별 확률이 출력되도록 unit 수를 설정한다.

                                (10개 클래스 별 확률이 출력되도록 하기 위해서 unit 수를 10 으로 설정.)

 

            - activation  : 활성 함수의 종류를 지정

                   - ex) 'softmax' : 활성함수(activation function)의 종류를 softmax 함수로 지정.

 

 

- 입력과 출력은 데이터 셋, 학습 등에 의해 거의 정해져 있지만, 딥러닝의 Hidden Layer 는 art 개발자가 정한다.

3) Hidden Layer(은닉층)


    - Input Layer와 Output Layer사이에 존재하는 Layer.


    - 특성 추출(Feature Extraction), 추론하는 역할 을 담당.
        -  Layer 개수,   Layer 당 unit의 개수,   각 Layer 에 어떤 활성함수  를 사용할 것인지는 Hyper parameter 이다.

          (Art - 공식으로 정해진 것이 아니라 경험이나 테스트를 통해 찾아야 한다.)

 

 

 

 

- 목적, 구현 방식에 따라 다양한 종류의 Layer 들

      2), 3), 4) 가 특성을 추출하는 layer 이고, 추출한 특성으로 추론하는 것이 Fully Connected Layer 이다. 

 

         1) Fully Connected Layer (Dense layer)
                - 추론 단계에서 주로 사용


         2) Convolution Layer
                - 이미지 Feature extraction으로 주로 사용
         3) Recurrent Layer
                 - Sequential(순차) 데이터의 Feature extraction으로 주로 사용
                      - ex. 시계열 데이터(시간의 흐름이 중요한 feature)
         4) Embedding Layer
                 - Text 데이터의 Feature extraction으로 주로 사용

 

6. 모델 (Network)

:  Layer를 연결한 것이 Deep learning 모델이다.


이전 레이어의 출력을 input으로 받아 처리 후 output으로 출력하는 레이어들을 연결한다.
    
- 적절한 network 구조(architecture)를 찾는 것은 공학적이기 보다는 경험적(Art)접근이 필요하다.

- 딥러닝은 쌓는다고(수직구조) 표현을 한다.

     - Bottom Layer: Input Layer(입력층)에 가까이 있는 Layer들. 
     - Top layer: Output Layer(출력층)에 가까이 있는 Layer들

          (이를 나중에 arg 으로 쓸 때가 있다.)

- 왜 여러 개의 layer 를 쌓아 처리하냐 ? 각자의 역할이 다르기 때문에. 
    - input : 입력값을 받아서 다음으로 전달. 입력값의 shape 변수를 지정하는 역할
    - ouput : 최종추론 결과를 출력해주는 역할
    - hidden : bottom 쪽 - feature 추출, top 쪽 - 추론하는 역할
        - 추출, 추론 하는 애들 몇 개 만들지는 우리가 정하는 것.art

 

 

7. 활성함수 (Activation Function)

: 각 유닛이 입력과 Weight 간에 가중합을 구한 뒤 출력결과를 만들기 위해 거치는 함수

 

- 같은 층(layer)의 모든 유닛들은 같은 활성 함수를 가진다.


- 활성함수는 비선형함수

    -  분배법칙이 되지 않게 비선형 형태가 되어야 한다. 

       그래야 각각의 다른 처리가 된다. 이를 내부적으로 처리하는 게 활성함수라 한다.

  

    - 은닉층 (Hidden Layer)의 경우 비선형성을 주어 각 Layer가 처리하는 일을 분리하는 것을 목적으로 한다.
         - 비선형함수를 사용하지 않으면 Layer들을 여러개 추가하는 의미가 없어진다. 
         - ReLU 함수를 주로 사용한다. ( relu 또는 relu의 변형(ru 붙은 애들)

 

    - 출력 레이어의 경우 출력하려는 문제에 맞춰 활성함수를 결정

        - 다중 : softmax
        - 이진 : sigmoid

        - 회귀 : None   => 기본적으로 안 쓰지만, 정답의 shape에 따라 변경할 수 있다.

              - 회귀 출력층은 보통, 결과값 (추론해야할 연속형 값) 을 만드는 게 목적이기에 그냥 쭉 통과시킨다.
                    - 예외 ex ) 경우적으로 써야 할 때가 출력값이 어떤 범위로 출력되어야 할 때

                                    가끔 예측해야하는 값이 y가 0 ~ 1 실수라면, sigmoid 함수가 필요하다.

                                     또, -1 ~ 1 값으로 정규화해야 한다면, 이때 tach 함수를 쓴다.

 

7.1 주요 활성함수

 

1. Sigmoid (logistic function)

    - 출력값의 범위 :  0<sigmoid(z)<1

 

    - 한계
        - 초기 딥러닝의 hidden layer(은닉층)의 activation function(활성함수)로 많이 사용 되었다.
        - 층을 깊게 쌓을 경우 기울기 소실(Gradient Vanishing) 문제를 발생시켜

          parameter 학습이 안되는 문제 로 성능 개선이 되지 않는다.

                  
        - 함수값의 중심이 0이 아니어서 학습이 느려지는 단점이 있다.
            - X의 값이 0일때 0.5를 반환한다.


    - 현재, Binary classification(이진 분류)를 위한 네트워크의 Output layer(출력층)의 활성함수로 사용된다.
        - 모델이 positive(1)의 확률을 출력결과로 추론하도록 할 경우 사용. (unit개수 1, activation함수 sigmoid)
        - 위와 같은 한계때문에 hidden layer(은닉층)의 activation function(활성함수)로는 잘 사용되지 않는다.
        

★기울기 소실(Gradient Vanishing) 문제란 ?
 : 최적화 과정에서 gradient가 0이 되어서 Bottom Layer의 가중치들이 학습이 안되는 현상


    문제의 원인은 활성화 함수로 사용한 sigmoid 함수의 특성 때문이다.

    sigmoid 함수를 미분한 함수의 그래프를 보면 기울기의 최대가 0.25이고 양 끝은 0에 수렴하는 것을 볼 수 있다.

    즉, 0 ~ 0.25 사이의 값을 가진다.

 

    딥러닝의 최적화 과정에서는 역전파로 bottom layer 으로 가까이 가면서  

    sigmoid 함수의 미분을 연쇄적 곱하는데, 

    기울기가 1보다 작으므로 곱할수록 값은 점점 작아진다.

 

    만약, layer가  아주 많다면, bottom layer 로 가까이 갈수록

    기울기의 값은 거의 0 에 가깝게 작아져서 가중치의 변화는 거의 없게 되고 loss 또한 더 이상 줄어들지 않게 된다.

    즉, update 되야 하는 가중치들이 더이상 최적화 되지 않는 것이다.

  

    이 문제를 해결한 함수가 ReLU 함수이다.

 

 

2. Hyperbolic tangent

 

 

 - 출력값의 범위 :    -1 < tanh(z) < 1


 - Output이 0을 중심으로 분포하므로 sigmoid보다 학습에 효율적이다.
 - 시그모이드 문제 해결하려고 나왔는데, 여전히 기울기 소실(Gradient Vanishing) 문제를 발생시킨다.

 

 

3. ReLU(Rectified Linear Unit)

 

  -  입력값이 0 보다 작으면 0

                     0 보다 크면 입력값 그대로 내보낸다.  

 

  - 기울기 소실(Gradient Vanishing) 문제를 어느정도 해결 

          = >  Hidden layer 가장 많이 사용되는 활성화 함수

 

  - 0에서 미분이 되지 않는다.

  - 출력값은 0 또는 양수이고, 기울기 또한 0 또는 1인 양수 이다. (최적의 가중치를 찾는 지그재그 현상이 발생할 것)

 

  - 입력값이 음수라면 기울기가 0 이 되어 가중치 update가 되지 않을 것이다.
       =>  0 이하의 값(z <= 0)들에 대해 뉴런이 죽는 단점이 있다. (Dying ReLU) 

                - 이러한 단점을 보완하는 다양한 형태의 ReLU 함수들을 연구해왔다.

 

 

4. Leaky ReLU

    

    - ReLU의 Dying ReLU 현상을 해결하기 위해 나온 함수

          - 가 0보다 크면 

            0보다 같거나 작으면 𝛼 를 반환한다.  - - -  alpah (0 ~ 1 사이 실수) 를 곱해 반환 

               = > 음수 z를 0으로 반환하지 않는다.

           

가 음수인 영역의 값에 대해 미분값이 0이 되지 않는다는 점을 제외하면 ReLU의 특성을 동일하게 갖는다.

 

 

5. Softmax

   

 - Multi-class classification(다중 분류)를 위한 네트워크의 Output layer(출력층)의 활성함수로 주로 사용된다.
        - 은닉층의 활성함수로 사용하지 않는다.


 - Layer의 unit들의 출력 값들을 정규화 하여 각 class에 대한 확률값으로 변환해주는 함수

        - exp해당값/exp값의합 (큰 값 나오는 애가 큰 확률 나오게)
        - 출력노드들의 값은 0 ~ 1사이의 실수로 변환되고 그 값들의 총합은 1이 된다.

 

 

 

[ 활성화 함수 정리 ]

 

8. 손실함수(Loss function, 비용함수)

: Model이 출력한 예측값(prediction) 𝑦̂  와 실제 데이터(output) 𝑦 의 차이를 계산하는 함수


- 네트워크 모델을 훈련하는 동안 

  Loss 함수가 계산한 Loss값(손실)이 최소화 되도록 파라미터(가중치와 편향)을 업데이트한다.
       =>  즉 Loss함수는 최적화 시작이 되는 값이다.

 

- 네트워크 모델이 해결하려는 문제의 종류에 따라 다른 Loss함수를 사용한다.
            =>  해결하려는 문제의 종류에 따라 표준적인 Loss function이 있다.

 

 

8.1 해결하려는 문제의 종류에 따른 Loss Function

 

1)  Classification (분류)

       = = >  cross entropy (log loss) 사용 

                 이진분류 공식이나 다중 분류 공식이나 정답에 대한 확률에 log 처리 해준 것이다.

 

  1-1 ) Binary classification (이진 분류)

  • 두 개의 클래스를 분류
    • 둘 중 하나 (0 또는 1)
  • 예) 문장을 입력하여 긍정/부정 구분
  • Output Layer의 unit 개수를 1로 하고 activation 함수로 sigmoid를 사용하여 positive(1)의 확률로 예측 결과를 출력하도록 모델을 정의한 경우    loss  ='binary_crossentropy'  

 

  1-2 ) Multi-class classification (다중 클래스 분류)

  • 두 개 이상의 클래스를 분류
    • 여러개 중 하나
  • 예) 이미지를 0,1,2,...,9로 구분
  • loss = 'categorical_crossentropy' 

2)  Regression (회귀)

  • 연속형 값을 예측
  • 예) 주가 예측
  • Mean squared error를 loss function으로 사용 (오차를 제곱)
    • loss = 'mse' 로 지정

 

9. 평가지표

- 모델의 성능을 평가하는 지표


- 손실함수(Loss Function)와 차이
    - 손실함수는 모델을 학습할 때 가중치 업데이트를 위한 오차를 구할 때 사용한다.
    - 평가지표 함수는 모델의 성능이 확인하는데 사용한다. 

 

 

[ ★ 문제별 출력레이어 Activation 함수, Loss 함수 ]