티스토리 뷰
[PyTorch] Lab-09 ReLU, Weight initialization, Dropout,Batch Normalization
터보건 2019. 6. 10. 19:36ReLU
- Problem of Sigmoid
> Sigmoid function은 gradient가 saturated되는 문제를 가지고 있다.
> 파란색 부분은 gradient가 잘 구해지는 반면에 빨간색 부분은 gradient가 0에 가까운 작은 값으로 구해진다.
> Backprob을 통해서 앞 단으로 gradient가 잘 전달 되어야 하는데 0에 가까운 아주 작은 gradient을 전달하다(곱하다)보니 소멸하는 현상이 발생한다. (Vanishing Gradient)
- ReLu
> ReLu는 Vanishing Gradient문제를 일부 해결해준다. > 파란색 영역에서 gradient는 1이기에 x의 값이 양수인 부분에선 Vanishing gradient가 발생하지 않는다.
> ReLU이외에 다양한 activation function이 존재한다. (tanh, leaky relu)
linear1 = torch.nn.Linear(784, 32, bias=True)
linear2 = torch.nn.Linear(32, 32, bias=True)
linear3 = torch.nn.Linear(32, 10, bias=True)
relu = torch.nn.ReLU()
model = torch.nn.Sequential(linear1, relu, linear2, relu, linear3).to(device)
Weight initialization
> Weight initialization이 잘된다면 학습이 잘되고, 모델의 성능이 뛰어나지게 된다.
> weight를 0으로 초기화하는 방법이 존재하지만 모든 gradient값이 0 되면서 vanishing gradient이 발생하게 된다.
> 위의 문제가 일어나지 않는 여러가지 Weight initialization이 등장하기 시작했다.
- Restricted Boltzmann Machine
> 제약 사항: layer 내에선 connection이 없다. layer 간에는 connection이 있다.
> X에서 Y를 예측하는 weight를 찾은 뒤, 다시 Y에서 X`을 예측하는 weight를 찾는다.
> pre-training, Fine-training 두 가지 과정으로 나누어진다.
> Pre-training : 두 layer 사이에서 weight를 학습 -> 고정 -> 앞 단의 두 layer 사이에서 다시 weight학습, layer의 개수에 따라 과정을 반복한다.
> Fine-training : 학습된 weight을 가지고 전체 모델에서 학습을 진행한다.
- Xavier / HE initialization
> 무작위로 initailization을 하는 것이 Normalization을 이용해 layer의 특성에 맞게 initialization 실시
torch.nn.init.xavier_uniform_(linear1.weight)
torch.nn.init.xavier_uniform_(linear2.weight)
torch.nn.init.xavier_uniform_(linear3.weight)
Dropout
- Overfitting
> Underfitting : 주어진 데이터를 충분히 학습하지 못하여 낮은 성능을 보인다.
> Overfitting : 주어진 데이터를 과도하게 학습하여 높은 성능을 보인다. 그러나 unseen data에 대해서는 좋은 성능을 보이지 못한다.
> Train set에서는 잘 훈련이 되어 있어 classifier가 빨간점과 파란점을 잘 구분하게 된다.
> 그러나 Train set에서 학습한 classifier를 Test를 적용하였을 때는 error률이 높다.
> 적절하게 학습된 초록색 classifier는 Train set에서 overfitting모델보다 낮은 성능을 보이고 있지만 Test set에서는 overfitting 모델보다 좋은 성능을 가지고 있다.
- Dropout
> 학습을 진행시, drop out probability에 맞춰 노드(정점, 꼭지점)들을 비활성화 해준다.
> 비활성화되는 node들은 임의(random)로 정해진다.
> Drop out은 overfitting을 방지하고, 매번 랜덤하게 node들이 선택되기에 매번 다른 형태의 모델로 학습하는 효과를 가진다.(즉, network ensemble 효과)
linear1 = torch.nn.Linear(784, 32, bias=True)
linear2 = torch.nn.Linear(32, 32, bias=True)
linear3 = torch.nn.Linear(32, 10, bias=True)
relu = torch.nn.ReLU()
dropout = torch.nn.Dropout(p=drop_prob)
model = torch.nn.Sequential(linear1, relu, dropout,linear2, relu, dropout,linear3, relu, dropout)
Batch Normalization
- Internal Covariate Shift
> Layer가 더 깊어질수록 고양이 이미지 분포가 왜곡 되는 현상을 보이고 있다.
> 고양이 이미지 분포가 왜곡이 되면 이미지를 고양이로 인식하지 않는다.
- Batch Normalization
> Layer가 깊어질수록 분포가 왜곡 되는 현상을 막기 위해서 각 layer들마다 Normalization을 하여 변형된 분포가 나오지 않도록 한다.
> Normalization을 하면 activation function의 Non - linearity 성질을 잃게 되는 경우가 발생한다. 이를 보완하기 위해서 Normalization값에 gamma를 곱하고 beta를 더한 뒤 back-prop 과정에서 gamma와 beta를 학습시켜준다.
linear1 = torch.nn.Linear(784, 32, bias=True)
linear2 = torch.nn.Linear(32, 32, bias=True)
linear3 = torch.nn.Linear(32, 10, bias=True)
relu = torch.nn.ReLU()
bn1 = torch.nn.BatchNorm1d(32)
bn2 = torch.nn.BatchNorm1d(32)
bn_model = torch.nn.Sequential(linear1, bn1, relu,linear2, bn2, relu,linear3).to(device)
> Batch Norm을 사용하였을 때 좋은 결과를 보여준다.
참고링크:
'모모딥 시즌2 정리' 카테고리의 다른 글
[PyTorch] Lab-10 Convolution, VGG, RESNET (0) | 2019.09.02 |
---|---|
[PyTorch] Lab-08 Perceptron, Multi Layer Perceptron (0) | 2019.09.02 |
[PyTorch] Lab-07 Tips, MNIST Introduction (0) | 2019.06.04 |
[PyTorch] Lab-06 Softmax Classification (0) | 2019.06.04 |
[PyTorch] Lab-05 Logistic Regression (0) | 2019.06.02 |