이번 포스팅은 김성훈 교수님의 '모두를 위한 딥러닝 강좌 시즌1'의 8~12강을 듣고 정리한 글입니다.
[DL Lec 08] - 딥러닝의 기본개념 : 시작과 XOR 문제
뇌의 뉴런이 동작하는 형태를 기계로 구현하는 것에서 시작되었다. 과거, AND GATE와 OR GATE를 선형으로 풀게 되면서, 가능성을 매우 긍정적으로 생각했다. 하지만, XOR GATE를 해결할 수 없게 되면서, 주춤하게 된다.
x1 | x2 | OR |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
<OR GATE>
x1 | x2 | AND |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
<AND GATE>
x1 | x2 | XOR |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
<XOR GATE>
- Backpropagation : 최종적으로 예측한 error를 구해서 학습을 시키자는 생각에서 시작되었다.
- CNN의 기원 : 어떤 사진을 보여주었을 때, 뇌가 동작하는 것을 살펴보아하니 일부 부분들을 담당하는 신경망들이 조합되는 것이 아닌가라는 생각을 했다.
- 사진을 부분부분 본 후, 다음 레이어로 보내어 최종적으로 합치는 것으로 동작한다.
[DL Lec 09] - XOR문제 딥러닝으로 풀기
XOR GATE는 가중치 벡터와 편향 벡터의 값이 위의 사진과 같은 값으로 나타낸다면, 해결할 수 있다. 물론, 위의 사진에서 주어진 가중치와 벡터 값 이외의 값을 이용해서도 XOR GATE를 풀 수 있다.
[DL Lec 10-1] - sigmoid보다 ReLu가 더 좋아
딥러닝의 층을 깊게 하려면, 각각의 weight와 bias를 주면 된다. 단, 이때 matrix 형태를 잘 맞추어 주어야 한다.
따라서, input과 output만 잘 설정하고 hidden은 마음대로 형태만 맞추면 된다.
*bias는 output 형태와 같은 형태를 가진다.
하지만, 층을 깊게하더라도 결과가 안좋게 나오는 경우는 왜 그럴까?
sigmoid gate를 통과하면 0~1 사이의 값만 곱해져서 작은 값이 되므로 순전파 (forward propagation)이 계속 될수록 값이 작아져서 0에 가까운 값이 되기 때문이다. 이런 경우를 vanishing gradient라고 부른다.
ReLU는 vanishing gradient를 해결하기 위해 등장했다.
- Relu
- $x , x >= 0 $
- $0, x < 0 $
- 다음과 같이 표현 가능함 -> $max(0, x)$
따라서 Neural Net에서는 ReLu를 사용하면 된다고 하셨다. 하지만, 마지막 layer의 출력을 위해서, 마지막 Activation (활성화 함수)는 sigmoid를 사용한다.
[DL Lec 10-2] - 초기화 잘 해보자.
- 초기값은 0으로 주지마라.
- Restricted Boatman Machine (RBM)을 이용 -> Deep Belief Nets
- Restricted Boatman Machine (RBM)
- Forward Propagation (순전파)의 값과 Back Propagation (역전파)의 값의 차이를 줄여가는 방법으로 weight를 구한다.
- weight를 따로 설정하지 않고 RBM을 통해, weight를 구했다. (2006년 논문)
- Xavier initialization
- code : w = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
- fan_in : 이전 layer(input)의 노드 수, fan_out : 다음 layer의 노드 수
- Xavier Normal Initialization
- $ W ~ N(0, Var(W)) $
- $ Var(W) = \sqrt \frac{2}{n_{in} + n_{out}} $
- $n_{in} : 이전 layer(input)의 노드 수, n_{out} : 다음 layer의 노드 수$
- Xavier Uniform Initialization
- $ W ~ U(-\sqrt \frac{6}{$n_{in} + {n_out}}, +\sqrt \frac{6}{n_{in} + {n_out}})$
- $n_{in} : 이전 layer(input)의 노드 수, n_{out} : 다음 layer의 노드 수$
- $ W ~ U(-\sqrt \frac{6}{$n_{in} + {n_out}}, +\sqrt \frac{6}{n_{in} + {n_out}})$
- code : w = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
- He's Initialization
- code : w = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in / 2)
- fan_in : 이전 layer(input)의 노드 수, fan_out : 다음 layer의 노드 수
- He Normal Initailzation
- $ W ~ N(0, Var(W)) $
- $ Var(W) = \sqrt \frac{2}{n_{in}} $
- $n_{in} : 이전 layer(input)의 노드 수$
- He Uniform Initialization
- $ W ~ U(-\sqrt \frac{6}{$n_{in}}, +\sqrt \frac{6}{n_{in}})$
- $n_{in} : 이전 layer(input)의 노드 수$
- $ W ~ U(-\sqrt \frac{6}{$n_{in}}, +\sqrt \frac{6}{n_{in}})$
- code : w = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in / 2)
[DL Lec 10-3] - Dropout과 앙상블
- Overfitting (과적합) : train dataset에 과하게 학습되어 새로운 data set에 성능이 낮게 나오는 현상
- Layer를 상당히 깊게 한다면, Overfitting 가능성이 높아진다.
- Overfitting 해결법
- More training data : 더 많은 학습 데이터를 수집한다.
- Regularization (정규화) : 모델에 규제를 주어 일반성을 띄게하는 방법
- Dropout : Random 하게 뉴런들을 멈추는 방법
- 단, 학습하는 동안에만 Dropout을 사용하고 모델을 평가하거나 모델을 사용할 때에는 Dropout한 것이 아닌 전체를 불러와야한다.
- Ensemble : 똑같은 Neural Net을 여러개 만든 후, 학습을 시키고 합친다.
[DL Lec 11-1] - Conv Net의 Conv 레이어 만들기
- Conv (Convolutional Network) : 전체 이미지 중 일부만 발췌한 것
<Start with image (width x height x depth)>
- filter는 해당 크기만큼을 추출하여 한 장만 뽑아낸다.
- *단, image의 depth와 filter의 depth는 같아야한다.
- stride : 필터를 움직이는 칸의 크기
- output size : (N-F) / stride + 1
- N : 이미지의 weight or height
- F : 필터의 크기
- output size : (N-F) / stride + 1
- padding : 기존의 weight, height 크기를 늘려주는 것
- padding이 1이면, 위 아래 + 양 옆에 2씩 늘어난다.
- 그림이 급격히 작아지는 것을 방지함 (정보의 손실 방지)
- image에 filter를 적용하는 횟수에 따라 결과 이미지가 달라진다.
[DL Lec 11-2] - Conv Net Pooling (sampling)과 Full Network
1 | 1 | 2 | 4 |
5 | 6 | 7 | 8 |
3 | 2 | 1 | 0 |
1 | 2 | 3 | 4 |
위의 표와 같은 이미지가 존재한다고 할 때, 필터의 크기가 2x2, stride가 2, max pooling을 적용한다면, 다음과 같은 결과가 나온다.
*max pooling은 필터를 적용할 때, 가장 큰 값을 추출하는 것이다. min pooling은 최소값 추출이 된다.
6 | 8 |
3 | 4 |
[DL Lec 12] - NN의 꽃 RNN 이야기
- RNN : Recurrent Neural Net
- Sequence data (series data) : 이전의 연산 or data가 영향을 미치는 것
- $h_t = f_w(h_{t-1}, x_t)$
- $h_t$ : new state
- $f_w$ : same function with parameters $W$
- $h_{t-1}$ : old state
- $x_t$ : input vector same timestamp
- $h_t = tanh(w_{hh}h_{t-1} + w_(xh)x_t)
- *$f$가 $WX$라고 가정
- 출력값은 지정한 $W$에 따라 갯수가 다르게 나온다.
- $y_t = W_{hy}h_t
- Notice : the same function and the same set of parameters are used at evrey timestamp
'Data Science > DL' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝1] 퍼셉트론 (0) | 2021.06.30 |
---|