본문 바로가기

AI Theory/key concept of AI

Regularization(정칙화)

Regularization

정칙화(Regularization) vs 정규화(Normalization)

정규화(Normalization)

  • 데이터셋에 대해 모든 features가 동일한 범위를 갖도록 전처리하는 과정
  • z-score, min-max scaling 등이 있다.
  • 피처 간 값의 범위 차이가 클 경우, 데이터의 분포가 feature값의 범위에 의해 왜곡되어 학습을 방해한다는 문제점이 있다. normalization은 모든 feature의 범위를 동일하게 하여 모델 학습을 돕는다.

정칙화(Regularization) 

  • 오버피팅(overfitting)을 해결하기 위한 방법 중의 하나
  •  L1, L2 Regularization, Dropout, Batch normalization 등이 있다.
  • overfitting 된 모델의 경우 trainset에 대한 loss는 매우 낮지만, validation/testset에 대한 loss가 높다. regularization 기법들은 모델에 제약 조건을 걸어서 모델의 train loss를 증가시키는 역할을 한다.
  • regularization은 train loss는 약간 증가시키지만 결과적으로, validation loss나 최종 test loss를 감소시키려는 목적을 갖고 있다.

Regularization의 방법인 L1, L2 Regularization, Dropout, Batch normalization 를 알아보자.


L1 Regularization

(출처: 모두의연구소)

이 부분이 바로 L1 norn이다.

L1 norm은 다른 말로 Lasso라고도 불린다.

L1 regularization이 L2 regularization과 다르게 왜 일부 컬럼의 가중치를 0으로 보낸다.


norm?

norm이란 벡터, 행렬, 함수의 거리를 나타내는 것으로 이 중 Lp norm의 정의는 아래와 같다.

이 Lp norm에서 p가 1이면 L1 norm, p가 2이면 L2 norm이 된다.

 

p가 무한대인 경우에는 어떨까?

그러면 x에서 가장 큰 숫자를 출력한다.

norm_x = np.linalg.norm(x, ord=np.inf)
print("result of infinite norm : %0.5f "%norm_x)

matrix norm

  • norm 중에서 행렬의 norm
  • p=1, p=무한대인 경우만 알면 된다.
  • 행렬 A가 m*n 행렬일 때, p=1, 무한대일 때 norm은 다음과 같다.
  • 인 경우에는 컬럼(column)의 합이 가장 큰 값이 출력되고, 인 경우에는 로우(row)의 합이 가장 큰 값이 출력된다.

A = np.array([[1,2,3], [1,2,3], [4,6,8]])

one_norm_A = np.linalg.norm(A, ord=1)
print("result one norm of A :", one_norm_A)

inf_norm_A = np.linalg.norm(A, ord=np.inf)
print("result inf norm of A :", inf_norm_A)

L2 Regularization

L2 norm은 아래와 같은 식으로 정의된다.

Ridge라고도 불린다


L1 norm이 L2 norm과 다르게 일부 컬럼의 가중치를 0으로 보내는 이유?

 

 

빨간색 직선은 우리가 풀어야 하는 문제의 해답이 될 수 있는 파라미터 들의 집합이다.

 

마름모/원의 크기를 늘렸을 때 빨간 직선이 마름모/원과 만나는 지점이 바로 |w1|+|w2| / w1^2 + w2^2을 최소화하는 해가 된다.

 

L1 regularization은 제약 조건이 꼭지점이 각 축 위에 있는 마름모 모양이기 때문에, '정답 파라미터 집합'과 만나는 지점 역시 축 위에 있을 가능성이 높다. 그리고 축 위에 있다는 것은 좌표값이 0을 가진다는 것을 의미하므로 L1 regularization의 결과를 보면 일부 coef 값이 0으로 나올 수 밖에 없다.

 

L2 regularization은 제약 조건이 원의 형태이므로 빨간  직선과 만나는 지점이 축 위에 있을 가능성보다, 축과 가까운 다른 곳에 있을 가능성이 높다. 따라서 coef 값이 모두 0이 아니므로 coef 값이 줄지 않으며, 제곱이 들어가 있기 때문에 절댓값으로 L1 norm을 쓰는 Lasso보다는 수렴이 빠르다.

 

 

