지금까지 배운 것들의 한계

지금까지는
1. Regression문제해결을 위한 Regression버전의 Single-Layer Neural Network
- input을 넣으면 z(x)가 바로 w1x1 +b형태로 나옴

2. Binary classification 문제해결을 위한 Binary classification 버전의 Single-Layer Neural Network
- classification을 위해서는 h(x)가 0~1의 확률값으로 나와야 0.5를 기준으로 squarshing할 수 있는데,
- h(x)를 변환시키기 위한 sqaursh func인 sigmoid를 z(x)  = w1x1+b에 입힌 sigmoid(z(x))가 h(x)

3. Multi-class classification 문제해결을 위한 Multi-class classification 버전의 Single-Layer Neural Network
- binary classifcation버전에서 h(x)가 여러개가 나오는 경우이다.
- 각각의 output(h(x)) 중 어느 것을 선택할 지에 대한 각각의 확률이 나오도록
- y(label)은 0,1,2순으로 미리 구성이 되어있어야하며 --> one-hot-encoding시킨 y_hot을 구한다.
- y_hot을 정답을 바탕으로 학습하여 도출된 y_predict_hot 버전으로 w를 업데이트한다.
- 정확도 비교를 위해서 y(label)와 y_predic(h(x))는 다시 0,1,2순으로 롤백하도록 argmax(axis=1)를 이용한다.

을 학습하였다.

image

그 가운데,  binary classification버전의 Single-Layer Neural Network를 사용하여,

  • 정답y는 이미 0 or 1의 값을 가지고 있어서,  ( y> 0 ).astyle('int')를 이용해서 0과 1으로 squarshing하였다.
  • 예측값y_predict(h(x))는  Regression버전(무한대의 예측값)--> sigmoid로 0~1값을 가지게 만들고 --> ( y>=0.5).astype('int')를 이용해서 0 or 1로 squarshing 하여 Classification버전으로 바꾸었다.

feature인 x1과 x2의 데이터에 따른 y(label)을 찍어보면, 0일 때는, 보라색 / 1일 때는 노란색으로 그림이 나타났다.
그 기준이 되는 것이 ( y_predict >=0.5 ).astype('int')를 이용하여 sigmoid(h(x))의 결과값들0과 1로 잘라낸  0.5이다.
마치 하나의 선이 있는 것 같아보인다. 그 선의 아래부분에 있는 것들은 y값이 0, 위에 있는 것들이 y값이 1이 나온다.
이러한 기준이 되는 선을 Decision Boundary라고 한다.

이 Decision Boundary의 공식을 유도하고, 그것을 이용해 코드로 시각화 해보자.

먼저, h(x)의 결과가 0or1로 squarshing해주는 기준인, h(x) = 0.5인 지점을 찾아야한다.
image

Decision Boundary는 y_predict = h(x) = 1/2 인 지점인들인데, sigmoid(z(x)) = 1 / 1 + e ^-(z(x)) = 1/2 지점을 찾아야한다.

곧, z(x) = 1이 되는 지점들이다. 즉, w1x1 + w2x2 + b = 1인 지점들이,
classification 문제에서 예측값을 0or1로 판단하는 지점인, Decision Boundary이다.

x1이 주어진다고 가정하면,(x축, 코드상 xx, linspace로 지정해줄 것임)
x2(y축, 코드상 yy)가 - (w1x2 +b)/ w2인 지점들이다.
코드로 표현해주면 아래와 같다.


image

요약)

아~, 그럼 h(x)를 0 or 1로 squarshing 해주는 기준인 1/2 = h(x)지점이 Decision Boundary라고 하고,

Decision Boundary를 그려서 정확히 보라색점(h(x)=0)과 노란색점(h(x)=1)이 나누어지면,
binary classification버전의 Single-Layer Neural Network로 풀어지는 문제구나 생각할 수 있다.

