Vanishing Gradient(기울기 손실) 문제란 gradient descent와 back propogation 기반으로 학습하는 모델에서 나타나는 현상이다. ResNet에서는 모델이 깊어질수록 최적화에서 멀어지는 것에 주목했다. 레이어가 깊어질수록 곱해지는 미분값들이 증가함에 다라 초기값에 집중하지 못해서 CNN 자체의 성능이 떨어지게 된다. ResNet 논문에서는 이 기울기 손실 문제를 degradation problem으로 정의하였고 이를 해결하기 위한 기법으로 residual connection가 나왔다.
Residual Connection (skipped connection)
Residual Connection이란 layer와 layer 사이를 건너뛰는 일종의 지름길에 해당하는 연결
기존의 신경망은 입력값 x를 타겟값 y를 매핑하는 함수 H(x)를 얻는 것이 목적 H(x) = F(x) + x → (resnet은 F(x) + x 를 최소화하는 것을 목적으로 한다)
x는 현시점에서 변할 수 없으므로 F(x)가 0에 가깝게 되게 만드는 것이 목적 F(x) = H(x) - x이므로 H(x) - x인 잔차(residual)를 최소로 해주는 것
첫번째 layer에 들어갈 input인 𝑥 가 전달되어 두번째 layer의 output과 더해진다. 이렇게 되면 back propagation으로 gradient를 전달할 때 layer의 output인 𝐹(𝑥) 뿐만 아니라 𝑥 의 미분도 함께 계산되어 전달된다. 단순히 𝑥 를 미분하면 1 이기 때문에 gradient에 항상 1이 더해져서 0에 가까워지는 문제를 원천봉쇄 할 수 있게 된다.
# 사전학습 모델 불러오기
from tensorflow.keras.applications.resnet50 import ResNet50
# ImageNet으로 학습된 ResNet-50 모델
# include_top=False 가장 마지막의 classification layer는 포함하지 않는다
resnet = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape)
# 불러온 ResNet50 모델의 모든 layer를 freeze(학습 가능하지 않게 설정)
resnet.trainable = False
# for layer in resnet.layers: 더 세부적인 layer 설정
# layer.trainable = False
x = resnet.output
x = Flatten()(x)
outputs = Dense(10, activation='softmax')(x) # 출력층
# 모델
ResNet_model = Model(resnet.inputs,
outputs)