Stack Building

[스크랩] 모두를 위한 딥러닝 정리 본문

딥러닝

[스크랩] 모두를 위한 딥러닝 정리

S00ahKim 2019. 9. 9. 14:10

[머신러닝]

supervised learning

정답이 있는 트레이닝 데이터로 트레이닝 하여 label(cat/dog/mug/hat)을 나눔(regression;연속된 값중 답 찾기, classification;pass/nonpass,학점과 같은 개수가 정해진 답 찾기)

unsupervised learning

정답없는 데이터를 받아 어떤 패턴에 따라 데이터를 나눔(google news grouping, clustering)

 

[머신러닝 프로세스]

training data set -> ML algorithm -> (training) -> (model) -> 특정 x input, 미지의 y output

 

[tensorflow]

tensor는 노드를 나타내고 이런 노드의 흐름으로 머신러닝을 하기때문에 이름이 tensorflow 다.

 

[linear regression]

데이터셋에 맞는 직선(가설)을 찾아 새로운 x를 데입하여 y를 찾는 것.

hypothesis(가설) : H(x) = Wx + b (W는 Weight, b는 bias)

cost cunftion : cost(W,b) = 1/m * sum( ( H(x(i)) - y(i) )^2 )

                       -> 이것을 최소로 하는 가설의 W와 b를 찾는다

gradient descent algoritm(minimize cost function) : cost function을 그래프로 그려보면 밥 그릇 모양 이므로, 그래프의 특정 위치에서 시작하여 미분으로 기울기를 구하고, 그 기울기를 반영한 값을 현재 위치(W,b)에 적용(빼기)하기를 반복해서 기울기가 0(cost가 가장적은)이 나오는 (W,b)를 찾는다.ㅜ우선 단순하게 b를 배제한 W에 대해서만 생각해보면..(W만 있으면 2차원 밥 그릇, b까지 있으면 3차원 밥 그릇 모양)

W := W - a * a/aW * cost(W)

W := W - a * 1/m * sum( W(x(i)) - y(i) ) * x(i)

식을 보면 W에 cost를 미분한 경사를 빼고 있다. 경사가 - 면 + 방향으로 + 면 - 방향으로 점점 이동한다. a는 얼마만큼의 스텝으로 경사를 내려갈까 하는 learning_rate 라고 한다(동영상을 보면 보통 0.001(softmax), 0.1(그 외) 인 듯)

 

[multi-variable linear regression]

실제 변수(피처)가 하나인 선형회귀는 쓸모가 없다(모든 현상에는 여러가지 변수가 적용하므로)

   [b w1 w2 w3] * [ 1  = [b * 1 + w1 * x1 + w2 * x2 + w3 * x3]

                           x1

                           x2

                           x3

                          ]

   => H(X) = WX, 가로 세로가 달라서 싫으니까 W를 세로로만들면 H(X) = W^T * X3

cost function 및 minimize cost function algorithm 은 같음

 

[logistic classification]

pass/nonpass 문제는 linear regression 가설로 적당하지 않다(데이터 분포가 두단계로만 나누어져 쭉 나타나기 때문에 최소화 직선을 찾기 어렵다). linear regression의 값을 0~1사이에 값으로 치환해주는 함수가 필요

 

logistic function or sigmoid function : g(z) = 1 / (1 + e^-z) => 우리 가설을 z에 넣어 새로운 가설을 만들면 linear regression의 가설이 sigmoid 형태로 0~1 사이로 나온다 => H(X) = 1 / (1 + e^-(W^T * X))

 

cost function : linear regression cost function 을 사용하면 울퉁불퉁한 밥 그릇 모양이 되서 사용할 수 없게 된다(e의 영향). 따라서 다른 cost function 이 필요

                   c(H(x), y) = -log(H(x))    : y = 1 일 때는 이 식을 사용,

                                  = -log(1-H(x)) : y = 0 일 때는 이 식을 사용

