티스토리 뷰

ReLU

  • Problem of Sigmoid

image

> Sigmoid function은 gradient가 saturated되는 문제를 가지고 있다.

> 파란색 부분은 gradient가 잘 구해지는 반면에 빨간색 부분은 gradient가 0에 가까운 작은 값으로 구해진다.

image

> Backprob을 통해서 앞 단으로 gradient가 잘 전달 되어야 하는데 0에 가까운 아주 작은 gradient을 전달하다(곱하다)보니 소멸하는 현상이 발생한다. (Vanishing Gradient)


  • ReLu image

> 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

image

> 제약 사항: layer 내에선 connection이 없다. layer 간에는 connection이 있다.

> X에서 Y를 예측하는 weight를 찾은 뒤, 다시 Y에서 X`을 예측하는 weight를 찾는다.

image

> pre-training, Fine-training 두 가지 과정으로 나누어진다.

> Pre-training : 두 layer 사이에서 weight를 학습 -> 고정 -> 앞 단의 두 layer 사이에서 다시 weight학습, layer의 개수에 따라 과정을 반복한다.

> Fine-training : 학습된 weight을 가지고 전체 모델에서 학습을 진행한다.


  • Xavier / HE initialization

image

> 무작위로 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

image

> Underfitting : 주어진 데이터를 충분히 학습하지 못하여 낮은 성능을 보인다.

> Overfitting : 주어진 데이터를 과도하게 학습하여 높은 성능을 보인다. 그러나 unseen data에 대해서는 좋은 성능을 보이지 못한다.

image

> Train set에서는 잘 훈련이 되어 있어 classifier가 빨간점과 파란점을 잘 구분하게 된다.

> 그러나 Train set에서 학습한 classifier를 Test를 적용하였을 때는 error률이 높다.

image

> 적절하게 학습된 초록색 classifier는 Train set에서 overfitting모델보다 낮은 성능을 보이고 있지만 Test set에서는 overfitting 모델보다 좋은 성능을 가지고 있다.

image

  • Dropout

image

> 학습을 진행시, 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

image

> Layer가 더 깊어질수록 고양이 이미지 분포가 왜곡 되는 현상을 보이고 있다.

> 고양이 이미지 분포가 왜곡이 되면 이미지를 고양이로 인식하지 않는다.


  • Batch Normalization

image

> 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)

image

> Batch Norm을 사용하였을 때 좋은 결과를 보여준다.



참고링크:

[PyTorch] Lab-09-1 ReLU

[PyTorch] Lab-09-2 Weight initialization

[PyTorch] Lab-09-3 Dropout

[PyTorch] Lab-09-4 Batch Normalization

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함