아래의 데이터셋이  S.L.N.N.로 풀 수 있는지 없는지 확인해보자.

1. AND dataset / OR dataset --> Single-Layer Neural Network로 풀자
- 왜냐하면, Decision Boundary가 그려져서 정확히 classification할 수 있으니까.

2.  XOR dataset ===>  Multi-Layer Neural Network 로 풀자.
- 왜냐하면, Decision Boundary가 그려지지 않아서 Single-Layer N.N.로는 classification되지 않으니까.
- feature만 변형하는 방법  / 


어떤 데이터가 주어졌을 때

Single-Layer Neural Network 로 풀 수 있는가 없는가? 를 판단할 때는,

시각화 하여 그래프 상으로  Decision Boundary로 그릴 수 있는가 없는가로

판단하면 된다.

  1. AND DATASET 와  OR DATASET을 Single-Layer N.N.로 풀 수 있는지 없는지 알아보자.
    ( 그래프상에서 점(y_predict)가 1이면 O,   0이면 X로 표시하였다)
    image

  2. XOR DATASET : x1과 x2가 동일하면 0, 다르면 1  --> Decision Boundary를 그리지 못한다. Single-Layer N.N.로 못푸는 문제
    image

Single-Layer N.N.로 풀지못하는 데이터를 풀기 위한 방법

1. dataset 자체를 변형한다.

싱글 레이어 뉴럴 네트워크로 풀지못하는 XOR데이터셋을 변형시켜 풀 수 있도록 해보자.
y는 XOR 데이터 그대로 가져온다. (0 , 1, 1, 0)  x1과 x2를 바꾸는데, AND( x1 !, x2 )  |  AND( x1, x2 !) | y 를 그려보자.
image
이것을 시각화 해보자.

요약하자면)
Single-Layer N.N.로 풀지못하는 문제를 만났을 때,
y(label)은 그대로두고, x(feature)만 어떻게 바꾸면 된다.

이렇게 Single-Layer로 못푸는 문제를 feature를 모조의 수단으로 바꾸어서 Decision Boundary를 그릴 수 있게 바꾸어서 풀 수 있다.

코드를 통해 AND/OR데이터는 w와 b를 잘 학습하여 정확한 accuracy가 나오는지
XOR데이터는 S.L.N.N로 w와 b를 제대로 학습하지못하여 낮은 accuracy가 나오는지 확인해보자.

image

로컬 실습 노트북 파일


feature를 S.L.N.N로 풀수 있게 새로운 feature로 변형하는 과정은.. 기존 Single-Layer N.N. 앞에 하나의 layer가 더 있는 형태이다.
즉, [] [] 의 S.L.N.N.를 ---> [] [] []  가운데 hiden layer를 넣은 형태로서, 맨 마지막 Layer를 S.L.N.N로서 풀면 된다. [] [] []
이후 이러한 새로운 방식의 아키텍쳐를 배울 것이다.


2. feature를 polynomial 방식으로 늘려준다

y = w1x1+w2x2+b의 w와 b를 학습하는데 있어서, x1과 x2가 XOR데이터일 경우  S.L.N.N [] [] 형태로는 잘 풀지 못하였다.
Polynomial 이라는 것은 dataset의 feature인 x1, x2를 서로 곱하거나,  제곱, 세제곱하여 차원을 늘려주는 방식이다.
이론적으로는, 다양한 x, x^2, x^3 ... 중에 decision boundary를 그릴 수 있는 x(feature)가 걸리면 정확하게 예측한다는 내용이다.
코드상으로는 x1, x2, x1^2 = x3, x1*x2=x4, x2^2=x5 까지 만든 뒤, 새로운 polynomial dataset를 S.L.N.N형태로 Gradient Descent를 태워보자.

image

image


3. Multi-Layer Neural Network

