*컴퓨터 구조 및 설계 5th Edition (저자 David A. Patterson 과 John L. Hennessy)를 기반으로 작성되었습니다.
*MIPS 어셈블리언어 기반으로 작성되었습니다.
컴퓨터 내에서는 일련의 높고 낮은 전기 신호의 형태로 숫자를 저장하므로, 결국 기수 2인 수로 볼 수 있습니다. 모든 정보는 이진 자리 수(binary digit), 즉 비트(bit)로 구성되므로 비트가 계산의 기본 단위가 됩니다. 어떤 기수(Base)의 숫자에서 $i$번째 숫자 $d$의 값은 다음과 같습니다.
$$d*Base^i$$
예를 들어, $11_{ten}$은 $1011_{two}$와 같이 나타낼 수 있습니다. 그리고 워드는 수평으로뿐만 아니라 수직으로도 그릴 수 있기 때문에, 가장 오른쪽 혹은 가장 왼쪽 비트라고 말하면 애매할 수 있습니다. 그렇기에, 가장 오른쪽 비트를 LSB(Least significant bit) 가장 왼쪽 비트를 MSB(Most significant bit)라고 합니다. 이러한 이진 비트 패턴을 연산하는 하드웨어를 설계 할 수 있는데, 연산의 결과가 하드웨어 구현된 비트들만으로 표현이 불가능하면 오버플로우(overflow)가 발생했다고 말합니다.
*다만, 오버플로우가 발생했을시 어떻게 해야 할지는 프로그래밍 언어와 운영체제 및 프로그램의 몫입니다.
컴퓨터 프로그램은 양수와 음수를 모두 계산합니다. 가장 확실한 방법은 별도의 부호를 한 비트로 표현하여 덧붙이는 방법입니다.
*이 방법의 이름은 부호와 크기(sign and magnitude)표현법 입니다.
그러나 부호와 크기 표현법에는 몇 가지 단점이 있었습니다.
첫째로 부호가 붙는 위치가 명확하지 않습니다.
두번째로 부호와 크기 표현법의 덧셈기는 부호를 결정하기 위해 한 단계가 더 필요합니다. 왜냐하면 최종 부호가 무엇이 될지를 미리 알 수 없기 때문입니다.
마지막으로, 비트가 따로 붙기 때문에 양의 0과 음의 0을 갖는다는 점입니다.
이러한 단점으로 인하여 2의 보수(two's complement)표현법을 사용하게 되었습니다. 2의 보수 표현에서 모든 음수는 MSB가 1이라는 장점이 있습니다. 따라서, 하드웨어가 양수인지 음수인지 알아보려면 MSB만 검사하며 됩니다.
*MSB를 부호 비트(sign bit)라고 부릅니다.
다만 부호없는 수의 연산결과가 오버플로우를 발생시킬 수 있는 것처럼 2의 보수 연산에서도 MSB가 부호에 맞지 않는 경우 오버플로우가 발생할 수 있습니다.
*부호있는 수와 부호 없는 수는 산술 연산뿐만 아니라 적재 명령어와도 상관이 있습니다.
부호 있는 적재의 경우, 레지스터의 남는 곳을 채우기 위해 부호를 반복하여 복사하는 부호 확장(sign extension)을 하게 됩니다.
2의 보수(two's complement) 연산 계산법
2의 보수 연산에서 사용할 수 있는 계산법은 두 가지가 있습니다.
첫번째로, 모든 0을 1로, 1은 0으로 바꾸고 그 수에 1을 더하는 방법이 있습니다.
이 방식은 원래 수와 모든 비트를 역전시킨 수의 합은 $111...111_{two}$가 -1이라는 것에 기초하고 있습니다.
두번째로, n비트로 표현된 이진수를 n비트보다 큰 수로 바꾸는 방법입니다. load, store, branch, add 그리고 set on less than 명령어의 수치 필드에는 2의 보수 16비트 이진수가 들어갑니다. 빠른 방법은 16비트의 이진수의 최상위 비트(부호 비트)를 취해서 비어있는 왼쪽 부분에 채우고, 원래의 16비트 값은 32 비트 수의 오른쪽 부분에 그대로 복사하는 것입니다.
*이러한 방법은 부호확장(sign extension)이라고 합니다.
$$0000\,0000\,0000\,0010_{two} = 2_{ten}$$
최상위 비트(0)를 취해서 왼쪽 부분에 16번 복사하고, 워드의 오른쪽 부분에는 원래의 값을 그대로 복사하여 32비트 이진수를 만들 수 있습니다.
*컴퓨터 구조 및 설계 5th Edition (저자 David A. Patterson 과 John L. Hennessy)를 기반으로 작성되었습니다.
*MIPS 어셈블리언어 기반으로 작성되었습니다.
하드웨어 설계의 3대 원칙
1. 간단하게 하기 위해서는 규칙적인 것이 좋다.
덧셈 같은 연산의 피연산자(operand)는 더해질 숫자 두 개와 합을 기억할 장소 하나, 총 3개인 것이 자연스럽다. 이렇듯 모든 명령어가 피연산자를 반드시 세 개씩 갖도록 제한하는 것은 하드웨어를 간단하게 할 수 있는 방법이다.
반대로 피연산자(operand)에 대한 변수 갯수가 가변적이라면 하드웨어가 매우 복잡해질 것이다.
이런 관점에서 하드웨어 설계의 3대 원칙 중 첫번째를 도출할 수 있다.
2. 작은 것이 더 빠르다.
MIPS는 보통 32개의 레지스터를 사용한다. 레지스터가 아주 많아지면 전기신호가 더 멀리까지 전달되어야 하므로 클럭 사이클 시간이 길어진다.
물론 32개가 아닌 31개로 구성하면 빨라진다는 것이 아니다.
따라서, 컴퓨터 설계자는 더 많은 레지스터를 원하는 프로그램의 갈망과 클럭 사이클을 빠르게 하고 싶은 본인의 바람 사이에서 적절한 타협점을 찾아야 할 것이다.
*레지스터가 메모리보다 작으면서 속도는 더 빠른데 여기에도 해당이 되는 원칙이다.
3. 자주 생기는 일을 빠르게 하라.
프로그램의 연산에서 상수를 사용하는 경우는 많이 있다. SPEC CPU2006 벤치마크를 실행해보면 MIPS의 산술 명령의 절반 이상이 상수를 피연산자로 사용함을 알 수 있다. 상수를 메모리에서 읽는 방식이 아니라, 상수 필드를 갖는 산술 명령어를 통해 사용하면 연산이 훨씬 빨리지고 에너지를 덜 소모하게 된다.
*update(2022.09.29)
4. 좋은 설계에는 적당한 절충이 필요하다.
예를 들어, MIPS 명령어 필드에서 5비트 필드 중 하나를 주소로 쓴다면 $2^5 = 32$ 보다 작은 값만을 사용할 수 있다. 이 필드는 큰 배열이나 자료구조에서 한 원소를 선택하는데 사용되므로 32보다 큰 값이 필요한 경우가 많아 5bit 필드로는 부족하다. 이러한 문제 때문에 모든 명령어의 길이를 같게 하고 싶은 생각과 명령어 형식을 한가지로 통일하고 싶은 생각 사이에서 충돌이 생긴다.
이와 같은 상황에서, 컴퓨터 설계자는 적당한 절충안을 통해 설계를 진행하여야 한다.
피연산자
상위 수준 언어 프로그램과는 달리 산술 명령어의 피연산자에는 제약이 있습니다. 레지스터(register)라고 하는 하드웨어로 직접 구현된 특수 위치만 사용할 수 있다는 것입니다. 또한, 프로그래밍 언어에서 사용하는 변수와 하드웨어 레지스터의 큰 차이점 하나는 레지스터는 개수가 한정되어 있다는 점입니다. 보통 32개의 레지스터로 구성되어 있는데, 이는 산술 명령어의 각 피연산자는 32개의 32비트 레지스터 중 하나이어야 한다는 제약이 추가됩니다.
*MIPS 구조에서 레지스터의 크기는 32bit 이며, 워드(word)라고 부른다.
프로그래밍 언어에는 값 하나만 기억하는 단순 변수 외에 배열(array)나 구조체(structure) 같은 복잡한 자료구조가 있습니다.
이러한 구조는 메모리(memory)에 보관합니다.
다만, 위에서 설명한 바와 같이 MIPS의 산술연산은 레지스터에서만 실행되므로 메모리와 레지스터간의 데이터를 주고받은 명령어가 있어야 합니다. 이러한 명령어를 데이터 전송 명령어(data transfer instruction)이라고 합니다.
메모리에 기억된 데이터 워드는 주소(Address)를 통해 접근하게 됩니다.
*적재(load): 메모리에서 레지스터로 데이터를 복사해 오는 데이터 전송 명령. 적재 명령은 연산자 이름, 메모리에서 읽어 온 값을 저장할 레지스터, 메모리 접근에 사용할 상수와 레지스터로 구성된다.
*저장(store): 레지스터에서 메모리로 데이터를 보내는 데이터 전송 명령. 저장 명령은 연산자 이름, 저장할 데이터를 갖고 있는 레지스터, 배열 원소 선택에 사용할 변위, 베이스 레지스터로 구성된다.
변수를 레지스터와 연관 짓는 일 뿐만 아니라 배열이나 구조체 같은 자료구조를 메모리에 할당하는 것은 컴파일러의 임무입니다. 이러한 작업이 진행되어야 컴파일러가 자료구조의 시작 주소를 데이터 전송 명령에 넣을 수 있게 됩니다.
주소는 프로그램에서 8bit로 구성된 바이트(Byte)를 많이 사용하므로, 대부분의 컴퓨터는 바이트 단위로 주소를 지정합니다.
워드 주소는 워드를 구성하는 4바이트 중 하나를 사용하므로, 연속된 워드의 주소는 4씩 차이나게 됩니다.
컴퓨터 별로 워드 주소를 사용하는 방법은 두가지가 있습니다. 제일 왼쪽, 즉 최상위(big end) 바이트 주소를 워드 주소로 사용하는 방식과 제일 오른쪽, 즉 최하위(little end) 바이트 주소를 워드 주소로 사용하는 방법이 있습니다.
컴퓨터가 갖고 있는 레지스터보다 프로그램에서 사용하는 변수가 더 많은 경우가 자주 있습니다. 레지스터의 개수는 제한되어 있으므로 컴파일러는 자주 사용되는 변수를 가능한 한 많이 레지스터에 담고 나머지 변수는 메모리에 저장했다가 필요할 때 꺼내서 레지스터에 넣습니다.
*이때 활용되는 기법으로, 자주 사용하지 않는(또는 한참 후에 사용할) 변수를 메모리에 넣는 일을 레지스터 스필링(Register spilling)이라고 한다.
"작을 수록 빠르다 라는 원칙에 의하면 레지스터가 더 작으므로 메모리보다 속도가 느려야한다. 실제로 레지스터가 더 빠르며, 데이터가 레지스터에 있으면 더 빠르게 접근할 수 있다.
레지스터는 메보리보다 접근시간이 짧고 처리량도 많으므로, 레지스터에 저장된 데이터를 사용하면 시간이 절약되고 사용하기도 간편하다. 뿐만 아니라, 에너지도 절약된다.
따라서, 좋은 성능을 얻고 에너지를 절약하기 위해서는 컴파일러가 레지스터를 효율적으로 사용하여야한다.
안녕하세요. 오늘은 인공지능에 한획을 그었다는 'Deep Residual Learning for Image Recognition(ResNet)'에 관한 논문을 리뷰해보고자 합니다.
이번 논문은 읽는데에만 1주 정도 걸렸고 정리하는 과정도 상당히 오래걸렸습니다.
잔차 연결이라는 아이디어와 세부 내용들이 쉽게 이해가 되지는 않더라구요.
그래도 자세하게 설명도 잘되어있고, 글이 잘 쓰여져 있어서 몰입감 있게 읽으면서 공부할 수 있었습니다.
0. Abstract
더욱 깊어진 신경망은 학습하기 어려워졌습니다. 이 논문을 통해 residual learning framework가 네트워크의 학습을 보다 쉽게 할 수 있음을 보이고자 합니다.
ImageNet 데이터 셋을 기준으로 측정하였을 때, 152 layer에 이르는 depth를 가진 residual network가 VGGNet보다 8배 이상 깊지만 여전히 적은 복잡도를 가지고 있다는 것을 확인할 수 있었습니다. 이러한 네트워크의 앙상블(Ensemble)을 통해 ImageNet 테스트 셋에 대하여, 3.57%의 error를 기록하였고 ILSVRC-2015에서 우승을 차지하였습니다.
1. Introduction
심층 CNN은 이미지 classification에 대하여 엄청난 영감을 주었습니다. 심층 네트워크의 depth를 통해 feature의 "level"을 향상시킬 수 있으며, depth를 기반으로 한 많은 시도들이 이루어지고 있습니다.
depth의 중요성이 대두되고 있는 와중에 한가지 의문이 떠올랐습니다. '레이어를 쌓는 것 만큼 레이어가 쌓인 네트워크를 학습시키는 것이 쉬울까?' 라는 의문이었습니다. 첫번째로, gradient vanishing(기울기 소실)과 gradient exploding(기울기 폭발)의 문제가 있습니다. 다만, 이 문제는 normalized initialization과 normalization layer를 통해 다뤄왔습니다. 어느정도 해결을 할 수 있다는 것이죠.
다만, 더 깊은 네트워크가 converging(수렴)하기 시작할 때, degradation 문제가 발생해 왔습니다. 네트워크의 depth가 깊어질 수록, accuracy는 더 이상의 진전이 없었고, 빠르게 저하되기 시작했습니다. 다양한 연구로부터 report된 내용을 검토하고 철저히 실험을 통해 검증을 거친 결과, 기대와는 다르게 overfitting으로 부터 야기된 문제가 아니라 네트워크가 깊어지면서 발생하는 문제라는 것을 알게 되었습니다.
이렇게 발생한 degradation problem은 모든 시스템이 쉽게 optimize 할 수 있는 것은 아니라는 것을 시사합니다. 따라서, 이번 논문에서는 degradation problem을 deep residual learning framework를 통해 다뤄보고자 합니다. 단지 몇개만의 레이어들이 바람직한 underlying mapping 되기를 기대하는 대신에, 이러한 layer들을 residual mapping(잔차 연결)을 하여 문제를 해결해보고자 합니다. underlying mapping을 $H(x)$라고 하였을 때, stacked linear layer가 또 다른 mapping인 $F(x) ≒ H(x) - x$를 학습하도록 하는 것입니다. 즉, original-mapping은 $F(x)+x$로 재구성 됩니다.
또한, original mapping 보다 residual mapping이 더 optimize 하기 쉽다고 가정하였습니다. 극단적으로, identity mapping이 optimal 하다면, nonlinear layer stack을 통한 identity mapping을 학습시키는 것보다 잔차를 0으로 수렴시키는 것이 쉬울 것입니다.
$F(x) + x$는 신경망의 shortcut connection을 통해 구현 될 수 있습니다(Fig.2). ResNet에서 shortcut connection은 identity mapping을 수행하고, 이 output은 stacked layer의 output으로 더해집니다.(입력 x가 layer를 통과하여 나온 결과물인 F(x)에 입력 값 x가 더해집니다.) Identity shortcut connection은 추가적인 파라미터나 계산 복잡도에 영향을 주지 않습니다. 또한, 전체적인 네트워크는 여전이 SGD를 통한 역전파 과정을 통하여 end-to-end로 학습되며, common library를 통해 구현됩니다.
Degradation problem을 확인하고 residual connection을 평가하기 위해 ImageNet에서 실험을 시행했습니다. 실험을 통해 두가지 사항을 알 수 있었습니다.
극단적으로 깊은 residual network가 "plain" network에 비해 optimize가 쉽다는 사실
deep residual network가 이전 네트워크 보다 상당히 나은 결과를 도출하면서 쉽게 정확도를 얻는다는 점입니다.
ImageNet classification 데이터 셋에 대하여, deep residual network를 통해 좋은 결과를 얻을 수 있었습니다. 152 layer의 residual network는 VGGNet보다도 덜 복잡할 뿐만 아니라, 지금까지 ImageNet에 제출되었던 모델 중에 가장 깊은 모델입니다.
2. Related Work
Residual Representations.
요약하자면, residual vector encoding이 original vector encoding보다 효율적이며 이러한 reformulation/preconditioning이 opmization을 단순화 한다는 것입니다.
Shortcut Connections.
요약하자면, gradient vanishing/exploding등 다양한 문제를 해결하기 위한 방법, ResNet과 유사한 방법으로 shortcut을 구현한 연구 등이 있지만 단점들이 있었습니다. 특히, shortcut을 구현한 모델들의 경우 parameter가 증가되고 shortcut gate가 "closed" 될 수 있다는 단점이 있으며 depth의 증가를 통해 정확도를 확실히 증가시킬 수 있다는 것이 증명되지 않았습니다.
ResNet은 정확도를 증가시킬 수 있을 뿐만 아니라 parameter-free 하면서 closed 되지 않는 모델이라는 내용이 담겨져 있습니다.
3. Deep Residual Learning
3.1. Residual Learning
H(x)를 몇개의 stacked layer로 부터 학습되어야할 underlying mapping, x를 이러한 레이어들의 input 이라고 하겠습니다. 다수의 nonlinear layer들이 복잡한 함수로 근사될 수 있다고 가정하였을 때, 이는 residual function인 $H(x) - x$로도 충분히 근사 가능하다는 것을 의미합니다. 이를 바탕으로 stacked layer가 H(x)가 아닌 $F(x) ≒ H(x) - x$ 로 근사되도록 할 것 입니다. 따라서 original function은 $F(x) + x$가 될 것입니다.
실제 케이스에서는, identity mapping이 optimal 하지 않더라도, 이러한 reformulation이 문제를 precondition하는데 도움이 될 지도 모릅니다. 만약, optimal function이 zero mapping보다 identity mapping에 가깝다면, solver가 새로운 함수를 학습하는 것 보다 identity mapping에 관하여 작은 변화를 찾는 것이 더 쉬울 것입니다. 우리는 실험(Fig.7)을 통하여 학습된 residual function이 작은 response를 가진다는 것을 보여줍니다. 이러한 사실은 identity mapping이 합리적인 preconditioning을 제공해준다는 것을 의미합니다.
*Universal Approximation Theorem.
비선형성을 가진 레이어가 하나의 은닉층으로 있다면, 어떠한 함수로도 충분히 근사 가능하다는 것을 증명한 이론입니다.
이 이론을 근거하여, nonlinear layer들이 $H(x) - x$로도 충분히 근사 가능하다는 것을 알 수 있습니다.
3.2. Indentity Mapping by Shortcuts
stacked layer마다 residual learning을 적용하였습니다. Fig.2에서 보인 형태와 동일하며, 이 논문에서는 building block을 다음과 같이 정의할 것입니다. $$y = f(x,\{w_i\})+x \qquad Eqn(1).$$
Eqn.(1)에서 shortcut connection은 추가적인 파라미터나 계산 복잡도에 영향을 주지 않습니다. 이것은 매우 실용적이기에 매력적일 뿐만 아니라 plain nework와 residual network 사이의 비교에서도 중요합니다. 이러한 장점 덕분에 동일한 수의 파라미터, depth, width, computational cost를 갖는 plain network 와 residual network를 비교할 수 있는 것이죠.
만약 input/output channel이 변화할 경우, $w_s$ linear projection을 통해 shortcut connection의 차원을 맞출 수 있습니다.
$$y = F(x,\{w_i\})+W_s*x\qquad Eqn(2).$$
다만, identity mapping이 degradation problem을 다루기 충분할 뿐만 아니라 효율적이라는 것을 알 수 있었기에, $w_s$는 차원을 맞추는데에만 사용합니다.
더 많은 레이어를 쌓을 수 있지만, 이번 논문에서는 function $F$는 2개 또는 3개의 레이어로 구성됩니다(Fig.5). 다만, $F$가 단일 레이어일 경우 선형 레이어와 유사하여 이점이 없기 때문에 사용하지 않습니다. 또한, 위 표기들은 FC layer에 대한 것이지만 convolutional layer에도 적용가능합니다.
3.3 Network Architectures
다양한 plain/residual net을 실험했지만 동일한 현상을 관찰할 수 있었습니다. 사례를 제공하기 위해, ImageNet에 대한 두가지 모델을 소개하고자 합니다.
Plain Network.
ResNet의 기본 모델(Fig.3 middle)은 VGG net(Fig3. left)를 모티브로 삼았습니다. convolution filter는 거의 대부분(1개를 제외하고) 3x3 filter로 구성하였으며 두가지 간단한 규칙을 따랐습니다.
output의 feature map size를 동일하게 맞추기 위하여 필터 수를 동일하게 설정하였습니다.
feature map size가 반감될 경우, 레이어 별 time complexity를 보존하기 위해 필터의 갯수를 두배로 설정하였습니다.
Stride = 2인 convolutional layer를 통해 downsampling을 수행하였으며, 네트워크의 끝에는 global average pooling layer와 softmax가 적용된 1000-way의 FC layer로 구성되어 있습니다. 총 weight는 34 입니다.
VGGNet에 비해 적은 필터 수와 낮은 complexity를 갖습니다.
Residual Network.
Plain network를 기반으로, shortcut connection(Fig. 3 right)를 삽입하였습니다. Input - output이 동일한 차원을 가질 경우, identity shortcut(Eqn.(1))을 직접적으로 연결할 수 있습니다. 차원이 증가될 경우(Fig.3 dotted line shortcut), 두가지 옵션을 고려할 수 있습니다.
증가된 차원에 맞춰 zero-padding을 이용하여 shortcut이 identity mapping을 수행하는 것
Eqn.(2)의 projection shortcut을 이용하여 차원을 맞추는 것
3.4 Implementation
ImageNet에 대한 implementation는 AlexNet과 VGGNet을 follow 합니다. 이미지는 scale augmentation을 위해 [256,480]에서 무작위로 샘플링된 shorter-side로 resize 됩니다. $224*224$crop은 평균 차감(mean substraction)이 적용된 이미지 또는 그 이미지의 horizontal filp된 이미지로 부터 샘플링 됩니다. 레이어 구성에 대한 세부 설명과 하이퍼 파라미터는 다음과 같습니다.
convolution 연산 이후, 활성화 함수를 적용하기 전에 Batch Normalization을 적용합니다.
He initialization을 통해 weight를 initialize 합니다.
Batch size = 256, optimizer는 SGD를 사용합니다.
learning rate = 0.1 이며, error 감소율이 정체될 때마다 1/10씩 줄입니다.
AlexNet의 10-crop testing을 통해 test를 진행하였습니다. 최상의 결과를 위해 He initialize와 VGGNet에서 사용한 fully-convolutional form을 채택하였으며, multiple scale에서 score을 평균화 하였습니다.
4.Experiments
4.1. ImageNet Classification
ImageNet 2012 classification dataset을 기반으로 top-1/top-5를 평가하였습니다.
1.28M training images
50K validation images
100K test images
Plain Networks.
18-layer와 34-layer의 plain network를 측정할 것이며, Table 1에서 구체적인 Architecture을 볼 수 있습니다. Table 2를 보면, 34-layer plain network가 18-layer plain network보다 높은 validation error를 보인다는 것을 알 수 있습니다. 이러한 결과(Fig. 4 left)에 대한 이유를 밝히기 위해 training/validation error를 비교하였으며, degradation problem이 발생하는 것을 알 수 있었습니다.
이러한 optimization difficulty가 gradients vanishing 문제로부터 유발된 것은 아닙니다. 그 근거는 다음과 같습니다.
설계된 plain network에는 BN이 적용되었기 때문에 순전파 signal이 non-zero variance(분산)를 가지는 것을 보장합니다.
역전파 과정 또한, BN으로 인하여 healthy norm을 보이는 것을 확인할 수 있었습니다.
즉, gradient vanishing은 발생하지 않았음을 알 수 있었습니다.
Residual Network.
다음으로, 18-layer 와 34-layer residual network(ResNet)을 측정하였습니다. 기본 구조는 plain network와 동일합니다. option A) zero-padding을 통하여 identity mapping을 수행하는 방식을 비교하였습니다(Table 2 and Fig. 4 right)
Table2와 Fig 4.를 토대로 주목해야할 3가지 사실이 있습니다.
첫번째로, 34-layer ResNet이 18-layer ResNet보다 약 2.8% 낮은 error를 보였습니다. 더욱 중요한 것은, 34-layer ResNet이 더 낮은 training error와 향상된 validation 성능을 보였습니다. 이러한 결과는 ResNet이 degradation problem을 잘 해결할 수 있다는 점과 증가된 depth로 부터 정확도를 얻을 수 있다는 것을 시사합니다.
두번째로, plain network와 비교했을 때, 34-layer ResNet이 top-1 error를 3.5% 줄였다는 점 입니다. 이것을 통해 extremely deep system에서 residual 학습의 효과를 증명할 수 있습니다.
마지막으로, 18-layer의 plain network와 ResNet이 비슷한 정확도를 보이지만, ResNet이 수렴하는 속도가 더 빠르다는 점입니다. 이러한 사실을 통해 ResNet이 초기 단계에서 더 빠른 convergence를 제공해줌으로써 optimization을 쉽게 한다는 사실을 알 수 있습니다.
Identity vs. Projection Shortcuts.
지금까지 parameter-free한 점과 identity shortcut이 training에 도움이 된다는 사실을 알 수 있었습니다. 다음으로는 projection shortcut(Eqn.(2))에 대해서 조사하려고 합니다. 총 3가지 option을 비교하고자 합니다.
A) 증가된 차원에 대하여 zero-padding을 사용하며, 모든 shortcut이 parameter free한 옵션(Table 2와 Fig. 4 right와 동일)
B) 증가된 차원에 대하여 projection shortcut을 사용하는 option
C) 모든 shortcut이 projection shortcut인 option
Table 3를 보면 모든 옵션이 plain network보다 좋은 결과를 보임을 알 수 있습니다. A/B/C 사이의 작은 차이는 projection shortcut이 degradation problem을 해결하기 위해서 필수적인 요소가 아님을 시사합니다. 따라서, 이번 논문에는 memory/time complexity와 모델 사이즈를 줄이기 위하여 option C는 사용하지 않을 것입니다.
Deeper Bottleneck Architecture
ImageNet의 deeper network에 대해서 설명하도록 하겠습니다. training-time에 대한 우려 때문에, building block을 bottleneck design으로 변형하였습니다. 각각의 residual Function F 는 3개의 레이어를 쌓았습니다. 3개의 layer는 1x1, 3x3, 그리고 1x1 convolution 레이어 이며, 1x1은 차원을 줄였다가 다시 늘리는 용도로 사용하며 3x3을 input/output 차원을 축소한 bottleneck으로써 둡니다.
Fig.5 는 비슷한 time complexity를 갖는 두 개의 residual Function 입니다.
만약 identity shortcut이 projection으로 대체된다면, time complexity와 모델 사이즈가 2배로 증가하게 됩니다. 따라서,Parameter-free identity shortcut은 bottleneck 구조에서 특히나 중요합니다.
50-layer ResNet: 34-layer ResNet의각각의 2-layer block을 3-layer bottleneck block으로 대체한 모델로, 증가된 차원에 대하여 option B를 적용하였습니다(Table 1). 이 모델은 3.8 billion FLOPs를 갖습니다.
101-layer and 152-layer ResNets: 3-layer block을 추가로 사용하여 각 ResNet을 구성하였습니다(Table 1). depth가 상당히 증가하였지만, 152-layer ResNet(11.3 billion FLOPs)는 여전히 VGG-16 / VGG - 19(15.3 / 19.6 billion FLOPs)보다 현저히 낮은 complexity를 갖습니다.
50/101/152-layer ResNet은 34-layer ResNet보다 더욱 정확합니다. degradation problem이 발견되지 않았으며, depth 증가로 부터 정확도를 얻을 수 있었습니다(Table 3 and 4).
Comparison with State-of-the-art Methods.
Table 4에서 이전의 best single-model 결과들과 비교한 결과를 볼 수 있습니다. baseline 34-layer ResNet은 매우 competitive한 accuracy를 얻었으며, 152-layer ResNet은 top-5 validation error 4.49%를 기록하였습니다. 이전 ensemble resulut을 모두 상회하는 결과이며, 6개의 서로 다른 depth의 모델을 ensemble 하였을 때 3.57% top-5 error를 기록하였고 ILSVRC-2015에서 우승할 수 있었습니다.
생각정리
*ResNet이 gradient vanishing에 매우 효과적인 이유에 대한 생각.
Gradient vanishing이란 역전파(Backpropagation) 과정에서 Gradient가 소실 되는 것을 말합니다. 가장 큰 원인은 활성화 함수(Activation Function)의 기울기 입니다. 함수를 미분했을 때의 값이 0에 가까워지는 것이 문제가 되는 것이죠.
import sys
from collections import deque
n,m,v = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(n+1)]
for i in range(m):
node1, node2 = map(int, sys.stdin.readline().split())
graph[node1].append(node2)
graph[node2].append(node1)
for i in range(1,n+1):
graph[i].sort()
visited_bfs = [False]*(n+1)
def bfs(n):
q = deque([n])
visited_bfs[n] = True
while q:
node = q.popleft()
print(node, end=' ')
for new_node in graph[node]:
if visited_bfs[new_node]:
continue
q.append(new_node)
visited_bfs[new_node] = True
bfs(v)
import sys
from collections import deque
n,m,v = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(n+1)]
for i in range(m):
node1, node2 = map(int, sys.stdin.readline().split())
graph[node1].append(node2)
graph[node2].append(node1)
for i in range(1,n+1):
graph[i].sort()
visited_dfs = [False]*(n+1)
def dfs(n):
print(n, end=' ')
visited_dfs[n] = True
for node in graph[n]:
if visited_dfs[node]:
continue
dfs(node)
dfs(v)
안녕하세요. 오늘은 VGGNet에 관한 'Very Deep Convolutional Networks for Large-Scale Image Recognition(2014)'에 대해서 정리를 해보았습니다. 지난번 Inception에 관하여 정리를 하고 난 후, ILSVRC에서 우승한 모델인 Inception 보다 2등을 차지한 VGGNet이 더 많이 활용되었다해서 호기심이 들어 논문을 찾아보게 되었습니다.
0. Abstract
우리는 convolution network의 depth가 large-scale 이미지 인식의 정확도에 어떠한 영향을 미치는지 조사하려 합니다. 핵심은 3x3 convolution fliter로 구성된 16-19 weight layer를 기반으로 depth를 늘린 네트워크를 철처히 평가하는 것입니다. 이러한 발견은 localisation과 classfication track에서 각각 1등과 2등을 차지한 ImageNet Challenge 2014 제출물을 기반으로 하였습니다.
1. Introduction
Convolutional networks(ConvNets)는 large-scale image와 video recognition에서 큰 성공을 누려왔습니다. 특히, High-Dimensional shallow feature에서 deep ConvNet에 이르기까지 deep visual recognition architecture의 발전에 중요한 역할을 수행하였습니다.
AlexNet과 같이 ConvNet Architecture design에 대해서 많은 연구가 이루어져왔지만 이 논문에서는 지금까지 다루지 않았던 핵심 측면인 depth에 대해서 다루고자 합니다. Architecture의 다른 파라미터를 수정하고, 매우 작은 3x3 convolution filter를 모든 레이어에 적용하여 네트워크 깊이를 점진적으로 증가시켜보았습니다. 이러한 시도 결과, 정확도가 매우 향상된 ConvNet architecture를 얻을 수 있었습니다.
2. ConvNet Configurations
증가된 ConvNet depth로부터의 성능 발전을 측정하기 위해, 모든 ConvNet layer의 파라미터를 동일하게 설정하였습니다.
2.1. Architecture
ConvNet의 입력 값은 고정된 사이즈의 224 x 224 RGB 크기 입니다. preprocessing(전처리)단계에서는 training set의 각 픽셀에서 RGB의 평균 값을 빼주는 작업을 해주었습니다. 이미지는 매우 작은 3x3 filter가 적용된 conv layer의 stack을 통과하게 되며, 추가적으로 1x1 convolution filter를 사용하였습니다. 3x3 filter를 사용한 이유는 상/하/좌/우/중심을 파악하기 위핸 최소한의 크기가 3x3 이기 때문이며, 1x1은 비선형성을 더해주기 위함이지만 input channel의 선형 변환으로 보였다고 합니다. stride는 1이며 padding size 또한 convolution 연산 이후 공간적 정보가 보존되도록 하기 위해 1로 설정하였습니다. 추가적으로, Stride가 2인 2x2 size의 max-pooling layer가 5개 적용되었습니다.
Convolution layer stack은 두 개의 4096 채널의 FC layer와 1개의 1000 채널의 FC layer로 구성되었으며, 마지막 레이어는 soft-max layer 입니다. FC layer의 configuration은 모든 네트워크에서 동일합니다.
모든 Hidden layer에는 활성화 함수로 ReLU를 사용했으며, LRN normalisation은 메모리 소비량과 연산량만 증가시킬 뿐 ILSVRC 데이터 셋에 대한 성능은 증가시키지 못하기 때문에 사용하지 않았습니다(Section 4.1에서 추가적인 내용 서술).
*3x3 filter가 상하좌우 + 중심의 notion을 파악하기 위한 최소 사이즈라고 논문에 서술되어 있는데 이에 대하여 이유가 궁금하지만 답을 찾지 못한 상태입니다. 향후 이유를 알게 된다면 추가적인 업데이트를 하도록 하겠습니다.
2.2 Configuration
각 ConvNet configuration은 Table 1의 하나의 열로 되어있습니다(A-E). 모든 configuration은 2.1.의 설명과 동일하며, 오직 depth만 11 weight layer(8 conv.와 3 FC layer)에서 19 weight layer(16 conv.와 3 FC layer)로 다릅니다. conv. layer의 width(채널의 갯수)는 오히려 작으며, 각 max-pooling layer에서 64개로 시작하여 최종적으로 512개 까지 2배씩 늘어나게 됩니다.
Table 2에는 각 configuration의 파라미터 갯수를 기록해두었습니다. 큰 depth에도 불구하고, 더 큰 conv. layer width와 receptive fields로 구성된 shallow net에 비하여 더 적은 파라미터 갯 수를 가지고 있습니다.
*학습파라미터 수가 다른 네트워크에 비해 적으면서도 낮은 에러율을 보였다는 것은 그만큼 VGGNet의 학습 효율성이 높다는 의미도 담고 있는 것 같습니다.
2.3. Discussion
VGGNet의 configuration은 ILSVRC-2012와 ILSVRC-2013에서 최상위 성능을 보여준 모델들과는 꽤 다릅니다. 11x11 필터를 쓴 AlexNet 또는 7x7 필터를 쓴 ZFNet 과 달리 상대적으로 큰 receptive fields를 첫번째 conv. layer 에 사용하지 않고 전체 네트워크에 아주 직은 3x3 receptive fields를 사용하였습니다. 그럼 7x7을 사용하지 않고 3x3 conv. layer를 사용한 이유는 무엇일까요?
첫번째로, 명확한 의사결정을 위해 더 많은 비선형성을 부여하기 위함이고 두번째로 파라피터수를 줄이기 위함입니다.
채널 갯수를 C라고 하였을 때, 3개의 3x3 filter를 사용하는 것은 총 3 * 3^2*C^2개의 학습 파라미터 수를 가집니다. 반면 1개의 7x7 필터를 사용할 경유 7^2*C^2개의 학습 파라미터수를 가지게 되죠. 즉 전체적으로 보았을 때, 약 81% 적은 파라미터를 사용하게 됩니다.
또한 1x1 conv. layer(config C, Table 1)를 사용하였는데 이것은 conv. layer의 receptive fields에 영향을 주지 않고 의사결정 함수의 비선형성을 증가시키기 위함입니다.
3. Classification Framework
이전 섹션에서는 VGGNet의 configuration의 detail에 대해서 설명하였습니다. 이번 섹션에서는 classification ConvNet의 학습과 평가에 대해 서술하고자 합니다.
3.1. Training
ConvNet 학습 과정은 전반적으로 AlexNet과 유사합니다(향후 설명하겠지만, Multi-scale 학습 이미지들로 부터 입력 값을 샘플링하는 법은 다른 방식을 사용하였습니다). 역전파를 기반으로한 mini-batch gradient descent(경사하강법)을 multinominal logistic regression objective 에 적용하여 학습을 진행하였습니다. 하이퍼 파라미터 세팅은 다음과 같습니다.
batch size = 256
momentum = 0.9(optimizer)
L2 = 5*10^-4 & dropout(p = 0.5)(regularization)
learning rate = 10^-2
validation set accuracy가 증가하지 않을 경우 learning rate 10배 감소(scheduler)
최종적으로, learning rate는 3번 감소하였으며 학습은 370K iteration(74 epoch)를 거친 후 종료 되었습니다.
AlexNet에 비해 더 많은 수의 파라미터와 깊이에도 불구하고 converge 하기 위해 더 적은 epoch가 필요한 이유는 다음 두가지라고 추측합니다.
더욱 깊고, 작은 conv. filter 사이즈로 인한 Implicit regularisation
특정 레이어의 pre-initialisation
특히나, 잘못된 initialisation은 심층 네트워크의 기울기의 불안정성을 야기하여 학습을 방해할 수 있기에 initialisation은 매우 중요합니다. 이러한 문제점을 예방하기 위해 deeper architecture을 학습할 때 처음 4개의 conv. layer와 마지막 3개의 FC layer에 대한 initialise를 해주었습니다.
또한, 고정된 사이즈의 224x224 ConvNet 입력 값을 얻기 위해, 학습 데이터를 rescaling하여 crop 하였습니다.
*Training image size
Training scale S를 설정하기 위해 두가지 접근법을 고려해보았습니다.
첫번째로, single-scale training에 일치하도록, S를 고정하는 것입니다. 실험 내에서, S를 256과 384로 고정하여 학습된 모델을 평가해보았습니다. 주어진 ConvNet configuration에서, S 를 256으로 설정하여 네트워크를 학습시켰습니다. 그리고 S = 384인 네트워크의 학습 속도를 증가시키기 위해, S = 256으로 pre-trained 된 데이터로 weight를 초기화 하고 10^-3인 더 작은 초기 learning rate를 사용하였습니다.
두번째 접근법은 multi-scale training입니다. [min S = 256, max S = 512]에 해당되는 범주 내에서 랜덤한 S 값을 통해 학습을 시키는 방법으로, 이미지 속 object들이 각기 다른 사이즈로 있을 수 있기 때문에 충분히 고려해볼만한 방법이라고 생각하였습니다. 또한 속도상의 이유로 multi-scale 모델을 S = 384로 pre-trained된 single-scale model을 fine-tuning하여 학습 시켰습니다.
3.2. Testing
주어진 학습된 ConvNet 과 입력 이미지에 대하여 다음과 같은 과정으로 분류되었습니다.
첫번째로, pre-defined test image를 rescale 해줍니다. 앞선 training 과정과 유사하게 rescale된 test image를 네트워크에 적용합니다. 그런 다음, FC layer 대신 convolutional layer들을 적용하여 검증을 진행합니다. 첫번째 FC layer를 7x7 conv. layer로 변경하고, 마지막 두개의 FC layer는 1x1 conv. layer로 변경합니다. 결과적으로, 전체 이미지(uncropped)에 fully-convolutional layer가 적용됩니다. 최종적으로, 이미지에 대한 고정된 class score vector를 획득하기 위해 class score map에 sum-pooled를 적용합니다. 뿐만 아니라 horizontal flipping을 통해 test set을 augument하고, softmax가 적용된 original 이미지와 flipped image의 평균을 구하여 최종 score를 얻습니다.
3.3 Implementation Details
C++ Caffe toolbox를 사용하였으며, training과 evaluation에 GPU를 사용하기 위해 변형하여 사용하였습니다. 트레이닝 이미지를 각 batch로 분할하여 GPU 상에서 병렬적으로 처리하였으며, 연산 후 전체 이미지에 대한 gradient를 얻기 위해 평균 값을 구하였습니다. Gradient 계산은 모든 GPU상에서 동시에 이루어져 단일 GPU로 연산했을 때와 같은 결과를 얻습니다. 또한, 단일 GPU보다 4-GPU를 통한 연산이 약 3.75배 빠르다는 것을 알 수 있었습니다.
4. Classification Experiments
*Dataset
이번 섹션에서는 ILSVRC-2012 데이터셋을 기반으로 VGGNet의 image classification 결과에 대해 서술하고자 합니다.
3 set으로 분리되는 1000class의 이미지
1.3M개 image for training, 50K image for validation, 100K images for testing
classification performance는 top-1 & top-5 error를 기반으로 측정하였습니다.
( top-1 error는 multi-class classification에서 잘못 분류된 이미지의 비율이고 top-5 error는 ILSVRC에서 사용된 주요 평가 기준으로 예측된 범주 밖에 있는 이미지의 비율입니다.)
4.1. Single Scale Evaluation
Section 2.2에서 서술하였던 것과 동일한 configuration을 기반으로, 각 ConvNet 모델의 성능을 측정하였습니다. 테스트 이미지 사이즈 Q는 고정된 S와 [min S, max S] 범주 내의 0.5 * (min S + max S) 값과 동일합니다. 결과는 위 Table 3에 나와있습니다.
첫번째로, LRN을 사용하는 것은(A-LRN 네트워크)는 모델 A의 성능을 증진시킬 수 없음을 알 수 있습니다. 따라서, deeper architectures(B-E)에 normalisation에 적용하지 않았습니다.
두번째로, 모델 A의 11 layer부터 모델 E의 19 레이어까지 보면 증가된 ConvNet depth는 classification error를 감소시킨다는 것을 알 수 있었습니다. 특히, 같은 depth에도 불구하고 3x3 conv. layer로만 구성된 configuration D가 1x1 conv. layer 3개를 포함한 configuration C에 비해 좋은 성능을 보여주었습니다. 이는 추가적인 비선형성이 도움이 되지만(C의 성능 > B의 성능), receptive field에서 conv. filter를 통해 공간적 context를 잡아내는 것 또한 중요하다는 것을 의미합니다. 또한, 19개의 layer에 도달한 모델이 가장 좋은 성능을 보였으며, B모델과 B모델의 3x3 conv. layer 한 쌍을 5x5 conv. layer로 대체한 모델을 비교하였을 때 3x3 conv. layer를 사용한 B 모델이 7% 정도 더 좋은 성능을 보였습니다.
마지막으로, 고정된 S 사이즈(S = 256 , S = 384)를 사용하는 것 보다 scale jittering을 사용하는 것이 training에 있어 더 좋은 결과를 보여주었습니다.
* 1x1 conv. layer를 사용하는 이유는 크게 3가지가 입니다.
1) 채널 수 감소 2) 채널 수 감소를 통한 연산량 감소 3) 비선형성의 증가
4.2. Multi-scale Evaluation
이번 섹션은, 테스트 이미지의 다양한 rescale 버전에 대해 서술하도록 하겠습니다. training과 test 사이의 큰 차이는 성능 하락에 영향을 줄 수 있다는 점을 고려하여, training 할 때와 유사하게 3개의 이미지 사이즈로 모델을 학습시켰습니다 ( Q = { S - 32, S, S + 32} ). 동시에, training 할 때 수행했던 scale jittering이 테스트 시에도 더 넓은 범위의 scale을 네트워크에 적용할 수 있도록 해주어서 [min S; max S] 범위의 고정되지 않은 S로 학습된 모델에 대하여 대하여 더 큰 범위인 Q = {min S, 0.5*( min S + max S), max S}의 범주로 측정하였습니다.
실험 결과는 Table4에 정리되어 있으며, test할 때에도 scale jittering이 더 좋은 성능을 보여준다는 것을 알 수 있습니다.
4.3. Multi-Crop Evaluation
Table5는 dense ConvNet evaluation과 multi-crop evaluation을 비교한 결과입니다. 이에 더불어, 두 가지 평가기법의 softmax output을 평균화하여 complementarity 또한 측정하였습니다. multiple crop을 사용한 것이 dense ConvNet보다 약간 더 좋은 성능을 보였으며, 두 가지 접근법이 상호보완적임을 확인할 수 있었습니다. 이러한 결과는 convolution 경계 조건의 다른 처리 방식으로 인한 것으로 보입니다.
4.4. ConvNet Fusion
앞선 섹션의 상호보완성에 대한 정보를 기반으로, 몇몇 모델의 output을 조합하여 보았습니다.
7개의 네트워크를 앙상블 한 결과 7.3%의 ILSVRC 테스트 에러를 기록하였습니다. 이후, 가정 성능이 잘 나온 두 개의 multi-scale model을 앙상블 하여 실험해본 결과 dense evaluation에서는 테스트 에러를 7.0% 까지, dense와 multi-crop evaluation을 조합한 방식의 테스트 에러를 6.8% 까지 낮추었습니다. 참고로, 최고 성능의 단일 모델은 7.1% 에러를 기록한 모델 E(Table 5) 입니다.
5. Conclusion
우리는 큰 scale의 이미지 분류에 있어서 아주 깊은 convolution network(19 weight layer) 측정을 통해 depth가 classification accuracy에 효과적이라는 사실을 증명했습니다.
*생각 정리
- 상/하/좌/우/중심의 notion을 capture 하기 위한 최소 조건이 3x3 Size인 이유가 filter의 중심 칸을 기준으로 상/하/좌/우로 모든 칸이 존재하는 사이즈가 3x3이기 때문이지 않을까 라고 추측해봤습니다.
- LRN의 배제한 이유가 모델 A에 적용해봤을 때, LRN을 적용하지 않은 original 모델 A가 더 성능이 좋아서 라고 서술되어 있습니다.
모든 layer의 configuration을 동일하게 세팅했기에 제일 단순한 모델로의 결과로 일반화 시킬 수 있다고 생각하면서도 depth가 다른데 한 모델의 결과만으로 일반화를 해도 되는 것인지 의문이 들었습니다. 이 점은 아직 정확하게 몰라서 생길 수 있는 생각의 충돌이라는 생각이 들어서 좀 더 공부를 해보려고 합니다.
역시 논문을 읽는 것은 아직까지는 버거운 과정이네요. 논문을 읽으며 이 논문은 어느 부분이 잘쓰였는지, 아쉬운 점이 뭔지 등을 파악해가며 읽을 수 있으면 참 좋을 것 같지만 아직까지는 실력이 모자른 것 같습니다. 그래도 이름으로만 들어봤던 모델들을 설계 이유부터 설계 과정, 근거 그리고 모델의 성능 등 자세히 공부해볼 수 있다는 점이 큰 장점 같습니다.
아직 실력이 매우 미흡하여 글에 틀린 부분이나 잘못 정리한 부분, 오역 등이 있을 수 있습니다. 댓글을 통해서 피드백을 주시면 감사하겠습니다.