Linear Regression, Gradient Descent, Back Propagation

선형 회귀(Linear Regression)

선형 회귀란?

  • 종속 변수 y와 1개 이상의 독립 변수 x와의 선형 관계를 모델링하는 회귀 분석
    • 회귀 분석 : 둘 이상의 변수 간의 관계를 보여주는 통계적 방법
  • 단순 선형 회귀 분석(Simple Linear Regression Task)
    y=Wx+by=Wx+b
    • 독립 변수 1개에 의하여 종속 변수를 도출 하는 선형 회귀 방식
  • 다중 선형 회귀 분석(Multiple Linear Regression Analysis)
    y=W1x1+W2x2+...+Wnxn+by=W_1x_1 + W_2x_2 + ... + W_nx_n+b
    • 독립 변수 N개에 의하여 종속 변수를 도출 하는 선형 회귀 방식

분류(Classification)과 회귀(Regression)

  • 분류 : 종속변수가 이름(정해져 있는 Label)일 때 활용
    • 어떤 Input 값이 주어졌을 때, 그것이 "정해져 있는 Label" 중 어떤 Label에 속하는지 선택하는 문제
  • 회귀 : 예측하고 싶은 종속 변수가 숫자일 때 활용
특정 문자가 욕인지 아닌지를 살펴본다고 하자.
이 때, 답은 "욕이다", 혹은 "욕이 아니다" 2개 Label만 존재하므로, 분류 문제가 된다

땅 위치, 주변 편의 시설 등의 Input이 주어졌을 때 땅값을 예측하는 문제를 풀어보자
이 떄 결과는 "숫자"로 나오게 될 것이다(즉, Label이 정해지지 않는다)
따라서 이런 문제는 회귀 문제라고 생각할 수 있을 것이다
정확히 말해서는 "할 수 있지만 권장하지 않는다"가 맞는 말이다.

회귀 문제에서 중요한 점은 "Label의 값에 의미가 존재하지 않는다"이다.
하지만, 선형 회귀 같은 경우 Output이 값으로 나오게 된다.
예를 들어, Labeling이 1, 2, 3일 때 Output이 1.5라면, 이 값은 어떤 Label에 
포함될까?

그럼 Label이 2개이고 Output을 0 ~ 1로 두어 Probability로 구하면 되지 않을까?
여기에서도 문제가 존재한다.
"선형"이라는 것을 생각해보면, 이 선형 값에는 Label을 넘어가는 값(즉, 1 이상)과
Label보다 작은 값(즉, 0 이하)도 존재하게 된다.
그런데 어쨌든 선형 회귀 모델에서는 Output으로 나올 수 있기 때문에
분류 문제에서도 해당 Answer를 확률에 포함시킬 것이다.
즉, 절대로 나올 수 없는 값을 확률에 포함시키기 때문에 Accuracy가 떨어진다.
이를 위해 활용하는 모델이 "로지스텍 모델"이다.

선형회귀식 찾는 방법

  • 무어 펜로즈 역행렬
    1. y = bx에서 b를 찾고 싶다.
    2. Xb = y => b = X+^+
    3. X+^+
    • 최근에는 이 방법보다는 경사 하강법을 활용함
  • 경사 하강법 : 이번 설명의 핵심이다

경사 하강법 학습 이전 배워야 할 개념들

Loss Function(Cost Function)

머신 러닝은 y = Wx+b를 가장 잘 만족시키는 W와 b를 찾을 것이다.
그렇다면 어떻게 해야 W, b가 적절한 값인지 판별할 수 있을까?

이를 위해 Cost Function(Loss Function)이라는 것을 활용한다.
결론부터 말하자면 내가 만든 Model의 예측 값과 실제 값을 비교하여 나오는 차이를
Loss라고 생각하고, 이 Loss를 함수식으로 형성하여 Loss Function을 생성하는 것이다
우리는 Loss를 최소화 하는 것을 원하기 때문에, 결국 Loss Function을 최소화 시키는
W와 b를 찾으면 되는 것이다.

예를 들어, Wx+b를 통해 예측한 값이 y'이고, 실제 x에 대한 값이 y일 때
||y-y'||을 가장 작게 만드는 W와 b를 찾는 것이라고 말할 수 있을 것이다

그렇다면 어떤 방법으로 W와 b를 구할 수 있을까?

Optimizer(최적화 알고리즘)

  • 모델의 Loss Function을 최소화 하는 W, b를 찾기 위해 활용되는 알고리즘
    • 즉, yy||y-y'||
  • 경사 하강법은 대표적인 Optimizer 중 하나이다.

