1. Basic Layer
아주 기초적인 neural network부터 시작해보겠습니다.
먼저 nn(neural network)에서 가장 기본적인 Linear layer 부터 보겠습니다.
Linear layer는 입력데이터에 선형변환 을 한 후 결과를 출력하는 layer입니다.
여기서 선형 변환이란 일반적으로 이야기 하는 Y = Wx + b 를 나타냅니다.
Y는 linear layer의 output이 될것이고, W는 가중치, x는 입력, b는 bias입니다. 이를 코드로 나타내 보면 아래와 같습니다.
이 코드에서 Linear라는 함수는 torch.nn 에 포함되어 있습니다. (torch.nn.Linear)
Linear의 parameter를 한번 봅시다.
Linear 함수는 크기가 10인 tensor를 입력으로 받고, 선형변환을 적용한 후 크기가 5인 tensor로 변환하여 출력합니다.
마지막 parameter는 bias 인데 이는 bool값을 가지고 있습니다. 쉽게 이야기하면 bias = True로 설정해 놓으면
Y = Wx + b 선형변환이 될 것이고, 그렇지 않으면 Y = Wx 단순 weight와 입력의 곱으로 나타낼 수 있습니다.
Pytorch의 장점은 위와같은 layer의 weight와 bias가 어떤 값을 가지고 있는지 볼 수 있습니다.
볼 수 있는 방법은 간단합니다. myLayer.weight, myLayer.bias를 입력해 보면 확인 해볼 수 있습니다.
Linear layer의 문제점
Linear layer의 문제점은 아주 명확합니다.
W1 = 2, W2 =3 를 가지고 있는 2층의 Linear layer block과 W3 = 6 인 Linear layer를 생각해봅시다. 이는 같은 연산을 수행합니다. (Bias가 없다는 가정.) 쉽게 보기위해 식으로 나타내 봅시다.
Linear layer Block : Y = 2(3X)
Linear layer : Y = 6X
이와 같이 layer의 수는 많아졌지만, 정작 연산되어 나타난 결과는 같은 것을 볼 수 있습니다.
이를 해결 하기 위해서는 non - linear function을 이용해야 합니다.
non linear function은 여러개가 있지만 그중에 대표적으로 사용되는 것은 다음과 같습니다.
-
Sigmoid
-
Tanh
-
ReLU
-
Leaky ReLU
각각의 특징을 간단하게 설명 해 보면, 먼저 sigmoid는 최근에는 거의 사용하고 있지 않습니다. 그 이유는 함수 자체의 기울기에 있는데, 입력값이 크면 클수록 1에 수렴하게 되고, 작을수록 0에 수렴하기 때문입니다.
이는 backprop에 의해 기울기가 거의 0 이 되는 상황이 되기 때문에 거의 사용하지 않습니다. 이러한 단점을 극복하기위해 대신 쓰이는 함수는 Tanh 함수입니다.
ReLU와 Leaky ReLU는 이름에서도 알 수 있듯이 서로 매우 비슷합니다.
ReLU는 0이하의 값들을 모두 0으로 출력하고, 양수의 입력값은 입력값 그대로 출력값으로 내보내게 됩니다.
Leaky ReLU는 0 이하의 값이 입력으로 들어왔을때 아주 작은 음수의 값으로 출력하게 된다. 양수일 때는 ReLU와 같다.
최근에는 Sigmoid 와 Tanh보다 ReLU를 더 많이 사용한다.
ReLU의 장점은 다음과 같습니다.
-
Optimizer가 더 빨리 올바른 weight를 찾도록 돕습니다. ReLU는 SGD가 더 빨르게 올바른 값으로 수렴 할 수 있도록 돕는 역할을 합니다.
-
computational cost가 굉장히 저렴합니다. singmoid나 tanh와 같은 함수들에 비해 매우 연산이 간단합니다.
하지만 단점으로는 back prop.을 진행하면서 기울기가 큰 값을 ReLU에 전달하게 되면 종종 응답이 없어지는 Dead Neural 현상이 일어 나게 됩니다. 후에 논문 리뷰에도 작성 하겠지만, 이러한 현상을 막기 위해 ReLU6 ( 최대값을 6으로 제한하는 ReLU)와 같은 함수들을 사용하기도 합니다.
이상 첫 포스트를 마치겠습니다.
'Programming' 카테고리의 다른 글
[re] 라이브러리 (0) | 2020.03.21 |
---|---|
[Argparse] 라이브러리 (0) | 2020.03.01 |
Neural Network의 기초 - 2 with Pytorch (0) | 2020.02.21 |