반응형

Layer Normalization 배경 설명

  • Layer Normalization은 토론토 대학에서 2016년 발표한 논문이다.  Geoffrey E. Hinton이 저자로 포함되어 있다.
  • CNN에서 BN이 주목을 받게 되면서, RNN에 적용 가능한 LN을 소개하였다.
  • BN의 단점을 극복하는 것(RNN에 적용이 안된다는 점)이 논문의 시작이기 때문에 BN에 대해 먼저 알아야 한다.

2023.11.10 - [머신러닝] - Batch Normalization (Accelerating DeepNetwork Training by Reducing Internal Covariate Shift) 논문 리뷰

 

Batch Normalization (Accelerating DeepNetwork Training by Reducing Internal Covariate Shift) 논문 리뷰

항상 문제에 봉착하기 전에는 내가 모르는 것이 뭐인지 모르게 된다. 항상 Batch Normalization은 당연하게 사용하였지, 그 의미에 대해서 대략적으로만 알고 있었던 것 같아서, 이번 기회에 Batch Normal

devhwi.tistory.com

  • 최근 유행하는 Transformer에 normalization 방법으로 거의 무조건 사용되기 때문에, 매우 중요한 논문이다. 

 

Abstract

  • 딥러닝 학습을 위한 연산은 비용이 크다. 
  • 이러한, 학습 시간을 줄이기 위한 방법으로 중간 layer의 결과들을 normalize 하는 방법이 있다.
  • 최근에는 mini batch 내에서 mean과 variance를 이용하여 normalization 방법인 Batch Normalization(BN)이 널리 사용되고 있다. 이 방법은 학습 시간을 크게 줄여준다.
  • 하지만, BN은 mini-batch 크기에 의존적이고, recurrent neural network에 적용 방법이 명확하지 않다. 
  • 이 논문에서는 하나의 training 데이터 내에서 한 layer의 mean과 variance를 이용하여 normalization 하는 "Layer Normalization(LN)"을 소개한다. 
  • BN처럼 normalization 후, activation 적용 전에 적용되는 bias와 gain을 이용한다. 
  • BN과 다르게 LN은 training과 test time의 normalization 방법이 같다.
  • 또한, LN은 각 time step에 따른 dependency가 없기 때문에, recurrent model에도 적용 가능하다. 

 

Introduction

[배경 - Batch Normalization]

  • 딥러닝 학습이 점점 발전하고 있지만, 학습에 매우 긴 시간이 소요된다.
  • 딥러닝 학습 속도를 향상하기 위해, 여러 머신을 사용한 병렬처리 등 여러 방법이 등장하고 있다.
  • 그중 BN은 training data에 mean과 standard deviation을 이용한 normalization 방법을 적용하여, 학습 속도를 향상했다.

[BN의 문제]

  • BN은 고정된 depth의 network에서 직관적이고 효과적이다. 하지만, RNN과 같은 길이가 달라지는 network에서는 time step마다 statistics가 달라지기 때문에 BN을 적용하기 어렵다. 
  • 또한, BN은 batch size가 작은 경우에는 효과적이지 않았다.

[LN]

  • 이 논문에서는 layer normalization이라는 간단하게 학습속도를 향상할 수 있는 normalization 방법을 소개한다. 
  • BN과 다르게 summed input(residual connection이 더해진 값들 or RNN처럼 누적된 값들) 내에서 normalization을 진행하기 때문에, training set 들간의 의존성을 가지지 않는다. 
  • LN을 사용하여 RNN에서 속도와 성능이 빨라진 것을 보인다. 

 

Layer Normalization

  • BN의 단점을 극복하기 위한, LN을 소개한다.
  • "covariate shift" 문제를 해결하기 위해, 각 layer의 mean과 variance를 이용한 normalization을 진행한다. 이를 위해, mean과 standart deviation을 아래와 같이 정의한다.  (H : hidden unit 수)

  • 이렇게, mean과 shift를 정의하여 BN과 달라진 점은 LN에서는 동일 layer들이 동일 통계값을 보고, training set 들 간에는 서로 의존성이 존재하지 않는 것이다. 
  • LN은 training set 간 의존성이 없기 때문에, batch size에 영향을 받지 않는다. (1도 가능하다.)

 

Layer normalized recurrent neural networks

  • NLP에서는 training set마다 다른 길이를 가지는 경우가 흔하다. 이것은 RNN이 각 time-step마다 동일 weight를 공유하기 때문이다. 
  • 하지만, BN을 RNN에 적용하려 할 때, 문제가 발생한다. 각 time step마다 별개의 statistics를 저장해 놔야 하기 때문이다. 특히, test set의 sequence 길이가 training set보다 길 때는 문제가 생긴다. (통계값이 없기 때문에)
  • LN은 현재 time-step의 input에서만 normalization을 진행하기 때문에, 이러한 문제가 발생하지 않는다. 또한, 모든 time step에서 공유 가능한 하나의 셋의 gain과 bias를 가진다.
  • RNN에서 LN을 위한 statistics는 다음과 같이 구해진다. (⊙: element-wise multiplication, b: bias, g: gain)

  • RNN이 LN을 적용하면, 일반적 RNN에서 time-step 진행에 따라 값이 점점 커지거나, 점점 작아져서 발생하는 exploding or vanishing gradient 문제가 해결되어 안정적 학습이 가능하다.

(이 이미지는 group normalization 논문에서 가져온 이미지이다. group normalization 관련된 내용은 아래 글 참조 바란다.)

2024.03.28 - [머신러닝] - Group Normalization 논문 리뷰

 

Group Normalization 논문 리뷰

Group Normalization 배경 설명Group Normalization은 Kaming He가 저자로 포함된 ECCV 2018년 논문이다. Computer vision 분야의 필수 component인 Batch Normalization의 한계와 그를 해결하기 위한 Group Normalization을 제시하

devhwi.tistory.com

 

Analysis

Invariance under weights and data transformations

  • LN은 BN이나 WN(weight normalization)과 연관이 있다. 

[Weight re-scaling and re-centering]

  • BN과 WN은 weight vector가 a만큼 scaling 되었을 때, mean과 standard deviation은 a만큼 scaling 된다. 
  • scaling 전후의 normalization 값은 같기 때문에, BN과 WN은 weights의 re-scaling에 대해 불변하다.
  • 하지만, LN은 single weight vector의 scaling에 따라 변한다. 
  • LN은 전체 weight matrix의 scaling이니나, weight matrix 모든 원소들의 shift에 대해서 불변이다.

[Data re-scaling and re-centering]

  • 모든 normalization 방법들은 데이터셋의 re-scaling에 대해 불변하다. 

 

Geometry of parameter space during learning

  • 학습은 function이 같더라도 parameter에 따라 달라질 수 있다.
  • 이 section에서 분석을 통해, normalization scalar σ가 implicit 하게 learning rate를 감소시키고, 학습을 더 안정적으로 만들 수 있다는 것을 확인한다.

 

Experimental results

  • LN을 6개 RNN task에 적용해 보았다. (image-sentence ranking, QA, contextual language modeling, generative modeling, handwriting sequence generation, MNIST classification)
  • LN의 기본 gain은 1, biases는 0으로 설정하였다. 

 

Order embeddings of images and language

  • validation curve를 보았 을때, LN의 학습속도가 매우 빠른 것을 볼 수 있다. 
  • 성능도 제일 좋다.

 

Skip-thoghts vectors

  • skip-thoghts는 sentence representstions를 unsupervised로 학습하는 방법이다. 
  • LN을 이용하였을 때, 속도 향상뿐 아니라, 성능면에서도 이점을 주는 것을 확인할 수 있다.(표에서 십자가 표시는 한 달 학습시킨 모델이다. - 오래 학습시켰을 때)

 

 