Decision Boundary를 그릴 수 없는 것으로 S.L.N.N.로 풀지못하는 문제로 판단한  XOR dataset은

  1. Dataset을 label은 유지한 체, feature를 모종의 방법(flipped & and)으로 뒤집어 변환하기
  2. Dataset을 label은 유지한 체, feature를 Polynomial 방식으로 늘여주

를 통해 해결할 수 있었다. 하지만, 각각의 단점이 있었다. 이러한 문제를 해결하는 방법이 Multi-Layer Neural Network이다.
특히 범용적이었던 Polymonial dataset은 feature가 늘어남에 따라, 메모리를 왕창 잡아먹는 단점이 있었다.
범용적이면서 좀 더 효율적으로 XOR problem을 푸는 방식이 바로 Multi-Layer Neural Network이다.




Multi-Layer Neural Network

Single-Layer Neural Network(perceptron)로 풀지 못하는(Decision Boundary) 그릴 수없는) Data에 대한 해결책으로 나온
Multi-Layer Neural Network(Multi Layer Perceptron)에 대해서 알아보자.

image

Multi-Layer Neural NetworkMulti-Layer Perceptron(M.L.P)는 완전히 동일한 용어다.
Single-Layer N.N.와의 가장 큰 차이점은 hidden Layer가 들어가는것이다. 이 히든 레이어가 M.L.N.N, 딥러닝의 핵심이다.

처음 들어가는 feature + bias를 input Layer, 마지막을 output Layer이라고 하고
각 Layer를 구성하는 것을 neuron이라한다.

hidden Layer의 갯수는 우리가 직접 수정가능하다.

맨 마지막 hidden Layer - output Layer는  input---> weight---> output이 나오는 Single-Layer Neural Network이다.

input Layer - 첫번째 hidden Layerfeature extractor라고 한다. M.L.N.N.의 핵심이다.
- 인풋을 집어넣으면, 알고리즘이 잘 학습됬다는 가정하에, feature를 집어넣으면 그것을 바탕으로
앞부분의 hidden Layer들로 구성된 feature Extractor가  맨 마지막의 Single-Layer N.N.가 classification할 수 있도록 해주는 새로운 feature를  뽑아내주는 역할을 한다.

즉, 다시 말하면 M.L.N.N.는 S.L.N.N.의 앞부분에 hidden Layer가 임의의개수만큼 들어가서
각 hidden Layer들은 새로운 feature들을 층 수 만큼 계속 뽑아내서, 최종적으로는 마지막의 Single-Layer Neural Network가 classification할 수 있는 새로운 feature를 전달해주어서 classification을 끝낼 수 있다.

범용적이었던Polynomial 과는 다르게, hidden Layer와 neuron의 갯수를 자유자제로 조절해줄 수 있기 때문에, 메모리 효율적이다.


hidden Layer가 1개만 있어도 Mulit-Layer Neural Network이며,
hidden Layer가 3개이상을 Deep Learning 이라 한다.


이제 XOR dataset 전용으로 Multi-Layer Neural Network를 그려보자.
image
image
image

위의 내용처럼, feature extracor로 인한 w가 더 늘어난 상황이다.
Gradient Descent를 태우기 위해서, 각각의 w1, w2에 대한 1개의 cost function의 변화량을 알아야, w의 업데이트가 가능해진다.

이러한 문제 - 2개의 w에 대한 1개의 cost functin 편미분(=결국 loss function 편미분)을 해결하기 위한 방법이 하는 back propagation이다.

편미분시 chain rule을 활용하여, 여러개로 쪼개어서 하나하나 구한 뒤, 곱하는 것. 그것이 바로 back progapation이다.

Back propagation( 역전파 알고리즘) for M.L.N.N.의 w,b업데이트량을 구하기 위해 사용하는 기법

back propagation의 공식을 유도해보자. 이 때, cost function과 loss function은 같은 개념으로 본다.


image

먼저 foward propagation을 알아보자.
input(X)을 넣은 다음, 마지막 h(x) ( y_predict)까지 나오는 과정forward propagation이라 한다.




