저번 포스팅 체인 룰에 이어서 이번 시간부터는 Linear Regression을 시작으로 포스팅하겠습니다.
1. Linear Regression?
데이터 공부하면서 참 자주 들었으면서도 잘 몰랐던 부분이지 않을까 합니다.
오늘은 딥러닝에서 Linear가 어떤 역할을 맡고 있는지 알아 보도록 하겠습니다.
딥러닝의 한 노드는 가중치*입력+bias를 계산한 뒤 활성화 함수로 넘겨줍니다.
이때 가중치*입력+bias가 바로 linear 인것이죠
linear에서 활성함수를 적용것이 위와 같으며 이를 logistic Regression.
활성함수를 제거한 것이 Linear 입니다.
2. Regression?
Regression을 간략하게 정의하면 독립변수와 종속변수간의 관계를 파악하여 미래를 예측하는 방법입니다.
우리가 머신러닝 작업을 할때 최대한 많은 변수들을 수집한 후에 영향을 주는 X들을 가려내기 위한 전처리 작업을 합니다. 즉 Regression은 dominant한 변수들을 가지고 예측을 하게 됩니다.
수학성적 = f(수면시간,공부시간,통학시간) 이라는 식이 있을때, 저 3개의 변수가 수학성적에게 중요한 변수라고 가정합니다. 하지만 저 3개 이외에도 수학성적에 미미하지만 영향을 주는 변수는 수도 없이 많습니다.
이 모~든걸 다 수집하여 적용한다는 건 거의 불가능에 가깝습니다. 연산량도 많아질 뿐더러 데이터를 수집하기도 힘들죠
위에 3개 변수로 예측기를 만들어도 나머지 자잘한 영향을 주는 변수가 포함했을때와 성능이 비슷할겁니다.
3개의 변수가 수학성적에 얼만큼 영향을 주는지에 대한 값을 알아내야 합니다.
이 값을 weight라고 합니다.
다시 Linear Regression의 식을 보겠습니다.
식을 간단하게 해석하면 n개 변수의 W(가중치)를 찾아내는 것입니다.
번외로 머신러닝 VS 딥러닝의 차이점은 뭘까요?
머신러닝은 dominant한 변수로 모델을 만듭니다. 이건 익숙합니다. 딥러닝은 쓸데없는, 영양가가 없는 X변수들도 다
집어 넣어서 학습을 시킨다는 것입니다. 예를들어 28*28의 강아지 이미지가 있다고 생각해 봅니다.
강아지 이외의 배경은 사실 쓸모없는 input입니다. 강아지를 인식하는데 전혀 영향을 주지 못합니다.
딥러닝은 이러한 쓸모없는 input까지 모두 고려하는 점이 머신러닝과 큰 차이점이라 할수 있습니다.
linear를 아래처럼 벡터로 표현이 가능합니다.
3.Loss and Cost Function
개인적으로 Loss와 cost가 굉장히 헷갈렸는데 이 둘의 차이점을 보겠습니다.
Loss는 실측치와 예측치를 하나씩 뺀 값의 제곱을 취한 값입니다.
Cost는 모든 Loss값을 더한 값후 datapoint값 만큼 나눈 평균값입니다.
평균을 냄으로써 각 loss값의 중간값을 표현합니다.
y ̂ = θx 일때, 대입 후 식을 전개해 보겠습니다.
y와 x는 정해진 값이기 때문에 constant로 볼수 있습니다. 여기서 변할수 있는 값은 θ뿐입니다.
최적의 θ값을 찾기 위해서는 gradient dscent를 해야하는데, 먼저 위 식이 어떤 그래프를 나타낼수 있는지 보겠습니다
θ가 2차이므로 밥그릇 모양의 그래프가 나오게되며 이는 마찬가지로 Loss값도 동일하게 밥그릇 그래프가 나옵니다.
이둘의 차이점은 평균을 하느냐 마느냐의 차이이기 때문입니다.
만일 bias까지 포함되면 어떻게 변할지 보겠습니다.
y ̂ = θ1x + θ0을 Loss 및 Cost로 대입했을때의 전개식입니다.
대입하고 벡터로 표현했습니다. 각 식을 전개를 하게되면 양쪽 모두 θ1**2, θ0**2 값을 얻게 됩니다.
Loss에 대한 θ1,θ0 그래프는 아래와 같습니다.
사실 위 그림은 y= X**2 + Y**2 그래프 입니다. 이해를 돕기위해서 사용되었습니다.
그러면 y = X**2+Y**2 +x1x2는 어떤 그래프 일까요
한 축을 기준으로 누운 그래프를 볼수 있습니다. X1X2의 계수에 따라 어떻게 변하는지 보겠습니다.
계수가 높을수록 그래프가 점점 평평해 집니다. 최적점을 구할려면 U 모양의 그래프가 필요한데 위 그래프는 U와는
거리가 멀어 보입니다. 뭔가 잘못되었음을 직감할수 있습니다. X의 값이 커지게되면 계수값이 증가해서 위 그래프처럼
되는 것입니다.
만일 X1이 연봉이라면 단위가 상당히 커지게 되고 그래프가 어떻게 변할지는 굳이 시각화 안해봐도 예측 할수 있게됩니다. 적절한 스케일링이 필요한 이유를 여기서 알수가 있게 되는 것이죠
3.Gradient descent
argminy를 찾아가는 과정을 gradient descent 라고한다. 어떻게 최저점으로 이동하는 것일까를 생각해 보자.
초록색처럼 x로 미분했을때 음수가 나오면 x값을 증가 하여 오른쪽으로 이동해야 한다. 얼만큼 이동해야 할까?
x-dy/dx 만큼 이동한다. 이동 한 수치가 빨간색 수치이다. 최종적으로 dy/dx=0이 가장 이상적인 수치이기 때문에 x값을 감소 시킨다. 얼만큼? x-dy/dx 만큼 이동한다. 이렇게 왔다갔다 하는 과정에서 오히려 발산하는 경우가 있다.
x=1일때 민분값이 -2.5이니까 이를 x와 더하면 3.5가 나오고 3.5위치의 미분값을 구하면 5가 나오고 이를 더하면 x가 그 전보다 더 커지는 현상이 발생되면서 위 그림처럼 나오게 된다. 따라서 미분값을 그대로 쓰면 안된다. 어느정도 패널티를 줌으로써 야금야금 기어 갈수 있도록 해야 하는데 이때 등장하는 것이 learning late이다. 위 사진 알파에 해당된다.
y와 y^이 일치 할때가 최소가 된다. 위 이미지처럼 x=2가 되면 y=0이 되고 미분값도 0이 되는 지점으로 가야한다.
x를 쎄타라고 했을때 아래 그림을 보면
현재의 세타 = 이전의 세타 - 움직여야 하는 거리 로 구성되어있다. loss와의 미분값이 0이 되는 지점으로 움직이는 것이다. 그래서 가장 최소가 되는 세타 지점을 찾는 것이다. (모든 세타는 0으로 수렴 하기가 거의 불가능)
gradient descent를 사용하는 이유는 최적의 세타를 구하기 위함이다. 이 세타값을 구하기 위해서 각각 Loss, Cost 최적화 함수를 사용한다. 이 두개의 함수를 이용해서 세타를 찾는다.
상단을 보면 x,y 값이 있고 그에 따라 그래프가 좁게 변화한다.
Loss 함수에서 x가 1일때, (y-세타*1)**2 -> 쎄타**2 의 값이 나오고
x=2 일때, (y-세타*2)**2 -> 4세타**2 값이 나와서 x의 증가에 따라 값이 커지므로 그래프가
좁게 변화한다. 따라서 각 loss에 따라 learning late를 조절해줘야 하는 문제점이 있다.