ETC

  • RNN Model에서 효과를 보았다. 
  • 하지만, CNN에서는 BN이 좋은 성능을 보였다. (input의 분포가 계속 바뀌기 때문에)

 

Reference

BA, Jimmy Lei; KIROS, Jamie Ryan; HINTON, Geoffrey E. Layer normalization. arXiv preprint arXiv:1607.06450, 2016.

 

 

총평

  • 정말 간단하고, 직관적이고, 그다음 논문(Group Normalization)을 먼저 읽은 터라 쉽게 읽혔다. 
  • 이런 기본적인 논문들은 아이디어가 너무 유명해져서, 논문 발표 당시 풀고자 했던 문제와 상황을 알지 못하는 경우가 많은데(논문으로 인해 이미 풀렸으므로), 당시 저자들이 어떤 생각과 문제에 집중했는지를 알게 되어, 꼭 읽어야겠다.
반응형

Group Normalization 배경 설명

  • Group Normalization은 Kaming He가 저자로 포함된 ECCV 2018년 논문이다. 
  • Computer vision 분야의 필수 component인 Batch Normalization의 한계와 그를 해결하기 위한 Group Normalization을 제시하고 있다.
  • Batch Normalization 관련 내용은 아래를 참고 바란다!

2023.11.10 - [머신러닝] - Batch Normalization (Accelerating DeepNetwork Training by Reducing Internal Covariate Shift) 논문 리뷰

Batch Normalization (Accelerating DeepNetwork Training by Reducing Internal Covariate Shift) 논문 리뷰

항상 문제에 봉착하기 전에는 내가 모르는 것이 뭐인지 모르게 된다. 항상 Batch Normalization은 당연하게 사용하였지, 그 의미에 대해서 대략적으로만 알고 있었던 것 같아서, 이번 기회에 Batch Normal

devhwi.tistory.com

 

Abstract

  • Batch Normalization(BN)은 딥러닝의 milestone 기술이 됐다. 
  • 하지만, Batch 방향의 normalization은 batch size가 작아질수록 error가 커진다. 
  • 이 논문에서는 BN을 대체할 수 있는 "Group Normalization(GN)"을 제안한다.
  • GN은 channel 방향으로 그룹을 나눠, 각 그룹에 대해 normalization을 위한 mean과 variance를 구한다. 
  • GN의 연산은 batch size에 독립적이어서, batch size가 변해도 accuracy가 안정적으로 유지된다. 
  • ResNet-50을 이용한 ImageNet 학습에서 GN은 2 batch size의 BN에 비해 10.6%의 낮은 error율을 보였다. 
  • 추가적으로 GN은 pre-training에서 fine-tuning으로 쉽게 전환 가능하다.
  • COCO 데이터셋에서의 object detection과 segment 등에서 GN은 BN을 대체할 수 있음을 보였다.

 

Introduction

[배경 - BN의 한계]

  • Batch Normalization은 딥러닝 분야에서 매우 중요한 component이다. 
  • BN은 feature를 batch 단위로 mean과 variance를 이용한 normalize를 진행하여, optimize와 네트워크의 converge를 빠르게 해 준다. 
  • BN의 이런 장점에도 불구하고, batch 방향의 normalize로 인한 특징이 존재한다. 예를 들어, batch size가 충분히 많아야 한다는 것이다.  적은 양의 batch는 batch statistics에 대한 부정확한 추정이 된다. 
  • 따라서, BN의 사이즈가 작아지면, model error가 급격하게 증가한다. 
  • 특히, model의 용량이 커서, 큰 batch를 가져가지 못하는, detection, segmentation, video recognition 등의 task들은 이 error에 더 치명적이다. 

 
[소개]

  • 이 논문에서는 Group Normalization(GN) 이라는 BN의 간단한 대체 방법을 소개한다. 
  • GN은 channel을 몇개의 group으로 나누고, 각 group에서 feature들을 normalize 한다. 
  • GN은 batch dimension을 이용하지 않기 때문에, batch size 변화에 무관하다. 

 
[BN과 비교 실험]

  • GN은 batch size에 매우 안정적이여서 , ImageNet 학습 ResNet-50 model의 2 batch size에서 BN을 적용한 것보다 10.6% 낮은 error를 보였다. 
  • 일반적인 batch size에서도 GN은 BN과 error 0.5% 이내의 적은 차이를  보이며, 다른 normalize 방법을 압도할 정도로 좋은 성능을 보인다. 
  • batch size가 변하더라도 GN은 pre-training, fine-tuning task에서도 자연스럽게 적용된다. 
  • GN은 OD, segmentation, video classification 등에서 BN의 좋은 대체가 될 수 있음을 보인다. 

 
[다른 BN 대체들과 비교 실험]

  • Layer Normalization, Instance Normalization과 같은 방법들은 논문과 비슷하게 batch dimension의 normalization을 피했다. 
  • 이런 방법들은 RNN/LSTM 같은 sequential model이나, GAN과 같은 generative model에는 효과적이나, visual recognition에서는 한계가 있음을 보였다. 
  • 반면에 GN은 visual recognition 성능도 좋으면서, sequential model과 generative model에 사용 가능하다. 

 

Group Normalization

  • visual feature에서 channel은 각기 독립적이다. 
  • SIFT, HOG, GIST 같은 전통적 feature들은 group 단위의 histogram 등을 통해 만들어지고, 이러한 feature들은 group 단위의 normalization 등에 사용된다. VLAD나 Fisher Vector도 group을 cluser에 대해 계산된 sub-vector로 생각될 수 있다.
  • 높은 차원의 layer는 더 추상적이고, 직관적이지 않지만, 빈도, 모양, 조명, 질감과 같은 많은 정보들이 전통적 방법처럼 group화로 이어질 수 있다. 
  • 이러한 특성과 인간의 시각 지각 시스템에서 영감을 받아, 딥러닝 네트워크를 위한 group-wise normalization을 제안한다.

Formulation

  • 일반적인 feature normalization은 다음 식으로 정의된다. (x: feature, i: index) 
  • 많은 종류의 feature normalization 방법들은 set(위의 식에서 S)를 어떻게 정의하느냐에 따라 달라진다. 
  • Batch Norm(BN)은 set을 아래와 같이 정의한다. (C: channel)
  • Layer Norm(LN)은 set을 아래와 같이 정의한다. (N : batch axis)
  • Instant Norm(IN)은 set을 아래와 같이 정의한다.
  • BN, LN, IN은 normalization 단계에서 소실된 표현력 복구를 위해, 아래와 같은 선형 변환을 진행한다.  (gamma: trainable scale param, beta: trainable shift param)
  • Group Norm은 mean과 variance를 구하기 위한, set을 아래와 같이 정의한다. (G: group number - default 32)
  • GN에서는 C(Channel) 방향의 C/G개의 Group 들에 대한 H, W 방향의 mean과 shift를 구한다. 

 
Relation to Prior Work

  • LN, IN, GN은 모두 batch axis에 대해 independent하다. 
  • GN의 극단적인 케이스를 각기 LN과 IN으로 볼 수 있다. 
  • 우선 LN과의 관계를 보면, GN에서 group number를 1로 설정하였을때, LN이 된다. LN은 모든 channel을 동일한 역할을 한다고 본다. 
  • 하지만, 이러한 가정은 FC에선 맞는데, convolution 연산에서는 틀릴 수 있다. GN은 LN보다 유연하여, 각 group에 각기 다른 distribution을 학습할 수 있다. 이것은 GN의 표현력이 LN보다 좋은 이유가 된다. 
  • group number를 channel size로 설정하였을 때, GN은 IN이 된다. IN은 spatial dimension에만 의존하기 때문에, channel 간 관계를 사용할 수 있는 여지를 사용하지 못한다. 

 