그래프로 보면 위 식은 H(x)가 1일 때 cost가 0, 0일 때 cost가 무한대로 증가하고, 아래 식은 그 반대이다. 깔끔하게 if 분기를 없애기 위해서 c(H(x), y) = -ylog(H(x)) -(1-y)log(1-H(x)) : y에 0 또는 1을 대입해보면 위의 수식과 같아짐(0*를 이용한 방법)

 

최종 cost function : c(W) = -1/m * sum( ylog(H(x) + (1-y)log(1-H(x)) )

minimize cost는 linear regression과 동일한 gradient descent algorithm이다. 단, 가설 부분(cost fn 부분)만 교체된다.

 

[softmax regression(multinomial classification)]

binary classification 은 그래프에서 반 나눠서 분류하는 것이고, multinomial classification은 여러번 나누어서 A와 not A, B와 not B, C와 not C 각각에 대해 개별적으로 cost를 구해 어느 것이 선택될 활률이 높은지 확인한다.

hypothesis(softmax function) : S(y(i)) = e^y(i) / sum( e^y(i) )

cost function(Cross-Entropy) : D(S, L) = -sum( L(i) * log(S(i)) ) = sum( L(i) * -log(S(i)) ) ; S는 예측 값, L은 실제 값. 여기에서 -log(S(i)) 값은 logistic 에서 나왔던 예측 값이 1일 때, cost가 0, 예측 값이 0일 때, cost가 무한으로 증가하는 그래프이다.

 

[learning rate]

gradient descent algoritm 에서 a 값이 learning rate 이다. 이 값은 얼마만큼 간격으로 경사를 오르 내릴 것인가 하는 것이다. 너무 a가 크면 cost 최소지점을 넘어가버리고, 결국엔 그래프 밖으로 나가게 된다. 이를 overshooting 이라 한다. 너무 a가 작으면 cost 최소지점을 찾기전에 traning이 끝나버릴 수 도 있다. 일반적으로 0.01로 시작해보고 작동하는 걸 지켜본후 조절하자.

 

[data preprocessing]

x1, x2 가 있을 때, cost 그래프는 보통 정원형의 3D 밥 그릇 모양이지만, x1과 x2의 값의 차이가 큰 데이터인 경우 옆으로 눌린 모양의 밥 그릇이 된다. 이런경우 learning rate을 잘 잡아도 그래프 밖으로 튈 수 가(overshooting) 있다. 따라서 값 들을 일저아게 변형할 필요가 있는데, 그 방법 중 하나가 normalization(정규화) 이다.

 

[overfitting]

학습 데이터에 너무 심하게 딱 맞게 모델을 만들어서, 학습 데이터에서는 잘 되지만 실제 데이터가 들어오면 잘 안되는 것을 overfitting 이라 한다. 데이터에 너무 딱 맞게 그래프를 구부려서 나타나는 현상이다.

overfitting을 없애는 방법으로는

   1) 트레이닝 데이터를 많이 확보한다.

   2) 중복데이터 등의 피처 개수를 줄인다.

   3) regularization(일반화)를 한다. regularization은 cost 함수에 term을 추가하는 것이다.

      cost fn = cost fn + r(람다) * sum(W^2)

각 앨리먼트(W)에 제곱을 하여 구부림을 핀다. 람다는 상수이며, 0인 경우 regularization을 안하겠다는 뜻이고, 클 수록 regularization에 비중을 두겠다는 이야기다. 이렇게 cost fn을 재정의 해서 최소 값을 구하면 된다.

 

[training and test set]

training set(교과서)의 몇 %를 빼서 test set(시험)으로 사용한다. 또 training set의 일부를 빼서 validation set(모의고사)로 사용할 수 있다(learning rate(알파), regularization의 강도(람다)를 튜닝하는 목적으로 사용).

online learning : 큰 데이터 셋(예, 100만개)을 한번에 학습하지 않고, 작게 나누어(예, 10만개씩) 순차적으로 트레이닝하는 기법으로 cost는 각각 구하는 것이 아니라 각 나온 cost를 m(100만개/10만개=10만개)으로 나눈 누적합을 구하고 그것을 cost로 삼는다.

 