image

forward propagation을 통해 예측값인 h(x)가 구해진다면,
L(y,h(x))를 정의할 수 있게 되고, loss function을 편미분하여 w2를 먼저 구할 수 있게 된다.
w2의 편미분 구해진 것을 이용하면 w1 편미분도 쉽게 구할 수 있게 되는데, w2, w1의 변화량이 구해졌다면
gradient를 태워 w1, w2를 업데이트 할 수 있게 된다. 이러한 과정을 Backpropagation이라 한다.

train은 forward -> back를 한 싸이클로 계속 반복하여 train시킨다.

요약하자면
Input(X, feature) ------> z1-(sigmoid for classification)->a1------->  z2-(sigmoid)->a2 = h(x)forward propagation
h(x)---> L(y,h(x)) ------> w2 변화량 ------>  w1변화량 ----(gradient descent)---> w1, w2, b1, b2 업데이트 : back propagation
my) loss function 은 a2인 h(x)를 가지고 있는 맨 마지막 Singlel-Layer쪽에서만 나오는 용어이다.


w1, w2를 편미분한 w1, w2 변화량을 구하는 것이 중요하다. 공식을 유도하여 코드를 도출해보자.
먼저 single-layer쪽이라서, h(x)-> L(y,h(x)) w2를 편미분하여 w2의 변화량을 구하는데, 편미분 할 때, chain rule을 활용하여 쉽게 계산한다.
그 계산과정에서 어떤 값들을 캐슁해놓으면, w1 편미분도 쉽게 구할 수 있게 된다.


w2에 대한 Loss function의 변화량 과 w1에 대한 것이다.

image


먼저 w2의 변화량을 chain rule을 적용하여 a2, z2를 활용하여 3단계로 나눈뒤, 각각 구하고, 곱해보자.
image
image
image
image


결과적으로, w2변화량 (w2업데이트 량)은  (a2 - y)a1으로 구해졌다.

w1을 구하는데, 총 5개로 쪼개어졌으며, 그 중 앞부분 2개의 미분w2변화량 시 구한 3개의 편미분 중 2개(1,2)가 겹친다..
그리고 마지막 2개는 w2변화량 시 구한 3개의 편미분 과 이름만 a2->a1으로 다르니, 구한것에 이름고, 참고한다.
image


w1, w2에 대한 cost function(loss function)변화량을 알아보았다. 마찬가지로 b2, b1의 변화량도 구해야하지만 생략한다.
결과적으로 여기서의 M.L.N.N.에서 Gradient Descent를 태우기위한 w2,w1,b2,b1의 업데이트 량은 아래와 같다.

image

결론적으로 코드상 캐슁효과를 내기 위해,

  • a2-y 는 전부 겹친다
  • a2-y * w2 * a1 * (1-a1)w1과 b1의 변화량 구할때 겹친다.

두 수식을 Gradient의 for문안에서 backpropagation 부분에 캐슁해놓을 것이다.

참고)
Single-Layer N.N. for Multi-classification (iris dataset문제)에서도 w는 matrix였다.
Multi-Layer N.N.의 w1 과 w2도 기본적으로 matrix( input(feature)수 , output(a1(x) or a2(x) = h(x) 수 ) 
bias도 마찬가지이다. 대신 input은 1개로 고정된다.
image



이제 코드상으로 Multi-Layer Neural Network를 사용하여 XOR_Data를 풀어보자
image
.

로컬 노트북 (실습3 검색)



cf)

여태껏 Single-Layer Neural Network에서는 h(x)가 0~1사이로 나오도록 squarshing해주기 위해 한번만 sigmoid해주었으나,

Multi-Layer neural network에서는 마지막 Single-Layer이외에 앞부분에서도 계속 층마다  z(x) -> sigmoid -> a(x)를 만들어준 이유는?

