원문링크: https://arxiv.org/abs/1502.03167

요약

DNN을 훈련시키는 것은 각 레이어의 input의 분포가 이전 레이어의 파라미터에 따라 바뀐다는 점 때문에 매우 복잡했다. 이것은 낮은 learning rate와 섬세한 파라미터 초기화를 요구하게 함으로써 훈련을 느리게 만든다. 그리고 모델을 비선형 근사를 시키는 것을 어렵게 만든다. 우리는 이 현상을 _internal covariate shift_라고 부른다.
이 문제를 레이어의 input을 정규화함으로써 해결하고자 한다. 우리의 방법은 정규화를 모델의 한 부분으로 만들고 매 트레이닝 mini batch마다 작동하게함으로써 힘을 보여준다. batch normalization은 우리에게 더 높은 learning rate를 쓸 수 있게하고 파라미터 초기화에 덜 신경쓰도록 해준다. 이것은 또한 규제화처럼 작동한다. 때때로 dropout을 안써도 될 정도이다.
Batch normalization을 최신 이미지 분류 모델에 적용하니 14 step 덜 학습하고도 원래와 똑같은 정확도를 보였다. 그리고 원본 모델을 큰 차이로 이겼다. batch normalization network의 앙상블을 이용함으로써 우리는 imageNet 분류 문제에서 성적을 경신했다. 인간의 분류 정확도를 넘어 4.9%의 top-5 validation error와 4.8%의 테스트 에러를 보였다.

본문

  • covariate shift: 데이터 추출에 bias가 있거나 결측치로 인해 input data의 분포가 모집단에 비해 바뀌는 것, domain adaptation으로 해결될 수 있다.
  • domain adaptation: 한 도메인(분포가 다른)의 데이터를 학습해 다양한 도메인(분포가 일반화)들에 적용할 수 있는 예측 모델을 만드는 것
  • internal covariate shift?: covariate shift의 개념을 learning system 전반으로 확장, DNN 내부에서 이전 레이어의 파라미터로 인해 sub network의 input data의 distribution이 바뀌는 것
  • internal covariate shift가 일어나면 데이터 전체의 분포를 옮겨져서 gradient discent를 유발할 가능성이 있다. (활성화함수가 sigmoid인데 데이터 전체의 분포가 전체적으로 증가하거나 감소할 경우, 미분계수가 0에 가까워지기 때문에 gradient discent가 일어난다.)
  • 일반적으로 이 현상은 relu를 사용하거나 파라미터 초기화 방법, 낮은 learning rate들을 통해 해결해 왔다
  • batch normalization은 layer input의 평균과 분산을 고정함으로써 이 문제들을 해결하고 모델의 훈련을 촉진한다. learning rate를 높일 수 있고 모델에서 규제로서 작용할 수 있다.
  • 처음엔 whitening을 위해 activation을 수정하여 매 training step마다 input data에서 input data들의 평균을 빼는 실험을 했지만, 그 결과 input data 전체적으로 더해지는 bias가 평균이 빼지는 것 때문에 gradient에 영향을 미치지 않아서 bias가 'blows up'해버리는 결과를 낳았다.

    • whitening: data간의 상관관계를 없애고 0과 1사이의 값으로 정규화하는 것
  • 이를 보완하기 위해 input data의 정규화를 해당 input data 이외의 모든 example data에 대하여 각각 데이터별로 평균과 분산을 구한다음 정규화를 진행하여 gradient에 정규화가 반영되도록 했다.

  • batch normalization은 효율성을 높이기 위해 두가지 조건을 가진다.

    • 화이트닝을 하는 대신, input별로 독립적으로 정규화한다.
      • ex) input data = [x1, x2, x3...]일 때, x1은 x1을 기준으로 정규화, x2는 x2를 기준으로 정규화
    • training set 전체 대신, mini batch의 평균과 분산을 이용한다.
  • 그러나 단순히 데이터를 정규화하는 것은 각 레이어의 표현을 해칠 수 있으므로 batch normalization에 감마와 베타를 추가하여 transformation을 하는 과정을 추가한다.

  • 최종적으로 batch normalization의 과정은 다음과 같다.

결론

