[AI] DNN (Deep Neural Network) : Keras

Ik·2022년 7월 25일
0

Data

목록 보기
16/34

DNN

Train process

  1. 입력 텐서 Layer 통과
    • Network를 구성하는 Layer(층)
  2. 예측값, 실제 타깃 손실 함수 통해 비교
    • 가중치를 어떻게 업데이트할지 예측결과와 Ground Truth(실제정답) 사이의 차이를 정의
  3. 옵티마이저 이용해 가중치를 곱해 layer 통과
    • optimizer : 가중치를 업데이트하여 모델의 성능을 최적화
  4. 반복

Unit

  • Node, Neuron 전부 같은 의미
  • Tensor를 입력받아 처리 후 Tensor를 출력하는 데이터 처리 모듈
    • 입력 값에 Weight(가중치)를 곱해 bias(편향)을 더한 결과를 Activation 함수에 넣어 최종 결과를 출력하는 계산을 처리
      • Logistic Regression처럼 z = w1x1 + w2x2 + w3x3 + b 구조
        • Logistic Regression : 선형회귀 알고리즘을 이용한 이진 분류 모델, sigmoid 함수
      • Activation(활성) 함수 : 선형 결합한 결과를 비선형화 시키는 목적

Layer

  • unit들로 구성되어 있으며 Network를 구성하고 있다
  • 학습에서 단계를 표현하며 input, output의 경우 사용자 정의 불가
  • hidden layer들의 구조 사용자 정의
    • 전체 과정 중에 사람이 설정하는 것은 모델(네트워크)의 구조 밖에 없다
  • 종류
    • Fully Connected Layer (Dense layer) : 추론 단계에서 많이 사용
    • Convolution Layer : 주로 이미지 특성 추출할 때 사용
    • Recurrent Layer : Sequential(순차) 데이터의 Feature extraction으로 주로 사용
    • Embedding Layer : Text 데이터의 Feature extraction으로 주로 사용

Input Layer

  • 입력 값들을 받아 Hidden Layer에 전달하는 노드들로 구성된 Layer
  • 입력 데이터(Feature)의 shape을 설정하는 역할
    • ex)
    keras.layers.InputLayer((28, 28))    # data의 feature shape(28*28)

Output Layer

  • 모델의 최종 예측결과를 출력하는 노드들로 구성된 Layer
keras.layers.Dense(10, activation='softmax')   # 총 10개로 출력 = 다중 분류인 경우를 나타내며
											   # 활성함수는 softmax 사용

Hidden Layer

  • Input Layer와 Output Layer 사이에 존재하는 Layer
  • 특성 추출(Feature Extraction), 추론하는 역할을 담당
    • Layer 개수, Layer 당 unit의 개수, Layer별 활성함수 선정
      • 공식적으로 정해진 것이 아닌 경험이나 테스트에 많이 의존
  • 대부분 ReLU 또는 ReLU 계열 활성함수 사용
  • Dropout, Pooling Layer와 같이 parameter가 없는 Layer도 존재

모델(Network)

  • Layer들을 연결한 형태
  • 적절한 Network 구조(architecture)를 찾는 것은 공학적이기 보다는 경험적(Art) 접근이 필요

모델 성능

  • 딥러닝 자체가 복잡한 모델을 사용하기에 과대적합에 취약
    • 데이터에 비해 모델이 복잡한 경우에 과대적합 발생 확률 높기때문에 데이터가 복잡한 경우에 사용
    • ex) 비정형데이터
  • 모델이 과소적합인 경우
    • 모델 네트워크 크기를 키움
    • Epoch or step 수를 늘린다
      • 성능이 계속 개선되는 과정에 멈췄다면 더 학습 시켜준다
  • 과대적합인 경우
    • 데이터 더 많이 수집 -> 현실적으로 힘듬
      • 이미지의 경우는 Image Augmentation 이용해 데이터의 양 늘릴 수 있다
    • 모델의 복잡도 낮춤
    • Epoch or step 수 낮춤
      • Validation 성능 지표가 가장 좋았던 Epoch까지만 학습

모델 규제(성능향상을 위한)

  • 과적합의 종류에 따라 모델의 성능 개선을 위해 모델을 변화시킨다

