1. Single-Layer Neural Network For Regression문제
이론
머신러닝이란?
- 우리가 쓰기위해 만든 보편적인 알고리즘
- 한국어로는 기계학습이라한다. 영어에 익숙해야져야한다. 그래야 자료를 많이 볼 수 있따.
- 머신러닝은 크게 3가지로 갈린다.
- Supervised learning(지도학습)
- label(암인지 아닌지)를 맞추는데 도움을 주는 것을 feature(성별, 나이, 혹은 픽셀)라 한다.
- x(feature) 과 y(label)이 있다. 즉, 맞추어야하는 정답에 해당하는 y값(label)이 있으면 supervised learning으로 풀어야한다.
맞추어야하는 정답에 해당하는 y값(label)이 없다면 unsupervised learning으로 풀어야한다.
- 현장(일상생활)에서는, unsupervised learning이 많이 쓰일 것이다.
왜냐하면, supervised learning은 하나의 feature당 하나의 label이 딱딱 있어야한다.
하지만, cctv/블랙박스의 많은 사진들 중 각각의 사진마다 하나의 사람을 태깅할 수 없기 때문이다. 즉, x와 y가 정확히 태깅되어있는 데이터를 쉽게얻을 수 없기 때문이다. 반면에 unsupervised learning은 각각의 feature에 해당하는 label이 있어야하는 것이 아니기 때문에, 상대적으로 알고리즘을 적용하기 쉽다.
- 그러나 실제(현장)로는 supervised learning이 많이 쓰인다. 연구하기도 쉽고 성과가 잘나오기 때문이다.
즉, 일상생활에서는 unsupervised learning이 많아야하지만, 연구와 실제(현장)는 supervised learning가 많이 쓰이고 있다|
하지만 요즘 연구의 추세는 unsupervised learning에 대한 연구를 많이 시도하고 있다.
- 간단히 말하자면, y값이 있으면 supervised / 없으면 unsupervised다.
연구를 위해서 말해보자면, y값(supervised)이 있어서 잘했는지 못했는지 가이드를 해주는 컨셉이 supervised이고,
y값이 없는데도 스스로 가이드해서 학습이 가능한 것은 unsupervised다. 1. Supervised learning(지도학습)의 분류
- Tree 모델(Decision Tree)
- Regression 모델 : 이게 딥러닝의 main
- Linear Regression
- Logistic Regression
- support vector motion
- Artficial Neural Network(ANN, 인공 신경 망)
- CNN
- RNN
2. Unsupervised learning(비지도학습)
- x(feature)만 있고 y(label)는 없다.
- x와 y가 정확하게 맞추어져있는 태깅되어있는 반드시 없어도 되므로 적용하기 쉬우나.. 연구에 있어서는 supervised가 많음
y가 많으므로. 그러나 지금은 un~으로 가는 중 왜냐하면
- 가이드가 지도해줄 y값이 없는데도 불구하고 스스로 아이가 학습하는 것. 아이가 중력/가속도를 스스로 알아낸다.3. Reinforcement learning(강화학습) :
- 알파고가 아니면 다룰 일이 없다. 앞으로 응용할 때도 없음. 응용할 곳이 별로 없다.
딥러닝?
- 마케팅적인 요소가 적혀있다. 그래서 연구쪽에서는 인공신경망이라고 말한다.
- - 딥러닝이란? 머신러닝 알고리즘(3) 중 Supervised learning 중 Regression모델 을 먼저 알아보자.
1) Linear Regression 모델- y값이 -무한대 ~ +무한대의 범위를 가지는 Regression문제를 푸는 알고리즘,
2) Logistic Regression 모델 - y값이 0 or 1이 나오는 Classification문제를 푸는 알고리즘,
- 1)과 2)는 전통적인 Regression모델이다. 이제 3)부터는 요즘시대에 말하는 딥러닝 알고리즘을 담고 있는 Regression모델
3) Atficial Neural Network(A. N. N) - 사람 뇌의 Neural Network를 모방한 컴퓨터의 알고리즘 모델
- A.N.N.은 가장 처음 나온 Single-Layer N.N. -> Multi-Layer N.N. -> Convolutional N.N. -> ... 로 발전하였다.
- A.N.N. 을 사용하여 Regression 문제와 Classification 문제를 푸는 것이 목표이며
A.N.N. 중 hidden-Layer가 3개이상 들어간 Multi-Layer N.N. 로 Regression/Classification문제를 푸는 것을 딥러닝이라 한다.
1) y값이 -무한대 ~ +무한대의 범위를 가지는 Regression문제
2) y값이 0 or 1이 나오는 Classification문제 - - 이번시간에는 하나인 Artificial Neural network 중 가장 간단한 Single-Layer Neural Network를 먼저 공부해보자.
Artficial Neural Network
이번시간엔 A. N. N. 중 가장 간단한 Single-Layer Neural Network를 배울 것이다.
- 딥러닝, 알고리즘의 특성을 나타낼 수 있는 가상의 가장 심플한 dataset을 만드는 것이 중요하다.
ANN의 dataset은 Supervised Learning으로서 기본적으로 feature와 label이 기본적으로 필요하다
- ANN은 Supervised Learning으로서 feature와 label이 있다고 했다.
- 실습은 1) Single Layer Neural Network에 관련된 RandomSearch / h-step Search / Gradient Descent 모델을 학습할 것이다.
실습 - 생략
이론2 - Gradient Descent 자세히 알아보기
머신러닝 3가지 중에 Supervised Learning은 x들과 더불어 y(답)이 있는 학습방법이다.
그 중 Regression 모델인 ANN, RNN, CNN, 선형회귀, 로지스틱회귀 등이 있지만, 그 중 ANN을 다루고 있다.
- Artficial Neural Network
- Single-Layer Neural Network
- Multi-Layer Neural Network
- Convolutional Nerual Network
Single-Layer Neural Network와 perceptron은 동일한 개념이라고 생각하자.
- y(답)과 x(feature들) 있는 어떠한 데이터가 주어졌다고 가정하자. (x는 여러개 일 수 있지만 하나라고 가정)
이러한 데이터는 Supervised learning을 적용할 수 있고, 그 중에 Regression 모델을 쓴다고 했을 때,
A.N.N 중 가장 간단한 S.L.N.N.로 Regression문제를 풀 때는, feature에서 -> label예측값을 도출해내는 weight와 bias를 구해야한다.
이러한 과정을 Optimalization이라고 한다.
이러한 최적화 기법에는 여러가지 방식(Random Search, h-step Search, Gradient Descent)이 있지만,
그 가운데 가장 효율적으로, A.N.N.을 학습시켜 weight와 bias를 구하는 알고리즘이 Gradient Descent이다..
- 기본적으로 앞으로 학습하는 모든 A.N.N.은 이 Gradient Descent를 사용해서 학습시킬 것이다.
- Gradient의 핵심은 loss, cost function을 편미분하여 w와 b의 업데이트량을 구할 수 있는 알고리즘이다.
- 제대로 학습되었다면 좋은w(배점, weight)와 b(bias)를 찾아내서 -> 다음data에 대한 y를 예측할 수 있다. 이러한 S.L.N.N.로서 문제를 풀 때, w와 b를 잘 찾아냈는지를 나타내는 함수가 Loss function이다. - 즉, 답을 알고 있는 data를 보고서, w와b를 예측하여, 다음의 답을 예측할 때
Single-Layer Neural Network를 사용해서 풀고자 한다면, - 가장 먼저해야할 것은 Hypothesis function -> Loss function -> Cost function을 정의하는 것이다.
- 다음은 Cost function을 w에 대해 편미분하여 -> 더 나은 w(점프거리)를 대략적으로 알아서 업데이트 시켜주는 것이다.
- 결과적으로는 Loss function만 편미분 해주면, 알아서 나온다. - 마지막으로 epoch-loop 수와 learning_rate를 통해 좀더 정확하게 w를 업데이트 해준다.
- Loss function(y, h(x)) -( w에 대한 2차함수) 을 편미분하여
Gradient Descent 알고리즘 속에서 갱신해줘야할 w의 방향성과 양을 대략적으로 알 수 있다고 했는데
그림으로 표현해보면 아래와 같다.
- L(y,h(x))를 편미분한 것이 w의 점프거리 갱신량과 대략적으로 비슷하다
- 그래프상 접선의 기울기가 0이라면, 갱신할 것도 없이 w와 거의 같다. 기울기가 가파르다면 갱신량이 많은 안좋은 경우다..
- 정확한 w의 갱신량은 epoch을 통한 loop와 learning_rate가 결정해 줄 것이다.
Loss function에 대해 정리하자면
Regression문제를 - S.L.N.N.로 이용해서 풀 때,
정의한 Loss function( L(y,h(x) = 1/2 ( h(x)-y)^2 )는 0이면 error가 0이라서 좋고, 무한대로 나오면 error가 큰 안좋은 경우다
그러므로 w를 계속 업데이트 시켜서 h(x)-y = 0이 나오도록 만들어야 하는데,
Loss function의 편미분한 값은 w를 찾아가는 점프거리를 반복해서 갱신해주는 방향성과 양(w변화량)을 의미한다.
그래프상으로 접선의 기울기이다.
참고) Regression문제에 쓰이는 Loss function을 MSE(mean square error) = 1/2 ( y_predict - y)^2 이라 한다.
앞으로나올 classification문제에 쓰이는 Loss functiond을 Cross-entropy라 = -y*log(h(x)) - (1-y)log(1-h(x)) 한다. - Cost function은 결국에는 Loss function을 미분하면 되지만, 증명해보자.
- 결과적으로 코드상의 매칭은
h(x) = wx+b ---> y_predict
L(y,h(x))의 편미분 ---> w 의 변화량(점프거리 갱신)의 대략적인 것
J(w,b)의 편미분 ---> w의 변화량(learning_rate = 람다 제외)
그리고 y_predict(예측값)에 해당하는 함수가 hypothesis function이다
Loss function이 하나의 데이터에 관한 얘기라면, Cost function은 전체 데이터에 관한 Loss function이다
실제 데이터를 S.L.N.N.로 분석해보기
어떠한 데이터를 보고서, label 칼럼에 대한 label(predict) 칼럼을 생성할 것이다.
예를 들어, 보스턴 집값에 대한 데이터를 가지고, 집값을 예측하는 알고리즘을 Gradien Desecent(Single-Layer Neural Network)로 만들어서 예측하자.
- numpy와 pandas 패키지를 import한다.
- Dataset을 데이터프레임으로 만든다.
- 데이터 중에 칼럼명만 나열된 칼럼이 있다면, 가져와서 columns인자로 같이 DataFrame으로 만든다.
- 데이터 중 target인 label데이터가 따로 있다면, label만 받아와서 DataFrame의 칼럼으로 추가해준다.
- 만든 데이터는 shape와 head()를 확인한다. - Gradient Descent 기본 코드를 가져와 적용해보자.
- 데이터의 각 feature에 해당하는 칼럼들을 x1, x2로 받자. 각 데이터 수만큼 리스트로 들어갈 것이다.
- for문에 들어가기 전에,
num_epoch과 learning_rate는 기본적으로 시작
w는 feature수만큼 랜덤균등분포로 -1.0 ~ 1.0으로 생성
b는 1개만 랜덤균등분포로 -1.0 ~ 1.0으로 하나 생성
- for문 안에서는 돌면서 더 해피한 값으로 갱신들어야 할 것인
y_predict 계산식이 있다. feature수만큼 수정해준다.
error(예측값- 정답에 절대값씌운 평균)식은 그대로다.
if error < 기준error값: break의 기준error값도 수정해준다.
*기준error값은 해당 데이터의 y(label)을 기준으로 생각해준다.
*만약, 집값 예측이라면, error기준이 5로 주어도, 5000달러(500만원)으로서 에러범위로서는 충분하다.
if epoch 갯수별 print는 0 : 해당epoch과 1: error 수치만 띄워주도록한다.
w값과 b 갱신식을 만들어준다. feature수에 맞게만 만들어주면 된다. - 만일 epoch 100, learning_rate 100으로 시작했는데, error가 줄지않고 늘면서 발산한다면,
- 가장 만만한 것은 learning_rate를 줄여주는 것이다.
*너무 줄이면, w가 없데이트가 안됨->y예측값 그대로->error도 그대로-> 발산 그대로-> 올려줘야함. 다른 것을 수정하더라도 error가 멈쳐있으면 learning_rate를 올려줘야함.
- 1.0 -> 0.1 -> 0.01 -> ...-> 0.00001 식으로 나누기10씩 소수점을 넣어준다.
- 0을 늘려줬는데, 발산하면 다시 0을 줄인다.
- 그다음 마지막 자리수를 1->2->3으로 늘여준다.
- 그다음 epoch을 10000, 100000 씩으로 늘여준다.
- epoch만큼 print 단위와, 자리수배열을 예쁘게 만들어준다.
* 딥러닝은 data에 따라 configuration(hyper-parameter)이 천차만별로 바뀌기때문에 tensorflow코드만 가져온다고해서 실행이 되지않는다. 그러므로 이론을 자세히 공부한 상태에서 응용이 가능하다. - 이제 원하는 기준error수준으로 label이 예측가능해지면, 결과값을 뽑아낸다.
- y_predict식을 가져와서 예측값을 데이터수만큼 확인해본다.
- dataFrame을 .copy()해서 result라는 새로운df에 옮겨담는다.
- y_predict를 데이터의 label예측 칼럼(predict)으로 추가해준다.
Single-Layer Neural Network도 실전에 이용할 수 있다.
real데이터에서도 어느정도 성능이 보장된다.
dot product
지금은 13개의 feature밖에 안되지만, 만약 feature가 300개가 넘어가면 y_predict 식을 작성하기가 쉽지가 않다. 그 때 쓰는 것이 dot product이다.
위의 그림를 보면, y_predict 계산식에서 가로는 x, 세로는 w가 될 것이다.
- feature의 수만큼 생성했던 w를, 한번에 생성해도 된다.(size=13인자)
- X에서는 feature들만 모아놓았기 때문에, y_predict = X(506 ,13).dot(w(13,1))+b 로 한번에 계산된다.
- w를 업데이트해줄 때, 기존은 w = w - learning_rate * ( (y_predict - y)*x).mean()
- feature 데이터만 모아놓은 X에 dot()을 적용하여, 순서대로 앞의 y_predict-y와 곱해져야한다.
- X(506, 13)를 X.T로서 (13, 506)로 바꾸고,
- y_predict - y(506, 1)을 dot하여 (13, 506)dot(506,1) -> (13,1)의 w데이터가 각각 업데이트 될 것이다.
- 이제 .mean()의 개념을 도입하기 위해서, for문전에 num_data = X.shape[0]을 통해 X의 (506, 13)중 데이터의 수를 의미하는 506을 가져와서 나눠준다. - 만약, 공식상에서 나온 행렬의 곱에 dot product를 적용시킬 때, shape가 맞지 않아서 계산이 안된다면,
1) 뒤에놈을 .T로 변형시키고
2) 그놈을 앞으로 빼서 .T.dot( ) 해주면 된다.
예를 들어, X(506데이터, 13feature수) * w(feature수13, output수 1)는 바로 X.dot(w)로 적용이 되지만
w의 업데이트량을 의미하는 y_predict - y ( 506, 1 ) * X(506, 13) 의 계산에서는
1) X.T(13, 506) -- y_predict-y(506, 1) 로 뒤에것을 T.로 뒤집고
2) X.T.dot( y_predict -y ) 로 앞으로 빼서 dot을 적용시킨다.