반응형

안녕하세요. 오늘은 RNN을 Pytorch로 직접 구현해보고, Tanh(hyperbolic tangent) 대신, Sigmoid나 ReLU를 사용하면 어떻게 되는지 실험을 한 번 해보겠습니다. 

 

www.youtube.com/watch?v=tlyzfIYvMWE&list=PLSAJwo7mw8jn8iaXwT4MqLbZnS-LJwnBd&index=26

제가 Pytorch를 처음 공부할 때 위 영상을 많이 참고 했습니다. 

 

Pytorch를 처음 공부하시는 분이시라면, 위 딥러닝 홀로서기 Pytorch Kist 영상을 보시는 걸 추천드립니다. 

 

자료도 아낌없이 GIt에 올라와 있고, 라이브 코딩을 하면서 수업이 진행되기 때문에 접근하는 노하우를 기를 수 있다고 생각합니다. 

 

코드는 위 영상 GIthub의 자료를 수정한 내용입니다. 

 

우선 RNN(Recurrent Neural Network)에 구조 대해 이야기 해보겠습니다. 

 

RNN은 Input과 Output을 Sequence 단위로 처리하는 네트워크 구조입니다. 

 

일반 신경망과 달리 순환 신경망은 Cell 부분이 순환하게 됩니다.

Hidden Layer는 바로 이전 Hidden Layer의 입력을 현재 입력으로 사용하는 것이 가장 큰 특징입니다.

 

이런 RNN의 순환 구조 때문에 시계열 데이터에 가장 많이 사용되고 있습니다. 

 

위 구조는 간단한 식으로 표현할 수 있습니다.

 

그렇다면 activation function인 tanh 말고, 지금 가장 많이 사용한다는 ReLU를 사용하면 안될까 라는 궁금증이 생겼습니다. 

 

Sigmoid의 미분의 최대값이 0.25이기 때문에, Deep해질수록 Vanishing Gradient 가 발생합니다. 

 

Vanishing 문제를 해결하기 위해 만든 것이 Tanh 입니다. 

 

Tanh는 0~1인 Sigmoid 확장판이며, 미분의 최대값이 1로 Vanishing Graidient를 해결합니다. 

 

ReLU는 -1~1을 반환하는 Tanh 대신, x가 0보다 크면 그대로 값을 보내게 되어, 속도와 학습률이 향상됐습니다.  

 

하지만, RNN의 내부는 계속 순환하는 구조로 값이 1보다 크게 되면, ReLU 특성상 값이 발산할 수 있기 때문에 적합하지 않다고 합니다.   

 

그렇다면, 간단한 데이터에서 발산하지 않는 환경에서 ReLU를 사용하게 된다면 어떻게 될지 궁금했습니다. 

 

위 영상의 Git 코드를 사용했으며, 학습이 실패한 영상입니다. 

 

수정을 하진 않고, 코드를 그대로 사용했으며, 활성화 함수만 바꿔가면서 학습 결과를 확인했습니다. 

 

import torch
import torch.nn as nn


class RNN(nn.Module):
    def __init__(self, input_dim, output_dim, hid_dim, batch_size): 
        super(RNN, self).__init__()
        
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.hid_dim = hid_dim
        self.batch_size = batch_size
        
        self.wx = nn.Linear(self.input_dim, self.hid_dim, bias=False)
        self.wh = nn.Linear(self.hid_dim, self.hid_dim, bias=False)
        self.wy = nn.Linear(self.hid_dim, self.output_dim, bias=False)
        self.act_fn = nn.Tanh()  # nn.Sigmoid() nn.ReLU() nn.LeakyReLU() 
        
        self.hidden = self.init_hidden()
        
    def init_hidden(self, batch_size=None):
        if batch_size is None:
            batch_size = self.batch_size
        return torch.zeros(batch_size, self.hid_dim)
    
    def forward(self, x):
        h = self.act_fn(self.wx(x) + self.wh(self.hidden))
        y = self.wy(h)
        return y, h

대략 이런 그런 그림이 그려집니다. 분명 Loss 전부 떨어졌으나 모델 성능은 별로 인 것 같습니다. 

 

ReLU가 조금이나마 따라가는 듯하나 값을 예측을 하지 못했습니다. 

 

그래서 LeakyReLU를 사용해 또 결과를 확인 했습니다. 

 

Sinc함수???

LeakyReLU를 사용했을 땐, Sinc 함수가 그려졌습니다. 

 

궁금증을 해결하고자 활성화함수를 바꿔가면서 학습을 시켰으나 오히려 궁금증이 더 커졌습니다.

 

이 부분은 좀 더 공부를 해봐야 할 것 같습니다... 딥러닝 고수분들 피드백 부탁드립니다. 

728x90
반응형
반응형

안녕하세요.

 

오늘은 딥러닝에서 가장 많이 사용되는 ReLU를 통해 비선형함수와 선형함수의 차이점을 알아보겠습니다.

 

ReLU 함수

머신러닝에서 선형함수를 통해 회귀문제를 해결할 수 있게 되었고, 더 복잡한 문제를 풀기 위해 비선형 함수 Sigmoid, Tanh, ReLU를 나오기 시작합니다. 

 

현재까지 복잡한 문제를 딥러닝 분야에서 ReLU를 사용하는 것은 당연시 되고 있습니다. 

 

바로, 본론으로 들어가겠습니다.

 

TesorFlow, Keras, Pytorch를 통해 ReLU를 사용하는 것은 굉장히 간단합니다. 

 

신호 및 시스템의 개념적 이야기로 가보겠습니다.

 

ReLU는 왜 비선형 함수일까요?

 

 

 

선형 시스템비선형 시스템의 차이

 

선형성을 가지고 있으면 선형 시스템이고, 그 외는 비선형 시스템입니다.

 