Overfitting 규제

  • Dropout Layer
    • Dropout Node
      • 학습시 일부 Node들을 Random하게 빼고 학습시키는데 이 때 빠지는 Node
      • 매 step마다 Node들은 random하게 바뀜
    • Dropout rate
      • Dropout이 적용되는 Layer에서 Dropout Node의 비율 지정
    • co-adaptation 현상 감소/방지 효과
      • co-adaptation
        • 학습 시에 모든 Node들이 공동책임으로 업데이트 되는 것을 의미
        • 역할들이 나눠지지 못하고 공동화되며 쓸데 없는 패턴까지 학습되는 것
        • ensemble 효과
          • Dropout Layer를 통해 줄여줄 수 있다
    model.add(layers.Dropout(0.5))  # 0.5 비율로 Dropout
  • Batch Normalization (배치정규화)
    • 각 Layer에서 출력된 값을 평균 = 0, 표준편차 = 1로 정규화하여 Layer의 입력분포 균일하게 만든다
      • 딥러닝 이미지처리할 때 많이 사용
    • 데이터가 정규분포를 따른다해도 Layer를 통과하면 분포가 변화해 성능이 덜어지는 문제 개선
    • Internal Covariate Shift(내부 공변량 변화) 문제 개선
      • 학습 과정에서 각 층을 통과할 때마다 데이터의 분포가 달라지는 현상(여기서 분포가 바뀐다는 것은 다른 데이터라는 것)
      • 데이터의 형태 최대한 일정하게 유지해준다
    • 가중치 + bias 후에 activation 함수에 전달하기 전에 실행
    # model을 add할 때 layer형태, activation함수를 함께 넣는 것이 아니라 분리하고 그 사이에 BN을 넣어준다 
     model.add(layers.Dense(units=256))  
     model.add(layers.BatchNormalization())  # Batch Normalization Layer - 평균 : 0+beta, 표준편차 : 1*gamma의 분포
                                                  # beta, gamma는 우리가 알 필요 X, 학습하면서 알아서 찾음
     model.add(layers.ReLU()) 
    • 효과
      • 랜덤하게 생성되는 초기 가중치에 대한 영향력을 줄일 수있다
      • Gradient Vanishing(가중치 update가 안되는 것), Gradient exploding(가중치의 update방향이 일정하지 않은 것)을 막아준다

Optimizer의 Learning rate(학습율) 조정을 통한 성능향상

  • Optimizer의 Learning rate가 너무 크거나 너무 작으면 최적의 파라미터를 찾지 못할 수 있다
    • Learning rate는 모델 성능과 밀접한 관계가 있는 아주 중요한 Hyper Parameter
    • 너무 크면 exploding, 너무 작으면 epoch 횟수가 끊나 제대로 학습 불가
    • high learning rate의 경우 최적점 주변을 계속 맴돈다
    • 학습하면서 고정된 하나의 learning rate를 사용할 수 있지만 learning rate의 변화를 주어 최적의 성능을 뽑아 낼 수 있다
  • 종류
    • Learning Rate Decay
      • 일정한 step 마다 일정한 비율로 Learning rate를 변경
      • 보통 초반에는 크게 설정하고 갈수록 줄여주는 방향으로 구현
        • 일반적으로 5 에폭마다 절반으로 줄이거나 20 에폭마다 1/10씩 줄이기도 한다
      # 시작 Learning을 크게 잡아주고 갈수록 줄어들도록 규칙을 정함
      lr_scheduler = keras.optimizers.schedules.ExponentialDecay(
                      initial_learning_rate=LEARNING_RATE,  # 시작 Learning Rate
                      decay_steps=len(train_dataset)*5,     # 몇 step마다 변경할 것인지(epoch단위가 아니라 step단위) 
                      decay_rate=0.2,                       # 변경 비율. 현재_learing_rate * decay_rate ==> 새로운 learning rate  
                      staircase=True,                       # 계단식 변경 여부(default:False --> 매 스텝마다 조금씩 변경. True:지정한 step에서 한번에 변경) 
                      )
      # LearningRate Decay객체(ExponentialDecay)를 컴파일 할 때 설정하는 optimizer에 learning_rate매개변수에 전달
    • Callback
      • 일정 step동안 검증 성능지표가 향상되지 않으면 그때 learning rate를 조정
      • Callback : 학습 도중 특정 이벤트(변화)가 발생하면 호출되도록 정의한 기능
        • 사용자가 호출하는 것이 아닌 실행환경이 호출하는 함수
        • 종류
          • event handler - 비정기적
          • life cycle - 정기적
      # ReduceLROnPlateau : 학습도중에 성능이 개선이 되지 않으면(시점) Learning Rate를 조정(처리)
      from keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint
      lr_cb = ReduceLROnPlateau(monitor='val_loss',   # 어떤 성능 확인할지, loss이면 traing 대상, default = val_loss    
                            factor=0.2,           # 변경비율(현재 LR * factor ==> 새로운 LR)
                            patience=3,           # 성능개선이 안되는 것을 몇 epoch까지 볼 것인지. 설정한 에폭 안에 성능 개선이 안되면 LR를 변경(보통 5~10)     
                            verbose=2)            # 로그(기록) 출력