Implementation

  • GN은 pytorch나 tensorflow로 몇 개의 line만으로 쉽게 구현 가능하다.  (아래 Tensor flow 코드)

 

Experiments

  • 실험 환경 : ImageNet 학습을 RseNet model로 비교하였다. GN의 group number는 32로 설정하였다. 

 
comparison of feature normalization methods

  • 우선 일반적인 상황에서 실험을 위해 32개 batch size에서 실험하였다. 
  • 이런 환경에서 알려진 것처럼 BN은 좋은 성능을 보였다. 
  • LN과 IN등이 BN 방법보다 높은 validation set error율을 보이지만, GN은 0.5% 정도의 작은 error율 차이만 있다. 
  • GN과 BN의 error율 차이는 GN이 BN의 regularization 역할을 조금 상실하기 때문이다. 이것은 GN에 적당한 regularizer를 달면 완화될 것이다. 
  • Training set error율을 보면, GN이 더 작은 error율을 보임을 확인할 수 있는데, GN이 optimization이 더 쉽게 된다는 것을 의미한다. 

 
 
Small batch sizes

  • BN이 stochasticity를 통한 장점을 갖지만, batch size가 작아지면 uncertainty가 높아지면서, error가 늘어난다. 
  • batch size를 각각 32, 16, 8, 4,2 image로 학습을 진행했다. 
  • GN은 batch size 변화에 대해 안정적인 분포를 보인다. GN은 batch size에 상관없이 거의 비슷한 curve를 보이는 것을 확인할 수 있다. 
  • batch size가 2일 때는 GN은 24.1%의 error율로 34.7%의 BN보다 10.6%가량 낮은 error율을 보인다. 
  • 이것은 batch mean, variance의 추정이 부정확하였다는 것이다. 

 
OD and Segmentation

  • fine-tuning task에서도 비교해 보았다. 
  • COCO에서 OD, segmentation 성능(Mask R-CNN, ResNet-50)은 다음과 같다. 
  • COCO에서 OD, segmentation 성능(Mask R-CNN, ResNet-50 FPN)은 다음과 같다. 

 
 
 

Reference

WU, Yuxin; HE, Kaiming. Group normalization. In: Proceedings of the European conference on computer vision (ECCV). 2018. p. 3-19.
 
 

총평

  • 사실 BN을 기계적으로 사용하다가, 최근 연구에서 다른 Normalization 기법들(LN, GN)을 사용하는 것을 보고, 이유를 찾아보기 시작했다.
  • 그동안 이용에만 관심있었지, 왜 이런  normalization을 사용하는지 제대로 이해하고 가지 않은 것 같다. 
  • Kaiming He가 저자로 들어간 논문은 아이디어가 매우 간단하고 직관적인데 임팩트가 큰 것 같다. 다시 한번 대단하다고 생각한다. 
반응형

항상 문제에 봉착하기 전에는 내가 모르는 것이  뭐인지 모르게 된다. 항상 Batch Normalization은 당연하게 사용하였지, 그 의미에 대해서 대략적으로만 알고 있었던 것 같아서, 이번 기회에 Batch Normalization의 논문을 읽으면서 기본기부터 다시 쌓고자 한다.


Batch Normalization 배경 설명

  • Batch Normalization은 딥러닝을 접해본 사람이면, 누구나 알 것이다. Batch Normalization은 2015년 구글에서 ICML에 발표한 논문이다.
  • Internal Covariate Shift 문제를 정의하고, 이를 해결하기 위한 mini batch 단위의 Normalization 방법에 대해서 제안한다.

Abstract

  • DNN의 학습 과정에서 앞선 layer들의 parameter 변화에 따라, 뒷 layer들의 input의 분포가 변하기 때문에 학습이 매우 어렵다.
  • 이 현상으로 인해 학습의 learning rate를 크게 가져가지 못하고, parameter 초기화를 신중히 해야 한다. 따라서, 비선형성 모델의 학습을 느리게 만든다.
  • 이 논문에서는 이 현상을 "internal covariate shift"라 부르고, 이를 해결하기 위해, layer의 input을 normalize 하는 방법을 사용한다.
  • 이 모델에서는 normalization을 model 아키텍처의 일부분으로 각 training mini-batch마다 normalization을 수행하는 방법을 사용한다.
  • Batch Normalization을 통해, 더 높은 learning rate를 사용할 수 있고, 모델이 parameter 초기화에 덜 민감해지게 된다. 또한, regularizer로 작동하기 때문에, 일부 상황에서는 Droupout을 대체하기도 한다. 
  • 그 당시 SOTA image classification model에 적용하여, Batch Normalization은 training step을 14 단계나 줄이면서 비슷한 accuracy를 달성하였다. 

 

Introduction

[배경]

  • stochastic gradient descent(SGD)는 deep network 학습에 효과적인 방법이라는 것이 밝혀졌다. SGD의 변형 버전들은 SOTA 성능을 이끌고 있다.
  • SGD는 parameter를 optimize 하기 위해 loss를 minimize 한다. SGD에서 학습은 단계적으로 이뤄지고, 각 학습의 단계는 mini batch로 여겨진다. 이 mini-batch는 loss function의 gradient를 추정하기 위해, 아래와 같은 식을 사용한다.

  • mini-batch들을 사용하면, 데이터를 하나씩 학습하는 것에 비해 몇 가지 장점이 있다.
    1. mini-batch를 통해 구해진 loss의 gradient를 통해, training set의 gradient를 추정할 수 있다. 
    2. bach 계산은 병렬 연산을 이용하기 때문에 각 example을 m번 연산하는 것보다 효과적이다. 

[문제]

  • 이렇게, SGD는 간단하고 효과적이지만, model hyper-parameter를 신중하게 tuning 해야 한다. 특히, 앞선 layer들의 parameter 변화가 뒷 layer들에 영향을 미치기 때문에, model parameter나 learning rate 같은 hyper parameter 선택 시 주의를 요한다. 
  • 특히, layer input의 분포 변화는 layer들이 새로운 분포를 계속 처리해야 하는 문제를 야기한다. 이러한 input 분포의 변화를 covariate shift라 한다. 예를 들어, 아래와 같은 gradient descent step 연산이 있을 때, x (input 값)이 고정된다면, parameter는 x의 새로운 분포에 적응하는데, 연산을 낭비하는 것 없이, parameter optimize에 집중할 수 있다.

  • 추가적으로, 이런 고정된 input의 distribution은 다른 장점을 가진다. 예를 들어, sigmoid를 생각해 보았을 때, sigmoid의 input의 절댓값이 커지면(큰 음수값을 가질 때), sigmoid의 값은 0에 가까워진다. 이는, 학습의 속도를 늦추게 된다. 이러한 현상은 모델의 깊이가 깊어질수록 가속화되는데, 이러한 현상(staturation problem으로 야기된 gradient vanishing)을 실제 학습에서는 ReLu function과 좋은 parameter initialization, 또는 작은 learning rate 적용을 통해 방지하곤 한다.
  • 하지만, 이러한 비선형의 input들이 조금 더 안정적인 분포를 띄게 된다면, optimizer는 saturate에 덜 빠지게 되어, 학습이 가속화될 것이다.
  • 이 논문에서는 deep network의 internal node의 분포 변화를 "internal Covariate Shift"라고 명명하고, 이것을 없애면 더 빠른 학습이 된다는 것을 밝힌다. 