Batch normalization의 효과

  • 높은 learning rate 가능: 높은 learning rate는 gradient vanishing이나 gradient exploding을 유발하고 local minima에 빠지게 만들기도 하지만, Batch normalizaton은 이러한 문제를 해결해준다.

  • 모델 규제: model의 generalization 능력을 향상시킨다. Dropout의 의존도를 낮춘다.

서론

드롭아웃(Dropout)은 딥러닝을 배울 때, 가장 자주 듣는 규제방법 중 하나이다. 드롭아웃의 아이디어가 멋지기도 하고 효과도 좋기 때문이다. 드롭아웃 레이어는 모델 훈련시에 input이 들어오면 dropout rate에 따라 무작위로 몇몇 노드들을 골라 0으로 바꾼다. 그러나 실제로 모델을 테스트할 때는 노드를 0으로 바꾸지 않는다. 하지만 모델이 훈련될 때는 dropout이 적용되는 상태에서 훈련되었으므로 괴리를 줄이기 위해 output을 dropout rate만큼 조절한다. 많은 사람들이 드롭아웃의 과정을 다음과 같이 배웠을 것이다. 그런데 Keras의 공식문서에 따르면 Keras의 dropout layer가 작동하는 방식은 조금 다르다.

Kears의 드롭아웃 레이어

Keras 공식문서에 따르면 Dropout layer는 다음과 같은 인자들을 받는다.

tf.keras.layers.Dropout(rate, noise_shape=None, seed=None, **kwarg)

rate는 dropout rate를 의미하고, noise_shape는 input에 적용될 dropout의 형태를 의미한다. 예를 들어 (batch_size, timesteps, features)형태의 시계열 데이터가 들어올 때, 모든 timestep마다 동일한 dropout을 적용하고 싶다면, noise_shape=(batch_size, 1, features)와 같이 입력하면 된다.

케라스의 드롭아웃 레이어는 training=True일때만 작동한다. model.fit을 사용하거나 training을 사용할 때는 자연스럽게 이 값이 True가 된다. 혹은 레이어 하나만 불러올 때에는 **kwarg에 training=True와 같이 명시적으로 입력해줄 수도 있다. 물론 training=False인 것과 trainable=False인 것은 다르다. trainable=False는 단순히 가중치가 업데이트되지 않는 것일 뿐, 드롭아웃은 똑같이 적용된다.

케라스의 dropout layer가 특이한 점은 output을 보정해주는 방법이 다르다는 것이다. 일반적으로 배우는 dropout의 경우, train시에는 드롭아웃만 적용되고, test시에 output 값에 보정을 해준다. 그러나 keras에서는 test에서 output에 따로 보정을 하지않고, 오히려 train시에 output에 보정을 한다. 공식문서에 따르면 케라스의 dropout layer는 0이 되지 않은 output값에 1/(1-rate)값을 곱해줘서 output을 크게 만든다. 훈련을 할 때 scale을 맞춰주느냐 테스트를 할 때 scale을 맞춰주느냐 차이인 것 같다. 어떤 방식이든 결과는 똑같겠지만 배웠던 dropout 과정과 keras의 알고리즘이 서로 달라 흥미로워서 내용을 정리해보았다.

공식문서 URL: https://keras.io/api/layers/regularization_layers/dropout/

서론

내 생각에 딥러닝에서 '차원'이라는 단어는 혼동을 일으키기 매우 쉬운 단어이다. 딥러닝을 배우는 학생이라면 100이면 100 선형대수를 이미 배웠을 것이고, 선형대수에도 '차원'이라는 단어가 등장한다. 그런데 딥러닝과 선형대수에서 이 단어를 쓰는 양상은 썩 다르다. 내가 추론하건데 그 차이는 딥러닝에서는 array를 데이터를 담는 컨테이너로 보고, 선형대수에서는 array를 벡터나 매트릭스로 해석하기 때문인 것 같다. 헷갈리는 개념은 제대로 정리하는 것이 좋으니 딥러닝과 선형대수에 대한 차원의 개념을 제대로 정리하고 넘어가겠다.

선형대수에서의 차원

선형대수에서 차원은 보통 벡터의 차원을 이야기하는 것이다. 벡터의 차원이란 해당 벡터가 존재하는 Vector space의 차원을 의미한다. 쉽게 말해서 벡터 안에 들어있는 숫자의 갯수다. 벡터는 안에 들어있는 숫자 하나하나가 축의 갯수를 의미하기 때문이다.