활성 함수(Activation Function)

  • 각 유닛이 입력과 Weight간에 가중합을 구한 뒤 출력결과를 만들기 위해 거치는 함수
  • Layer별로 활성함수 다름
    • 같은 Layer들은 활성함수 같음
  • Output Layer의 경우 출력하려는 목적에 따라 활성함수 결정
  • Hidden Layer의 경우 비선형을 주어 각 Layer가 처리하는 일을 분리하는 것을 목적으로 사용
    • 가중치 합을 구한 선형 형태인 경우 분배법칙이 가능해 Layer 존재 의미 없어짐
    • Layer가 많은 것이 학습에 유리하며 선형 형태인 경우 Layer의 의미가 없어지므로 활성함수를 사용
    • ReLU나 ReLu 계열 사용
  • 회귀의 경우 None(사용X)

Sigmoid

  • Logistic Function
  • 출력 값의 범위 0과 1사이
  • 층을 깊게 쌓을 경우 기울기 소실(Gradient Vanishing) 문제를 발생시켜 학습이 안되는 문제
    • Gradient Vanishing : 최적화 과정에서 gradient가 0이 되어서 Bottom Layer의 가중치들이 학습이 안되는 현상
      • 여기서 Bottom은 Input Layer 부근
  • 함수의 중심이 0이 아니기에 학습이 느려지는 단점
    • 함수의 중심이 0인 경우 학습이 빠름
  • Binary classification(이진 분류)를 위한 네트워크의 Output layer(출력층)의 활성함수로 사용
    • Hidden Layer의 활성함수로는 잘 사용 X

Hyperbolic tangent

  • 출력 값의 범위 -1과 1 사이
    • 형태는 sigmoid와 같은 형태, 범위만 차이
  • Output이 0을 중심으로 분포하므로 sigmoid보다 학습에 효율적
  • 마찬가지로 기울기 소실(Gradient Vanishing) 문제를 발생

ReLU(Rectified Linear Unit)

  • 출력 값
    • 입력 값 음수 : 0반환, 입력 값 양수 : 양수 반환
  • 기울기 소실(Gradient Vanishing) 문제를 어느정도 해결
  • Dying ReLU
    • 0이하의 값(z <= 0)들에 대해 뉴런이 죽는 단점
    • Forwardpropagation 과정에서 어떤 뉴런의 음수값이 한번 들어왔다하면 Backpropagation 과정에서 0이라는 real value가 가중치에 곱해지면서 해당 노드가 통째로 죽는 현상

Leaky ReLU

  • ReLU의 Dying ReLU 현상을 해결하기 위해 나온 함수
  • 음수 입력을 0으로 반환하지 않고 alpah (0 ~ 1 사이 실수)를 곱해 반환

Softmax

  • Multi-class classification(다중 분류)를 위한 네트워크의 Output layer(출력층)의 활성함수로 주로 사용
    • Hidden Layer에는 사용 X
  • Layer의 unit들의 출력 값들을 정규화 하여 각 class에 대한 확률값으로 변환
    • 출력노드들의 값은 0 ~ 1사이의 실수로 변환되고 그 값들의 총합은 1
    • 이 과정에서 확률 극대화시킴(더 극단적으로 분포 나오게끔 된다)

손실함수(Loss Funtion, 비용함수)

  • 모델의 예측값과 실제 데이터의 차이를 계산하는 함수
  • 네트워크 모델을 훈련하는 동안 Loss 함수가 계산한 Loss값(손실)이 최소화 되도록 파라미터(가중치와 편향)을 업데이트
    • Loss함수는 최적화 시작이 되는 값
  • 해결하려는 문제의 종류에 따라 표준적인 Loss function 존재

