티스토리 뷰

1. 딥러닝은 어디에서부터 왔는가?

 

딥러닝은 우리 뇌의 신경망 구조를 본뜬 퍼셉트론(Perceptron)에서 부터 출발했다. 딥러닝이 현재 실제로 상용화된 인공지능 서비스까지 닫기에 많은 고난을 거쳤지만(XOR문제, 계산속도 문제, Backpropagation의 등장 등) 현재는, 퍼셉트론에서 시작한 딥러닝이 생활 곳곳에 자리잡고 있다.

 

딥러닝은 가중치의 학습을 통한 정확한 예측을 목적으로 하고 있다.

 

2. 딥러닝 가중치는 무엇을 기준으로 학습할까?

무언가를 학습하려면 목적에 알맞게 학습할 필요가 있다. 딥러닝은 Cost 즉, 비용(오류)를 최소화하는 방향으로 학습한다.

 

이때, 가능한 비용이 적은 부분을 찾는 과정이 최적화(Optimization)이고 Cost(Loss)가 얼마나 있는지 나타내는 것이 Cost Function(Loss Function)이다.

 

2-1) 회귀문제에서 Loss Function

먼저, L1 loss이다. 예측값과 절대값의 차이형태로 표현된다. 

MAE

 

다음으로  L2 loss 이다.  일반적으로 많이 쓰이고, 회귀분석에서도 쉽게 볼 수 있었던 MSE이다.

MSE

 

공통점

절대값, 제곱의 형태로 오차를 양수로 제한 하였다.

 

차이점

오차값의 크기를 증가시키는 정도가 다르다. L2 Loss는 제곱의 형태이기 때문에 0~1사이 값을 더욱 작게, 1이상의 값을 더욱 크게 해준다. 즉, outlier의 영향을 줄이고 싶으면 L1 Loss를 이용해야 한다.

하지만 일반적으로 L2를 많이 사용한다.

 

2-2) 분류문제에서 Loss Function

 

교차 엔트로피 오차(CEE : Cross Entropy Error)

 

 

t_k는 원 핫 인코딩된 정답 레이블이다. 즉, [0,0,0,0,1,0] 이런식으로 인코딩 되어 있기 때문에 실제로는 정답레이블에 

-logy_k를 곱한 형식이다.

 

-log(y)

 

분류모델에서 출력은 0~1사이 이므로 -log(y)는 위와 같다. 즉 정답이 1이라고 했을때 오차가 거의 0에 수렴하고, 0에 가까워지면 오차가 기하급수적으로 증가한다. 즉, 오답을 맞추면 큰 패널티를, 정답을 맞추면 적은 패널티를 준다고 볼 수 있다.

 

3. Loss Function에 대해서 알았는데 대체 무얼 어떻게 학습하는 걸까?

위 질문에 대한 대답은 "가중치"를 학습시키는 것 이라고 할 수 있다. 사실상, 가중치를 학습시키는 것이 딥러닝의 전부이다.

Gradient Descent

 

좌변의 세타는 업데이트 될 가중치우변의 세타는 업데이트 이전의 가중치알파는 Learning Rate로 HyperParameter이다. 알파의 크기에 따라 가중치를 얼마나 학습할지 즉, Step Size를 결정할 수 있다. Learning Rate의 크기가 너무크면, Gradient가 발산할 수 있고 너무 작으면 수렴속도가 너무 느리다는 문제가 있다. 즉, 적당한 값을 주어야한다.

 

J는 Loss Function 이다.

Learning Rate가 보폭의 크기라면, Loss Function의 미분값은 방향을 지정해준다고 생각하면 된다.

아래 2차함수 그래프에서 원점보다 좌측이면 Loss Function의 미분값이 음수로 결국 가중치 세타는 양의 방향으로 업데이트 된다.(결국 minimum을 향해 나아가는 형국) 우측일때는 그 반대 작용이 일어난다고 볼 수 있다.

 

그러면 Loss Function의 미분값은 어떻게 구할 수 있을까? 이는 뒤에 나올 BackPropagation(5번)에서 확인할 수 있다.

 

Convex Function을 가정했을때 위와 같이 f(손실함수)를 최소값을 가지도록 x를 최적화 시켜나가는 과정이라고 보면 된다. 실제 Problem Space는 훨씬 복잡하겠지만 이차함수를 떠올리면 직관적으로 이해할 수 있습니다.

 

 

Learnig Rate의 크기에 따른 함수 최적화의 문제점

 

 

4. 어떻게 미분할까?

기존 Perceptron은 뉴런의 전기신호를 모방한것이기 때문에 0과 1을 가지는 Step Function을 Activation Function으로 이용했다. 가중치의 학습을 위해서는 미분이 필요했는데 Step Function은 미분이 불가능하다는 문제가 있다.

 

아래 그래프 검은선과 같이 Step Function은 미분이 불가능한 점이 있다. 그래서 각 레이어에 Activation Function을 미분이 불가능한 Step Function 대신 미분가능한 함수인 Sigmoid Function(통계학에서는 Logistic이라고 합니다.)을 걸어준다.

 

