ABOUT ME

Today
-
Yesterday
-
Total
-
  • 모두를 위한 딥러닝 - 정리 (7~12)
    공부/머신러닝 2021. 3. 22. 02:42

    모두를 위한 딥러닝 : www.youtube.com/watch?v=BS6O0zOGX4E&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=2

    lecture만 정리


    lec 07 - 1 : Learning rate, Overfitting, 그리고 일반화 (Regularization)

    Gradient descent : 

    $- \alpha \triangle L(w_1, w_2) $

    - $ \alpha $ : Learing rate

    • Learning rate를 잘 정해야 함
    • Learning rate가 너무 크면 overshooting 발생 (cost값이 줄어들지 않고 발산하게 됨)
    • Learning rate가 너무 작으면 너무 오래 걸리고, local minimum에서 멈출 수도 있음

    Learning rate 정하기 - 보통 초기값으로 0.01을 많이 둠

     

    Data값의 차이가 큰 경우에는 normalize 할 필요성이 있음

    • zero-centered data : 데이터의 중심이 0이  될 수 있도록
    • normalized data : 어떤 형태의 도면에 항상 들어가도록 normalize

     

    Standardization

    normalization 방법 중 하나

    $x'_j = {x_j - \mu _j \over \sigma _j}$

     

    python

    X_std[:, 0] = (X[:, 0] - X[:,0].mean()) / X[:,0].std()

     

    Overfitting

    머신 러닝의 가장 큰 문제 중 하나

    학습을 통해 모델을 만드는데, 학습 데이터에 너무 잘 맞는 모델이 생기면 테스트 데이터에는 적합하지 않게 될 수 있음

     

    Overfitting을 줄이는 법

    • 트레이닝 데이터가 많을 수록 줄어듦
    • feature의 개수 줄이기
    • Regularization

     

    Regularization

    너무 큰 weight 값을 가지지 말자

    weight를 줄여서 그래프 모양을 좀 평평하게 하자...

     

    $L = {1 \over N} \sum_i {D(S(WX_{i}+b),L_i)} + \lambda \sum W^2$

     

    $\lambda \sum W^2$ 추가 : W^2를 줄이기 

    $\lambda $ : regularization strength (값에 따라 중요도 -> 0이면 regularization 안 쓰겠다.. 값이 크면 regularization중요하다는 것)

    l2reg = 0.001 * tf.reduce_sum(tf.square(W))

     

     


    lec 07 - 2 : Training/Testing 데이터 셋

    data를 가지고 ML model을 학습 시키는데, 이 model이 얼마나 훌륭한지를 어떻게 평가할까?

    data를 training data set과 test data set으로 나눔

    • training set으로 학습을 시키고
    • test data set으로 모델의 예측값과 실제 값을 확인
    • training set을 다시 training set과 validation set으로 나누기도 함 :
      • validation을 가지고 변수(learning rate, $\lambda$ ) 튜닝

     

    Online learning : 데이터를 한번에 학습시키는 것이 아니라 n묶음으로 나누어 학습시킴

    -> 데이터가 추가되는 경우 모든 데이터를 다시 학습시키는 것이 아니라 추가적인 데이터만 학습시킬 수 있음

     

     


    lec 08-1 : 딥러닝의 기본 개념

     Activation Functions : 값들의 합이 기준값 이상이면 1, 이하면 0이라는 신호로 출력

     

    첫번째 침체기

    (Simple) AND/OR 문제를 기계가 예측할 수 있도록 하는 것이 중요한 문제였음 => linearly separable 했음. 가능했음

    (Simple) XOR 문제 => 어떤 linear한 선을 그어도 구분이 불가능했음

    => 7-80년대에 Back propagation을 통해 해결

     

    Convolutional Neural Networks : 그림을 한 번에 다 학습시키는 것이 아니라 부분부분 잘라서 보낸 후 나중에 한 번에 합치기

     

    두번째 침체기

    BIG problem :  여러 layer인 경우 Back propagation 성능이 떨어지게 됨

     

    2006, 2007 :

    초기값을 잘 준다면 깊게 신경망을 구축하여 복잡한 문제를 풀 수 있음

     

    Imagenet challenge : 오류 2n% 에서 3%로 떨어짐

     

     


    lec 09-1 : XOR 문제 딥러닝으로 풀기

    하나의 logistic regression 유닛으로는 XOR 문제를 풀 수 없음

    여러 unit을 합치면 해결 가능 (NN)

     

    XOR using NN

    이 3개의 unit으로 해결 가능함

    Forward propagation

    그림처럼 하나의 neural network이 됨

    $K(x) = sigmoid(X_1 W_1 + B_1)$

    $ \bar{Y} = H(X) = sigmoid(K(X)W_2+b_2) $

     

    K = tf.sigmoid(tf.matmul(X, W1) + b1)
    hypothesis = tf.sigmoid(tf.matmul(K, W2) + b2)

    lec 09-2 : 딥네트웍 학습 시키기(back propagation)

     

    lec 09-1 그림에서, $W_1, W_2, B_1, B_2 $를 어떻게 학습할 수 있을까?

     

    Back propagation

    예측값과 실제값을 비교하여 나온 오류를 뒤에서부터 앞으로 돌려 미분값과 실제로 조정해야 할 것을 계산함

    각 w, x, b가 f에 미치는 영향을 미분값으로 표현함

     

    1. forward (w = -1, x = 5, b = 3)
      • 학습데이터의 실제 값을 가지고 그래프에 값을 입력시켜
      • => g = -10, f = -7
    2. Backward
      • backward로 실제 미분의 값 계산
      • ${\partial g \over \partial w} = x, {\partial x \over \partial g} = w $
      • ${\partial f \over \partial g} = 1, {\partial f \over \partial b} = 1$
      • ${\partial f \over \partial w} = {\partial f \over \partial g}\cdot{\partial g \over \partial w} = 1*5 = 5$
      • ${\partial f \over \partial x} = 1*(-2) = -2$

    더 복잡한 경우

    Back propagation 이므로 가장 마지막 노드부터 계산해나가면 됨

    Back propagation in TensorFlow : TensorBoard

    hypothesis = tf.sigmoid(tf.matmul(L2, W2) + b2)
    
    #cost function
    cost = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis))

    lec 10-1 : Sigmoid보다 ReLU가 더 좋아

    Review : NN for XOR

    W1 = tf.Variable(tf.random_uniform([2,5], -1.0, 1.0))
    W2 = tf.Variable(tf.random_uniform([5,4], -1.0, 1.0))
    W3 = tf.Variable(tf.random_uniform([4,1], -1.0, 1.0))
    
    b1 = tf.Variable(tf.zeros([5]), name = "Bias1")
    b2 = tf.Variable(tf.zeros([4]), name = "Bias2")
    b2 = tf.Variable(tf.zeros([1]), name = "Bias3")
    
    #Our hypothesis
    L2 = tf.sigmoid(tf.matmul(X, W1)+b1)
    L3 = tf.sigmoid(tf.matmul(L2, W2) + b2)
    hypothesis = tf.sigmoid(tf.matmul(L2, W3) + b2)

    Back propagation :

    2단, 3단은 학습이 잘 되는데 늘어나면 학습이 잘 안 됨

    => Vanishing gradient : 단수가 깊어질수록 초반 단은 최종값에 영향을 거의 미치지 않게 되는 문제

    sigmoid는 항상 1보다 작으므로 ReLU라는 activatio function을 쓰자

     

    ReLU

    Rectified Linear Unit

    L1 = tf.nn.relu(tf.matmul(X, W1) + b1)

     

    이외에도 다양한 activation functions가 존재함 (sigmoid, tanh, ReLU, Maxout, ELU, Leaky ReLU)

     

     


    lec 10-2 : Weight 초기화 잘 해보자

    • 초기값은 0이면 안 됨
    • RBM을 사용하여 초기화 시킨 것을 Deep Belief Nets라고 함
      • 두 개의 단만 보고 encode와 decode를 반복하여 초기값이 내가 준 값과 유사하게 나오는 weight를 학습 시키고, 그 다음 단으로 가고 그 다음 단으로 가면서 학습을 시킴
    • Xavier/He initialization :
      • 입력값(fan_in)과 출력값(fan_out)의 개수에 따라 
    #Xavier initialization
    #Glorot et al. 2010
    W = np.random.randn(fan_in, fan_out)/np.sqrt(fan_in)
    
    #He et al. 2015
    W = np.random.randn(fan_in, fan_out)/np.sqrt(fan_in/2)

    lec 10-3 : Dropout과 앙상블

    Overfitting 문제

    - 학습 데이터를 통한 정확도와 테스트 데이터 셋의 정확도 간의 괴리가 큰 경우

    • Layer가 많아질수록 training dataset을 통한 error는 계속 떨어지나, test dataset을 통한 error는 떨어졌다가 다시 늘어남

    Overfitting문제의 해결책

    • 더 많은 training data
    • (feature를 줄이기)
    • Regularization

    Regularization

    weight를 너무 크게 하지 말자

    $L = {1 \over N} \sum_i {D(S(WX_{i}+b),L_i)} + \lambda \sum W^2$

    l2reg = 0.001 * tf.reduce_sum(tf.square(W))

     

    Dropout

    Neural Networks를 연결해놓고, 학습할 때 몇 개의 연결을 끊는 것

    랜덤하게 쉬게 해서 훈련을 시키는 것

    dropout_rate = tf.placeholder("float")
    _L1 = tf.nn.relu(tf.add(tf.matmul(X, W1), B1))
    L1 = tf.nn.dropout(_L1, dropout_rate)
    
    #TRAIN : 
    sess.run(optimizer, feed_dict={X: batch_xs, Y: batch_ys, dropout_rate: 0.7})
    
    #EVALUATION : 
    print "Accuracy:", accuracy.eval({X: mnist.test.images, Y: mnist.test.labels, dropout_rate: 1})

    dropout 레이어로 보내고, dropout 레이어에 있는 걸 다음 레이어로 보내는 것

    주의 사항 : 학습하는 동안에만 dropout 시키는 것이므로 실전에는 dropout_rate : 1로 하여 쉬는 노드가 없도록 해야 함

     

    Ensemble

    독립적인, 같은 형태의 Neural Network를 만든 후 마지막에 합치는 것

    최소 2% ~ 4,5%까지 향상 가능


    lec 10-4 : 레고처럼 네트워크 모듈을 마음껏 쌓아보자

    • Feedforward neural network : 입력을 주면 층층이 쌓아 결과를 뽑아내는 것
    • Fast forward : 중간 출력을 뽑아 두 단 앞에 추가 시키는 것
    • Split&merge : 여러 갈래로 나누어서 가다가 나중에 합쳐지는 형태
    • Recurrent network(RNN) : 옆으로도 한 번 나가보자!


    lec 11-1 : ConvNet의 Conv 레이어 만들기

    • 이미지를 부분부분 자름 -> ReLU -> Conv -> POOL 등 반복하여 최종 결과를 얻음
    1. 이미지가 있다고 가정(32*32*3 image)
    2. 이미지의 일부분만 처리하고 싶으므로 (5*5*3)filter를 만듦 -> 한 필터는 한 값을 만들어 냄
      1. =Wx + b or = ReLU(Wx+b)
    3. 옆으로 옮겨가며 다른 부분을 가림 -> 하나의 필터로 전체 이미지를 훑음
      1. 몇 개의 값을 모을 수 있을까? 
      2. stride : 옆으로 한 번 옮길때 이동하는 크기
      3. (N - F)/stride + 1
      4. Padding : filter를 적용하면 output의 크기가 input의 크기와 달라짐. -> 이미지 크기를 늘려서 원래 입력 이미지와 출력 이미지가 같아지도록
    4. 다양한 filter를 적용해가며 output을 받음 => Convolution Layer 거치면 activation maps
    5. CONV, ReLU를 반복 적용 가능

    lec 11-2 : ConvNet Max pooling과 Full Network

    Max pooling

    Pooling layer (sampling) : conv layer에서 한 layer만 뽑아내어 resize하는 것 -> 각 layer마다 적용하여 다시 합침

    Max pooling : filter를 사용한 이미지에 대해 가장 큰 값을 골라내는 것

    Fully Connected Layer

    Conv, ReLU, Pool을 어떤 순서로 쌓을 것인가? 마지막에 pooling을 하고 나온 값을 원하는 만큼의 깊이에 Fully connected network에 넣어 마지막 softmax classifier을 통해 여러 레이블 중 하나를 고르는 형태로 구성

     


    lec 12 : NN의 꽃 RNN 이야기

    Sequence data

    • 음성인식, 자연어 등
    • 이전에 말했던 단어를 통해 지금 말을 이해하는 것
    • NN/CNN은 못함

     

    이전 연산이 다음 연산에 영향을 미친다

    $h_t = f_w (h_{t_1}, x_t)$

    • $h_t$ :new state
    • $f_W$ : some function with parameters W
    • $h_{t-1}$ : old state
    • $x_t$ : input vector at some time step

    state를 계산할 때 이전 state가 사용된다는 것이 중요함. 모든 step에서 function과 파라미터는 똑같음

     

    $h_t = f_w (h_{t_1}, x_t)$

    $h_t = tanh(W_{hh}h_{t_1}+W_{xh} x_t)$

    $y_t = W_{hy}h_t$

     

    RNN applications

    • Language Modeling
    • Speech Recognition
    • Machine Translation
    • Conversation Modeling/Question Answering
    • Image/Video Captioning
    • Image/Music/Dance Generation

    RNN 형태를 여러가지로 유동적으로 구성 가능

    '공부 > 머신러닝' 카테고리의 다른 글

    Kaggle - House Price  (0) 2021.04.05
    Kaggle - Titanic  (0) 2021.03.30
    모두를 위한 딥러닝 - 정리 (1~6)  (0) 2021.03.13

    댓글

Designed by nanometre380.