Programming

Neural Network의 기초 with Pytorch

VL_HD 2020. 2. 21. 21:45

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