GOAL
- ResNet의 구조를 이해
- Tensorflow를 이용하여 ResNet50으로 CIFAR10 데이터셋을 이용하여 분류해 보자
Residual Network
- 오늘은 2015년 ILSVRC에서 우승을 차지한 Residual Network(이하 ResNet)에 대해 포스팅하려고 합니다.
- ResNet은 마이크로소프트에서 개발한 알고리즘으로 원 논문명은 "Deep Residual Learning for Image Recognition"입니다. 어마어마한 논문의 인용 수를 볼 수 있으며 이는 딥러닝 이미지 분야에서 많이 사용되고 있다는 뜻입니다.
- CNN이 이미지 인식 분야에서 뛰어난 성능을 보여주고 있었고, 네트워크의 layer를 깊이 쌓으며 성능 향상을 이루고 있었습니다. 하지만 실제로 layer를 깊게 쌓으면 gradient vanishing/exploding이 일어나고 성능이 더 떨어지는데 layer가 깊어지면서 역전파로 얻어지는 기울기가 너무 작아지거나 커지면서 생기는 현상입니다.
- 또 layer가 깊어지면 학습이 어려워지는데 이는 overfitting 때문이 아니라 깊이가 깊어져 training error가 증가하기 때문입니다. (파라미터 수가 많아지기 때문)
- 위 그림은 논문에서 CIFAR-10 데이터 셋으로 layer-depth에 따른 오류율을 확인했으며 56-layer에서 training error와 test error가 높은 것을 확인할 수 있습니다.
- 이 논문은 이런 문제를 먼저 제기하면서 시작되며 해결하기 위해 제안되었습니다.
Residual Learning
- 논문에서 문제를 해결하기 위해 사용한 방법이 Residual Learning입니다.
- 기존은 CNN은 입력 값 x를 타깃 값 y로 매핑하는 함수 H(x)를 얻는 것이 목적이었습니다.
그러나 ResNet은 F(x) + x를 최소화하는 것을 목적으로 합니다. x는 현시점에서 변할 수 없는 값이므로
F(x)를 0에 가깝게 만드는 것이 목적이 되는 것입니다. F(x)가 0과 가까워질수록 출력과 입력이 모두 x와 가까워지며
F(x) = H(x) - x 이므로 F(x)를 0과 가깝게 한다는 말은 H(x) - x를 0과 가깝게 하는 말과 동일한 의미를 지닙니다.
여기서 H(x) - x를 Residual이라고 합니다.
- weight laeyr를 통과한 F(x)와 weight layer를 통과하지 않은 x의 합을 논문에서는 Residual Mapping이라고 하며
위 그림의 구조를 Residual Block이라고 하고 이것이 쌓이면 Residual Network 즉, ResNet이라고 합니다.
- Residual Mapping은 간단하지만 Overfiint, Gradient vanishing 문제가 해결되어 성능이 향상됐습니다.
인용 수에서 볼 수 있듯이 다양한 네트워크 구조에 사용하며 ILSVRC에 우승한 네트워크에도 사용됩니다.
- 본 논문에서는 VGG-19, plain network, residual network 이렇게 3가지에 대해 비교하며(Figure 3) 또한 ResNet의 경우 깊이를 늘리고 Shortcut Connections 방법을 사용하여 다른 네트워크와 결과를 비교하고 있습니다. 여기서 중요한 포인트는 기존의 VGG-16, 19 대비 연산량도 줄어들고 깊이가 깊음에도 불구하고 residual learning을 통해 학습이 더 잘되며 좋은 성능을 이끌어 냈다는 점입니다.
- 위 그림을 보면 알 수 있듯이 34층의 ResNet은 처음을 제외하고는 균일하게 3 x 3 사이즈의 컨볼루션 필터를 사용했습니다. 그리고 특성 맵의 사이즈가 반으로 줄어들 때, 특성 맵의 뎁스를 2배로 높였습니다.
- 최종적으로 2015년 ILSVRC에서 ResNet-152 모델을 가지고 top-5 test error에서 3.57%를 기록하며 우승하게 됩니다.
- 왼쪽 그래프를 보면 plain 네트워크는 망이 깊어지면서 오히려 에러가 커졌음을 알 수 있습니다. 34층의 plain 네트워크가 18층의 plain 네트워크보다 성능이 나쁩니다. 반면, 오른쪽 그래프의 ResNet은 망이 깊어지면서 에러도 역시 작아졌습니다! shortcut을 연결해서 잔차(residual)를 최소가 되게 학습한 효과가 있다는 것입니다.
- ResNet-152 모델의 경우 "bottleneck" building block 구조(layer가 3개)를 가지고 residual function을 구성해 적용하였습니다. (Figure 5)
ResNet 구현
- Tensorflow로 구현했으며 transfer learning으로 ResNet50을 이용해 CIFAR-10 분류했습니다.
from keras.applications.resnet_v2 import ResNet50V2
model = ResNet50V2(include_top=True, weights=None, input_shape=(32, 32, 3), classes=10)
- CIFAR-10의 크기가 32x32x3이며 10개의 클래스가 있기 때문에 설정해 주었습니다
- 훈련
model.compile(optimizer='adam',
loss=losses.categorical_crossentropy,
metrics=['accuracy'])
history = model.fit(x_train, y_train,
batch_size=128,
epochs=50,
verbose=1,
validation_data=(x_test, y_test))
- 결과)
- loss: 1.4717 - accuracy: 0.7445
- 결과가 오히려 VGG나 다른 네트워크로 했을 때 보다 낮게 나온 것을 볼 수 있었습니다.
아마 저장된 가중치를 불러오지 않고 학습했기 때문이라고 생각합니다
이렇게 ResNet 논문을 알아보았고 전이 학습으로 구현해 봤습니다.
질문이나 틀린 점이 있으시면 댓글로 남겨주세요!
감사합니다 :)
| 추가 (2021.11.23) : 전이학습은 가중치를 불러오지 않는다면 의미가 없는가?
댓글을 남겨주셔서 내용 추가하였습니다.
우선 weights 파라미터에 None 설정한 것은 모델을 랜덤 초기화하여 학습을 시작하겠다는 의미입니다.
따라서 weights=None은 사전 학습된 가중치를 사용하지 않겠다는 것을 뜻하며
모든 가중치를 랜덤 하게 초기화하여 학습을 시작합니다.
이는 주로 특정 데이터셋에 특화된 모델을 학습시킬 때 사용됩니다.
따라서 weights=None을 설정하는 것이 "의미가 없다"라고 설명하기는 어렵습니다.
사용자가 특정한 데이터셋에 모델을 처음부터 학습시켜려는 목표를 가지고 있다면
weights=None을 설정하는 것이 오히려 적절할 수 있기 때문입니다.
| 추가 (2023.10.13) : ResNet에서 x값을 뒤로 넘겨주는 게 왜 기울기 소실을 해결하는가?
댓글로 남겨주셔서 내용 추가하였습니다.
기울기 소실을 해결하는 이유부터 말씀드리면 역전파(Backpropagation) 과정에서
스킵 연결을 통해 직접 전달되는 경로가 생기기 때문입니다.
ResNet에서는 스킵 연결(Skip Connection)이라는 특별한 구조를 사용해 기울기 소실 문제를 해결합니다.
이는 입력값 x를 여러 계층을 거쳐서 변환시킨 후, 원래의 입력값 x에 더하는 방식으로 작동합니다.
그렇게 되면 역전파(Backpropagation) 과정에서스킵 연결을 통해 직접 전달되는 경로가 생기게 됩니다.
역전파는 출력층에서 입력층으로 오차를 전파시키면서 각 층의 가중치를 업데이트하는 방식으로 작동합니다.
이때, 계층이 깊어질수록 오차를 전파하는 과정에서 기울기가 점차 작아지는 기울기 소실 문제가 발생합니다.
하지만 ResNet에서 스킵 연결을 통해 입력값 x가 직접 출력층으로 전달되기 때문에,
역전파 과정에서 최소한 기울기가 1이라는 값이 보장됩니다.
즉, 기울기가 완전히 소실되지 않고 전파될 수 있게 됩니다.
스킵 연결을 통해 기울기 소실 문제를 완화하는 방식은 ResNet의 중요한 특징 중 하나이며,
덕분에 깊은 계층 구조를 가진 모델에서도 뛰어난 성능을 보이는 것입니다.
'AI > DL' 카테고리의 다른 글
Batch Normalization (배치 정규화) 이해 (0) | 2021.08.29 |
---|---|
VGGNet 구조 이해 및 구현 (3) | 2021.08.20 |
AlexNet 구조 이해 및 구현 (2) | 2021.08.19 |