Gradiend Descent 로 부터 Adam까지 optimizer 정리

BASE

GD(Gradient Descent)

  • 전체 데이터를 관찰하고 파라미터 업데이터(속도 느려, 메모리 잡아먹어)SGD(Stochastic Gradient Descent) - vanila
  • Mini batch 적용
  • 자주 파라미터 업데이트 되지 속도 빨라 메모리 효율적으로 사용돼
  • 하지만 여전히 local minima 에 빠짐

개선 갈래 1 (관성을 이용하자. 직전 step의 변화량을 사용

Momentum

  • 관성(탄력)을 이용하는 방법
    • "이전에 이렇게 많이 움직였는데... 갑자기 급브레이크를? 자연스럽지 않잖아!" 자연스럽게 바꾸자!
  • 이전 스텝에서 계산된 그래디언트를 일정비율로 (현재 스텝의 그래디언트에) 더해줌
  • /수식을 보면 저 이전스텝적용 비율대로 step이 진행됨에 따라 decay 되는 것을 확인할 수 있음/

Nesterov Accelerated Gradient (NAG)

  • 이전에 계산된 위치에 관성을 먼저 적용시켜불고 거기서 로스를 구해서 그래디언트를 구해부러! (모멘텀 텀은 그대로 존재)

개선 갈래 2 (parameter 마다 step을 다르게 주자..., Adaptive Learning Rate)

  • param1은 미니마에 거의 도착했고 param2는 아직 도착 못햇으면 param1는 작은 LR를 적용하고 param2는 큰 LR를 적용해야 하는거 아냐? 라는 생각으로 부터 적용

Adaptive Gradient (Adagrad)

  • Learning rate 에 상수가 아닌 분모에 변화를 줘서 파라미터마다 다르게 적용할 수 있도록 함 (상수가 아닌 파라미터갯수만큼의 벡터를 사용)
  • Gt 라는 놈에 각 파라미터가 얼마나 많이 변해왔는지를 계산해서 넣어둠 (그 값의 루트값을 분모로 취해줌. 즉, 많이 변한놈은 lr을 작게 만듦)
  • (궁금증) 초기값이 애초에 너무 어긋나 있으면...?? 그럼 실제로 열심히 찾아가야 하는데 많이 움직였다고 브레이크를 걸어??? 음...

RMSProp

  • Adagrad 에서 분모가 무한발산해서 학습률이 엄청 작아지는 문제를 개선하기 위해 (위에서의 궁금증 부분) 일정 비율로 Gt 값이 업데이트 되도록 개선하였음
  • Gt = r*Gt-1 + (1-r)(파라미터미분값제곱합)

AdaDelta

  • 얘는... learning_rate의 분자까지 계산식이 들어가는데...(즉 상수인 lr이 사용되지 않음, 그래서 하이퍼파라미터에 없음)
  • 근데 생각보다 잘 동작하지 않는다고 함

개선 갈래를 합치차 (Momentum 사용 + Adaptive Learning Rate 사용)

Adaptive Moment Estimation (ADAM)

  • Mt, Vt 를 사용해서 계산하는데...
  • Mt
    • Gradient 에 Momentum을 적용한 항
  • Vt
    • Gradient 에 Adaptive LR 를 적용한 항 (Gradient 의 제곱을 사용)
  • 첫 스텝에 너무 큰 스텝을 밟지 않게 하기 위한 Mt, Vt 를 변경하는 계산을 더해줌
  • 최종 수식은 Mt를 모멘텀 적용된 변화량으로 사용, Vt를 Learning Rate 계산용으로 사용하여 최종 업데이트가 진행됨.

TO-DO

  • NAdam, RAdam, AdamW 등 더 개선된 놈들이 실제 practical 한 지..의 관점으로 더 살펴보기

Ref

'기계학습' 카테고리의 다른 글

GCN (Graph Convolution Network)  (0) 2021.12.29
[정리노트] XGBoost 이해하기 (Regression)  (0) 2020.08.25
Gradient Boost for classification (binary)  (0) 2020.08.20
K-means Algorithm  (0) 2015.11.25

구조

  • 노드 피쳐 메트릭스
  • 인접행렬
    • 노드피쳐 메트릭스 , filter weights, 인접행렬을 곱하면 message passing 이 된다.
  • Inception
    • message passing을 몇 번 반복하느냐에 따라 receptive field의 크기를 조절할 수 있다.
  • Readout Layer
    • 그래프의 노드 순서와 상관없이 학습되도록 하는 방법 중 하나
    • MLP로 연결해버림
  • skip connection
    • resNet 처럼 연결하면 된다
    • gated skip connection을 적용할수도 있다. (두 입력을 어느정도의 비율로 적용할지 비율을 계산하여 반영하는 방법)
  • Attention
    • 인접 노드들의 정보를 합칠때 Attention 기법을 이용하여 weighted sum 형태로 구현 가능하다

 

'기계학습' 카테고리의 다른 글

Optimizer 종류  (0) 2022.01.01
[정리노트] XGBoost 이해하기 (Regression)  (0) 2020.08.25
Gradient Boost for classification (binary)  (0) 2020.08.20
K-means Algorithm  (0) 2015.11.25

"붕어가 되어가는 나를 위해..."

 

추천 강의

 

StatQuest 의 XGBoost 강의 시리즈 [링크]

 

XGBoost 의 기본 개념부터 사용되는 수식의 유도까지 모두 다룬다. BAM~~ (Part4 까지 볼것.)

 

이전 시리즈인  Gradient Boost (Part1~3) 도 볼 것을 추천함.

 

 

기억해야할 Terms

 

  • Initial Prediction : 학습, 예측 모든 과정에서 사용되는 초기 예측값 (보통 레이블의 통계정보를 활용하여 설정)

  • Similarity : 해당 노드에 속한 sample들의 유사성 점수 (정규화 상수 reg_lambda 가 사용됨)

    • lambda 의 역할

      • Similarity 의 점수를 낮춘다.

      • Leaf 에 있는 sample의 수가 적을 수록 Similarity 점수를 더욱 많이 낮춘다.  (Gain이 작아짐)

      • 결국, pruning이 더 잘 일어나도록 만든다.

      • 더욱 일반화된 트리가 형성되도록 한다.

  • Gain : 트리가 분기함에 따라 높아진 Similarity 의 값 (분가를 시킬 변수를 결정할때 사용됨.)

  • 양자화(Quantization, feat.binning) : continuous 한 값을 갖는 변수의 모든 영역을 분기의 기준으로 삼을 수 없기에 영역을 지정하고 binning을 통해 진행함.

  • Missing Value 의 처리 - 완벽한 feature를 가지고 있지 않은 샘플에 대한 예측 및 고도화 전략

  • Pruning (Post prunning) : 일반화를 위한 pruning. (pruning 상수 gamma가 사용됨)

    • Pruning은 Gain 값을 기준으로 진행됨.

    • gamma가 0이라고 pruning 이 진행되지 않는 것은 아님.

  • Learning Rate (eta)

 

 

학습

 

매번의 Single Tree 학습은 아래와 같은 순서를 반복한다.

  1. 모든 Residual 계산 (이전 트리까지의 output 값을 이용)

  2. Build Tree (Gain, Similarity, lambda, max_depth 이용)

  3. Prune Tree (Gain, gamma 이용)

  4. 최종 output 값 계산 (learning_rate, lamba, initial_prediction 이용)

 

학습의 종료

  • n_estimator 만큼 트리를 반복적으로 생성 

  • 매 트리 생성 시 마다 dev 셋의 성능을 측정.

  • early_stopping_rounds 동안 성능의 향상이 없다면 신규 Tree 생성을 종료

 

수식 (Regression) - classification은 다름

 

Similarity = (Sum of Residuals)^2 / (# of Residuals)

 

Output = (Sum of Residuals)^2 / (# of Residuals)

 

Gain = LeftGain + RightGain - ParentGain

 

 

'기계학습' 카테고리의 다른 글

Optimizer 종류  (0) 2022.01.01
GCN (Graph Convolution Network)  (0) 2021.12.29
Gradient Boost for classification (binary)  (0) 2020.08.20
K-means Algorithm  (0) 2015.11.25

STEP1. Initial prediction 설정 (log odds & logistic 함수사용, feat. sigmoid)

  • 왜 logistic regression에서 sigmoid 함수를 사용하는가?

  • odds 란 무엇이며, sigmoid 함수와 어떤 관계가 있는가?

  • 이 링크에 모든 것이 설명되어 있다.

  • 위 링크의 내용을 이해하면 주어진 데이터로부터 아래의 초기 prediction 값을 계산하는 과정을 이해할 수 있음.

  • initial prediction = logit(log(p(Positive) / p(Negative)))

STEP2. Residuals 계산

  • prediction 결과와 실제 값과의 차이를 구하는 것.

  • 다음에 생성될 tree의 목표 예측 값으로 사용됨.

  • 첫 트리에서는 pos/neg sample 의 residual 값이 각각 같은 값으로 설정되지만 두번째 트리부터는 달라짐.

STEP3. Tree 생성

Tree 의 Leaf node 에서의 probability 값 계산 (** 주의 ** regression용 트리에서의 수식은 다름)

  1. 먼저 output 값을 구한다. 여기서 output 값은 log(odds) 값을 구할때 사용되는 값임.

    • output = Sum(all residuals on the leaf node) / Sum ((이전트리 예측치) * (1-이전트리 예측치))
  2. log(odds) 값 구하기

    • log(odds) = init_prob + learning_rate * (output value) (트리가 하나인 경우, 두개인 경우. 뒷 항이 트리의 갯수만큼 붙음
  3. probability 값 구하기 (최종 예측값)

    • logistic function을 이용하여 log(odds) 값을 probability로 변경함. 관련 내용은 위의 링크에서 확인 가능함.

변수 선택의 기준

- Gradient Boos 의 설명에서 생략 되어 있고 XG boost 에서만 설명이 나와있는데 같을 것으로 생각됨. XG Boost 포스팅에서 설명

'기계학습' 카테고리의 다른 글

Optimizer 종류  (0) 2022.01.01
GCN (Graph Convolution Network)  (0) 2021.12.29
[정리노트] XGBoost 이해하기 (Regression)  (0) 2020.08.25
K-means Algorithm  (0) 2015.11.25

분류 : 기계학습 - 비지도 학습(Unsupervised learning) - clustering - K means


기계학습 관련하여 일을 하거나 혹은 공부를 하는 사람이라면 k-means clustering에 대해 많이 들어봤을 것이다. 엄청 단순하고 간단한 알고리즘이나 k-means에 대해 자세히 설명하라 하면 할 수 있는 사람이 생각보다 많지 않다. 

아마도 '대충 비슷한 놈들끼리 묶어 주는 건가보네' 하고 넘어가는 경우가 많지 않을까 싶다. 

그래서 엄청 단순하지만 성능은 꽤 좋은 k-means 알고리즘에 대해 설명한다. 


* 사전 지식 *

혹여나 기계학습에 대한 기본적인 지식이 없는 상태에서 블로그를 방문한 사람이라면 이 부분을 먼저 읽길 바란다. 그렇지 않은 사람이라면 넘어가시길...

 - 기계 학습의 분류 (방법론적인 관점)

  • 정답이 주어진 데이터에 대한 학습 : Supervised Learning
  • 정답이 주어지지 않은 데이터에 대한 학습 : Unsupervised Learning
  • 뭐 Semi 어쩌구 강화 어쩌구... 일단 대충 그렇다

 - Clustering

정답이 주어지지 않은 데이터에 대한 학습(Unsupervised Learning) 의 대표적인 예다.

여기서 문제!!!

문제) 아래의 그림에 있는 도형들을 비슷한 놈들끼리 묶어봐라.

이 그림을 보고 대부분의 사람들이 아래와 같이 묶었을 것이다.

여러분이 방금 한 것이 Unsupervised Learning 이면서 동시에 Clustering의 작업을 한 것이다. 

즉 clustering 은 속성이 비슷한 놈들끼리 묶어주는 일련의 작업을 말한다.


- k-means 알고리즘

  k means 알고리즘은 주어진 sample 들을 k 개의 묶음으로 묶어주는 작업을 수행한다. 아래의 그림은 k가 3일 때, 좌표평면 상의 점들을 세개의 분류로 나눠주는 예이다. (아래의 실험에 대해 아래에서 자세히 설명한다.)

K-means Clustering 수행 예



알고리즘 설명

   1. k 개의 점(sample)을 임의로 선택하여 그 점(sample)의 위치를 각 Class의 기준 위치으로 지정한다. 

   2. 모든 점(sample)들 각각에 대해 k개의 기준 위치 중에서 가장 가까운 기준위치(A)를 찾아내고 해당 점             (sample) 을 기준위치(A) 의 class 로 배정한다.

      예를 들어 기준위치가 다음과 같고 각각의 class 명을 A,B, C라 하자

          기준위치 / Class 명   -   (10,10) / A        (10, 90) / B       (90, 10) / C

      이때, 점 (5,5)는 class A에 속하게 된다. ((5,5) 와 (10,10) 의 거리가 class B,C의 기준위치와의 거리보다         가깝기 때문이다.)

      모든 점(sample)들에 대해 위와 같이 하나의 class로 배정한다.

  3. 기준위치 갱신

    A class, B class , C class 에 속한 점(sample)들의 평균값으로 A, B, C class의 기준위치를 변경한다. 

  4. 새로운 class 배정 결과 얻기

   3번에서 얻은 새로운 기준위치를 기준으로 하여 2번 과정과 동일한 과정을 반복하여 class 에 점(sample)들이    배정된 새로운 결과를 얻는다.

  5. 클러스터링 종료판단

   새로운 class 배정 결과가 이전의 class 배정 결과와 차이가 없다면 클러스터링 작업을 종료한다.

   차이가 있다면 3번 부터 다시 시작한다.

* 위의 그림에서 노란 네모는 각 클래스의 중심점이 어떻게 이동하는 지를 보여주며 동그란 점들의 색깔은 점       (sample) 들이 class 에 배정된 결과를 보여준다.


설명은 장황하나 무척 심플한 발상이다. 

k-means 알고리즘 적용 시 고려해야 할 몇가지 상황이 있다. 

1. 거리측정 문제

  1-1. 점과 점 사이의 거리

     점과 점 사이의 거리를 구하는 방법은 여러가지가 있다. 

     맨하탄 거리 - 바둑판 거리라고 생각하면 될듯 하다 수직 혹은 수평 방향으로만 갈 수 있다고 가정했을 때의 거리이다. 예를 들면 (1,1) 에서 (2,2) 까지의 맨하탄 거리는 2이다. (1,1) 에서 (2,2)로 가기 위해선 위로 한칸, 오른쪽으로 한칸 이니 두칸을 이동해야 한다. 

     유클리디안 거리 - 수학시간에 배운 점과 점사이의 거리이다. 각 축의 거리차를 제곱하여 합한 후 축의 갯수가 N 이라 할때 1/N 승을 해주면 된다. (1,1), (2,2) 의 거리는 잘 알다시피 root(2) = 1.414... 로 구해진다.

     마할라노비스 거리 - 모든 샘플에 대해 각 축에 사상시킨 값에 대한 분산을 구하여 분산의 정도에 따라 가중치를 부여하여 거리를 구한는 방법이다. 유클리디안 거리를 구하는 공식에 분산을 이용한 가중치 부분이 추가된 것이다.

     (1 - 코사인유사도) - 점사이의 거리는 유사도를 이용하여 표현할 수 있으며 그 반대도 가능하다. 코사인 유사도를 이용하여 점 사이의 거리를 구할 수 있다. 코사인 유사도는 text 문서와 같은 sample을 다룰 때 주로 사용하는 거리 측정법으로 sample의 볼륨 차이를 무시할 수  있는 거리측정법이다. 코사인유사도 참고

     이 외에도 sample 이 binary 속성을 갖을 때의 거리 측정법 등 다양한 방법이 존재한다. 이러한 것들 중 어떠한 것을 선택하여 사용할 것인지는 sample 의 속성과 clustering의 목적에 맞게 사용하여야 한다.

  1-2. 점과 class 사이의 거리

      위의 알고리즘 설명 부분에서는 class 에 속한 sample들의 평균 값을 구하여 그 위치를 class 에 대한 기준위치로 삼아 다은 점들과의 거리를 계산할 때 사용하였다. 이러한 방법 이외에도 class 내의 대표 sample을지정하여 그 sample 과의 거리를 사용하는 방법도 있다. 대표 sample을 지정하는 방법은 거리를 측정할 점과 가장 가까운 점 혹은 가장 먼 점을 선택할 수도 있고 클래스 내에서 다른 점들과의 거리의 합이 가장 작은점을 대표 sample 로 지정하는 방법 등 다양한 방법이 있다. 어떠한 방법을 선택하느냐에 따라 외톨이(outlier)에 민감하게 혹은 둔감하게 만들 수 있으니 적절한 방법의 선택이 필요하다.

2. 초기화의 문제

  k-means 알고리즘은 초기화에 따라 결과가 상이하다. 

 따라서 어떠한 샘플을 초기화에 사용할 것인지 결정하는 것이 쉽지 않은 문제이다. 

 이를 해결하는 하나의 해결책이 다중 k-means 로 다양한 초기화 값으로 k-means 알고리즘을 수행 후 

 클러스터링 결과를 기준으로 제곱오류를 계산하여 제곱오류가 가장 작은 결과를 최적 결과로 취하는 것이다.

 아래의 그림에서 동일한 데이터에 대해 초기화 위치에 따른 k-means의 결과가 상이한 것을 확인할 수 있다.

 



 

위의 이미지들은 k-means 알고리즘 테스트를 위해 임의로 생성한 데이터를 가지고 k-means clustering을 수행한 이미지이다. 테스트의 목적은 k-means 알고리즘의 수행 단계를 눈으로 보기 위함과 초기화에 따라 결과가 상이한 것을 확인하기 위함이었다. 

테스트한 코드를 첨부하니 궁금하신 분들은 돌려보기시 바란다. 

 python 3.x 를 사용하였으며 matplotlib 를 설치하여야 한다. 

P.S - 첫 번째 포스팅이라 쓰다보니 내용이 그지같네요. 뭔가 설명을 잘하려 했는데 자꾸 산으로 가는... 읽는 사람의 지식 수준을 정하지 않고 설명하다보니 힘이드는 경향이 없지 않아 있네요 ㅋ 추가로, k-means 알고리즘의 개떡같은 부분은 k 를 알고 있어야 한다는 거 겠지요. k 값을 몰라도 clustering 작업이 가능한 network 구조를 이용하는 SOM, ART 등의 알고리즘이 있습니다. 저도 공부를 하다 말아서... ㅎㅎ 간략히 본 바로는 ART 알고리즘이 SOM 알고리즘의 확장판의 개념이고 ART 의 구조는 auto-encoder 랑 비슷한 느낌이 있더군요. 근데 저는 둘다 정확히 몰라서 ㅎㅎ 공부 후에 추가 포스팅 하도록 하겠습니다. (무슨 PS 가 이래.....ㅋㅋㅋ그럼..이만)


'기계학습' 카테고리의 다른 글

Optimizer 종류  (0) 2022.01.01
GCN (Graph Convolution Network)  (0) 2021.12.29
[정리노트] XGBoost 이해하기 (Regression)  (0) 2020.08.25
Gradient Boost for classification (binary)  (0) 2020.08.20

+ Recent posts