[Batch Normalization] 

  • 이를 위해, "Batch Normalization"이라는 방법을 소개한다. 이 방법은 input layer들의 평균과 분산을 고정된 값으로 normalization 하는 과정을 포함한다. 
  • Batch Normalization을 사용하면, parameter들의 초깃값의 scale에 따른 gradient scale의 민감도를 줄여줘서, divergence 위험 없이 더 큰 learning rate를 선택할 수 있게 해 준다. 
  • 추가적으로 Batch Normalization은 model을 regularize 해줘서, Dropout의 필요성을 줄여준다.

 

Internal Covariate Shift를 줄이기 위한 방법

  • 이전부터, input을 whitned(평균 0, 표준편차 1의 값)하게 되면 network training이 빠르게 수렴된다는 것이 알려져 있었다.
  • whiening을  모든 학습 과정이나, 일정한 interval 단위로 network를 직접 바꾸거나, optimization algorithm을 활용한 parameter 변경을 할 수 있지만, 이러한 변화들이 optimization 단계에서 gradient step의 영향을 줄여, 학습의 속도를 저하시킬 수 있다. (normalization이 되기 때문에) 
  • 만약, network가 항상 원하는 형태의 분포를 갖게 된다면, loss에 대한 model parameter의 gradient가 normalization을 고려하고, model parameter에 대한 의존성을 동시에 고려할 수 있게 된다. 
  • x가 layer input vector이고, X가 training dataset의 전체의 input vector 집합이라고 할 때, normalization은 다음과 같이 계산될 수 있다

  • 이 식의 backpropagation을 위해서 Jacobian을 계산해야 하는데, 아래 식에서 두 번째 term을 무시하면 explosion이 일어날 수 있다. 이 framework에서 layer의 input을 normalization 하기 위해서는 매우 큰 비용이 드는데, covariance matrix를 구해야 하기 때문이다. 

  • 이를 해결하기 위해, 저자들은 미분 가능한 다른 대안을 생각해 보았고, 앞서 통계적 방법이나 feature map들을 사용한 방법들이 있었지만, network의 성능을 떨어뜨릴 수 있기 때문에, network의 정보를 유지하면서 전체 training data의 통계값에 대한 trainign example을 normalization 하는 방법들을 고안하게 된다.

 

Mini-Batch 통계값을 이용한 Normalization

  • 각 scalar feature들을 독립적으로 평균 0, 분산 1을 갖도록 normalize 한다. input들의 모든 dimension을 아래와 같이 normalization 한다.

  • 단순히, 위처럼 input을 normalization 하면, 각 layer의 output 값들이 변경될 수 있기 때문에, 아래처럼 original model param을 구해 준다. 이때, gamma과 beta는 학습가능한 parameter이다. 즉, normalization 한 값을 original 값으로 돌리기 위한 parameter들을 학습하는 것이다. 

 

  • Normalize를 위해 전체 training set을 모두 통계내는 것은 비효율적이다. 따라서, mini-batch의 개념을 이용하여, 각 mini-batch에서 평균과 분산을 계산한다. (즉, batch 내에서 각 dimension에 대한 평균과 분산을 구한다.)
  • 이 과정을 Batch Normalization이라고 하고, 그 자세한 과정은 아래와 같다.

  • Batch Normalization은 단순히 하나의 batch 내에 있는 training example들에 의존하는 것이 아니라, 다른 mini-batch들을 고려할 수 있게 된다. 이를 통해, 모델의 학습 과정에서는 항상 평균이 0이고, 분산이 1인 input, 즉 고정된 distribution이 사용되게 된다. 

 

CNN에서 Batch Normalization

  • Batch Normalization은 CNN에도 적용할 수 있는데, 아래와 같은 식이 있다고 할 때, (u: layer input, g: activation function, W: weight, b: bias) Convolutional layer 직후 (activation function 전)에 Batch Normalization을 걸어 줄 수 있다.

  • BN을 model input인 u에 걸어주지 않는 이유는, model input은 다른 nonlinearity의 output이기 때문에 (전 layer의 activation function의 결과이기 때문에) 분포가 학습과정에서 계속 바뀔 수 있기 때문이다. 반면에, convolutional layer 직후(Wu+b)는 더 대칭적이고, non-sparse 한 분포를 띌 가능성이 높고, 더 "Gaussian"하기 때문에 조금 더 안정적인 distribution을 만들 수 있다고 한다. b는 합항이기 때문에 당장 고려하지 않아도 된다. (어차피 학습될 Beta가 해당 값을 포괄할 수 있기 때문에) 따라서, layer의 output은 다음과 같이 나타낼 수 있다.

  • convolutional layer에서는 BN을 위해, 각 mini batch에서 모든 위치에 걸쳐 공통적으로 정규화하는 방법을 사용하고 있다. (즉, 기존은 dimension 단위의 normalization이었다면, 이번엔 feature의 spatial 부분까지 고려한 normalization이다.) 따라서, learned parameter인 gamma와 beta도 feature map의 크기를 갖는다. 

 

Batch Normalization으로 인한 high learning rate 사용 가능

  • 기존 deep network에서 큰 learning rate를 적용하면  gradient의 explosion이나 vanish가 일어나게 되어, local minima에 빠지게 된다.
  • Batch Normalization은 parameter의 변화로 인한 gradient의 큰 변화를 방지하여, high learning rate를 사용 가능하게 해준다.

 

실험 결과

[batch normalization으로 인한 high learning rates 사용 가능]

  • batch normalization으로 인해 큰 learning rates를 사용할 수 있게 되었다. 

 

[ImageNet Classification]

  • 아래 그래프의 가로축은 training step이고 세로축은 validation accuracy이다. Batch Normalization을 이용하면 더 적은 step에서 좋은 성능을 발휘하는 것을 확인할 수 있다.

 

 

Reference

Ioffe, Sergey, and Christian Szegedy. "Batch normalization: Accelerating deep network training by reducing internal covariate shift." International conference on machine learning. pmlr, 2015.

 

총평

  • 당연히 Batch Normalization에 대해 이해하고 있다고 생각했고, 따로 논문 찾아볼 생각을 안했는데, 읽기를 잘했다.
  • 논문이라는 게 문제를 정의하고 푸는 과정이기 때문에, "왜?" 쓰는지를 깊이 알려면, 논문을 직접 읽는 게 나은 것 같다.
반응형

사실, 비정형 데이터를 분석하는 게 더 재밌고 공부할 부분도 많지만, 내 기준으로 현업에서는 정형데이터를 다루는 경우가 많은 것 같다. 정형 데이터를 처리할 때, 처리 속도가 빠르고, 설명력이 좋은 머신러닝 알고리즘을 선호하는 경우가 많은데, 대표적인 것이 바로 의사결정나무이다. 


의사결정나무란?

  • 의사결정나무는 계층적으로 데이터를 분할하면서, 의사 결정 규칙을 학습하여, 데이터 분류와 회귀 분석에 사용할 수 있는 예측 모델이다.
  • 의사결정나무의 가장 큰 장점은 해석력이다. 의사결정나무는 다른 머신러닝 기법들과는 다르게, 직관적으로 분할 규칙을 이해할 수 있다.
  • 의사결정나무는 특성중요도(Feature Importance, 어떤 Feature가 예측에 큰 영향을 미치는지)를 쉽게 파악할 수 있다.  
  • 의사결정나무는 일반적으로 연산 cost가 적은 편이다. 
  • 의사결정나무는 Overfitting에 취약하다. 따라서, Depth 제한 등을 둬야한다.
  • 또한, 의사결정 나무는 각 분기마다의 최적을 계산하기 때문에, 성능을 조금이라도 더 올려야 하는 Global Optimum을 찾는 문제에 약하다. 
  • CNN의 유형에 다양한 모델이 있듯, 의사결정나무에도 ID3, C4.5, CART, CHARID 등 다양한 알고리즘 등이 존재한다. 

 

의사결정나무 구성요소

