Tech Review of Airbnb #6
이미지를 연구하는 것은 Data Science에 있어, 굉장히 중요한 과제 중 하나입니다. 많은 사용자들을 대부분의 서비스들을 이미지로 소비합니다. 어떠한 이미지가 제공되는지가 사용자에게는 서비스의 신뢰도와 충성도를 결정하는 중요한 요인이 될 것입니다. Airbnb라는 서비스에서도 마찬가지입니다. 우리는 집을 선택하고 고르는데 다양한 요소들을 고려합니다. 우리가 원하는 집의 Spec부터, 위치 등 많은 것을 고려합니다. 이러한 것들을 판단하는 기준에 있어 제공되는 사진들은 매우 중요할 것입니다. 이번 리뷰에서는 Airbnb에서 그들의 서비스에서 이미지에 대해 어떠한 고민을 하고 있고, 그 문제를 어떻게 풀어나갔는지 알아보고자 합니다.
Large-scale deep learning models are changing the way we think about images of homes on our platform
Airbnb는 수천만 개의 home들을 그들에 플랫폼에서 제공한다. 전 세계의 여행자들은 그들의 여행에 있어 최고의 home들을 찾고 발견한다. 지역과 가격의 측면에서 listing photo들은 게스트가 검색을 하는 과정에서 의사결정을 하는데 가장 중요한 요소 중 하나이다. 그러나 최근까지, 우리는 이 중요한 photo들에 대해 아주 조금만 알고 있었다. 게스트가 home의 listing photo들과 상호작용할 때, 우리는 그들에게 어떻게 유용한 사진을 제공하고, 어떻게 사진을 통해 전달되는 정보가 정확하다고 확신을 주어야 하는지 알지 못했다. 또한 어떻게 호스트들에게 게스트들에게 더 잘 어필하기 위해, 그들의 사진을 어떻게 개선해야 하는지 조언을 주지 못했다.
이런 이미지를 잘 학습하여 두면, Host들에게도, Guest들에게도 충분한 가치를 줄 수 있습니다. 무엇을 어떻게 해야 할지 모르는 상황에서 Host들에게는 Assistant Technology로 작용할 것입니다. Guest들에게는 서비스에 대해 신뢰와 만족을 가져다줄 것입니다.
최근의 computer vision과 deep learning의 발전으로, 우리는 위의 문제를 푸는데 이러한 기술들을 적용할 수 있었다. 우리는 이 프로젝트의 목표로 listing photos를 다양한 room type으로 categorizing 하는 것으로 초기 설정했다. 우선 categorization은 동일한 room type을 함께 묶어줌으로써 home을 더 쉽게 둘러볼 수 있게 해 준다. 또한, categorization은 방의 개수를 체크하고, 방에 대한 기본적인 정보가 정확한지 확인하는 것을 가능하게 했다. 더 나아가서, 우리는 이미지 기술을 Airbnb의 이미지에 적용함으로써 더 흥미로운 기회들을 얻을 것이라 믿는다. 이번 포스팅에서 일부 예시를 소개하겠다.
주어진 listing photo의 room type을 정확하게 분류하는 능력은 사용자 경험을 최적화하는데 매우 유용하다. 게스트의 측면에서 생각해보면, 우리는 Image Classification 기술을 활용하여 사진을 re-ranking 하고 re-layout 할 수 있으며, 이를 통해 게스트가 관심을 갖는 room type의 사진을 우선적으로 노출할 수 있다. 호스트의 측면에서 생각해보면, 우리는 Image Classification 기술을 활용하여 listing photo들이 시장의 평균적인 사진의 품질 정도가 되는지 검토할 수 있도록 도와준다. 즉, 정확한 photo categorization은 이러한 기능들의 핵심 기술이다.
우리가 첫 번째로 분류하고자 했던 방의 유형은 Bedrooms, Bathrooms, Living Rooms, Kitchens, Swimming Pools, 그리고 Views이다. 우리는 제품팀의 요구에 따라 다른 유형의 room type을 추가하려 하였다.
우리가 풀려는 Room type classification 문제는 ImageNet classification 문제와 거의 동일하며, 모델의 결과가 customized room type이라는 점만 다르다. 그렇기에 VGG, ResNet, Inception과 같은 최신의 state-of-the-art Deep Neural Network(DNN) 모델은 우리의 경우에 그대로 적용되지는 않는다. 기본적으로 우리는 몇 가지 변형을 해야 한다. 첫 번째로 마지막 몇 개의 DNN layer를 우리의 output dimension과 맞추어야 한다. 두 번째, 만족스러운 performance를 얻기 위하여 기존의 DNN을 재학습 하여야 한다. 이러한 모델들을 몇 번 실험한 이후, 우리는 model performance과 computation time을 종합적으로 고려하여, ResNet50을 우리의 모델로 선정하였다. 우리의 사례에 더 적합하게 적용하기 위해, 우리는 두 개의 fully connected layer와 softmax activation을 마지막에 추가하였다. 우리가 수행한 추가적인 training option은 다음 section에서 설명하도록 하겠다.
Airbnb에서는 기존의 모델을 이용하여, 데이터를 바꾸는 Transfer learning을 이용하였습니다. 분명한 것은, 기존의 학습된 모델을 이용함으로써 빠르게 모델을 생산해보고 적용해볼 수 있었다는 점에서 좋다고 생각이 듭니다. 또한 Data Science에서는 자신들에게 잘 적용할 수 있는 좋은 reference를 찾는 것 역시 필요한 역량이며, Imaga Classification 문제는 이미 많은 연구자들이 연구를 한 문제이기 때문에 기존의 ResNet 모델을 적용한 점은 매우 좋았다고 생각이 듭니다.
ResNet50의 re-training 시나리오는 3가지가 있다.
1. 기본 ResNet50 모델을 고정시켜놓고 단지 2개의 layer를 추가하여 최소한의 데이터로 re-train 한다. 보통 fine-tuning이라고 불린다.
2. 더 많은 데이터를 이용하여, 1번의 fine tuning을 수행한다.
3. 수정된 ResNet50을 모두 반영하여 처음부터 다시 re-train 한다.
대부분의 online tutorial에서는 빠르고 보통 좋은 결과를 낼 수 있는 첫 번째 접근방식을 사용한다. 우리는 첫 번째 접근방식을 시도하였고, 몇 가지 합리적인 초기 결과를 얻었다. 하지만 더 좋은 품질의 image product를 론칭하기 위해, 우리는 모델의 performance를 더 극적으로 개선(95% 이상의 precision, 80% 이상의 recall)할 필요가 있었다.
Transfer learning을 하는 데 있어, 어떠한 시나리오는 택할지는 기존의 학습된 데이터와 새롭게 학습하고자 하는 데이터의 분포 간의 유사성, 그리고 각 데이터 셋의 크기에 따라 결정이 될 것입니다. 또한 학습의 목적과 얼마나 기존의 모델의 목적이 유사한지를 살펴보고 신중하게 학습 방식을 선정해야 할 것입니다.
높은 precision과 높은 recall 얻기 위해, 우리는 더 많은 데이터를 사용해 DNN을 re-train 해야만 한다고 생각했다. 하지만 두 가지 어려움이 있었다. 첫 번째, 우리는 호스트가 올린 많은 listing photo들이 있지만, 우리는 정확한 room-type label이 붙어 있지 않기 때문에 정확히 알지 못한다. 두 번째, ResNet50과 같은 DNN을 re-train 하는 것은 매우 어려운 일이다. 학습해야 하는 2500만 개 이상의 parameter들이 있으며, 이것은 엄청난 양의 GPU를 필요로 한다. 이 두 가지 어려움을 다음 두 섹션에서 다루도록 하겠다.
많은 회사들이 third-party vendor들로부터 고품질의 image data label을 얻는다. 수백만 장의 사진에 label을 붙여하는 우리에게 이 방법은 경제적인 해결책이 아니다. Cost와 Performance의 밸런스를 찾기 위해, 우리는 hybrid 방식으로 labeling problem에 접근하였다. 한쪽 측면에서, 우리는 수천/수만 개의 적은 수의 사진들에 대해 vendor들에게 label을 붙여 달라고 요청하였다. 이렇게 label 된 golden set은 우리의 model을 평가하는 데 사용되었다. 우리는 random sampling 하여 golden set을 얻었으며, 데이터가 편향되지 않았다는 것을 확신했다. 다른 측면에서, 호스트들이 달아놓은 image caption들을 room-type 정보의 대체제로 사용하였으며, 이것으로부터 label을 추출하였다. 이 아이디어는 우리가 비싼 labeling task를 무료로 할 수 있게 해 주었기 때문에, 매우 중요한 작업이었다. 우리는 image caption으로부터 room-type의 label이 정확하고 믿을 수 있도록 추출하는 방법이 필요했을 뿐이다.
Image caption에서 room-type label을 추출하는 방법은 다음과 같다. Image caption에서 특정 room-type의 키워드가 발견된다면, 해당 room-type으로 label 한다. 하지만 실제 데이터는 그것보다 복잡하다. 실제 결과를 본다면 매우 실망스러울 것이다. 우리는 실제 사진과 무관한 내용의 image caption들을 많이 발견하였다. 그러한 나쁜 예들은 아래와 같다.
이러한 나쁜 예를 filtering 하기 위해, 우리는 room-type label을 image caption들로부터 추출하는데, 몇 가지 규칙을 추가하였다. 몇 번의 filtering과 checking 이후, label의 품질이 크게 향상되었다. 아래의 예는 어떻게 Kitchen 데이터를 필터링하여 상대적으로 clean 한 Kitchen 이미지를 얻었는지에 대한 것이다.
AND LOWER(caption) like '%kitchen%'
AND LENGTH(caption) <= 22
AND LOWER(caption) NOT LIKE '%bed%'
AND LOWER(caption) NOT LIKE '%bath%'
AND LOWER(caption) NOT LIKE '%pool%'
AND LOWER(caption) NOT LIKE '%living%'
AND LOWER(caption) NOT LIKE '%view%'
AND LOWER(caption) NOT LIKE '%door%'
AND LOWER(caption) NOT LIKE '%table%'
AND LOWER(caption) NOT LIKE '%deck%'
AND LOWER(caption) NOT LIKE '%cabinet%'
AND LOWER(caption) NOT LIKE '%entrance%'
이러한 추가적인 필터 때문에, 우리는 꽤 많은 사진 데이터를 활용하지 못한다. 하지만 각 room type 별로 수십만/수백만 장씩 있기에 충분히 괜찮다. 게다가, 필터링되고 남은 사진들의 label 품질은 훨씬 좋아졌다. 우리는 filtering을 하여도 data의 분포가 변화하지 않는다고 가정하였으며, 이것은 golden dataset을 통해 검증하였다.
간혹 데이터가 많다고 해서, 모든 데이터를 활용할 수 있다고 생각하는 경우가 있습니다. 그리고 데이터 양이 모든 것을 해결해줄 것이라고 여기는 경우도 있습니다. 하지만 이러한 supervised learning의 경우, 양질의 labeled 된 데이터가 없는 경우, 그 모델의 성능은 현저히 떨어지며, Data Science로 접근을 한 것이 의미가 없어집니다. 그렇기에 golden set을 구성하는 노력 역시 매우 중요하며, domain knowledge를 통해, heuristic 한 방식을 통해 데이터를 labeling 하는 과정도 매우 중요하다는 생각이 듭니다.
우리는 NLP 기술을 rule-base의 heuristic 대신에 사용하여 image caption을 동적으로 클러스터 하는 데 사용할 수 있을 것이다. 하지만 우리는 우선 NLP를 이용하는 것은 차후에 하기로 하고, heuristic을 이용하기로 하였다.
수백만 개의 사진을 이용하여 ResNet50과 같은 DNN을 re-train 하는 데는 많은 computational resource가 필요하다. 우리는 Nvidia GPU를 사용하는 AWS Instance를 사용하였으며, backend에서는 parallel training을 위해 Tensorflow를 사용하였다. (자세한 SPEC은 원문에서 확인하시기 바랍니다.) 우리는 parallelizing 한 이후 모델을 compile 하였다. 학습 속도를 올리기 위해, pre-trained 된 imagenet weight(keras.applications.resnet50.ResNet50)을 사용하였다. 최고의 모델은 3 epoch 동안 학습된 것이었다. 그 이후, 모델일 overfitting 되기 시작하였으며, validation set의 performance가 더 이상 개선되지 않았다.
한 가지 중요한 점은 우리는 다양한 room type에 대하여, 모든 room type을 커버할 수 있는 multi-class model을 사용한 것이 아니라, multiple binary-class model을 사용했다는 것이다. 이는 이상적인 것은 아니었지만, 우리는 모델을 offline으로 서빙하기 때문에 multiple model 호출로 인한 추가적인 delay의 영향은 매우 작았다. 우리는 곧 multi-class model로 변경할 것이다.
Airbnb에서 왜 multi-class model이 아닌 multiple binary-class model을 사용했는지 의문이 듭니다. 여기서 생각할 수 있는 이유는 몇 가지 있습니다. 첫 번째, class의 수가 매우 적기 때문에 multi-class로 설정할 필요까지 없으며, 특정 room-type인지 아닌지 결정하는 것만 중요하다고 생각했을 수도 있습니다. 또한, room-type별 사진의 수가 불균형하였을 수도 있습니다. 두 번째, 데이터 품질이 너무 좋지 않아, 낮은 확률로 label 된 것을 버리며, 보수적으로 접근하려 했기 때문일 수도 있습니다.
우리는 우리의 모델들을 precision과 recall 관점에서 평가하였다. 또한 F1 score와 accuracy와 같은 metrics들을 관찰하였다. 이것들의 정의는 아래와 같다. (자세한 정의 및 개념들은 Wikipedia 등을 참고하시면 좋습니다.)
Confusion Matrix는 위의 지표들을 계산하는 metrics이다. 우리 모델의 기본적인 output은 각 이미지에 대한 0에서 1 사이의 확률 값이다. Confusion matrix를 계산하기 위해서는 확률 값을 0이나 1로 변환하기 위한 threshold가 필요하다. Threshold 값이 정해지면 Precision-Recall curve(P-R curve)가 그려진다. 이렇게 그려진 curve의 아래 영역인 AUC(Area Under Curve)가 1에 가까울수록 정확한 모델이라 할 수 있다.
모델들을 평가할 때, 우리는 앞서 언급된 goldel set을 사용하였다. 우리는 room type에 따라 accuracy가 다르다는 것을 발견하였다. Bedroom과 Bathroom 모델이 가장 정확하였다. 여기에서는 Bedroom과 Living Room에 대한 P-R curve를 보여줄 것이다. 두 개의 점선이 교차하는 지점은 특정 threshold가 주어졌을 때의 final performance이다. 아래에서 summary를 확인할 수 있다.
우리는 두 가지를 관찰할 수 있었다.
1. 전체적으로 Bedroom 모델의 performance가 Living room 모델보다 좋다. 그 이유는 두 가지 이유로 설명될 수 있다. 첫 번째, Bedroom은 Living room보다 쉽게 분류될 수 있다. 왜냐하면 Bedroom의 세팅은 Living room에 비해 상대적으로 표준화되어 있고, 덜 다양하기 때문이다. 두 번째, Bedroom 사진들로부터 추출된 label들이 Living room 사진들로부터 추출된 label에 비해 품질이 우수하다. 왜냐하면 Living Room의 사진들은 Dining Room이나 Kitchen을 포함하기 때문이다.
2. 각각의 room type에 대해, fully re-trained 모델 (red curve)가 partially re-trained 모델(blue curve)보다 performance가 좋다. 그리고 그 차이는 Living room보다 Bedroom 모델에서 더 크다. 이것은 full ResNet50 모델을 re-training 하는 것이 room type별로 다른 영향을 미친다는 것을 의미한다.
우리가 생성한 6개의 모델들의 precision은 전체적으로 95%을 넘었으며, recall은 50%를 넘었다. 다른 threshold 값을 설정함으로써 trade-off 관계를 만들 수 있다. 모델은 Airbnb 내 여러 product team 사이의 다양한 product들에 대해 제공되었다.
사용자들은 우리의 결과를 잘 알려진 third-part image recognition API들과 비교했다. 우리가 만든 모델이 타사의 일반 모델보다 좋은 성능을 보이는 것을 확인할 수 있었다. 이것은 자신의 데이터를 활용하는 것의 장점이며, 그랬을 때 우리가 관심 있어하는 특정 task에 대해 state-of-the-art 모델보다 더 뛰어난 모델을 만들 기회를 갖게 된다는 것을 의미한다.
이번 섹션을 마무리하며, 우리 모델의 몇 가지 구체적인 사례를 아래에서 보여주겠다.
이 프로젝트를 하는 동안, 우리는 room type classification은 넘어 몇 가지 흥미로운 아이디어를 시도하였다. 우리는 두 가지 예시를 여기서 설명하고, 이 문제들이 얼마나 흥미로운지 보여주도록 하겠다.
우리는 room type classification을 pre-trained 된 ResNet50 모델을 이용하여 학습하였으며, 2048 X 1 짜기 image embedding들을 coverpage 사진들에 대해 생성하였다. 우리는 이 embedding들의 의미를 해석하기 위해, PCA 기법을 활용하여 2D plane으로 투영(projection)시켰다. 놀랍게도, 투영된 데이터는 자연스럽게 두 그룹으로 나뉘었다. 두 그룹을 조사해보니 왼쪽 그룹은 거의 실내에서만 볼 수 있는 장면(indoor scene)이었으며, 오른쪽 그룹은 거의 야외에서만 볼 수 있는 장면(outdoor scene)이었다. 이 의미는 별도의 re-training 없이, image embedding들에 대한 첫 번째 principal component에 cut line을 설정하여 indoor와 outdoor를 구분할 수 있다는 것을 의미한다. 이것은 Unsupervised Learning에서도 transfer learning이 적절한 경우가 있는 것을 보여준다.
Room-type에 분명히 indoor에 주로 있는 것과 outdoor에 주로 있는 것들이 있기 때문에, 학습을 하면서 이 역시 embedding feature에 자연스럽게 녹아들어 간 것 같습니다.
우리가 살펴본 또 다른 영역은 object detection이다. Pre-trained 된 Faster R-CNN모델은 이미 엄청난 결과를 제공하고 있었다. 아래의 예시에서 알 수 있듯이, 이 모델은 Window, Door, Dining Table과 그것들의 위치를 찾는 것이 가능했다. Tensorflow Object Detection API를 사용하여, 우리의 listing phtos에 대해 몇까지 evaluation을 빠르게 시도하였다. 많은 home amenity들을 detect 할 수 있었다. 미래에는 Faster R-CNN 모델을 Airbnb의 customized 된 amenity label을 이용하여 re-train 시키려 한다. Open source 데이터에는 몇 label들이 누락되어 있기 때문에, 우리는 몇 가지 label들을 별도로 만들 것이다. Amenity를 detect 하는 알고리즘을 통해, 우리는 호스트가 작성한 listing의 수향을 확인할 수 있고, 게스트들이 원하는 수량의 amenity 들을 지닌 집을 빠르게 찾게 도와줄 수 있다. 이를 통해, Airbnb의 photo intelligence는 한 단계 더 발전할 것이다.
다음은 deep learning을 실제로 사용하는 사람에게 도움이 될만한 몇 가지 요소이다.
첫 번째, deep learning은 supervised learning의 한 종류에 불과하다. 좋은 품질의 label 된 데이터의 중요성을 과대평가하지 않을 수 없다. Deep learning은 대게 좋은 품질의 모델을 위해 유의미한 양의 training data를 필요로 하기 때문에, labeling 하는 효과적인 방법을 찾는 것은 매우 중요하다. 우리는 economical 하며, scalable 하고 reliable 한 hybrid approach를 사용하였다.
두 번째, ResNet50과 같은 DNN을 처음부터 학습하는 경우를 포함하여야 한다. 처음에는 간단하고 빠른 방법부터 시도해야 한다. 마치 우리가 적은 데이터로 top layer부터 학습하였던 것처럼 시작해야 한다. 만약 많은 양의 training 데이터가 있다면, DNN을 처음부터 re-train 하면 state-of-the-art의 성능을 얻을 수 있다.
세 번째, training을 parallelize 해야 한다. 우리의 경우 8개의 GPU를 사용함으로써 6배의 속도 향상을 얻었다. 이는 복잡한 DNN 모델을 computationally 더 효율적으로 학습하게 한다.
저는 Airbnb가 유연한 사고를 지녔다는 생각이 듭니다. Deep Learning에만 의존하지도 않고 유연하게 자신의 데이터를 이용하였습니다. 또한 초기에 접근해야 할 방식을 잘 선정하여, Data가 부족할 상태에서는 heuristic 한 방법도 사용하였습니다. 이러한 유연성과 단계적 접근 방식이 Airbnb가 지닌 가장 큰 강점 중 하나이지 않을까 합니다.
이 글은 아래의 원문을 번역/의역 및 요약하였습니다. 중간중간 파란색으로 표시된 글씨는 번역자의 견해입니다.
https://medium.com/airbnb-engineering/categorizing-listing-photos-at-airbnb-f9483f3ab7e3
지난 리뷰 보기
https://brunch.co.kr/@andrewhwan/54
https://brunch.co.kr/@sonjoosik/3