https://www.youtube.com/watch?v=cKtg_fpw88c&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=30
Lec10
*) 입력과 출력 층에서 보이지 않는 층을 hidden layer라고 한다.
#unit을 만들다.
#이전 층의 출력 수는 다음 층의 입력 수
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))
# bias의 크기는 각 층의 출력 수만큼
b1=tf.Variable(tf.zeros([5]),name="Bias1")
b2=tf.Variable(tf.zeros([4]),name="Bias2")
b3=tf.Variable(tf.zeros([1]),name="Bias3")
#hypothesis
L2.tf.sigmoid(tf.matmul(X,W1)+b1)
L3.tf.sigmoid(tf.matmul(X,W1)+b2)
hypothesis = tf.sigmoid(tf.matmul(L3,W3)+b3)
기울기 소멸 문제의 해결
1. 시그모이드 대신 ReLU 사용

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

ReLU를 사용하면 cost가 빨리 감소한다.
다양한 Activation Function
ReLU가 잘 작동한다는 것이 알려지자 다른 Activation Function들이 등장함
- tanh : 시그모이드의 단점 극복
- Leaky ReLU
- Maxout
- ELU
Activation function의 정확도

2. Weight 초기화
if 초기값을 모두 0으로 준다면?
미분값을 구했을 때 0이 된다
-> 입력 방향의 가중치가 모두 0이 되어 기울기 소멸 문제가 발생한다.
따라서 가중치를 0으로 주면 안된다.
Hinton (2006) "A Fast Learning Algorithm for Deep Belief Nets"
-Restricted Boatman Machine RBM
1. 값을 그대로 보낸다.(forward/encoder)

2. 가중치를 그대로 곱해서 입력층으로 보낸다. (backward/decoder)

1과 2의 차가 최소가 되도록 weight를 조절한다.
두 층 사이에서 encode와 decode를 반복하며 weight를 조절함
-> deep belief network
Deep Belief Network
두 층 사이에서 encode와 decode를 반복하며 weight를 조절함
->이를 모든 단계의 층에서 반복

여기서 조절된 weight를 통해 weight를 초기화함
(fine tuning이라고 한다. )
Xavier/He initialization
입력과 출력에 따라 초기값을 설정한다.
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)
초기값과 Activation Function에 따른 정확도

Overfitting
1. Overfitting인지 아는 방법?

빨간선은 test 데이터에 대한 error, 파란선은 train 데이터에 대한 error
test 데이터에 대한 error가 줄어들다가 증가하는 경계선 이후가 overfitting
overfiting의 해결방법
- More training data
- reduce the number of features
- Regularization
: cost + $\lambda \sum W^2$
또 다른 방법이 Dropout
2. Dropout

- neural network에서 랜덤한 노드의 가중치를 0으로 설정하여 학습한다.
- 마지막에 전체 노드를 통해 예측한다.
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})
# 학습하는 동안에만 dropout을 시키고 실전에는 모든 노드가 참여해야 한다.
# dropout_rate = 1
EVALUATION:
print "Accuracy:", accuarcy.eval({X: mnist.test.images,Y: mnist.test.labels, dropout_rate: 1})
3. Ensemble

1. 같은 형태의 neural network를 3개 만든다.
2. 각각 학습을 시킨다.
3. 마지막에 합친다.
-> 2~4% 성능 향상
NN Lego Play
1. Fast forward

그림과 같이 출력 값을 다음 층이 아니라 다다음 층에 전달할 수 있음
2. Split & Merge

이런식으로 나누거나 합칠 수 있다.
3. Recurrent network

forward만 하는 것이 아니라 옆으로도 값을 전달한다.
-> RNN
Lec 11 ConvNet
배경
:고양이가 그림을 볼 때 동시에 동작하는 것이 아니라 부분에 따라 다른 신경이 활성된다는 아이디어에서 착안함
Conv 레이어
1. 기본 개념