딥러닝에서의 차원

딥러닝에서의 차원은 보통 텐서의 차원을 이야기하는 것이다. 텐서는 딥러닝 모델에 데이터를 넣기 위한 데이터의 컨테이너같은 존재이다. 텐서의 차원은 벡터가 아니라 그 컨테이너가 어떤 shape을 갖고 있는지와 연관이 있다. 예를 들어 스칼라는 0차원 텐서, 벡터는 1차원 텐서, 매트릭스는 2차원 텐서이다. 텐서를 차원으로 표현하는 표기는 매우 널리 쓰인다. 해외 커뮤니티에서도 1-D array, 2-D array와 같은 표현을 자주 볼 수 있다.

예시

예를 들어 위의 벡터 a는, 3차원 벡터이면서, 1차원 텐서이다.

하나 더: Rank

그런데 차원 이외에도 개념에 혼란을 주는 단어가 하나 있다. 텐서의 차원은 텐서의 rank라고도 말한다. 선형대수를 배운 사람이라면 rank라는 단어가 낯설지 않을 것이다. 그러나 이 rank라는 단어 역시 딥러닝과 선형대수 분야에서 쓰이는 용도가 다르다. 선형대수에서 rank라고 한다면 흔히 매트릭스의 rank를 말한다. 매트릭스의 rank는 매트릭스의 선형독립인 열벡터의 갯수를 의미한다.

예를 들어 이 매트릭스 v의 rank는 1이다. 열벡터 [1, 2]와 [2, 4]는 서로 종속이기 때문이다. 그러나 텐서의 관점에서 보면 v는 rank가 2인 텐서이다. 용어의 정의를 확실히 알아두지 않으면 헷갈릴 수 있는 상황이다.

왜 다를까?

사실 딥러닝과 선형대수는 전혀 다른 분야의 학문이기 때문에 용어의 정의가 다른 것은 당연하지만, 좀 더 근본적인 원인은 딥러닝과 선형대수가 벡터, 매트릭스를 바라보는 관점이 다르기 때문이다. 딥러닝에서 벡터, 매트릭스 등은 단순히 모델의 input이나 output의 형태일 뿐이다. 중요한 것은 그 안에 든 자료들이지 그 자료뭉치들이 어떤 물리학적인 수학적인 의미를 가지진 않는다. 그래서 벡터와 매트릭스를 구분하지도 않고 array라고 부르며 shape은 데이터의 형태일 뿐이다. 그러나 선형대수에서는 벡터와 매트릭스는 각각 수학적인 개념을 가진다. 이들은 애초에 어떤 모델에 들어가기 위한 것이 아니고 선형대수는 이들의 성질이나 연산에 대해 관심있다. 아마 이런 면에서 단어의 혼동이 오지 않았을까 생각한다. 다만 딥러닝을 배우는 대부분의 학생이 선형대수를 배우는 현 상황에서는 거의 무조건 헷갈릴 수밖에 없는 상황이 아닐까한다.

'Data Science' 카테고리의 다른 글

[논문 리뷰]Batch normalization  (0) 2022.01.25
Keras에서 드롭아웃 레이어가 작동하는 방법  (0) 2022.01.02
[딥러닝 기본] RNN  (0) 2021.11.08
[딥러닝 기본] CNN  (0) 2021.11.08
[딥러닝 기본] Optimization  (0) 2021.11.04

Sequential model

  • 입력이 여러개 들어올때 다음 값을 예측

  • fix the time span: 입력할 과거 데이터를 고정(이전 2개의 데이터만 본다 등등)

  • Markov model: 나의 현재는 바로 전 과거에만 dependant 하다 하지만 현실에 잘 맞지 않음

  • Latent autoregressive model: input과 output 사이에 hidden state가 있음. hidden state는 과거의 정보를 summarize 하고 있다. 다음번 타입스텝은 히든 스테이트 하나에만 dependant하다.

Recurrent Neural Network

  • 자기 자신으로 돌아오는 구조가 있어서 과거 데이터들을 모두 반영함

  • 시간순으로 풀면 입력이 굉장히 많은 fully connected layer로 표현 가능

  • 단점) short-term dependencies: RNN은 하나의 fixed rule로 과거 정보를 모두 취합하기 때문에 데이터가 가면 갈수록 희석됨

  • 과거의 데이터를 계속 입력하면 계속 값이 활성화함수를 중첩해서 통과하기 때문에 vanishing이 일어남, ReLU의 경우 계속 weight를 곱하기 때문에 exploding이 일어남