경사 하강법

  • 미분 값을 빼서 함수의 극솟값의 위치를 구할 때 활용하는 방법
    • 경사 상승법 : 미분값을 더하여 함수의 극댓값의 위치를 구할 때 활용하는 방법
    • 우리는 Loss Function의 "극솟값"을 찾기 원하므로 경사 하강법을 활용
  • Function이 다변수로 확장될 경우, 미분값 대신 Gradient Vector를 활용
    • Gradient Vector : 변수별로 편미분하여 계산한 Vector
    • f=(fx1,fx2,...,fxn)\nabla f = (\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n})

Optimizer(with 경사 하강법)

  • 다른 Optimizer도 다양하지만, 여기서는 경사 하강법을 활용하는 Optimizer들만 설명하겠다

배치 경사 하강법(BGD)

Wt+1=WtlrgtW_{t+1} = W_t - lr * g_t
  • 수식 변수 정리
    • WtW_t
    • lr : 학습율
    • gtg_t
  • 경사 하강법 원리
모든 Data에 대하여 각각의 Gradient를 계산하고, 그들의 기댓값을 오차로 한다.
이렇게 구한 오차를 수식에 대입하여 Weight를 Update시켜 Loss를 최소로 함
  • 장점
    • Train Data를 모두 활용하므로, 수렴이 안정적임(방향 변환이 크지 않음)
  • 단점
    Local Optima(Local Minmum) Problem
    • Global Minimum을 찾는 알고리즘에서 Global Minimum을 찾기 전 Local Minimum에 빠져 Local Minimum을 Global Minimum으로 인식하는 문제
    • 초기 W에 따라 Local Minimum에 빠질 수도 있고, Global Minimum을 찾을 수도 있게 됨
    • 신경망 Layer를 깊게 쌓았을 때 모든 층에서 Local Minimum에 빠질 확률은 매우 적기 때문에, 이러한 방법으로 Local Opitma 문제 해결
    연산 Cost
    • BGD는 모든 Data에 대하여 각각의 Loss Function을 계산함
    • 즉, 모든 Data를 고려하여 연산을 수행하므로 연산 Cost가 매우 커짐

확률적 경사 하강법(SGD)

Wt+1=WtlrgtW_{t+1} = W_t - lr * g_t
  • 경사 하강법과 수식 자체는 동일
  • SGD 원리
Batch는 전체 데이터 셋과 동일하다.(Batch Size = 1)
이러한 Batch에서 랜덤하게 한 개의 데이터를 뽑은 이후, Gradient를 구하여 
경사 하강법을 활용한다

즉, 전체 데이터 셋(Batch)에서 1개의 랜덤 데이터를 뽑아 Gradient를 계산하고,
이렇게 구한 Gradient를 수식에 활용하여 Weight를 Update시키는 것이다
  • 장점
    • Local Minimum에서 쉽게 빠져 나올 수 있음
    • Global Minimum을 찾을 가능성이 BGD보다 높음
  • 단점
    • 최적해(Global Minimum)에 정확히 도달하지 못할 가능성이 존재
    • Data 개수와 상관 없이 1개 Data만 활용하여 Gradient를 계산하므로, Iteration이 매우 커지고 수렴 방향 차이가 커짐
      • 이렇게 기울기 방향이 매번 크게 바뀌는 것을 "Shooting"이라고 함

미니 배치 확률적 경사 하강법(MSGD)

Wt+1=WtlrgtW_{t+1} = W_t - lr * g_t
  • 경사 하강법과 수식 자체는 동일
  • SGD에서 Shooting이 너무 많이 발생하는 것을 줄여, Shooting이 적당하게 발생하도록 해주는 알고리즘
  • BGD와 SGD의 절충안
  • 참고로, 최근 SGD라고 하면 위에서 설명한 SGD보다는 MSGD를 통칭하는 경우가 더 많음
  • MSGD 원리
전체 데이터 셋을 Batch라는 여러 개의 Data Set Group으로 나눈다.
(이 때 만들어진 Batch 개수를 Batch Size라고 한다)

이후, Batch 1개당 1번의 SGD를 수행한다.
즉, Batch 개수만큼 SGD가 수행될 것이고, 이 과정이 1 Epoch마다 수행될 것이다

