-
모두를 위한 딥러닝 - 정리 (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에 미치는 영향을 미분값으로 표현함
- forward (w = -1, x = 5, b = 3)
- 학습데이터의 실제 값을 가지고 그래프에 값을 입력시켜
- => g = -10, f = -7
- 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 등 반복하여 최종 결과를 얻음
- 이미지가 있다고 가정(32*32*3 image)
- 이미지의 일부분만 처리하고 싶으므로 (5*5*3)filter를 만듦 -> 한 필터는 한 값을 만들어 냄
- =Wx + b or = ReLU(Wx+b)
- 옆으로 옮겨가며 다른 부분을 가림 -> 하나의 필터로 전체 이미지를 훑음
- 몇 개의 값을 모을 수 있을까?
- stride : 옆으로 한 번 옮길때 이동하는 크기
- (N - F)/stride + 1
- Padding : filter를 적용하면 output의 크기가 input의 크기와 달라짐. -> 이미지 크기를 늘려서 원래 입력 이미지와 출력 이미지가 같아지도록
- 다양한 filter를 적용해가며 output을 받음 => Convolution Layer 거치면 activation maps
- 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