분류의 경우

  • cross entropy(log loss) 사용
    • log(정답에 대한 확률)
    • log를 이용해 오차를 극대화 시켜 학습이 잘 되도록 유도

Binary classification

  • 두 개의 클래스를 분류 : 양성(1)의 확률을 출력
  • Output Layer의 unit 개수를 1로 하고 activation 함수로 sigmoid를 사용하여 positive(1)의 확률로 예측 결과를 출력하도록 모델을 정의 한 경우 binary_crossentropy를 loss function으로 사용

Multi-class classification

  • categorical_crossentropy와 sparse_categorical_crossentropy를 loss function으로 사용

회귀의 경우

Regression (회귀)

  • 연속형 값을 예측
  • Mean squared error를 loss function으로 사용
    • "mse"로 지정

평가지표

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

평가지표 vs 손실함수

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

최적화 방법

  • Training시 모델 네트워크의 parameter를 데이터에 맞춰 최적화 하는 알고리즘
  • 딥러닝의 경우 경사하강법(Gradient Descent)와 오차 역전파(back propagation) 알고리즘을 기반으로 파라미터들을 최적화
  • 종류
    • 정규방정식
      • 데이터 많아질수록 퍼포먼스 느려짐
    • 경사하강법
      • 딥러닝의 경우 경사하강법 사용, 정규방정식은 없음

Gradient Decent (경사하강법)

  • 최적화를 위해 파라미터들에 대한 Loss function의 Gradient값을 구해 Gradient의 반대 방향으로 일정크기 만큼 파라미터들을 업데이트 하는 것

오차 역전파(Back Propagation)

  • 딥러닝 학습시 파라미터를 최적화 할 때 추론한 역방향으로 loss를 전달하여 단계적으로 파라미터들을 업데이트
    • Loss에서부터(뒤에서부터) 한계단씩 미분해 gradient 값을 구하고 이를 Chain rule(연쇄법칙)에 의해 곱해가면서 파라미터를 최적화

batch size와 관련된 파라미터 업데이트 단위

Batch Gradient Decent (배치 경사하강법, 일반 경사하강법이라 생각하면 된다)

  • Loss를 계산할 때 전체 학습데이터를 사용해 그 평균 loss(오차)값을 기반으로 파라미터를 최적화
  • 학습 안정적
  • 많은 계산량이 필요해서 속도가 느리다. 학습 데이터가 클 경우 메모리가 부족할 수 있다

Mini Batch Stochastic Gradient Decent (미니배치 확률적 경사하강법, SGD)

  • Loss를 계산할 때 전체 데이터를 다 사용하지 않고 지정한 데이터 양(batch size) 만큼 마다 계산해 파라미터를 업데이트
  • 메모리 문제 없다
  • 계산은 빠른 장점이 있지만 최적값을 찾아 가는 방향이 불안정하여 부정확
    • 반복 횟수 늘릴 경우 Batch Gradient Decent의 결과로 수렴한다
  • step : 한번 파라미터를 업데이트하는 단위
  • mini-batch마다 parameter update의 방향성이 일정하지 않을 수 있는 가능성 존재

Batch SGD upgrade관련, Adam

  • 방향성 개선한 방법
    • Momentum
    • NAG(Nesterov Accelerated Gradient)
  • 학습률 개선
    • Adagrad
    • RMSProp
  • 방향성 + 학습률 개선 최적화 방법
    • Adam(Momentum+RMSProp)

계산 그래프(Computational Graph)

  • 딥러닝 네트워크 구조를 구현하는 방식
  • 그래프는 노드(Node)와 엣지(Edge)로 구성
    • 노드: 연산을 정의
    • 엣지: 데이터가 흘러가는 방향
  • 장점
    • 복잡한 계산을 단계적으로 나눠 처리하므로 문제를 단순하게 만들어 계산할 수 있다(딥러닝에서 역전파를 이용해 각 가중치 업데이트를 위한 미분(기울기) 계산을 효율적으로 할 수 있게 된다)
  • 연쇄법칙을 이용한 forward, back propagation 그림이라 생각하면 된다

0개의 댓글