멀티 레이블 분류를 보기에 앞서
머신러닝 모델은 크게 회귀 모델과 분류 모델로 나뉠 수 있습니다. 여기서 분류 모델은 이 사진이 개인지 고양이인지를 분류하는 모델, 사람이 맞는지 틀린지를 분류하는 모델 등 0과 1로 라벨링해서 분류를 할 수 있는 이진 분류 문제와, 어떤 사진이 개인지 고양이인지 토끼인지 고라니인지 등 다수의 레이블 중 하나를 선택하는 멀티 클래스 분류가 존재합니다.
이 두 개의 분류 방법 이진 분류, 멀티 클래스 분류는 각각 다른 Activation function
, Loss function
을 사용합니다. 여기서는 Activation function
을 간단하게 정리해보겠습니다. Loss function
에 대해서는 쉽게 정리된 링크로 대체합니다. 링크 해당 링크에서는 뒤에 나올 내용인 멀티 레이블에서 어떤 Loss function
를 써야하는지도 적혀있습니다.
Activation function
분류 문제에 있어 최종 레이블에서 Activation function
으로 사용할 수 있는 함수는 시그모이드 함수와 소프트맥스 함수 입니다.
우선 이진 분류 문제를 가정했을 때, 하나의 클래스가 맞을 확률을 y
라 한다면 나머지 클래스의 확률은 1-y
로 표현할 수 있습니다. 여기서 y / (1-y)
를 오즈(odds)라고 하는 데, 이 값이 클수록 성공확률이 높아지는 걸로 해석할 수 있습니다. 여기에 로그를 취하면 log(y / (1-y))
로 표현할 수 있고, 이를 로짓(logit)이라고 합니다. 이 로짓함수를 역함수로 변환하여 0~1 사이의 값이 나오게 한 함수가 시그모이드이며,
이 이진분류라는 가정에서 본 시그모이드를 일반화한 함수가 소프트맥스라고 볼 수 있습니다. 이 함수는 각 클래스에 대해 0~1사이의 값을 가지며 전체의 합은 1입니다. 전체의 클래스의 합을 1로 고정하기 때문에 다중분류 문제에 사용됩니다.
시그모이드를 다중 분류에 적용하면 확률의 합이 1이 아니기 때문에 시그모이드는 주로 이진 분류 문제에 쓰이게 됩니다. 소프트맥스는 다중 분류 문제에 사용됩니다.
Loss function
분류 문제에서는 크로스 엔트로피라는 Loss function
를 사용하는데, 시그모이드를 사용하는 분류 문제에서는 Binary Crossentropy
를, 소프트맥스를 사용할 때에는 Categorical Crossentropy
를 사용합니다.
멀티 레이블 분류(Multi label classification)
계속해서 사진 분류 문제를 예시로 들어보도록 하겠습니다. 사실 한 사진에 꼭 하나의 객체만이 존재할 필요는 없습니다. 고라니와 토끼가 같이 있는 사진 등이 있을 수 있고, 이런 여러 객체를 탐지할 필요성이 존재하는 분야가 존재할 수 있습니다. 이런 객체 감지 분야를 위한 방법이 멀티 레이블 분류입니다.
위의 그림에서 멀티 레이블 분류는 하나의 객체에 대해서 분류할 수 있는 멀티 클래스 분류와는 달리 다수의 객체를 탐지할 수 있음을 알 수 있습니다.
Activation function
멀티 레이블 분류에서의 Activation function
과 Loss function
는 어떤 걸 사용해야 할까요? 멀티 레이블 분류는 다수의 객체에 대한 분류를 수행하므로 멀티 클래스와 비슷할 것 같지만, 각각의 객체에 대해 개별적인 분류를 수행하기 때문에 시그모이드를 사용하게 됩니다.
위에서 적은 수식을 확인해보겠습니다. 소프트맥스를 적용할 경우, 모든 클래스에 대해 확률값의 합은 1으로 고정됩니다. 직관적으로 생각했을 때, 여러 클래스가 한 사진에 있더라도 확률의 합은 1이어야 하므로 클래스들의 확률값이 낮아지거나 한쪽으로 쏠리게 됩니다. 시그모이드의 경우 개별 적용이므로 이런 문제에서 유용할 수 있습니다.
Loss function
시그모이드를 사용하므로 Binary Crossentropy
를 사용합니다. 여기서 각각의 레이블에 대해 손실함수를 적용하므로 멀티 레이블 분류의 경우 Loss function
는 다음과 같습니다.
구현
전체 코드는 참고의 실습 깃헙 링크에서 확인하실 수 있습니다. 여기서는 Multi label classification의 모델 구현 부분만을 확인해보겠습니다.
모델 구현
일반적인 CNN 모델입니다. 여기서 확인할 수 있는 건 가장 마지막 Dense 부분입니다. 7가지의 카테고리에 대해 시그모이드 함수가 적용되어 있는 걸 확인할 수 있습니다. 앞서 말했듯이 소프트맥스의 경우 각 카테고리의 확률 합이 1이게 계산하므로 각 클래스들의 확률 값이 낮아지거나 꼬입니다.
# 모델
model = Sequential()
model.add(Conv2D(64, kernel_size=(3,3), padding='same', input_shape=(224,224,), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, kernel_size=(3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(256, kernel_size=(3,3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(GlobalAveragePooling2D())
model.add(Dense(128, activation='relu', name='after_gap'))
model.add(Dropout(0.25))
model.add(Dense(7, activation='sigmoid'))
모델 컴파일(Loss)
컴파일 부분에서 확인할 수 있는 것은 로스가 Binary Crossentropy
인 것입니다. 쉽게 정리하면 시그모이드를 적용했으므로 바이너리 크로스엔트로피를 적용했다고 볼 수 있습니다.
# 학습
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['accuracy'])
참고
크로스엔트로피 정리 : 엔트로피 정리
크로스엔트로피 이론 : 초보를 위한 정보이론 안내서 - Entropy란 무엇일까
실습 링크 : image_MTL/multilable_cnn.ipynb at main · saeu5407/image_MTL