[neural network]

우리 뇌의 뉴런은 어떤 입력(x)을 받아 가중치(w)를 곱하고, 이를 합(sum)한 후 편향(b)을 더해 나온 값이 일정 값(activation function)을 넘으면 다음을 활성화(1), 안넘으면 비활성화(0) 한다. 각 input w(i)x(i)들이 다음의 여러 output에 동시다발적으로 물린다. 이를 그림으로 그리면 우리가 흔히 보는 뉴럴넷의 모습이다.

OR, AND는 linear(sum(wx)+b)모델로 풀 수 있지만, XOR는 linear모델로 풀 수 없다. 해결법이 나왔는데,

- Backpropagation : 잘못된 값이 나왔을 때, 역으로 뉴럴넷을 타고 들어가 w들을 수정한다(피드백). 실제문제를 풀려면 굉장히 많은 레이어가 필요한데 Backpropagation으로는 성능이슈가 굉장히 컸다.

- Convolutional Neural Network : 어떤 입력 하나를 여러개의 부분으로 쪼개서 학습시킨다(알파고도 이걸 썼고, 이 알고리즘으로 구글 이전에 자율주행자동차 개발 됐었음). 

 

[deep learning]

앞 부분에서 W를 잘 주면 기존 뉴럴네트워크의 문제를 해결할 수 있다는 논문이 발표(2006년)되고, 많은 발전을 이루었다. 하지만 뉴럴네트워크가 워낙 인기가 없고, 이미지가 안좋아서 deep learning 이라는 새로운 이름을 지어 사람들의 관심을 끌었다.

 

[xor]

XOR 문제는 하나의 뉴런유닛으로는 풀 수 없었다. 하지만 뉴런유닛 여러 개(2개 이상)를 합치면 풀 수 있다. 그런데 그럼 각 뉴런유닛의 W와 b를 어떻게 학습하냐 하는 문제가 제기됐다(이번 예제에서는 우리가 지정한 W와 b로 하지만, 자동적으로 각 W와 b를 어떻게 구하는가 하는 문제가 남은 것 이다(back propagation으로 품)).

hypothesis(가설) :

   K(X) = sigmoid( XW1 + B1 )

   Y_ = H(X) = sigmoid( K(X)W2 + b2 )

 

[미분]

미분은 순간변화율을 나타낸다. 함수 f(x)의 순간변화율은 d/dx * f(x) 이렇게 표현할 수 있다(d/dx가 미분한다는 뜻). d/dx * f(x) = lim(△x->0) * ( ( f(x+△x)-f(x) ) / △x ) => △x가 0에 가깝게 변할 때, f(x)는 얼마만큼 변하는가(f(x)의 순간변화율)

partiol derivative : 내가 관심있는 것만 미분하고, 나머지는 상수로 본다(표현 : ∂f / ∂x (x만 신경쓰겠다))

 

[back propagation(chain rule)]

다음과 같은 식의 뉴런유닛이 있다.

   f = wx + b

   g = wx (미분하면 : ∂g/∂w = x, ∂g/∂x = w)

   f = g + b (미분하면 : ∂f/∂g = 1, ∂f/∂b = 1)

1) x=-2, x=5, b=3 과 같은 값이 주어졌으면 아래와 같은 그래프를 그리고 앞에서 부터 계산해 나간다(forward)

2) 그 다음 거꾸로 미분해 나가면서 각 W의 영향도를 구한다(backward)

 

[tensor board]

tensor board : 데이터를 비주얼하게 보여주는 tensorflow 내장 툴

 

[ReLU]

NN 에서는 sigmoid 같은 함수를 activation function 이라고 부른다. 첫 번째 레이어를 Input layer, 마지막 레이어를 Output layer, 중간 레이어들은 Hidden layer 라고 부른다. Hidden layer를 9개나 쌓고 돌려봤더니 정확도가 0.5 밖에 안나온다(지난번 2개보다 못한 결과) back propagation이 많은 레이어에서는 학습이 안되는 문제가 발생

 