이렇게 얻은 SGD 값들의 기댓값을 Gradient Vector로 정하고, 이 값을 활용하여 
경사 하강법을 진행한다.
이렇게 Weight를 Update하면 다시 Batch마다 SGD를 수행하여 위 과정을 반복한다
  • 장점
    • Batch Size가 클 경우, BGD보다 속도가 빠름
    • Shooting이 적당히 발생하며, Local Optima 문제를 어느정도 회피할 수 있음
    • 메모리를 적게 먹음
  • Batch Size를 정할 때 고려할 점
    • 2n2^n 승의 Size로 정하는 것이 좋음
    • 메모리 크기를 고려해야 함
    • 전체 DataSet 개수가 2000보다 작다면 BGD가 빠름
    • 만약 전체 데이터수가 Batch 개수에 나눠 떨어지지 않을 경우, 마지막 배치는 버리는 게 좋음
  • 마지막 Batch는 버리는 게 좋은 이유
예를 들어 10000개의 Data가 존재하고, Batch Size가 100개라면 100개의 Batch 모두
총 100개의 Data를 가지고 있기 때문에 그대로 활용해도 된다.

하지만 10001개의 Data가 존재하고 Batch size가 100개라면, 100개의 Batch는 100개
Data를 가지고 있지만, 마지막으로 만들어지는 Batch는 1개의 Data만 가진다.

이런 경우, 마지막 Batch의 Data가 학습에 더 큰 비중을 갖게 되어, 마지막 Batch에
포함된 Data가 학습에 과도하게 큰 영향력을 끼칠 수 있다.

1개의 Batch마다 1의 가중치를 가지고, 이 1들을 종합하여 학습을 진행하는 것이다.
Data를 뽑는 확률은 모두 같으므로, 100개의 Data를 가진 Batch는 1개 Data당 
0.01의 가중치를 갖는다고 볼 수 있다.
그런데, 마지막 Batch는 1개 Data만 존재하므로, 해당 Data 자체가 1의 가중치를 
가지게 된다.
즉, 마지막 Batch에 포함된 Data의 가중치(즉, 영향력)이 다른 Data에 비해 너무 커지
기 때문에, 이런 과도한 영향력을 줄여야 할 필요가 있다
   
따라서, 모든 Batch의 Data 개수를 맞춰주기 위해 마지막 배치를 버리는 것이다
  • 추가 설명
    • Batch size가 클 경우 : Sharp Minimizer
    • Batch size가 작을 경우 : Flat Minimizer
    • Batch size를 작게하여 Flat Minimizer를 갖도록 하는 것을 추천
<추천 이유>
Flat Minimum 같은 경우 Testing Function과 Model이 차이가 조금 있더라도 
Loss 값의 차이가 그렇게 커지진 않는다. 
하지만, Sharp Minimum 같은 경우 차이가 조금이더라도 Loss 값의 차이는 
너무 커지기 때문에 오차가 커진다.(아래 그래프 참조), Generalizataion을 좋게 하기 위해 Flat Minimum을 추천한다.


MLP(Multi-Layer Perceptron)

신경망(Neural Network)

  • 현실의 복잡한 Data는 선형 모델을 통해서만 처리하기가 매우 힘들다. 따라서, 이런 비선형 Data를 학습시키는 방법이 필요하며, 신경망이라는 개념으로 이 과정이 수행된다
    • 물론, 신경망을 자세히 뜯어 보면 선형 모델 분석 방식을 중간 과정에서 채택하고 있다.
  • 신경망
    • Input Data를 Hidden State에 보내고, Hidden State에서 Output Data를 도출해 내는 것
    • 이 때, Input에서 Hidden state로 보내는 과정, Hidden State에서 Output Data를 도출해 내는 과정에 대한 학습이 요구됨
  • 신경망에서 일어나는 사건들
    • 1개 Layer마다 가중치 행렬 W와 절편 벡터 b가 존재하며, 이를 활용하여 Input Data(X)로 Hidden Vector들을 형성한다.
    • 일어나는 연산 : WXT+bWX^T + b
    • 현재 Hidden Vector들은 선형 관계
    • Hidden Vector를 만들 때, 가중치 행렬(W)은 Hidden Vector 마다 다르지만, 절편 벡터(b)는 모두 동일

활성 함수

신경망에서 우리는 Hidden Vector가 선형에 가깝다고 했다. 그렇다면 이런 생각이 
들 수도 있다. 
"그럴거면 걍 선형 모델 분석 방식 쓰지 왜 굳이..."

