1. Gradient Descent Method 2
실제 문제에서는 변수가 여러개 있으므로 위 그림처럼 convex한 모양을 가지고 있지 않을 것이다. 어떤 모양인지는 모르겠지만 핵심은 특정 포인트에 대한 gradient만을 알수 있다. 초록색 점 포인트의 gradient는 음수가 나왔음을 알수가 있는 것이다. 비유를 한다면, 껌껌한 밤에 땅에 기울기만을 느끼면서 우리는 본능적으로 기울기가 아래로 향하는 쪽으로 내려갈것이다.
그렇다면 산 아래쪽으로 내려가는 방향을 알려주는 것이 마이너스 gradient이다. 일반적으로 미분하여 나온 gradient는 값이 증가하는 방향을 기본적으로 가리킨다. 여기에 마이너스를 붙여주면 반대방향을 가리키므로 기울기가 감소하는 방향, 즉 0이 되는 지점을 가리키게 된다.
따라서, 실제 딥러닝에서는 전체적인 loss , cost 모양은 모른 채 업데이트를 진행하는 것이다.(위 볼록한 파란색 선 cost 모양은 단지 예 일뿐)
학습 시킬 세타가 2개 이상이라면 어떻게 진행될까?
bias까지 포함해서 학습시킬 대상은 세타1,세타0 이다. 이때, 두개의 세타를 가지고 편미분을 적용하여 gradient를 구한다.
loss는 (실제값 -예측값)^2 이다. 따라서 위 그림처럼 나타낼수 있으므로 해당 prediction 값이 세타1,세타0에 대한 함수로 바뀐 것이다. cost는 loss들의 평균값이다. 따라서 loss, cost 각각gradient를 구할수 있게 된다.
(cost 끝부분에 제곱이 빠짐)
세타1,세타0에 대한 편미분을 위 처럼 구하여 gradient를 구할수 있다.
따라서, 업데이트된 세타들은 위 과정을 통해 구해진다. 기존에 있는 세타들에 대해서 마이너스 gradient를 연산한다. 알파는 구해진 gradient값을 줄이는역할을 한다. 구해진 gradient를 곧이 곧대로 적용하면 값이 너무 크기 때문에 발산할 가능성이 높다. 그래서 learning late로 조절해야한다. 그래서 천천히 최적점에 가까워지도록 돕는다.
x축 방향은 세타1이 업데이트되는 방향, y축은 세타0이 업데이트 되는 방향을 가리킨다. 각각 세타들이 업데이트 되면서 최적점에 가까워진다. 하지만 실제는 위 그림처럼 이쁜 원 모양이 아니다. 한쪽으로 쏠린 모양을 가지고 있다.
제대로 학습 시 이런 모양을 가진다. 해당 모양의 문제점은 세타들간의 학습 속도가 상당히 차이다 많이 난다는 것이다. 세타1 초반 부분에서는 업데이트가 빠른 진도를 보일때 세타0은 조금 밖에 업데이트가 되질 않는 모습이 그 예이다. 각 세타의 업데이트 속도가 달라서 학습이 제대로 안되는 것이 딥러닝의 문제점 중 하나이다.
이번엔 n차원으로 확정시켜보자
학습시킬 params는 세타n부터 bias까지 포함된 세타0까지가 될것이다. 해당 loss는 n+1 차원의 gradient가 나오게 된다.cost는 loss들의 평균이므로 큰 틀은 바뀌지 않는다.
N+1차원의 gradient 벡터가 만들어진다. 구해진 벡터를 가지고 gradient descent(경사하강법)를 구한다. 이때 마이너스를 넣어 줌으로써 loss를 감소 시키는 방향으로 갈수 있다.
gradient descent 할때는 n+1까지 있는 각 세타들이 위 그림처럼 각자 업데이트를 하는 것이다.
cost도 같은 원리이다. loss들을 모두 더해서 평균 낸 것이 cost이다 평균낸 값에서 각 세타들을 편미분하여 gradient vector를 만든다.
핵심은, 세타가 1개든, 100개든 몇 만개든 그 원리는 변하지 않고 아래처럼 업데이트가 진행된다는 점이다.
2. Learning late
아래 내용은 학습 이해를 돕기위해서 y=세타x, 즉 학습 시킬 파라미터가 1개임을 미리 알려드립니다.
위 그림에서 말하과 하는 것은 lr을 높일수록 최저점에 빨리 수렴하다는 점이다. 그렇다면 무조건 lr이 큰게 좋을까? 그렇지 않다. 실제에서는 lr을 키워서 최적점에 빨리 수렴하는 모습은 보기 힘들다. lr을 키우게 되면 아래처럼 나타날 가능성이 농후하기 때문이다.
오른쪽 그림의 보라색 lr을 보면 반대편 같은 위치로 포인트가 업데이트가 되었다. 기울기 절대값을 보면 크기가 같으므로 계속 같은 자리를 왔다갔다 할것이다. 이보다 안좋은 케이스가 빨간색lr이다. 업데이트를 시켰는데 그 전 포인트 보다 기울기 값이 증가한 경우이다. 이렇게 되면 왔다갔다 하되 최적점과 더욱 멀리 떨어진 곳으로 이동 할것이다(발산하게 됨)
세타가 2개일때의 lr의 시각화를 보면 아래와 같다
0번 초기값을 시작으로 왼쪽그림은 왔다갔다 하면서 최적점에 수렴한다. 반면 왼쪽그림은 점점 발산하는 모양을 취한다. 참고로 왼쪽그림처럼 왔다갔다하는 형태는 발산의 여지가 있으므로 옳지 못한 학습과정이다. 한개 세타가 발산하면 전체 모델이 발산하기 때문에 애초에 작은 lr을 시작으로 학습 시키는 것이 옳다. 아래를 통해서 확인해 본다.
가장 왼쪽그림은 지그재그 없이 안정적으로 최적점에 수렴되어 가고 있는 반면, lr이 커질수록 x축 세타1은 지그재그 형태를 띈다. 눈여겨 볼 것은 이때의 세타0와 세타1의 서로다른 학습 속도 인 것이다. 오른쪽으로 갈수록 서로간의 속도가 맞지 않게 된다. 이는 곧 발산의 여지를 주게 된다. 따라서 가장 왼쪽그림처럼 작은 lr을 사용하는 것이 옳다.
3. for a single sample: 이론
x_data에 100의 데이터가 있다고 가정할때, 각각의 100개의 세타(가중치)가 업데이트가 되면 이를 1epoch라 부른다. 즉 100번의 iteration = 1epoch
x=0, y=y^ 일 경우엔 값이 0이 되므로 학습이 일어나지 않는다. 그래서 x와 y값에 따라서 학습이 어떻게 진행이 되는지 알아본다.
실제값이 예측값보다 클때
1) x>0
세타+2ax(y-y^)는 기존의 세타보다 조금 커지게 업데이트 된다. 그렇다는건 y=세타x 에서 세타가 살짝 커졌다는 의미이다. 이러한 과정을 통해 실제 y값과 예측값 y값의 차이는 줄어들게 된다.
1) x<0
2ax(y-y) 부분이 음수가 되므로 기존 세타 보다 작게 업데이트가 될것이다. 이때 중요한 것이 y=세타x이다. 세타가 작아지고 x가 음수 이므로 오히려 커졌음을 알수 있다. 값이 커졌으므로 이 또한 실제 y값과 예측값 y값의 차이는 줄어든다.
실제값이 예측값보다 작을때
예측값이 더 크므로 값이 감소하는 방향으로 학습이 이뤄져야한다.
1) x>0
작아진 세타값에 양수인 x가 있으므로 예측값이 감소했고, 이에따라 실제값과 예측값의 차이도 감소한다.
1) x<0
x가 음수이므로 세타+2ax(y-y) 값은 기존 세타보다 커지게 된다. 하지만 예측값 y = 세타x이므로 값이 감소했음을 알수 있다. 이에따라 실제값과의 차이 줄어든다.
즉 모든 case가 실제값과 가까워지는 방향으로 학습이 된다.
'Data Diary' 카테고리의 다른 글
2021-08-11(딥러닝 수학8_Mini-batch and vectorization) (0) | 2021.08.11 |
---|---|
2021-08-10(태블로_기초편) (0) | 2021.08.10 |
2021-08-06(태블로 기본컨셉 이해하기) (0) | 2021.08.09 |
2021-07-29(Mask-RCNN_Segmentation) (0) | 2021.07.30 |
2021-07-26(RetinaNet & EfficientDet) (0) | 2021.07.26 |