Sigmoid로 미분 불가능하다는 문제가 있지만 Sigmoid또한 문제점이 있다. 각 극값으로 가면 미분값이 매우 작아지는 현상(Gradient Vanishing)이 일어난다.

step function과 sigmoid function


그래서 등장한것이 RELU다. Sigmoid 처럼 0에서 1사이로 출력값이 제한되지도 않고, 0 이상일 때 일정한 기울기를 가지고 있어 Gradient Vanishing 문제도 해결했다. 여기서 더 나아가, RELU는 0 이하 값에서 기울기가 0이므로 이 정보를 이용해보자는 생각에서 Leaky ReLU PReLU등의 Activation Function이 등장했다. 하지만 ReLU와 큰 차이는 나지 않고 그냥 상황에 따라 쓰면 된다고 한다.

 

5. 그럼 Loss Function의 미분값을 어떻게 구할까?

이 질문에 대한 대답이 그 유명한 Backpropagation(오류역전파법)과 이어진다.

오류역전파는 딥러닝의 발전에 지대한 영향을 끼쳤다.

 

다시 원론으로 돌아와서, 딥러닝은 어떻게 수행되고 딥러닝은 무얼 하는 걸까?

다시 말하지만 딥러닝은 "가중치"를 업데이트 시켜가면서 최적의 "가중치"를 찾아 오류를 최소화 시키는 방향으로 학습하는 작업이다.

 

이에 따라 필요한 작업은 가중치에 변화를 주었을때, Loss Function이 어떻게 변화하는지 -> 즉, 가중치에대한 Loss Function의 미분 값이 필요하다.

 

다시 Gradient Descent를 상기해본다.

Gradient Descent

가중치를 위와 같은 식에서 가중치를 업데이트 하기 위해서 우변의 J의 미분값 즉, 세타에 대한 Loss Function의 변화량을 알면 된다.

 

여기서 등종하는것이 Backpropagation(오류 역전파법)이다. 오류역전파법은 Chain Rule을 기반으로 하고있다.

 

6. Gradient Descent에 대해 알았는데, 데이터가 커져 너무 느려지면 어떻게 해야할까?

 

위에서 여러번 보여드렸던 Gradient Descent(경사하강법)의 식은 가장 기본적인 Optimizer다. 실제로는 더 빠르고, 성능이 좋은 Optimizer가 여러가지 있다.

 

흔히 Optimizer의 수행과정을 "산에서 길 잘찾기"에 비유하고는 한다. 실제로 상당히 유사한 면이 많다. Problem Space는 굉장히 복잡하다. Local Minimum에 빠지지 않으면서도 빠른 속도로 최적값에 수렴시키기 위해 다음과 같이 Optimizer가 발달해왔다.

 

아래 이미지는 Optimizer의 계보를 정리해놓은 것이다.

GD (Gradient Descent)

 

최초에는 Gradient Descent를 사용하였으나 모든 데이터를 확인하고 가기 때문에 너무 느리다. 또한 Step Size가 일정하기 때문에 Local Minimum에 빠질 염려도 많다. 

 

SGD (Stochastic Gradient Descent)

 

데이터를 하나씩 전부 확인하기 힘드니, 하나의 데이터만 가지고 확인한다. Gradient Descsent와 다르게 정확한 답을 내지 못할 수도 있다. 

 

sgd vs gd

하나의 데이터에 대해서만 체크하기때문에 SGD는 뒤죽박죽이다. 반면 GD는 모든 데이터를 확인하며 가기때문에 느리지만, 확실한 방향으로 간다.

 

정리하자면

GD : 확실하지만 천천히 모든 데이터를 훑고간다! (+ Local Minimum에 빠질 염려가 있음)

SGD : 조금 헤매지만 빠르게 간다! (+ GPU를 충분히 활용할 수 없음)

 

Mini-Batch SGD

이 부분에 용어 혼동이 있다. 최초의 SGD는 하나의 데이터를 이용해서 Weight를 업데이트 시켜나가는 방식이었는데, 하나는 너무 불확실 하니 Mini-batch로 잘라서 Stochastic Gradient Descent를 수행하는 것이다. 쉽게말해 GD와 SGD의 장점만 뽑아 쓴 느낌이다.

 

Momentum

 

Momentum vs SGD

 

관성으로 이해하면 된다.

 

local minima와 global minima

 

Gradient Descent는 일정한 Step size(learning rate)를 가지기 때문에 local minima에 빠질 염려가 크다. 즉, global minima에 수렴하지 못하고 local minima에 수렴하게된다는 것이다. Momentum을 이용하면 관성을 이용해 local minima에서 나올 수 있는 확률이 높아지고, 속도 또한 빨라진다.

 

즉, 

- 속도의 향상

- Local Minima 문제 해결

 

두 가지 장점을 가진다. 대신 메모리는 2배로 필요하게 된다.

 

NAG(Nesterov Accelerated Gradient)

 

Momentum과 크게 다르지는 않다. 차이점은 Momentum Step을 이미 이동했다 생각하고 Gradient를 구한다.

일단 Momentum으로 이동을 반정도 한 후 이동방식을 결정하기 때문에 적절한 시점에 제동을 걸기 좋다.

 