의사결정나무에는 Node, Branch, Depth 개념이 있다.

  • Node : 의사결정나무에서 분할 기준과 그 답(위의 결정 나무 그림에서 박스로 표시되는 부분)
    • Root Node: 맨 상위에 존재하는 Node
    • Inter Node : 중간에 존재하는 Node
    • Terminal or Leaf Node : 맨 마지막, 자식이 없는 node
  • Branch : 하나의 Node로부터 끝 Node까지 연결된 Node들
  • Depth : Branch를 이루는 Node의 개수

 

의사결정나무 기본 원리

  • 의사결정나무의 핵심 아이디어는 각 분기마다, 데이터를 가장 잘 구분할 수 있는 특성을 뽑아서, 데이터를 분할하는 것이다.
  • 즉, 데이터를 분할하는 방식이 매우 중요한데, 이를 위해 불순도(Impurity) 개념을 사용한다.
  • 불순도란 특정 노드 내에 있는 데이터들이 얼마나 서로 다른 클래스 또는 값들을 가지고 있는지를 의미한다. 즉, 현재 분할된 데이터의 집합들이 불순도가 낮다면, 이 데이터를 나누었던 분할과정이 잘 수행되었다고 할 수 있다. (같은 특징만을 가진 데이터끼리 모은 분할이기 때문에)
  • 다만, 단순 불순도를 낮추는 방향으로 학습하면, 이미 잘 분할된 데이터도 계속 분할하는 상태가 발생한다. 이를 예방하기 위해 , 현재 노드의 불순도와 자식 노드의 불순도 차이를 Information Gain이라고 하고, Information Gain이 클수록 좋은 분할 기준이다. (가중 평균 불순도는 왼쪽 자식노드와 오른쪽 자식노드의 불순도를 각 노드의 데이터개수에 대한 가중평균을 통해 합한 값을 의미한다.)

  • 즉, 의사결정나무는 재귀적으로, Information Gain이 큰 방향으로 데이터를 분할하는 과정이다. 

 

불순도 측정

불순도를 측정하는 방법은 크게 3가지가 있다.

  • Gini 지수 : Gini 수는 무작위로 선택한 데이터의 Class가 오분류되었을 확률을 나타낸다. 전 노드에서 완벽하게 분할되었다면, 불순도가 하나의 class가 p가 1.0이 될 것이고, Gini 지수는 0이 된다. 

  • Entropy : Entropy는 자주 등장하는 개념이어서 익숙할 것이다. 데이터의 혼잡도를 의미한다. 마찬가지로, 전 노드에서 완벽하게 분할되었다면, 하나의 class만 있고, p가 1.0이나 0.0 값이다. 두 경우 모두 식의 값이 0이 되고, (1인 경우는 log항에 의해, 0인 경우는 극한을 생각해 보면 쉽게 이해 간다.) 합인 entropy도 0이 된다.

  • Variance : 회귀분석에서는 일반적으로 불순도를 분산으로 정의한다.

 

가지치기 (Pruning)

  • 위의 의사결정나무 과정을 요약하면, Information Gain이 최대가 되는 방향으로 자식노드를 만들어, 데이터를 분할하는 것이다. 
  • 다만, 이 경우에는 모든 데이터가 Terminal Node가 되어(Full Tree, 모든 데이터를 고유의 특성으로 각각 분할하여 일반화의 특성이 없어짐) Overfitting이 발생한다. 
  • 이를 해결하기 위해, 오히려 분기를 합치는 과정이 필요하다. 가지치기에는 2가지 방법이 있는데, 사전가지치기와 사후가지치기이다.
    • 사전 가지치기 (Pre-Pruning) : 분할하는 조건을 사전에 정의하여, 해당 조건을 만족하지 않으면 더 이상 분할하지 않는다. 한 Node의 데이터 개수가 일정 값 미만이면 분할을 멈추는 등의 방법이 있다.
    • 사후 가지치기 (Post-Pruning) : 우선 full tree를 만들고, 불필요한 Branch를 제거하는 방식. Pruning 후의 예측 성능과 복잡성 사이의 균형을 측정하도록 아래와 같이 Cost를 줌.

 

 

의사결정나무 파이썬 구현

  • 의사결정나무는 sklearn을 통해 쉽게 사용 가능하다. 
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

if __name__ == '__main__':
    # 데이터 불러오기
    iris = load_iris()
    X = iris.data
    y = iris.target

    # 의사결정 트리 모델 학습
    clf = DecisionTreeClassifier()
    clf.fit(X, y)
    
    # 예측
    new_data = [[5.1, 3.5, 1.4, 0.2]]
    predicted_class = clf.predict(new_data)
    print("Predicted class:", predicted_class)
반응형

t-SNE는 딥러닝 모델에서 feature의 유사도를 파악하기 위해 시각화할 때, 정말 많이 사용했던 방법이다. 단순 차원축소를 해주는 알고리즘이다라고만 이해하고 있었는데,  이번 기회에 완벽히 이해해보고자 한다. 


t-SNE 이란?

  • t-SNE(t-distributed Stochastic Neighbor Embedding)는 고차원 데이터를 저차원 영역으로 표현하기 위한 비선형 차원 축소 기법이다.
  • 여러 Feature 들의 차원 중에서 의미가 큰 차원을 선택하는 Feature Selection과 달리, 고차원 데이터의 구조와 패턴을 유지하면서, 차원 축소를 가능하게 한다.  
  • 딥러닝 등의 중간 Layer의 Output Feature 들은 대체적으로 고차원의 영역의 데이터이다. 이러한 데이터들은 직관적으로 이해하기가 어렵기 때문에, 저차원으로 시각화하여 Visualization을 진행하는데, t-SNE가 자주 사용된다.
  • PCA(주성분 분석)과 차원축소의 개념에서는 비슷하지만, 목적과 방식이 달라, 혼용해서 보완 사용하기도 한다.
  t-SNE PCA
목적 고차원 데이터를 저차원으로 바꿔, 시각화
(유사한 데이터는 가깝게, 다른 데이터는 멀게)
고차원 데이터를 저차원으로 바꿔, 데이터의 구조와 패턴을 파악 
방법 확률 분포를 이용하여 고차원 데이터와 저차원 데이터 간의 유사도를 계산하고, 최적화함. 데이터의 분산을 최대한 보존하는 축을 찾아서 차원을 축소함 (고유값 분해)
알맞은 데이터 유형
선형적 & 비선형적 데이터 모두 (데이터 간 유사도가 극명하면 유리) 데이터가 선형적으로 구성되어 있는 경우 
주의점 저차원에서의 유사도 최적화 과정이 포함되어서, PCA보다 computation cost가 높음
최적화 과정이 있기 때문에, 데이터셋 구성에 따라 결과가 달라짐
비선형적 데이터에 대해서는 성능이 떨어짐

t-SNE 알고리즘

  • t-SNE의 원리는 쉽게 말해서, 고차원 공간에서 가까운 것은 저차원에서도 가깝게, 고차원에서 먼 것은 저차원에서도 멀게 유지하는 것이다.
  • 기본적으로 t-SNE는 고차원 데이터 포인트들간 유클리디안 거리를 이용해서, 유사도를 조건부 확률로 바꿔서, 유사도를 나타내겠다는 SNE를 개선한 방법이다.
  • SNE의 유사도를 조건부 확률로 바꾸는 것이 처음에 잘 이해가 안 되는데, 쉽게 생각하면, Gaussian 분포의 PDF를 생각하면 된다. 이 식에서 평균이 데이터 포인트 i라고 하면, 평균이 i 포인트인 Gaussian 분포를 생각하면 된다. 즉, 한 데이터 포인트를 중심으로 다른 데이터 포인트 간의 거리는 정규 분포를 따른다고 생각하면 된다. 

  • 우선, t-SNE를 이해하기 위해 SNE 원리를 이해해보자.  

 