Long Short Term Memory

  • 이전의 출력값(previous cell state), previous cell state, input data가 입력된다.
  • core idea: cell state, 타임스텝 t까지 들어오는 정보를 요약
  • forget gate: 어떤 정보를 버릴지 결정 현재의 input, 이전의 output이 들어감
  • input gate: 어떤 정보를 cell state에 저장할 지 결정
  • update cell: cell state 업데이트
  • output gate: cell state를 이용해 output을 결정

Gated Recurrent Unit

  • 게이트가 두개
  • cell state가 없음, hidden state만 존재
  • reset gate
  • update gate
  • LSTM보다 GRU의 성능이 올라가는 경우가 있음(패러미터가 적음)
  • transformer가 나오면서 RNN구조가 transformer로 바뀌고 있음

출처: boostcamp precourse

convolution

  • convolution의 의미: 필터의 모양을 이미지에 찍음 -> 블러, emboss, outline

RGB image convolution

  • 커널의 차원이 n * n *3이 됨
  • feature map: convolution 채널이 여러개, output의 차원이 늘어남
  • stack of conovlution: 여러개의 convolution을 거침,
  • 32 * 32* 3 의 이미지를 28 * 28 * 4 로 만들기 위해선 5 * 5 * 3 필터가 4개, 총 5 * 5 * 3 * 4 = 300개의 parameter가 필요함

convolution neural network

  • convolution layer: feature extraction
  • pooling layer: feature extraction
  • fully connected layer: decision making (ex. classification)
  • 파라미터가 늘어나면 늘어날수록 새 데이터에 대한 성능이 나오지 않음
  • 파라미터를 최대한 줄이는 방향으로 발전

Stride

  • 커널을 몇픽셀마다 찍을 것인가.

Padding

  • 필터가 가장자리에 찍힐 때 가장자리를 채워주는 역할
  • zero padding
  • input과 output의 차원이 똑같아 짐

Convolution Arithmetic

  • input size: 40 * 50 * 128, output size: 40 * 50 * 64
  • padding (1), stride (1), 3 * 3 kernel
  • 파라미터의 숫자는?
  • 파라미터 숫자: 3 * 3 * 128 * 64 = 73728

1 * 1 convolution

  • 이미지를 줄이진 않고 dimension reduciton

  • 레이어를 쌓으면서 패러미터를 줄이기 위해서

출처: boostcamp precourse

Introduction

  • Gradient Descent: 1차 미분 값을 사용해 local minimum을 향해 반복적으로 최적화 시킨다.

Important Concepts in Optimization

  • generalization
  • under-fitting vs over-fitting
  • cross validation
  • bias-variance tradeoff
  • bootstrapping
  • bagging and boosting

Generalization

  • 새로운 데이터에 모델이 얼마나 잘 적용될 것인가
  • Underfitting vs. Overfitting

cross-validation

  • train data와 validation data를 나누는 경우가 많음. validation data로 모델의 성능을 검증
  • train/validation 비율은?
  • cross-validation: data를 k개로 나눠서 k-1개로 학습하고 1개로 validation
  • cross-validation으로 최적의 parameter를 찾고 실제로 모델을 학습시킬땐 모든 데이터를 사용한다. test 데이터는 학습에 어떤 방식이던 사용되면 안됨

Bais and Variance

  • High Variance: 얼마나 출력이 일관적?
  • High Bias: 평균적으로 출력이 true target에 접근하고 있는가?
  • Bias and Variance Tradeoff: bias를 줄이면 variance가 늘어나고 variance가 줄어들면 bias가 늘어난다.

Bootstrapping

  • 랜덤 샘플링을 이용해서 만든 여러 모델들의 컨센서스를 보고 전체적인 uncertainty를 예측하려고 함
  • Bagging vs Boosting
    • bagging: 여러 모델을 부트스트랩으로 만듦, 여러 모델의 결과값을 투표나 평균을 내서 최종 결과값을 냄(모델들이 독립적)
    • boosting: 간단한 모델을 만들고 다음 모델을 전 모델이 잘 예측하지 못하는 부분에 성능을 좋도록 만들어서 여러 모델을 sequential 하게 만듦으로써 strong learner를 만드는 것(모델들이 독립적이지 않음)