32x32x3 이미지와 5x5 필터가 있다고 했을 때
- 이 필터를 통해 이미지의 일부분에서 하나의 숫자(특징)를 만들어낸다.
- one number = Wx+b = ReLU(Wx+b)
- 필터를 옆, 아래로 움직이며 전체 이미지에서 특징을 만들어낸다.
- input : 7x7, filter : 3x3, stride :1 일때
(stride = 움직이는 칸 수)



- 이런식으로 필터를 움직인다.
- 이때 output 은 5x5
- output 크기 계산 방법 : $((input size - filter) / stride)+1$
- input : 7x7, filter : 3x3, stride :2 일때
output = ((7-3) / 2)+1 = 4/2 +1 =3
output = 3x3
- 이런식으로 계속 필터를 적용하면 이미지의 크기가 작아진다 -> padding 사용
- padding : 이미지의 외부 테두리에 0인 값을 준다.

- padding의 목적
1. 이미지가 급격하게 작아지는 것을 막는다.
2. 테두리라는 것을 알린다.
- padding : 1, input : 7, filter 3, stride: 1
- output = ((input + 2*padding) - filter) / stride +1 = (7+2-3)/1+1=6/1+1=7
- output = 7x7
2. Convolution layers

-input : 32X32x3
- filter 여러개를 동시에 적용시켜 activation maps를 만든다.
- activation maps : 깊이는 6, 크기는 28x28
- activation maps에 filter를 다시 적용한다.
Pooling layer(sampling)

- conv layer 에서 한 레이어를 뽑고, 그 레이어에서 특정한 값을 뽑아 resize한다.
- 이를 다른 레이어들에 대해서 반복하여 pooling layer를 만든다.
1. Max Pooling
- filter를 적용하여, 한 filter 내에서 최대 값을 선택한다.

Fully Connected Layer
- conv, relu, pool을 원하는 대로 쌓는다.
- 마지막 출력을 일반적인 neural network에 넣고, 마지막 출력에 softmax를 적용하여 하나의 label를 출력한다.
ConvNet의 예
- LeNet-5

- AlexNet
: input 227x227x3 images
처음으로 ReLU를 사용함
7 CNN ensemble: 18.2% -> 15.4%
-GoogleNet

inception module
- ResNet
error : 3.6%
fast forward 개념 사용
Lec 12 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, 모든 RNN에 대해 function이 동일하다.
$h_{t-1}$ : old state
$x_t$ : input vector at some time step
Vanilla RNN
$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$
Character-level language model example
- Vocabulary: [h,e,l,o]
- Example training sequence "hello"
- 문자열 하나를 입력했을 때 그 다음에 오는 단어를 예측하고 싶다.
- one hot encoding을 통해 문자열을 표시함
(one hot encoding : 각 문자열에 해당하는 자리만 1로 표시함)

- 옆의 결과 값에 가중치를 곱한 값과 입력 값에 가중치를 곱한 값을 더하여 학습을 진행한다.
-> 이전의 값을 잘 기억하게 된다.
- hidden layer의 값에 가중치를 곱해서 결과값을 낸다.
- 이 output layer값에 softmax를 적용하여 값을 결정한다.
- cost 값을 통해 학습을 진행한다.
RNN application
- Language Modeling
- Speech Recognitaion
- Machine Translation
- Conversation Modeling/Question Answering
- Image/Video Captioning
- Image/Music/Dance Generation
다양한 형태의 RNN


RNN을 훈련하는 데 어려움이 있음
-> LSTM, GRU
'STG 퀸트고 (딥러닝 기초) > 딥러닝 기초 (모두의 딥러닝 시즌1)' 카테고리의 다른 글
| Lec 7 ~ 9 (0) | 2021.12.27 |
|---|---|
| Lec 4 ~ 6 (0) | 2021.12.26 |
| 모두의 딥러닝 Lec00~03 (0) | 2021.11.08 |