Adagrad(Adaptive Gradient)

 

지금까지는 Learning Rate가 고정되어 있었다. AdaGrad를 문자그대로 해석하면 "적응하는 그레디언트"이다.

핵심 아이디어는 "지금까지 변화하지 않은 변수들의 Step Size는 크게, 많이 변화했던 변수들은 Step Size를 작게"하는 것이다. 이렇게하면 더 빠르고 정확하게 Global minima를 향해 나아갈 수 있을 것이다.

 

그런데, 학습을 여러번 반복하면 Learning Rate가 점점 작아지는 문제가 있다.

 

RMSProp

학습을 여러번 반복하면 Learning Rate가 점점 작아진다는 AdaGrad의 문제점을 보완하기 위해 나온 Optimizer이다. Adaptive를 위한 변수인 G가 무한정 커지지는 않으면서 최근 변화량 변수간의 상대적인 차이는 유지해준다고 한다.

 

Adam(Adagrad + Momentum)

Optimizer의 '거의' 끝판왕이라 할 수 있다. 말그대로 Adagrad의 성질에 Momentum성질을 더해주었다.

 

비슷하게 NAdam이 있는데, NAdam은 Adagrad성질에 NAG의 성질을 더해주었다.

 

7. 열심히 학습시켰더니..과적합?!

머신러닝(딥러닝)에서 Overfitting은 정말 중요한 이슈다.

 

 

Underfitting, good Fitting, overfitting

 

 

Regularization

L1, L2 규제 방법이 있다.

 

- L1 Regularization(Lasso)

Cost Function에 Lasso 규제항을 더해주는 형식이다.

계속해서 특정상수를 빼주는 꼴이 되고 어떤 Weight는 0이 되도록 한다.

즉, 영향이 큰 핵심 feature들만 학습과정에 반영하게되어 Overfitting을 방지할 수 있다.

 

- L2 Regularization(Ridge)

Lasso처럼 일부 항을 0으로 만들어 버리지는 않지만, 전체적인 Weight의 절대값을 감소시켜 덜 구불구불한(달리 말하면, Smooth한) 곡선을 만들어낸다. 위 Fitting그림을 다시 상기해보면, 너무 Train데이터에 대해 구불구불하면 Overfitting되어있다고 판단할 수 있다.

 

결론적으로 L1, L2 Regularization으로 입력차원을 낮춰주고, Overfitting을 방지할 수 있다.

 

Dropout

은닉층의 노드를 전부 사용하지않고, 랜덤하게 몇개를 선택해서 사용한다.

Dropout

 

Hidden Layer가 많아질수록 Overfitting의 가능성이 높아진다.

 

- Dropout을 사용하면 뭐가좋지?

Overfitting을 방지한다.

뉴런들끼리의 Co-adaption을 방지할 수 있다.

 

8. 데이터간 단위차이가 너무커서 효율적인 학습이 되지 않는다. 어떻게 해결할까?

모든가중치에 대해 동일한 상수값(Learning Rate)이 적용되기 때문에 입력데이터의 범위를 동일화 해줄 필요가 있다.

즉, 딥 뉴럴네트워크의 효율적인 학습을 위해 정규화(Normalization)는 필수다.

 

9. Network의 각 층과 Activation 마다 input의 분포(distribution)이 달라지는 현상을 해결해보자.

Training 전체 과정을 안정화 시키기 위해 Batch Normalization을 이용한다.

 

Internal Covariacne Shift 현상은 Netwrok 각 층과 Activation 마다 input의 distribution이 달라지는 현상을 의미한다. 쉽게 생각하면 input을 normalize하면 되는데 Whitening으로 해결 할 수 있다. 

 

근데 문제는 Whitening을 하기 위해서는 Covariacne Matrix와 inverse의 계산이 필요해 계산량이 상당히 필요하고,

일부 Parameter들의 영향이 무시되는 경향이 생긴다. 

 

이 문제를 해결하기 위해 나온것이 Batch Norm이다.

 

Batch Norm의 장점은

- 기존 Deep Neural Net에서는 Learning Rate를 높게 잡으면 Graidient explding/vanishing 그리고 local minima에 빠지는 문제가 있었는데 Batch norm을 이용하면 propagation과정에서 parameter scale에 영향을 받지 않을 수 있다. 그래서 큰 Learning Rate를 잡을 수 있고 이는 빠른 학습을 가능하게 한다.

 

Batch Normalization의 경우 자체적인 regulariztion(규제)효과가 있다. 이는 기존의 다른 regularization term을 제거할 수 있게 한다.(예를들어 Dropout을 없애도 됨)

 

출처 : https://statinknu.tistory.com/23

 

'Artificial Intelligence > Deep Learning' 카테고리의 다른 글

[DL] validation/metrics/val_loss/early stopping/history  (0) 2022.07.02
[DL] activation 활성화함수  (0) 2022.07.02
[DL] R2 예제_diabets  (0) 2022.06.23
[DL] R2 예제_california  (1) 2022.06.23
[DL] R2 예제_boston  (0) 2022.06.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함