Gradient Descent Methods

  • sotchastic gradient descent: 하나의 샘플만을 이용
  • min-batch gradient descent: batch size를 이용
  • batch gradient descent: 한번에 모든 데이터를 사용
  • momentum: 모멘텀과 현재 gradient vector를 합쳐 accumulation을 만들고 다음으로 최적화를 넘김
  • nesterov accelerated gradient: lookahead gradient로 local minimum에 잘 들어감
  • adagrad: 패러미터가 지금까지 얼마나 많이 변했는지 고려, 많이 변한 패러미터는 적게, 적게 변한 패러미터는 많이 변화시킴, 뒤로가면 갈수록 학습이 멈춰지는 부작용
  • adadelta: adagrad 개선, learnig rate이 없음
  • rmsprop: step size 추가
  • adam: gradient square와 모멘텀을 같이 사용, adaptive + momentum

Batch-size matter

  • 배치사이즈가 크면 sharpe minimizer, 배치사이즈가 작으면 flat minimizer(새로운 데이터에 잘 작동)

Regularization

  • early stopping: validation error를 보고 학습을 먼저 멈춤
  • parameter norm penalty: 패러미터가 너무 커지지 않게 함, 함수를 최대한 부드럽게 만듦
  • data augmentation: 더 많은 데이터는 언제나 옳다. 주어진 데이터를 조작해서 새 데이터를 만들어서 데이터를 늘린다. 레이블이 변환되지 않는 조건 하에서
  • nois robustness: 입력데이터에 랜덤 노이즈를 만든다.
  • label smoothing: 학습데이터 두개를 뽑아서 섞는다.(cutmix)
  • dropout: 일부 weight을 0으로 바꿔준다.
  • batch normalization: 적용하고자 하는 layer의 statistic을 정교화 시킴

출처: boostcamp precourse

Neural Network

  • 인간의 뇌를 모방하고자 한 시스템
  • neural networks are function approximators that stack affine transformation followed by nonlinear transformation

Linear Neural Networks

  • model: yhat = wx + b
  • loss: sum(y - yhat)^2 / N -> mse
  • loss function을 파라미터로 편미분하고 이를 통해 gradient descent로 파라미터를 최적화한다.

Beyond Linear Neural Networks

  • 좀 더 레이어를 쌓는다면? -> 결국 행렬의 곱이기 때문에 쌓아봤자 의미 없다
  • non-linear transform 필요!
  • 활성화 함수: ReLU, Sigmoid, tanh
  • 히든 레이어가 하나 있는 neural network는 대부분의 measurable function을 근사할 수 있다. 그러나 뉴럴 네트워크의 표현력만을 의미하는 것. 진짜 찾을 수 있을지는 모른다.

Multi-Layer Perceptron

  • 히든 레이어가 1개 이상 있는 perceptron
  • loss function은?
    • Regression Task: MSE
    • Classification Task: cross-entrophy
    • probabilistic Task: MLE

출처: boostcamp precourse

 

따라서 답은 4번

 

따라서 답은 3번

활성화 함수 비선형함수로, 선형연산된 WX + b를 비선형 근사해준다. 따라서 답은 2

1025 / 32 = 32.03125, 1 epoch당 33 step, 답은 33 * 2 = 66

 

bubble sort는 가장 효율이 나쁜 정렬 알고리즘 중 하나로 시간복잡도는 O(n^2)이다. 따라서 답은 4

 

def is_palindrome(s : str):
    if s[::-1] == s:
        return 1
    else:
        return -1

코드 참조

문제출처: https://blog.naver.com/boostcamp_official/222543585249

'Data Science' 카테고리의 다른 글

딥러닝에서의 '차원' 이라는 용어에 대한 고찰  (0) 2022.01.02
[딥러닝 기본] RNN  (0) 2021.11.08
[딥러닝 기본] CNN  (0) 2021.11.08
[딥러닝 기본] Optimization  (0) 2021.11.04
[딥러닝 기본] multi-layer perceptron  (0) 2021.11.04

+ Recent posts