선형성을 가지는 조건은 무엇일까요?

 

세 가지의 조건을 충족하면 선형성을 가진다고 이야기할 수 있습니다. 그 외에는 비선형 시스템으로 분류할 수 있습니다.

 

 

 

 

1. 선형적인 그래프

x = 0 에서 꺽이는 구간을 제외하고 전 구간이 선형성을 가지지만, (x =0) 부분 때문에 선형성을 가진다고 할 수 없습니다. 

 

부끄럽지만, 저는 꺾이는 부분을 제외한 전 구간이 부분 선형형태를 띄우니 선형 함수가 맞지 않나라는 생각을 해 공부를 해서 찾아보았습니다.

 

2. 동차성 ( f(ax) = a * f(x) )

 

ReLU를 간단히 설명하면, x가 0보다 작으면 f(x) = 0, x가 0보다 크면 f(x) = x 입니다. 이를 f(x) = max(0, x)라 표현하겠습니다.

 

 

① a = 3으로 가정하면, 

 

f(3x) = 3x

3 * f(x) = 3x

 

f(3x) = 3 * f(x)  = 3x

 

② a = -3 으로 가정하면

 

f(-3x) = -3x

-3 * f(x) = -3x

 

f(-3x) = -3 * f(x)  = -3x

 

ReLU는 동차성이 성립함을 알 수 있습니다.

 

 

 

 

3. 가산성 ( f(x1 + x2) = f(x1) + f(x2) )

 

x1 = -1, x2 = 2 라고 가정하면,

 

f(-1+2) = 1

 

f(-1) = 0,

f(2) =2 

f(-1) + f(2) = 2

 

f(-1+2) != f(-1) + f(2)

 

ReLU는 가산성이 성립하지 않음을 알 수 있습니다.

 

ReLU는 동차성은 성립하지만, 가산성이 성립하지 않아 선형성을 가지지 않으므로 비선형 함수임을 알 수 있었습니다. 

728x90
반응형
반응형

 

 

 

https://openaccess.thecvf.com/content_cvpr_2017/papers/Chollet_Xception_Deep_Learning_CVPR_2017_paper.pdf

 

안녕하세요.

 

Xception 논문 리뷰 2회차입니다. 

 

1회차 논문리뷰로 An Extreme version of Inception module이 Depthwise Separable Convolution까지 소개했습니다.

 

아래 전 편의 글을 읽는 것을 추천드립니다.

 

https://coding-yoon.tistory.com/78?category=825914

 

[딥러닝 논문 리뷰] Xception: Deep Learning with Depthwise Separable Convolutions (feat.Pytorch)(1)

안녕하세요. 저번 Depthwise Separable Convolution 기법에 대해 글을 올렸습니다. 오늘은 이 기법을 사용한 Xception 논문에 대해 리뷰하도록 하겠습니다. https://openaccess.thecvf.com/content_cvpr_2017/html..

coding-yoon.tistory.com

 

An Extreme version of Inception module과 Depthwise Separable Convolution는 굉장히 비슷한 형태를 가지고 있습니다.

 

논문에서 소개하는 두 개의 차이점을 설명하고 있습니다.

 

Two minor differences between and “extreme” version of an Inception module and a depthwise separable 
convolution would be:

“extreme” version of an Inception module과 depthwise separable 
convolution의 두 가지 사소한 차이점은 다음과 같습니다.

 

 

 

1. Order(순서)

• The order of the operations: 
depthwise separable convolutions as usually implemented (e.g. in TensorFlow)perform first channel-wise 
spatial convolution and then perform 1x1 convolution, whereas Inception performs
the 1x1 convolution first.

Depthwise Separable Convolution : Depthwise Convolution(3x3, 5x5 ...), Pointwise Convolution 

An Extreme version of Inception module : Pointwise Convolution , Depthwise Convolution(3x3, 5x5 ...)

 

Convolution의 순서가 다르다고 합니다.

We argue that the first difference is unimportant, in particular because these operations are meant
to be used in a stacked setting.

 

스택 설정에서 사용되기 때문에 순서의 차이점은 중요하지 않다고 합니다.

 

 

 

2. Non-Linearity(비선형성)

• The presence or absence of a non-linearity after the first operation.
In Inception, both operations are followed by a ReLU non-linearity, however depthwise separable 
convolutions are usually implemented without non-linearities.

ReLU(비선형)의 유무.

 

Inception은 Convolution 수행이 후 ReLU가 붙는 반면, 

 

일반적으로 Depthwise Separable Convolution는 ReLU가 없이 구현됩니다. 

 

The second difference might matter, and we investigate it in the experimental section 
(in particular see figure 10).

 

ReLU의 유무는 중요하며, Figure 10에서 실험 결과를 보여줍니다.

 

Depthwise Separable Convolution에서 ReLU를 사용하지 않았을 때 더 높은 Accruacy를 보여줍니다.

 

It may be that the depth of the intermediate feature spaces on which spatial convolutions are applied 
is critical to the usefulness of the non-linearity:

 for deep feature spaces (e.g. those found in Inception modules) the non-linearity is helpful, 
 but for shallow ones (e.g. the 1-channel deep feature spaces of depthwise separable convolutions) it becomes harmful, 
 possibly due to a loss of information.

 

깊은 특징 공간의 경우, ReLU가 도움이 되지만  얕은 공간( 1x1 Convolution )에서는 ReLU에 의해 정보 손실이 생길 수 있기 때문에 사용하지 않는 것이 좋다는 결과입니다.

 

다음 글은 Xception의 Architecture에 대해 설명하고, Pytorch로 구현함으로 글을 Xception 논문 리뷰를 마치도록 하겠습니다. 피드백주시면 감사하겠습니다.

728x90
반응형

+ Recent posts