back propagation은 chain rule로 ∂f/∂x = ∂f/∂g * ∂g/∂x 와 같이 거꾸로 미분 값을 곱해나가는 방식을 쓰는데, sigmoid는 1보다 작은 값들이고, 0.001과 같이 작은 값도 많이 나오는데 이를 곱하다 보니, 뒤로 갈 수록 아주 작은 수가 되어버린다. 이것은 앞으로 갈 수록 결과에 영향을 미치지 못한다는 것을 의미하고 이는 곧 예측이 불가능 하다는 뜻이다. 이 문제를 vanishing gradient(경사 사라짐) 문제 라고 부르는데, 이 때문에 NN에 2차 위기가 찾아왔고, 힌튼 교수님의 해결법은, 문제의 원인이 sigmoid 이기 때문에 다른 activcation function을 사용하는데, 그것이 ReLU(Rectified Linear Unit, ReLU = MAX(0, x))다. ReLU의 그래프는 0보다 작으면 0으로 꺼버리고, 0보다 크면 x축이 증가하는데로 쭉 linear하게 증가한다. 마지막 레이어(Output layer)는 sigmoid를 써야한다(결과를 위해 0~1 값이 필요하기 때문에). 그 이후 다양한 activation function 이 나왔다(Leaky ReLU, Maxout, ELU, tanh 등).

 

[weight 초기화]

같은 코드라도 초기 weight를 랜덤으로 -1~1 사이 값을 주기 때문에 cost 그래프가 달라진다. 초기 W값을 0으로 주면 chain rule 할 때 곱하기 때문에 전부 미분 값이 0이 되어버린다. hinton 교수님이 초기화에 대한 논문을 내셨다. Restricted Boatman Machine(RBM)이라는 방법으로 이 방법을 쓴 딥러닝을 Deep Belief Nets 이라고 한다.

RBM : 2단 레이어가 x -> □ -> □ -> y 이렇게 있을 때, forward로 값을 구해놓고(x * w), 이번엔 반대로 x_ <- □ <- □ <- y_ 나온 결과에 w을 곱해서(y_ * w) 나온 값 x_와 x의 차이가 최소가 되도록 w의 초기 값을 잡는다.

여기서 앞으로 가는 것을 encode, 뒤로 가는 것을 decode 라고도 한다. 몇 겹의 레이어가 있을 때, 앞에서 부터 2단계만 따로 이 방법으로 W을 구하고, 그 다음 단계로 2단씩 넘어가며 계속 구하는 방법이다. 이렇게 하는 것을 pre-tranning, 실제로 트레이닝 하는 것은 이미 w이 잘되어있어 쉽게 트레이닝 된다고 해서 fine tuning 이라고도 한다. 하지만 이것은 복잡한데, RBM을 안 쓰고도 잘 되는 방법이 나왔다.

xavier initialization : rand(in_count, out_count) / sqrt(in_count)과 이를 조금 개량한 더 잘되는 he’s initialization : rand(in_count, out_count) / sqrt(in_count / 2)

한 퍼셉트론의 in, out의 개수에 따라 초기화 하는 방법이다.

 

[dropout & ensemble]

netwrok이 deep 할 수록 overfitting될 가능성이 높다. 이런 overfitting을 제거하는 방법은 지난번에 3가지를 이야기 했었다. 그 중 대표적인 것이 regulariztion 이었다. 또 한가지 방법으로 dropout이 있다. dropout이란, 랜덤하게 일부 뉴런들을 쉬게하고 트레이닝 한 후 실전에서는 모두 투입하는 방법이다. dropout rate는 보통 0.5로 한다고 한다. 예제에서는 0.7(30%는 쉼)로 했다. ensemble(앙상블)은 같은 데이터를 개별 뉴럴넷에서 각각 학습시키고, 그 결과들을 모아 하나의 모델로 합치는 방법이다.

 

