728x90

ResNet(2015)

Layer가 깊어지면서 성능도 개선됨을 보였다. 이후 depth 증가에 관한 많은 연구가 진행되었다.

Depth가 깊어질수록 한계점에 봉착하게 되었고 몇가지 문제점이 발생하게 되었다.

 

 

Layer 층을 깊게 쌓게 되면 위와 같은 문제가 발생하게 된다. 그래서 ResNet에서는 다른 방법을 적용하여 성능을 개선 시킴

 

Identity block은 위 그림처럼 X라는 값이 들어오면 두갈래로 나뉘어진다. 하나는 정상적인 Conv 과정, 다른 길은 X값을 그대로 전달하여 Conv를 거친 값과 더해진다. 그렇다면 X라는 입력값을 넣어서 그대로 전달해주는 f(x)를 어떻게 하면 만들수 있을까?

 

 

Identity , 즉 입력받은 값을 그래도 돌려주는 작업이 쉽지 않다. Weight가 단순한 값이더라도 Relu가 있어서 비선형으로 값이 변경이 된다. X값을 그대로 반환해 주기가 까다로워 지는 문제점이 발생했다. 그래서 아래와 같이 우회하는 방법을 사용했다.

 

 

F(x)를 추가한다. 그리고 이 F(x)0으로 학습하게끔 해준다면 상대적으로 딥러닝이 학습하기가 수월해진다.

 

왼쪽은 일반 layer구성이다. 이외 비교하여 오른쪽 ResNet layer 구성을 보면, X값이 그대로 전달하는 skip connectionF(x)라는 Residual Block으로 이루어져있다. 앞서 언급했단 X값을 그대로 전달해 주려면 F(x)값이 0이 되어야 한다. 따라서 ResNet의 핵심은 F(x)을 어떻게 0으로 학습할 건지가 관건이다. 이 모든 건 더 깊은 depth를 적용하기 위해서 하는 작업이다.

 

 

F(x)0이 되게끔 학습을 진행하게 된다.

 

 

위 그림은 Identity Block 구성이다. X값이 7*7*128이라면 F(x)를 거친 후 나온 값도 7*7*128 똑같아야 add가 가능하다.(50 layer부터는 1*1 Conv가 등장함)

 

 

 

차원을 줄일때는 Residual Block stride =2를 적용하여 감소 시킨다. Pooling 사용빈도가 낮다. 그래서 이 이후에 발표된 모델들은 Pooling이 적은걸 확인할수 있다.

 

1*1Conv는 차원을 압축시켜서 연산량을 줄이는 역할을 수행할 수 있다.(Resnet 50 부터 적용)

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts