Deep Learning

딥러닝 주요 알고리즘 1 - 딥러닝 기초 이론 (1) 확률적 경사 하강법(Stochastic gradient descent, SGD)

햇농nongnong 2021. 12. 11. 13:54

 

 

딥러닝이란?

 

- 인공지능의 여러 방법론 중 하나인 기계 학습 (머신러닝)

- 머신 러닝의 여러 방법론 중 하나인 인공 신경망 (Artificial Neural Network)

- 딥러닝인공 신경망의 응용 방법론

 

 

딥러닝의 역사

 

* 딥러닝의 발전 과정

- 1950년대 퍼셉트론 알고리즘

- 1980년대 다층 퍼셉트론, 역전파 알고리즘

- 2012년 이미지 분류 모델 AlexNet 의 압도적인 성능 : 딥러닝에 큰 주목

 

* 딥러닝의 재부상 배경

- 빅데이터의 등장

- 컴퓨터 하드웨어(특히 GPU)와 소프트웨어의 발전

 

 

딥러닝의 기초 이론

- 세상에 여러가지 현상이 있는데, 그 현상에 있는 여러 문제를 해결하기 위해, 혹은 어떤 현상을 표현하는 것 자체를 문제로 정의를 해서, 이 문제를 어떤 방법을 통해서 해결하느냐, 표현하느냐, 구현하느냐.. 이런 것이 공학의 목표.

 

- 기계학습데이터를 이용하면서 경험을 통해 자동적으로 발전할 수 있는 컴퓨터 알고리즘을 연구하는 학문이다. (Wikipedia)

- 그러한 알고리즘을 통해 학습하는 함수를 모델(model) 이라고 하며, 모델은 많은 수의 학습 가능한 매개변수(파라미터, learnable parameter)들로 구성되어 있음

- 기계학습 모델이 "학습한다"라는 것은 모델이 훈련 데이터를 처리한 결과에 따라 파라미터들의 값을 변경하는 것을 말함

- 기계학습 모델의 목표주어진 훈련 데이터를 통해 처음 보는 데이터에 대해서도 과제를 가장 잘 수행할 수 있는 파라미터 값을 학습을 통해 찾는 것

- 기계학습 모델은 분류(classification), 회귀(regression), 예측(prediction) 등 여러 가지 문제에 적용할 수 있음

 

 

* 기계학습(딥러닝)의 학습 방법

 

- 지도 학습 (supervised learning) : 정답이 있는 데이터로 학습시키는 방법

--> 이미지 분류, 음성인식 등의 문제를 푸는 데 이용

- 비지도 학습 (unsupervised learning) : 정답이 없는 데이터로 학습시키는 방법
--> 이미지 복원 등의 문제를 푸는 오토인코더 (autoencoder) 가 대표적인 딥러닝 기반 비지도 학습 모델

--> 군집화 : 평면상의 덩어리들. 정답은 없지만 어떤 경향성을 가지고 있음. 그래서 서로 묶여서 결국 나뉜 그룹끼리의 관계만 알면 되고, 정답은 있을 필요 없음.

- 강화 학습 (reinforcement learning) : 정해진 보상을 최대화하는 학습 방법

--> 알파고(Alphago) 와 같은 게임 인공지능, 자율주행인공지능 에이전트(agent) 가 주어진 환경에서 행동하는 방법과 관련된 모델 (알고리즘을 수행하는 주체 - agent) 

--> '보상' 이라는 개념을 가지고 학습하는 것

- 이외에도 적대적 학습 (adversarial learning), 자기지도 학습 (self-supervised learning), 준지도 학습 (semi-supervised learning) 등의 학습 방법으로 나뉨

 

 

* 오차 함수 / 역전파 알고리즘

 

- 학습을 위해서는 모델이 추론한 답안오차 함수 (loss function) 를 이용해 평가하며, 모델은 이 오차 함수 값을 최소화하는 방향으로 학습을 진행

- 기계학습에서 오차 함수 값을 최소화하는 방법은 여러 가지가 있지만, 특히 딥러닝 모델들은 각 파라미터에 대한 오차 함수의 편미분을 이용, 역전파(back-propagation) 알고리즘확률적 경사 하강법(stochastic gradient descent)으로 학습을 진행함 

- 입력을 가지고 모델이 y hat 을 냈을 때, 예를 들어 '이 입력은 꽃이 맞는 것 같다. ' 라고 했을 때 이 판단이 맞나 안맞나 평가 해야함.

- 그래야 틀렸으면 '이렇게 하면 안되고 다르게 생각해야겠구나' 하고 수정하고, 맞으면 '이렇게 하면 되겠네' 하고 그대로 진행하고.. 이런식으로 알 수가 있음.

- 이렇게 정답이 맞나 안맞나 평가할 수 있는 척도가 Loss. 오차함수임. 

- 모델의 학습 목표를 하나의 식으로 표현하면 Loss 함수라고 할 수 있음.

--> L(y hat, y) 가 있을 때, 원래 정답 값이 있고, 모델이 낸 답안이 있으면 그 답안을 Loss 함수에 넣어서 얼마나 틀렸는지를 평가하는 것

- 오차 함수는 얼마나 맞았느냐보다 얼마나 틀렸느냐를 평가하는 함수 - 틀릴 수록 값은 커짐. 보통 맞으면 0

학습시켜준다는 건 파라미터 값을 변화시켜주는 건데, 그걸 오차함수 값에 따라서 변화시키는 것임 - 어떻게? 그 때 편미분을 이용

- 편미분을 이용해서 얼마나 값을 변화시켜야 하는지 계산하고, 역전파 알고리즘을 통해서 쭉쭉쭉 전달

--> 역전파 알고리즘으로 편미분 값을 각각의 계수, 파라미터에 전달하는 것

--> 이 값들을 변화시켜주는 것을 보고 '확률적 경사 하강법' 이라고 얘기함.

 

 

* 확률적 경사 하강법

 

확률적 경사 하강법 (Stochastic gradient descent, SGD) 시각적으로 이해하기

 

- 모델은 (이상적으로는) 어느 입력이 들어와도 오차 함숫값이 최소가 되는 곳의 파라미터 값을 찾는 것이 목표

- 이 때 현재 파라미터 값 위치에서의 오차 함수에 대한 미분값(기울기)의 부호 가까운 최솟점을 향한 방향을, 크기 움직여야 하는 정도를 의미

- 미분을 통해 파라미터에 변화를 반영할 수 있음

- 역전파 알고리즘으로 구한 기울기 값소수점 값인 학습률(learning rate)을 곱해 현재 파라미터 값에서 빼 줌

- 그러나 이것은 하나의 입력 데이터에 대해서 (입력 데이터가 고정되었을 때) 나타낼 수 있는 오차 함수의 그래프

--> 우리는 데이터를 굉장히 많이 보게 될 것이고, 데이터가 달라지면 당연히 그에 따라서 오차 함수의 그래프는 달라짐. 그래도 데이터가 잘못된 것이 아니라면 데이터들이 어느정도의 경향성을 가지니까 웬만하면 최솟값에 가까워지는 방식으로 학습 됨. 

- 서로 다른 데이터에 대해서 이와 같은 작업을 수행하는 것을 "확률적" 경사 하강법이라고 부름

--> 전체 데이터를 한번에 보는 것이 아니라 딥러닝 같은 경우는 워낙 데이터가 많다 보니까, 데이터들을 조금씩 일부씩 보면서 이렇게 미분값을 통해서 파라미터 값을 update 함. 이것을 그냥 경사 하강법이 아닌 "확률적" 경사 하강법이라고 함. 

- 학습률과 같은 파라미터는 학습 과정에서 자동으로 최적화되는 것이 아닌, 사람이 직접 정해 주어야 하는 것으로 이와 같은 파라미터를 '하이퍼파라미터(hyperparameter)' 라고 함.

 

 

 

- 미분은 '순간변화율' : 어떤 순간에 있어서, y = f(x) 식을 미분했을 때,  x 가 1만큼 이동했을 때 그 점에서 y 값은 얼마나 변화하느냐를 나타내는 것 = 미분값 = 기울기

- 수학에서 x축, y축이 딥러닝에서는 x축은 w (가중치 값), y축은 오차 함수.

--> 최종적으로 가중치 값을 통해서 나오는 함수값오차 함수 값

- 위 그림은 w 가 변화함에 따라서 Loss 값이 달라지는 그림임.

--> 이 그림은 이해를 돕기 위해 하나의 입력에 대해서만 생각했을 때, 하나의 데이터에 대해서 w 가 어떻게 움직여야 loss 값이 달라지는지 보는 그림임.

- 현재 함수값L L(y hat, y)

--> y hat 은 f(x) --> f(x) 는 w 와 x, b 로 이루어진 함수. w 를 변수로 생각. (x 가 고정되었으니까 x는 상수취급)

--> w 가 변수니까 w가 움직임에 따라서 loss 값이 얼마나 달라지느냐가 저 그림인 것임. 

- 오차함수의 목표오차값이 최소인 지점인 0을 찾아 오차값을 최소화하는 방향으로 학습하는 것.

--> 그럼 저 그림에서 기울기가 0인 제일 낮은 부분인 'global optimum' 부분이 목표.

--> 목표 w 값은 global optimum 의 w축 값이 되어야 함. -- 그럼 그 w 값을 어떻게 찾아갈 수 있을까? w 값을 일단 식으로 표현해보자.

--> w 값미분계수(기울기)로 표현이 가능. 미분계수를 이용해서 w 값한테 목표 w 값을 위해 얼마나 바뀌어라 하고 알려줄 수 있다. -- 어떻게 알려주냐? 

 

 

- 빨간 x표 부분을 현재 w의 위치라고 보면, 그 값에서 순간변화율양수. 즉, 기울기는 양수임.

--> loss 값이 작아지려면 w 값은 음의 방향으로 이동해야함.

--> 그렇다면, 양수의 기울기음의 방향으로 이동해야하는 w 값반대라고 생각할 수 있음.

 

 

--> 양수니까 그 기울기 값을 빼버리면 w 값은 음의 방향으로 이동하게 됨.  

--> 즉, 양수인 기울기 값을 w 에서 빼면 w 는 음의 방향으로 이동하는 결과를 가지게 됨.

--> 이동할 때 많이 이동하면 아예 왼쪽으로, 아니면 중간으로.. 만약 아예 왼쪽으로 가게 된다면 기울기 값은 음수. 그걸 또 빼주면 양의방향으로 움직이고.. 이런식으로 변화..  

- 딱 적절하게 움직였을 때최적의 장소인 global optimum 에 멈추었을 때임.

--> 이 때는 학습이 가장 잘 되었을 때라고 보면 됨. 이 경우로 만들기 위해서 모델을 학습하는 것임. 

- 정리하자면, 모델 오차값을 최소화하고 싶고, 그 최소화하는 방법을 이 기울기 값을 통해 찾는 것이고, 그 기울기 값은 미분을 통해서 찾을 수 있다.  

 

- 지금 저 그림은 w 값이 하나인 경우를 말하는 것. w 값이 하나가 아니라면 저 그림처럼 좌표평면상에서 표현 불가능. ---> but 실제로는 f(x) = w1*x1 + w2*x2 + b 처럼 w 가 여러개.

--> 이 파라미터 값들이 서로 따로따로 어떻게 변하느냐에 따라서 또 다시 오차함수 값이 달라짐.

--> 얘네들 각각에 대해서 미분 값 구해주어야 하고, 얘네들 각각에 대해서 미분 값 변화함.

--> 그렇기 때문에 "편미분" 을 사용하는 것임.

--> w1 에 대해서 w1 이 변화하는 것에 따라 loss 값이 변화하는 걸 알고 싶다면, 나머지 w2, b 는 상수취급 미분해버리면 w1 에 대한 loss 값의 편미분 값을 구할 수 있음. w2와 b 도 마찬가지로.. 

 

- 기울기부호가 중요하고 크기는 그렇게 중요하지는 않음.

--> 만약 그 기울기 값이 그대로 빼지게 되면 너무 큰 값이 되어서 막 요동치게 됨.

--> 따라서 '학습률' 이라는 개념을 도입해서 조금만 변해라 하고 알려줌.

--> 학습률은 보통 0.1, 0.01, 0.001 의 작은 값으로 진행.

 

 

- 이 빨간색 부분에서 시작하게 된다면, 기울기가 양이기 때문에 w 값을 음의 방향으로 이동하게 만드는데, 그럼 최솟값인 global minimum 은 오른쪽임에도 불구하고 왼쪽으로 이동해 local minimum 에 다다르게 한다는 아쉬운 점. 

 

--> '공굴리기' 를 생각해보자

- 기울기를 변화해가는 건 최솟값을 찾아가려고 하는 과정. 

- 이런식으로 조정해 나가는데, 오른쪽이던 왼쪽이던 공굴리기에서 공을 내려놓으면 minimum 을 찾아 밑으로 내려감.

- 이런식으로 공굴리기를 해서 기울기가 0 이 되는 지점을 찾아가도록 조정하는 것임.

- 그런데 기울기가 0 인 지점하나가 아니라 여러개임 : local minimum, global mininum. 

- 사실 global minimum 을 찾는게 최솟값을 찾는 문제에서는 best solution.

- 하지만 gradient descent 방법공굴리기를 해서 내려가는 것이기 떄문에 항상 최솟값에 가까운 곳으로 움직임. 

--> 운이 좋아 global minimum 근처에서 시작하면 global minimum 에서 멈출 것이고, local minimum 근처에서 시작하면 내려가는 방향으로만 가는거니까 그냥 local minimum 이 답이 되어버림.

--> 그래서 stochastic gradient descent 방법optimal 하지는 않다.

--> 자기 주변에 있는 local minimum 을 잘 찾아가도록 해주는 개념적으로 굉장히 단순한 방법이다.

--> 대부분의 딥러닝 방법 : loss function 을 최소화시키는 목적함수를 푸는 수학적 과정뉴럴 네트워크의 weight 값을 체계적으로 변화시켜가면서 진행 --> 그럼 그 때 neural network 의 parameter 가 결정되는 것.

--> 대부분의 딥러닝은 이런 gradient descent 방법을 사용해서 local minimum 을 찾아가는 방법 사용. 

- global minimum 을 찾으려고 하면 문제가 더 복잡해짐.

--> global minimum 은 어떤 제한된 조건이 주어지지 않으면 찾을 수가 없음.

--> 엄청 복잡한 최적화 방법들엄청 복잡한 제한된 조건을 넣어야 찾을 수 있음 - 연구 많이 되고 있음. 

--> 우선은 보통 딥러닝은 gradient descent 방법으로 최솟값을 찾아가는 식으로 공굴리기를 해간다고 이해하고 넘어가면 됨. 

 

 

(이 글은 '언어와정보처리' 과목에서 '딥러닝 주요 알고리즘' 수업 내용을 정리한 글이다.)