[SNE 원리]

1. 각 데이터 포인트간 Euclidean Distance를 구한다.

2.  두 데이터 포인트 간 거리를 d라고 했을때, 두 데이터 포인트 사이의 거리가 d 일 확률은 다음과 같은 정규분포의 조건부 확률로 나타난다. 즉, 거리를 다음과 같이 나타낸다. (p(i|j)와 p(j|i)가 다르다는 점을 주목해야한다.)

3. SNE의 원리는 고차원의 거리를 그대로 유지하는 저차원에서의 모델을 찾는 것이다. 저차원에서 σ의 제곱(분산)이 1/2 값을 갖는 분포를 가정하면, 저차원에서 데이터 분포 간의 거리는 다음과 같이 나타낼 수 있다.  

4. 학습의 목적은 고차원에서 데이터 포인트간의 거리를 나타내는 분포 p를 제일 잘 표현할 수 있는 저차원의 근사분포 q를 찾는 것이다. qp와 비슷한 분포가 되기 위해, 두 분포간의 KL(Kullback-Leibler) Divergence가 작아지도록 학습한다. (Gradient Descent를 이용, 두 분포가 완전히 같아졌을때, KL divergence는 0)

 

  • SNE도 좋은 방법이지만, t-SNE는 SNE보다 다음과 같은 면을 수정했다.

 

1. 비대칭성 → 대칭성

조건부 확률 기반에서, 고차원의 두 데이터 포인트 i와 j 사이의 거리인 p(i|j)와 p(j|i)는 다르다.(Sigma가 다르다) t-SNE에서는 둘 사이의 거리를 정의하는 확률을 아래와 같이 수정하여 대칭성을 부여하였다. (이로 인해, 최적화 속도가 빨라졌다. → 어느 방향에서도 동일하게 수렴 가능하기 때문에 안정적이다.)

2. Gaussian 분포 → t-분포

고차원을 저차원으로 축소하다 보면, 고차원에서 데이터가 많이 분포하는 구간에서 축소된 데이터들은 서로 많이 뭉치게 된다. 10차원에서 봤을 때는 다양한 값들을 가진 데이터들이 2차원으로 차원 축소가 되면, 거의 비슷하게 보일 수 있다. (RGB 이미지에서 구분 잘되던, 그림들이 흑백에서 구분이 잘 안 되는 걸 생각하면 된다.) 이를 완화하기 위해서는 데이터의 분포가 고르게 퍼져있는 구조가 유리하다. t-SNE에서는 거리 분포를 Gaussian 분포 대신에 t 분포를 도입하여, 데이터를 퍼뜨렸다. 

t-분포

v: 자유도, B : 베타 함수

[t-SNE]

1. 각 데이터 포인트간 Euclidean Distance를 구한다.

2.  두 데이터 포인트 사이의 거리가d일 확률은 다음과 같은 조건부 확률로 나타난다. 다만, 앞에 말했던 대로, 대칭성 확보를 위해 두 데이터 포인트 사이의 거리를 다음과 같이 정의한다. (고차원의 거리 분포는 Gaussian 분포를 그대로 유지한다.)

3. t-SNE는 SNE와 달리, 저차원에서 분포를 t-분포로 가정한다. 따라서, 데이터 포인트 간 거리를 다음과 같이 나타낼 수 있다. (일반적으로 자유도가 1인 t-분포를 사용한다.)

 

4. t-SNE도 마찬가지로, 학습의 목적은 고차원에서 데이터 포인트 간의 거리를 나타내는 분포 p를 제일 잘 표현할 수 있는 저차원의 근사분포 q를 찾는 것이다. q p와 비슷한 분포가 되기 위해, 두 분포간의 KL Divergence가 작아지도록 학습한다. (Gradient Descent를 이용)

t-SNE 파이썬 구현

  • scikit-learn의 TSNE를 사용하면, 쉽게 TSNE를 사용 가능하다. 
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.manifold import TSNE

if __name__ == '__main__':
    # Data Load (MNIST: 64 dim)
    digits = datasets.load_digits()
    X = digits.data
    y = digits.target

    # t-SNE(64 to 2)
    tsne = TSNE(n_components=2, random_state=1)
    X_tsne = tsne.fit_transform(X)

    # t-SNE Visualization
    plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
    plt.show()

반응형

Logistic Regression

Logistic Regression의 원리는 이진분류에서 다뤘다. 하지만, 실제 데이터 분석 시에는 이진 분류보다는 다중 클래스 사이에서 데이터가 어느 클래스에 속하는지를 분류하는 문제가 많다. 사실 다중 분류를 위한 로지스틱 회귀는 이진 분류와 내용 차이가 크게 없지만, 많이 사용하는 만큼 따로 나눠서 소개를 하고 한다. 


다중 Logistic Regression 이란?

  • 3개 이상의 클래스 중, 하나의 클래스에 속하는지를 예측하는 문제이다.
  • 이진 분류와 가장 다른 점은, 이진 분류는 분류 문제의 정답이 '참'일 확률(p)만 고려하여, '참'과 '참이 아님'을 분류하면 되지만, 다중 분류는 여러 가지 클래스 중, 예측 모델이 속할 확률이 가장 높은 클래스를 찾는 문제이다.
  • 즉, 정답이 이진 분류에서는 정답 예측을 한 차원('참'일 확률 p)에서만 끝낼 수 있었지만, 다중 분류의 예측은 클래스의 개수만큼의 예측 결과가 필요하다. 
  • 이러한 다중 분류를 위해 다중 로지스틱 회귀 모델에서는 일반적으로 Softmax 함수를 사용한다. 

※ Softmax 함수
-  K개의 클래스가 있는 다중 분류 문제에서 j번째 softmax 함수 결과는 아래와 같이 나타난다.

 

-  Softmax 함수는 Logistic 함수의 일반화된 형태이다. 
-  Softmax 함수는 각 클래스에 속할 확률(p)을 각 클래스들에 속할 확률들의 합으로 나눠서, 0부터 1 사이로 Normalization 한 형태이다. 
-  일반적으로 Softmax 함숫값이 가장 큰 클래스로 예측 모델의 결과를 낸다. 

 

다중 Logistic Regression의 학습 방법

  • 다중 Logistic Regression의 학습을 위해서도 최대우도방법(MLE, Maximum Likelihood Estimation)을 사용한다.
  • 다중 Logistic Regression의 학습을 위해서, 학습에 사용되는 정답을 One-hot vector 형식으로 나타내야 한다. 
  • 다중 Logistic Regression의 학습을 위해서는 일반적으로 크로스 엔트로피(Cross Entropy) 함수를 사용하여, 목적 함수를 정의한다. 

[크로스 엔트로피]

  • 크로스 엔트로피는 정보 이론에서 사용되는 개념으로, 두 확률 분포가 얼마나 다른지를 측정하는 방법이다. 
  • 크로스 엔트로피 식은 다음과 같다.

p: 실제 확률, q: 예측 확률, n: 분포의 원소 개수

  • 크로스 엔트로피의 그래프를 확인해 보면, 예측 확률 q가 실제 확률 p과 동일한 지점에서 최솟값을 나타냄을 확인할 수 있다. 
  • 즉, 크로스 엔트로피가 최솟값을 가지는 구간이 실제 확률과 가장 비슷한 예측을 하였다고 할 수 있다.
  • 분류 문제에는 종속 변수가 범주형(각 클래스에 속할 확률이 0 or 1)으로 나타나기 때문에(One-Hot vector), 첫 번째 그래프처럼 실제 분포를 정확히 예측하였을 때, '0' 값을 갖는다.