각 층마다 나오는 output인 a1(x), a2(x), ... 등을 output function을 위한 sigmoid이다.
output function은 덧셈*곱셈밖에 안하는 단순한 딥러닝의 계싼복잡도를 높혀주는 기능정도로 생각하자.
마지막 층인 single-layer에서 사용된 마지막 sigmoid는 0 ~1사이 값으로 변환시켜주는 activation function 중 하나인
squarsh function을 위한 sigmoid이다.


실습 - MNIST(multi-classification) 문제를 Multi-Layer Neural Network로 풀어보자.


MNIST(multi-class classification)을  Multi-Layer N.N.로 풀어보기(로컬)


3회차에서 푼 MNIST by Single-Layer의 정확도는 80%까지 올라갔었다.
MNIST문제(multi-classification) 를 Multi-Layer( 1개의 hidden-Layer 추가 및 노드는 1000개 )로 구성하여 풀어보고, 정확도를 비교해보자.

image

과정)

1. 모듈 import 및 keras.dataset에서 mnist 데이터 가져오기 -> 가져온 데이터의 shape찍어서 확인하기
2. 가져온 데이터의 label( y_train)값을 찍어본 뒤, -> figure,axes에 X_train집어넣었을 때, matshow로 그려지나 확인하기

3. Convolutional N.N.이 아닌 이상, feautre인 픽셀을 가로x세로 -> 하나로 통합하기 위한 reshape해주기
- X_train/X_test ( 데이터수, 가로pixel, 세로pixel ) ---- reshape ---> ( 데이터수, pixel수 = feature수 )
4. y_train(label) / y_test 을 원핫인코딩 해주기
- 그래야 y_predict도 원핫인코딩 형태로 예측값이 나옴.

5. classification 문제이므로
    1) z(x)에 입힐 sigmoid함수 정의
    2) loss 확인용 cross-entropy함수 정의 ->  hot버전의 (actual = y_train_hot, predict = y_predict_hot)이 들어간다.

6. Single-Layer에서 사용하던 Multi-classification버전의 그라디언트 태우는 코드를 가져와서 수정하기
- 임의로 뉴런( = 노드)를 가운데 1000개를 준다고 생각하자.
- w,b 1묶음이 w1, w2, b1, b2 2개의 묶음으로 늘어난다.
- forward propagation부분이 늘어난다. 아직 ont-hot-encoding버전이다.
- bacward propagation부분이 생긴다. 아직 ont-hot-encoding버전이다.
- 정확도 비교는 argmax(axis =1)으로 다시 원래 label형태로 롤백하고 난 뒤 비교한다.( binary문제면, y_predict를 0.5기준으로 squarshing후 비교)
- loss가 올라가는 발산의 상황에서는, 지금수준에서는 learning_rate를 1/10씩
- loss가 왔다갔다하는 오실레이트 상태에서도 learing_rate를 1/10씩 줄여준다. 변화가 보이면 마지막자리수만 올려준다.
- learning_rate가 너무 적으면 weight, bias도 변화가 없어진다.

7.  Train의 Result를 작성하자
- 그라디언트 코드안의 forward propagation 부분(hot버전의 h(x), y_predict_hot ) + armax로 롤백하는 부분(y_predict)까지를 복사해온 뒤 실제값인 y_train과 y_predict로 DataFrame을 만들고, 2칼럼을 비교하여 전체 accuracy를 작성하자.
- 전체 Accuracy + 만든 df.shapehead()를 출력해주자.

8. Test set에 대한 Result는 금방 구할 수 있다.
- 마찬가지로 h(x) + 롤백하는 부분을 복사해온 뒤, train->test로 변수를 모두 변경하자.
- 전체 Accuracy + 만든 df.shapehead()를 출력해주자.


Multi-Layer를 쓰는 순간부터, 계산이 너무 느려진다. --> GPU를 사용하자.

+ Recent posts