어찌보면 맞는 말이다. 하지만, MLP에서는 "활성 함수"라는 것이 추가 된다.
이 활성 함수를 선형 모형에 적용시켜, 다시 비선형 모형으로 변환을 시켜 준다.
즉, 계속해서 선형 모델을 학습하는 선형 모델 분석 방식과는 다르게,
비선형 Data를 (신경망을 통해) 선형 모델로 바꾸고, 이 선형 모델을 활성 함수를 통해
다시 비선형 함수로 바꾸고, 그 비선형 Data를 다시 선형 모델로 바꾸는 방식을 
반복하며 학습을 진행한다.
  • 선형 모형을 비선형 모형으로 바꿔주는 비선형 함수
  • 전통적으로는 Sigmoid나 tanh 함수를 많이 활용하였지만, 최근은 ReLU를 많이 활용함
    • 하지만, 무조건 ReLU를 활용하지는 않는다. 뒤에서 배우겠지만, 어떤 DL 방법은 ReLU를 활용해서는 안되는 경우도 존재한다.

MLP란?

  • Layer : 1번의 신경망
    • 즉, 가중치 행렬 및 절편 벡터로 비선형 Data를 선형 Data로 바꾸는 과정
  • MLP : Layer가 여러 층 합성된 함수
    • n-Layers 신경망 : n번의 Layer 과정이 수행되는 신경망
  • 중요한 점은, 신경망의 Input으로 들어갈 비선형 Data를 활성 함수를 통해 다시 비선형 모델로 만드는 과정이 필수적으로 필요하다.
  • 사진으로 보는 비선형 모델(σ\sigma : 활성 함수)
  • 그렇다면 왜 층을 여러 개 쌓을까?
결론적으로 말하면 층의 깊이에 비례해 정확도가 좋아지기 때문이다
이유는 아래와 같다.

1. 신경망의 Parameter 수가 줄어듬
층을 깊게 한 신경망은 깊지 않은 경우보다 적은 Parameter를 활용하여 더 높은 수준의
표현력을 달성할 수 있다.
Parameter가 많아지면 그래프가 조금 더 Local Minimum이 많아지게 될 것이며,
Data에 Overfitting될 수 있는 확률이 높어진다. 따라서,Parameter 수를 줄여야 하고
이를 위해 가장 많이 활용하는 방법이 층의 깊이를 깊게 하는 것이다

2. 학습의 효율성이 높아짐(학습 Data 양이 덜 필요함)
신경망을 깊게 한다는 것은 그만큼 배울 수 있는 과정이 증가한다는 것이다.
1층 Layer만 존재하면 처음부터 미적분을 배우는 것이지만, Layer가 다양하면
1층에는 사칙연산을, 2층에는 함수를, 3층에는 미적분을 배우는 것처럼
단계별로 학습이 가능하다. 즉, 문제를 계층적으로 분해하여 학습할 수 있으므로
학습 데이터가 적어도 특징을 잘 뽑아내어 학습을 잘 수행할 수 있다

Softmax 연산

(특히 분류문제를 풀 때) 선형 모델을 통해 나온 결과값은 활용할 수가 없다. 
선형 모델을 활용하면 값이 음수가 나올 수도 있는데, 분류 문제 같은 경우 
(Label이 음수가 아닌 이상) 음수가 나올 수 없으며, 애초에 Label에 속하지 않는 값이
답으로 나올 수도 없다. 

하지만, 위에서 말했듯 신경망은 마지막에 선형 모델을 활성 함수에 집어 넣기는 하지만
결론적으로 분류 문제에 적절한 값이 도출되지는 않는다.
이를 위해 나온 연산 중 대표적인 것이 sofmax이다.
  • 모델의 출력을 확률로 해셕할 수 있게 해주는 대표적인 연산
  • softmax를 통해 Output Data를 확률적으로 계산하여, 해당 Label이 답일 "확률"을 구하는 방법이다.
  • softmax 연산(o1,o2,...ono_1,o_2, ... o_n

역전파 알고리즘(BackPropagation)

  • 딥러닝의 학습 원리
  • 경사 하강법 등의 Optimizer를 활용하여 가중치나 절편 벡터를 Update하여 학습을 진행
  • 순전파(Forward Propagation)
    • Data를 받아 신경망을 통해 원하는 결과를 출력시키는 것
    • 학습 이후 데이터 분석이나 모델의 정확도를 검증할 때 거치는 과정
  • 모든 층에 대해서 "윗층부터"(즉, Output과 가까운 Layer부터) 역순으로 학습을 진행
    • Chain Rule과 Loss Function을 활용함
  • 이 부분은 CNN과 RNN을 배우며 조금 더 자세히 다룰 예정

사진 출처

좋은 웹페이지 즐겨찾기