[One-Hot Vector]

  • One-Hot vector는 범주형 데이터를 다루기 위해, 사용되는 벡터 표현 방법이다. 
  • 클래스에 정수형 범주를 붙인다면, 클래스 간의 대소 관계와 순서가 모델의 학습과정에서 고려되어, 숫자형 범주 자체를 '중요도'로 오해하여 학습될 수 있다. 이를 막기 위해 One-Hot vector를 이용하여 정답 레이블을 표시한다.
  • K개의 클래스가 있는 범주형 데이터가 있는 분류 문제에서, 해당 데이터가 실제로 i번째 클래스에  속해있다고 하면, i번째 데이터를 제외한 K-1개 클래스는 0으로, i번째 클래스는 1의 값을 갖는다.
  • One-Hot vector는 해당 클래스에 속할 확률을 나타낸다고 생각할 수 있다. 

[다중 로지스틱 회귀 목적함수]

    • 다중 로지스틱 회귀를 이용한 분류 문제의 목적은 실제 데이터가 속한 클래스와 비슷한 분포를 예측하는 모델을 만드는 것이다.
    • 위의 크로스 엔트로피 식에서 p를 실제 데이터의 분포를 One-Hot vector로 변환한 값, q를 모델이 예측한 분포라고하면, 크로스 엔트로피 값이 최소인 지점이 모델이 실제 데이터를 가장 잘 예측하였을 때라고 생각할 수 있다.
    •  결국 다중 로지스틱 회귀 모델의 학습의 목적은 Softmax 함수의 형태로 구해진 예측 모델의 결과가 실제 정답의 분포에 가장 유사한 형태를 갖도록, 크로스 엔트로피 값을 최소화할 수 있는 모델 파라미터를 찾는 것이다.  

y : 실제 정답 레이블(one-hot vector 형태), K: 클래스 개수, N: 데이터 개수 

  • 다중 로지스틱 회귀 목적함수는 다음과 같다. 

Logistic Regression의 Python 구현

  • 다중 Logistic Regression은 Python의 Sklearn을 이용하여 쉽게 구현 가능하다.
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score


if __name__ == "__main__":
    # 데이터 Load (iris 데이터 사용, X :꽃의 길이와 너비, y: 꽃의 종류, 3개의 class)
    iris = load_iris()
    X = iris.data[:, :2]
    y = iris.target
        
    # 데이터 분할
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)

    # 모델 학습
    clf = LogisticRegression(random_state=1)
    clf.fit(X_train, y_train)

    # 모델 예측
    y_pred = clf.predict(X_test)

    # 정확도 계산
    acc = accuracy_score(y_test, y_pred)
    print("Accuracy:", acc)

 

반응형

Logistic Regression

Linear Regression을 통해서, 연속적 값에 대한 출력 변수를 모델링을 할 수 있다. 하지만, 연속 데이터의 예측 문제에서 Linear Regression은 효과적이지만, 연속적인 값을 추측하기 때문에 분류 모델에서는 적합하지 않다. 분류 문제를 푸는 방법에는 여러가지가 있지만, 오늘 알아볼 Logistic Regression에 대한 이해가 필수적이다. 


Logistic Regression 이란?

  • 이진 분류 문제(입력 값을 2가지 유형으로 나누는 문제)에서 사용하는 분류 모델이다. 
  • Linear Regression과 비슷하게, 입력변수와 출력변수 간의 관계를 모델링하는데, Linear Regression과 달리 값의 범위를 제한하기 위해 일반적으로 Sigmoid 함수를 사용한다. (다른 함수를 사용할 수 있지만, 일반적으로 Sigmoid를 사용한다.)
  • Linear Regression은 입력변수와 출력변수의 선형적 관계에 초점을 맞췄다면, Logistic Regression은 Sigmoid 함수를 통해, 0에 가까운지 1에 가까운지를 모델링하는데에 초점을 맞췄다.
  • Sigmoid 함수

-   Sigmoid 함수는 이진 분류를 위해 사용하는 함수로 출력값을 0에서 1 값으로 제한하는데 사용된다.
-   Sigmoid 함수는 입력변수로 구해진 모델링 값을, 중간의 일부 구간을 제외하고, 0이나 1에 매우 가까운 근접 값으로 출력해준다. (아래 그래프를 보면 이해가 쉽다.)
-   Sigmoid 함수는 무엇보다, 모든점에서 미분이 가능하기 때문에, Back Propagation을 통한, Weight와 Bias 업데이트가 가능하다. 즉, 머신러닝 문제에서 활용 가능하다.
-   Sigmoid 함수는 아래 그래프에서 확인 할 수 있듯이, Z 값이 너무 크거나, 작을 때는 Gradient가 0에 가까워 지는 Gradient Vanishing 문제가 있다.  

 

 

  • Logistic Regression에서의 예측 출력값은 다음과 같이 나타난다. 

 

 

[Logistic Regression 식 유도] 

Logistic Regression의 식은 Odds를 Logistic 변환하여 유도된다. 


odds 식 :성공 확률 (y=1)이 실패 확률(y=0)의 몇 배인지 나타내는 식 


odds 식의 logit 변환 수행 (편의상, 성공확률을 p로 표기)

 logit 변환된 odds를 입력변수의 선형 변환 예측하면,


성공확률 p는 다음과 같다.

라하면, 


Logistic 식이 만들어진다.

 

Logistic Regression의 학습 방법

  • 일반적으로 Logistic Regression의 학습을 위해서는 최대우도방법(MLE, Maximum Likelihood Estimation)을 사용한다. (물론, Linear Regression과 같이, 최소제곱법을 사용 가능하지만, 효과적이지 않다.)
  • 최대우도방법은 주어진 파라미터를 통해, 실제 값이 나올 확률을 최대화하는 방향을 따라 학습하도록 하는 알고리즘이다.
  • 보통 학습은 경사하강법을 사용하여 학습된다.

 

[최대우도방법]

  • 최대 우도 방법은 입력변수(x)와 모델 파라미터(θ)가 있을 때, 실제 결과 값(y)가 나오는 Likelihood를 최대화하는 방법이다.   Likelihood 함수는 최대화하는 값을 구하는 것이, 입력 변수에 대한 실제 결과 값을 가장 잘 추론할 수 있는 파라미터를 찾는 것이다. (yi:i번째 Label - 0 or 1, pi: i번째 성공 확률)

  • Likelihood 함수의 최댓값을 그대로 구해도 되지만, 양변에 Log함수를 취하면, (x값에 따라 y값이 증가하므로, log를 취한 최댓값을 찾는 것은, log 취하기 전 값의 최댓값을 찾는 것과 같다. 보통은 학습의 안정성 때문에 활용한다.)

  • 결국, 최대우도방법은 가장 Log Likelihood가 가장 큰 값이 될 수 있는 모델의 파라미터(θ)를 추정하도록 학습하는 방법이다.

[경사하강법]

  • 경사하강법은 함수의 기울기를 이용하여, 함수의 최적값을 찾는 최적화 알고리즘이다. 
  • Logistic Regression에서 경사하강법은 다음과 같이 실행된다.

1. Logistic Regression에서 모델의 파라미터 θ를 학습하는 것은 아래 식을 최대화하는 θ를 찾는 과정이다.

2. 이것은 logistic likelihood에 음수값을 취한 값을 최소화하는  θ를 찾는 것과 같다. 따라서, 목적함수는 다음과 같다.

3. 모델 파라미터  θ를 무작위로 초기화한다.(후에 초기화를 위한 여러 방법도 있지만, 기본적으로 무작위이다.)

4. 목적함수를 최소화하는 방향으로  θ를 업데이트한다. 