[레고블록 같은 deep learning]

feedforward NN : 그냥 쭉 일자로 쌓는 방법

fast forward : 중간 결과를 다음 뉴런이 아닌, 더 앞에있는 뉴런으로 보내는 방법

split & merge : 나눠서 처리하다가, 모아서 하나로 처리하다가 하는 방법 또는 그 반대 또는 복합

recurrent netwrok : 일자가 아닌 옆으로도 붙여서 여러방향으로 연결시키는 방법

결론 : 레고블록 처럼 자유롭게 뉴런들을 구성할 수 있다.

 

[optimizer]

우리가 지금까지 써온 cost optimizer는 gradient descent 인데, 사실 이것보다 좋은 알고리즘이 많다. 그 중 현재까지 알려진 가장 좋은 알고리즘은 adam(아담) 이다.

 

[convolutional neural network]

고양이 실험에서 착안 됨 : 고양이 눈이 어떤 그림을 볼 때, 그림의 각 부분을 나누어 뉴런들이 각각 입력을 받음 이미지에 filter를 씌워 각 부분을 부분적으로 읽어들이는 방법이다. 이미지 크기(7x7)보다 작은 filter(3x3)를 씌우면 그 부분(3x3)에서 1개의 점을 도출 한다(x1~x5, w1~w5, WX+b => ReLU(WX+b) = Y_) w들은 filter가 가지고 있고, 다야안 w을 가지는 filter 여러장을 적용할 수 도 있다. 이미지 width * height * color(3) 이 있을 때, filter(예, 3x3)를 적용하여 한 행에 c = (N - F) / stride + 1 만큼 이동하면서 부분적으로 처리, 따라서 cxc만큼의 점이 나옴. N은 이미지의 길이, F는 filter의 길이, stride는 몇 칸만큼 filter를 이동할 것 인가에 대한 변수. 이미지가 점점 작아져서 패딩을 하기도 한다(겉을 특정 값(0 등)으로 감싸 이미지 크기와 동일하게 만듬) W 개수는 filter(5x5x3) 6장이면, 5*5*3*6개 이다.

 

[maxpooling]

pooling : 각 layer를 resize(sample) 하여 다시 쌓는 것

maxpooling : pooling도 filter를 적용하는데, 각 filter에 포함된 값 중 가장 큰 값을 뽑아 샘풀링하는 방법

 

[여러 NN 구성]

Le-Net

AlexNet : 첫 딥러닝 이미지 넷 우승

GoogLeNet

ResNet : 이미지넷 3.6% 에러율, 사람 5%보다 적음

 

[RNN(Recurrent Neural Network)]

sequence data / time series 를 대상으로 하는 NN

h(t) = fw( h(t-1), x(t) ) => (WX) => h(t) = tanh( W(hh)*h(t-1) + W(hx)*x(t) ) , tanh은 sigmoid와 같음 activation function , h(t)는 다음 전달 값. 각 결과 값이 몇 개의 벡터가 될 것인지느 W의 사이즈에 따라 결정됨.

 

RNN 활용 : 자연어처리 분야, 번역, 봇, 코딩, 시/소설 작문 등. RNN의 사용목적에 따라 다양한 형태의 Net을 구성한다. RNN의 단점을 극복하여 나온 것에는 Long Short Term Memory(LSTM)과 GRU가 있고, 보통 일반 RNN은 사용하지 않고 이것들을 사용한다.

 

[출처] http://blog.daum.net/kwy2000/64

'딥러닝' 카테고리의 다른 글

[pytorch] 시작하기  (0) 2019.08.31
신경망 기초  (0) 2019.08.27
신경망 공부하면서 궁금한 것들 셀프 질답 2  (0) 2019.08.25
신경망 공부하면서 궁금한 것들 셀프 질답  (0) 2019.08.24
딥러닝 기초  (0) 2019.06.04
Comments