정리하면, L1 regularization은 가중치가 적은 벡터에 해당하는 계수를 0으로 보내면서 차원 축소와 비슷한 역할을 하는 것이 특징이며, L2 regularization은 계수를 0으로 보내지는 않지만 제곱 텀이 있기 때문에 L1 regularization보다는 수렴 속도가 빠르다는 장점이 있다.

 

실제 데이터에 적용할 때에는 이러한 장단점을 고려하여 적절한 regularizaiton 방법을 채택해야 한다.

 


Dropout

  • 확률적으로 랜덤하게 몇 가지의 뉴런만 선택하여 정보를 전달하는 과정
  •  몇 가지의 값들을 모든 뉴런에 전달하는 것이 아닌, 확률적으로 버리면서 전달하는 기법
  • 오버피팅을 막는 regularization layer 중 하나
  •  fully connected layer에서 오버피팅이 생기는 경우에 주로 dropout layer를 추가한다.
  • 확률을 설정할 수 있다. 확률을 너무 높이면 (비활성화된 뉴런의 비중을 높이면) 모델 안에서 값들이 제대로 전달되지 않으므로 학습이 잘 되지 않고, 확률을 너무 낮추는 경우에는 fully connected layer와 같이 동작한다.
  • 2014년 나온 논문에서 확인할 수 있다.
  • https://jmlr.org/papers/v15/srivastava14a.html
 

Dropout: A Simple Way to Prevent Neural Networks from Overfitting

Dropout: A Simple Way to Prevent Neural Networks from Overfitting Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever, Ruslan Salakhutdinov; 15(56):1929−1958, 2014. Abstract Deep neural nets with a large number of parameters are very powe

jmlr.org


batch Normalization

딥러닝에서 경사하강법으로 모델의 가중치를 업데이트할때, 한번에 전체 데이터를 보는 batch gradient descent 방식과  데이터 하나를 관찰할 때마다 업데이트하는 stochastic gradient descent라는 방법, 두 방법의 절충안으로 데이터셋을 여러개의 mini batch로 쪼개어 학습하는 mini batch gradient descent가 있다.

 

그러나 mini batch gradient는 학습속도와 안정성 모두를 잡았지만 딥러닝 모델 안에서 데이터가 처리되며 mini batch된 데이터들 간 데이터 분포의 차이가 생길 수 있다는 문제가 있었다.

 

데이터간 분포의 차이가 생길 경우 gradient 값이 달라짐에 따라 gradient vanishing이나 explode 문제가 발생할 수 있다.

 

따라서 batch normalization을 이용해 각 mini-batch마다 평균과 분산을 계산하여 정규화(normalization)를 수행하고, scale and shift 변환을 적용하여 mini-batch들이 비슷한 데이터 분포를 가질 수 있도록 하였다.

 

https://arxiv.org/pdf/1502.03167.pdf

 

batch normalization 방식

 batch normalization은 mini-batch의 평균()과 분산()을 구해서 입력 데이터를 정규화(normalize)하고, 이 값에 scale()과 shift()를 추가하였다.

 

결국 입력 데이터()는 batch normalization을 거쳐 (=  + )가 된다.

  • 이때 중간에  
  •  값은 학습 파라미터로 모델 학습이 진행되면서 가중치와 함께 업데이트되도록 하였다.

이러한 batch normalization을 통해 빠르고 안정적으로 학습할 수 있도록 하였다.

 

텐서플로우 코드

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(10, activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=20, batch_size=2048, validation_data=(X_valid, y_valid))

'AI Theory > key concept of AI' 카테고리의 다른 글

비지도학습(Unsupervised Learning)  (0) 2023.07.07
선형 회귀와 로지스틱 회귀  (0) 2023.07.05
활성화 함수의 이해  (0) 2023.07.03
딥네트워크  (0) 2023.07.03
데이터 전처리 기법들  (0) 2023.06.28