5. 특정 Epoch이나, 조건이 될때까지, 4번을 반복한다. 

 

Logistic Regression의 Python 구현

  • Logistic Regression은 Python의 Sklearn을 이용하여 쉽게 구현 가능하다.
  • 특히, classification 문제는 패키지로 쉽게 load 가능한 데이터들이 많다. (구현에서는 iris 사용)
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score


if __name__ == "__main__":
    # 데이터 Load (iris 데이터 사용, X :꽃의 길이와 너비, y: 꽃의 종류, 3개의 class)
    iris = load_iris()
    temp_X = iris.data[:, :2]
    temp_y = iris.target
    
    # 이진분류를 위해, class=0인 데이터들은 제외함
    indices = np.where(temp_y != 0)[0]
    
    X = temp_X[indices]
    y = temp_y[indices]
        
    
    # 데이터 분할
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)

    # 모델 학습
    clf = LogisticRegression(random_state=1)
    clf.fit(X_train, y_train)

    # 모델 예측
    y_pred = clf.predict(X_test)

    # 정확도 계산
    acc = accuracy_score(y_test, y_pred)
    print("Accuracy:", acc)

반응형

Linear Regression

Linear Regression 모델은 매우 간단하고, 직관적이여서, 머신러닝하면 가장 대표적으로 생각나는 모델이다. 딥러닝 관련 책들에 항상 1장으로 등장했을만큼, 기초적이고 매우 중요하다.


Linear Regression 이란?

  • Linear Regression은 어떠한 독립 변수들과 종속 변수 간의 관계를 예측할때, 그 사이 관계를 선형 관계(1차 함수)로 가정하고, 모델링하는 지도 학습 알고리즘이다.
  • Linear Regression은 보통, 인자와 결과 간의 대략적인 관계 해석이나, 예측에 활용된다.
  • Linear Regression은 확률 변수를 수학적 함수의 결과인 변수(모델링 결과값)으로 연결해준다는데, 그 의미가 크다.
  • Linear Regression은 변수의 수에 따라, 다음과 같이 구분된다.
    • 변수 1개와 종속 변수 간의 선형 관계 모델링은 단순 선형 회귀 분석이라고 한다.
    • 독립 변수 여러 개와 종속 변수 간의 선형 관계 모델링은 다중 선형 회귀 분석이라고 한다.

→ 단순 선형 회귀 분석은 Visualization이 쉽고(2차원 공간에서 선형 함수로 표현 가능), 변수가 하나여서 이해가 쉽지만, 실생활에서의 문제들은 보통 다중 선형 회귀 문제인 경우가 많다.

Linear Regression 선형 관계식

y: 종속 변수, βk :회귀 계수, Xk:독립 변수, ε: 오차항(모델으로 설명할 수 없는 부분), X1까지만 존재하면, 단순 선형 회귀 분석

Linear Regression의 Residual(잔차)

  • 앞서 말한대로, Linear Regression에서 종속 변수는 관찰의 결과인 확률변수이기 때문에, 오차(error)를 포함한다.
  • 오차를 알기 위해서는, 모델링을 위한 인자와 종속 변수 간의 모든 경우의 수를 학습해야하지만, 현실적으로 불가능하다.
  • 따라서, Linear Regression에서는 오차를 사용하지 않고, 표본집단(학습데이터)으로 학습된 모델의 예측값과 실제 관측값 사이의 차이인 잔차(residual) 개념을 사용한다

  • .Linear Regression은 i.i.d 라는 가정을 따른다.
    • 정규성 가정 : 잔차는 정규 분포를 따른다고 가정한다. 잔차가 정규 분포를 따르지 않고, 특정한 분포를 따른다면, 회귀 모델의 예측값을 신뢰하기 어렵다.
      • 확인 방법 : 잔차 분포도 Visualization 확인, 잔차 정규성 검정
    • 등분산성 가정 : 잔차의 분산은 일정하다.
      • 확인 방법 : 잔차-예측값 산포도 확인,
    • 독립성 가정 : 모든 잔차들은 서로 독립적이다. 만약, 잔차 간의 상관 관계가 있다면, 추정된 회귀식에서 설명하지 못하는 다른 어떠한 관계가 존재할 수 있다.
      • 확인 방법 : 잔차의 자기상관 함수 확인

Linear Regression의 학습

  • Linear Regression의 학습 목적은 종속 변수와 설명 변수 간의 관계를 가장 잘 나타낼 수 있는 선형식을 모델링하는 것이다.
  • Linear Regression의 모델 추정을 위해서, 보통 예측값과 실제관측값인 잔차의 제곱을 최소화하는 최소제곱법(OLS)을 사용한다.

최소 제곱법 식

y_i : i번째 데이터의 실제 종속 변수 값, ŷ_i 데이터의 예측값

 

  • 최소제곱법을 활용하는 이유는 다음과 같다.
    • 잔차의 제곱은 항상 양수이기 때문에
    • 잔차의 제곱은  큰 오차를 더욱 강조가 가능하기 때문에
    • 잔차의 제곱은 미분이 가능하기 때문
  • 단순 선형 회귀 분석에서는 최소제곱법을 이용하여, 회귀계수를 다음과 같이 추정할 수 있다. 

  • 다중 선형 회귀 분석에서는 최소제곱법을 이용하여, 회귀 계수 행렬을 다음과 같이 추정할 수 있다.

다중 선형 회귀 분석

 

Linear Regression의 평가

 

  • Linear Regression을 평가하기 위해서, 결정 계수(coefficient of determination) 개념을 활용한다. 
  • 결정 계수는 회귀 분석에서 모델이 얼마나, 실제 데이터를 잘 예측하는지를 나타내는 지표이다. 
  • 결정 계수를 구하기 위해서, 세가지 값의 의미 알아야한다.
    • SST (Total Sum of Squares): 종속 변수 y와 그 평균값 ȳ 간의 차이를 제곱하여 모두 더한 값
    • SSR (Residual Sum of Squares) : 종속변수 y에서 모델 추정값 간 차이를 제곱하여 모두 더한 . (잔차의 총합)

  • 결정 계수는 SST와 SSR을 통해 아래와 같은 식으로 구한다.

  • 결정 계수는 전체 오류(분산 개념) 중, 모델로 설명 가능한 오류의 범위의 비중을 뺀 비중으로, 1에 가까울수룩 일반적으로 예측력이 좋다고 해석한다. 
  • 결정 계수가 대략적인 모델의 적합성을 파악할 수 있지만, 절대적인 지표는 아니다. 

Linear Regression의 Python 구현

  • Linear Regression은 scikit-learn의 linear_model의 LinearRegression을 통해 쉽게 사용 가능하다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression


if __name__ == '__main__':
    
    # 테스트용 데이터 생성
    x = np.random.rand(1000)*100
    y = 0.8*x+np.random.randn(1000)*30

    # Linear Regrssion model 생성
    model = LinearRegression() 
    
    # Linear Regression model 학습
    model.fit(x.reshape(-1,1), y) 
    
    # Prediction
    y_new = model.predict(np.array([6]).reshape((-1, 1))) 
    print("Data Prediction: ", y_new)
    
    # Linear Regression model 평가
    r_sq = model.score(x.reshape(-1,1), y)  
    print("결정 계수: ", r_sq)
    
    # Linear Model 식 
    b0,b1 = model.intercept_, model.coef_[0]   
    print("b0",b0)
    print("b1",b1)

    # 시각화
    plt.scatter(x, y, s=5)
    plt.plot(x, model.predict(x.reshape(-1,1)), color='red', linewidth=2)
    plt.annotate('y = '+str(round(b1,2))+'x '+str(round(b0,2)), xy=(100, 100), xytext=(80, 80))
    plt.show()

+ Recent posts