[ICCV 2023] Verbs in Action: Improving Verb Understanding in Video-Language Models

제가 현재 연구주제로 잡은 task인 Moment Retrieval은 사용자의 텍스트 쿼리를 입력받아 길고 다양한 컨텐츠를 포함하고 있는 untrimmed video 내에서 상응하는 구간을 찾아내는 것이 목적입니다. 처음에는 해당 task를 수행하는 데에 효율성을 중시하거나 학계 데이터셋과 실제 사용자 쿼리 간 도메인 갭을 메우는 연구를 해보려고 했으나, 우선 지금 살펴보고 있는 포인트는 바로 텍스트 쿼리의 중요성입니다.

제가 이전에 리뷰했던 QD-DETR과 이의 후속연구 CG-DETR에서 텍스트 쿼리의 중요성을 피력하며 비디오와 텍스트의 local한 정보까지 학습에서 명시적으로 활용하는 논문이 존재하였습니다. 저 또한 Moment Retrieval task 자체가 주어진 텍스트 쿼리에 상응하는 구간을 비디오에서 찾는 것이기 때문에, 기본적으로 텍스트 쿼리가 정확히 어떠한 의미론적 상황을 담고 있는지 파악하는 것이 제일 중요하고 우선되어야 한다고 생각합니다. 하지만 이 방법론들은 특정 조건(dummy token, loss)를 주고 feature-level에서 알아서 학습되길 기대하는 측면이 좀 크다고 느껴져, 최근 텍스트 쿼리가 feature로 임베딩 되기 전 자연어 문장에서부터 구별력을 주어 학습을 하는 방법론들이 무엇이 있는지 찾아보고 있었습니다.

이에 따라 이번 주 X-Review에서 소개해드릴 논문은 23년도 ICCV에 게재된 <Verbs in Action: Improving Verb Understanding in Video-Language Models> 이며, Moment Retrieval을 수행하진 않지만 우선 문장에서 동사의 중요성을 강조하고 이를 모델에게도 주입시켜주기 위해 LLM과 간단한 수식들을 활용해 좋은 표현력을 학습시킨 논문입니다. 여담으로 본 논문은 저희에게 익숙한 VGG 네트워크를 만든 옥스포드대학 Visual Geometry Group과 구글에서 나온 연구입니다.

리뷰 바로 시작하겠습니다.

1. Introduction

예전부터 연구실에서 꾸준히 언급되었던 CLIP에 대해 이젠 모든 분들이 아실거라고 생각됩니다. CLIP을 필두로 수많은 Vision-Language Models (VLMs)들은 비디오 관련 멀티모달 task인 text-to-video retrieval, video question-answering 등등에서 꽤나 강력한 zero-shot 성능을 보여주고 있었습니다. 이러한 모델들이 비디오-텍스트 쌍으로 사전학습한 것이 아닌 이미지-텍스트 쌍으로 사전학습된 모델이라는 점을 감안한다면 놀라운 결과이긴 합니다.

이렇게 높은 zero-shot 성능을 보여주고 있는 것은 사실이지만 최근 연구들은 CLIP과 같이 이미지-텍스트 쌍으로 사전학습한 모델들이 명사에 편향적이라고 지적하고 있습니다. 물론 영상을 다루는 task에서는 이 점이 상대적으로 큰 문제가 되지 않을 수 있지만, 시공간 축에 따라 여러 상황 변화와 행동이 발생하는 비디오 관련 task에서는 사전학습된 CLIP만으로는 표현력이 부족하다는 것이죠. 이러한 문제를 해결할 수 있는 가장 단순한 방식은 비디오-텍스트 데이터셋에 fine-tuning을 하는 것입니다. 그러나 기존 연구에 따르면 이렇게 단순히 수행한 fine-tuning은 동사를 이해하는 데에 큰 도움이 되지 않았다고 합니다. 자연어 문장을 함께 다루는 비디오 task에서 문장 내 포함된 동사는 비디오에 등장하는 사람들이 주변 물체, 환경과 어떻게 상호작용하는지에 대한 정보를 함축하고 있기 때문에 지금보다 더 중점적으로 모델링되어야 합니다.

저자는 fine-tuning을 한 모델을 포함해 왜 기존 연구들이 Video understanding에 중요한 동사를 이해하지 못하는지에 대한 2가지 이유를 이야기합니다. 첫 번째 이유는 이미 CLIP과 같은 사전학습 모델이 이미 강력하게 object에 편향되어있다는 점입니다. 그렇기 때문에 fine-tuning을 수행하더라도, 동적이고 시간축에 따라 변화하는 동사를 잘 이해하지 못한다는 것입니다. 두 번째 이유는 사전학습 시 사용하는 contrastive objective의 한계가 있다는 것입니다. 당시 학계에서 사전학습에 사용할만한, 즉 문맥은 비슷하되 동사만 다른 문장이 매핑되어있는 데이터셋이 존재하지 않았기 때문에 모델은 사전학습을 수행하는 중 동사의 의미를 명확히 파악하지 않아도 최적으로 도달할 수 있었다고 이야기합니다. 정리하자면 CLIP과 같은 거대 Image-Text 사전학습 모델로 비디오 도메인의 task를 수행하기 위해서는 동사를 이해하는 능력이 중요한데, 기존 연구들은 제대로 된 contrastive learning을 하고 있지 않았을 뿐더러 학계에는 그러한 목적으로 사전학습을 수행할 적합한 데이터셋이 구축되어있지 않았다는 의미입니다.

위와 같은 문제점을 해결하기 위해서는 동사의 의미를 깊게 파악하기 위해 문맥은 비슷하되 동사만 변형된 문장 데이터셋과 이러한 지식을 모델에게 주입시켜주기 위한 최적의 loss가 필요합니다. 이에 따라 저자가 제안하는 방법론 Verb-Focused Contrastive pretraining (VFC)는 마찬가지로 아래 그림 1에서 확인할 수 있는 두 가지의 학습 테크닉을 제안합니다.

그림 1

첫 번째로 그림 1의 왼쪽과 같이 LLM을 활용해 학습 때 사용할 negative 문장을 생성해냅니다. 생성하는 negative 문장은 기존 문장의 context는 유지하되 동사 부분만 바뀌게 됩니다. 배치 내 다른 텍스트 캡션의 동사를 가져오거나 단순히 캡션 내 단어 순서를 바꾸는 기존 방법들과 다르게 LLM으로 새로운 문장을 ‘생성’하는 것이 차별점이 되겠습니다. 두 번째로, 이렇게 생성한 negative 문장들을 학습에 그대로 사용한다면 contrastive learning 시 positive와의 불균형을 이루며 학습에 악영향을 미친다고 합니다. 저자는 이러한 불균형을 해소하고자 calibration strategy를 제시하며 학습의 안정성을 향상시켜주게 됩니다.

이와 같은 두 가지 학습 테크닉 이외에도 모델이 verb phrase 자체에 대한 의미를 파악할 수 있도록 그림 1의 오른쪽에 나타나있는 verb phrase loss를 제안합니다. 이 또한 LLM을 활용하게 됩니다. 이와 같은 방식을 활용해 CLIP 기반의 모델을 비디오-캡션 데이터셋으로 학습시켜 다양한 벤치마크에서 평가를 진행합니다. 자세한 방법론과 실험 결과들은 이제부터 알아보도록 하겠습니다.

2. Method

방법론은 LLM에 대한 의존성이 큰만큼 그리 어렵지 않습니다. 이에 대해 간단하게 소개해드리겠습니다.

2.1 Preliminaries

Large Language Models (LLMs)

앞서 간단히 설명드렸지만, 우선 저자가 제안하는 VFC 방법론은 LLM에게 prompt를 주어 원본 캡션으로부터 verb-focused hard negative caption들과 isolate verb phrases를 추출하도록 지시해줍니다. 이 때 사용되는 LLM은 구글의 PaLM이며, 당시 기준으로 SOTA 모델이었다고 합니다. Negative 캡션을 생성하거나 동사구를 뽑아낼 때 PaLM이 아닌 다른 LLM을 활용하거나 LLM이 아닌 manual 한 방법론들을 활용했을 때의 성능도 실험 부분에서 추후 알아보겠습니다.

Video-language contrastive pretraining

본 논문의 목적은 Vision-language 모델에게 비디오 속 동사의 구별력을 강조되어있는 효과적인 feature를 얻고자 하는 것입니다. 이를 위해 기본적으로는 contrastive learning을 수행하며 본 방법론은 기존의 contrastive learning 프레임워크를 크게 수정하지 않으면서 LLM을 활용해 동사의 표현력을 학습하는 방법론이라고 생각하시면 됩니다.

우선 N개의 비디오-텍스트 쌍 {(V_{i}, T_{i})}{i \in{} N}가 있을 때 비디오 인코더 f와 텍스트 인코더 g를 통해 각각의 feature v{i} = f(V_{i}), t_{i} = g(T_{i})를 추출합니다. 여기까지 진행했을 때 가장 기본적인 contrastive learning은 L^{t2v} + L^{v2t}를 최적화하는 것이고, L_{i}^{t2v}는 아래 수식 (1)과 같습니다.

L_{i}^{v2t}는 위 수식 (1)에서 vt의 notation만 바꿔주면 되고, 해당 loss가 최적화 되기 위해서는 pos 끼리는 유사도 최대화, neg 쌍 끼리는 유사도가 최소화되는 방향으로 학습이 진행될 것입니다. VFC는 텍스트 캡션을 생성하기 때문에 L_{i}^{v2t}를 조작하는 방법론이라고 생각하시면 됩니다.

이러한 학습을 진행할 모델은 CLIP 기반 모델 CLIP4Clip이며, 단순하게 CLIP의 이미지, 텍스트 인코더 feature를 aggregation하는 과정에서 비디오 트랜스포머가 추가로 붙어있는 모델이라고 생각하시면 됩니다.

2.2 Verb-Focused Contrastive Pretraining (VFC)

Calibrated Hard Negative Mining

모델에게 verb-reasoning이 가능하도록 LLM을 통해 negative 캡션들을 생성해냅니다. 이를 위해 기존 텍스트 캡션 내 존재하는 동사들을 모두 바꿔 의미를 변형해주도록 LLM에게 지시하여 만들어줍니다. 이 때 랜덤으로 동사를 바꿔주는 방식도 생각해볼 수 있는데, 예를 들어 ‘a man washes his face’라는 원본 캡션이 존재한다면, 현재는 ‘washes’라는 동사 자리에 ‘jumps’나 ‘plays’ 같은 동사가 들어오면 아예 문장의 문맥이 파괴되게 됩니다. 이렇듯 생성된 문장에 대해 최소한의 문맥은 보장해주기 위해 LLM을 활용하였다고 합니다.

학습 중엔 하나의 캡션에 대해 ‘In this task, you are given an input sentence. Your job is to tell me 10 output sentences with a different meaning by only changing the action verbs’라는 프롬프트를 주어 negative 캡션들을 추출합니다. 아래 그림 2에서 LLM이 생성한 negative 캡션에 대한 예시를 확인할 수 있습니다.

그림 2

일반적으로 contrastive learning을 수행할 때 배치사이즈가 클수록, 즉 negative 개수가 많을수록 성능이 크게 오르지만 저자는 본 task에서 positive에 비해 negative 개수가 너무 많아지면 feature space에 좋지 않은 왜곡을 불러온다고 이야기합니다.

표 1

먼저 위 표 1을 보시면 \omega{}는 문장 내 존재하는 동사로, S_{\omega{}}는 학습 중 원본 학습 데이터셋에서의 \omega{}의 개수, G_{\omega{}}는 LLM이 생성한 문장에서 \omega{}의 개수입니다. 저자는 둘 간의 비율 R_{\omega{}}를 배치에 독립적으로 만들어주는 것이 학습에 좋은 영향을 준다고 이야기합니다.

위 표 1에서 베이스라인은 생성한 Hard negative 없이 배치 내 타 샘플을 negative로 사용하는 경우로, 아까 말씀드린 수식 (1)의 변형과 동일합니다. 이 때의 비율 R_{\omega{}}\omega{}에 독립적인 상황입니다. LLM을 통해 생성한 Hard Negative를 학습에 활용하는 HN은 수식 상으로 negative 부분에 배치 내에서 생성한 negative들도 고려되고 있는 상황입니다. HN의 R_{\omega{}}는 배치 사이즈 B에 의존적이기에 negative 개수가 배치 사이즈에 비례하여 커질수록 feature space에 왜곡을 불러온다고 합니다.

따라서 저자가 제안하는 Calibration 방법론은 세번째 수식인 Calibrated HN과 같습니다. 수식이 어려워보이지만 단순히 G_{\omega{}} \approx{} G_{\omega{}}가 될 수 있도록 배치 내 자기 자신을 제외한 나머지 샘플들로 생성한 HN은 사용하지 않습니다. 수식을 보시면 현재 보고 있는 자신의 캡션만으로 생성한 HN들만이 추가적으로 사용되고 있는 상황입니다. 이러한 방식을 통해 안정적이고 효과적인 학습을 수행했다고 합니다.

The verb phrase loss

앞서 LLM으로 negative 캡션들을 추출한 것 이외에 동사 구도 추출합니다. LLM에게 ‘In this task, you are given an input sentence. Your job is to output the action verb phrases.’라는 지시를 주어 문장에서 동사 구만을 뽑아냅니다. 이렇게 동사 구를 뽑아내는 능력 또한 다른 manual한 방식보다 LLM이 더 유동적으로, 모호한 케이스에 대해서도 대응할 수 있는 능력을 갖췄기에 사용했다고 합니다.

이후 추출한 동사구로 아래와 같은 loss를 적용해 동사 구 끼리의 학습을 진행해줍니다. 여기선 별도로 hard negative를 추출하진 않고, 단순히 배치 내 동사 구 끼리 학습하는 것입니다.

여기까지가 저자가 제안하는 VFC의 전부입니다. 최종적으로 학습하는 loss는 아래와 같습니다.

2.3 Implementation details

저자가 위에서 제안한 내용으로 먼저 CLIP4Clip 모델을 사전학습 해줍니다. 다른 방법론들은 일반적으로 HowTo100M이라는 데이터셋으로 사전학습을 진행하는데, 본 논문은 Spoken Moments in Time (SMiT) 데이터셋으로 사전학습을 진행했다고 합니다. 사전학습을 어떠한 데이터셋으로 수행했는지에 따라 fair comparison 문제가 발생할 수 있을 것 같은데, 우선은 저자도 상대적으로 규모가 작은 SMiT로 사전학습 하는게 HowTo100M과 유사하거나 높은 성능을 보여준다고하며 후속 연구에서 SMiT를 많이 활용하라는 이야기도 하고 있습니다.

추가적으로 LLM으로부터 HN을 생성할 때 ‘\n’ 문자를 기준으로 자르고 앞 문장만 가져오는 전처리를 진행했다고 합니다.

3. Experiments

이제 실험 결과들을 살펴보겠습니다.

3.1 Comparisons to the State of the Art

벤치마크에 대해, 우선 3가지 task를 아래와 같이 소개해드리겠습니다.

  • MSR-VTT multiple choice (MC)
    • 비디오와 해당 비디오의 캡션으로 구성된 MSR-VTT 데이터셋에서의 multiple choice task입니다. 객관식으로 총 5개의 보기 중 현재 주어진 비디오의 캡션에 맞는 문장을 선택하는 것입니다.
    • 이 때 5개의 보기 중 하나를 본 방법론에서 생성한 hard negative caption으로 끼워넣었을 때의 성능 또한 측정합니다.
  • Video Question Answering on NEXT-QA
    • NEXT-QA라는 데이터셋에 대해 Video Question Answering을 진행합니다.
    • 이 때 질문이 요구하는 지식에 따라 Causal (C), Temporal (T), Descriptive (D) 이렇게 3가지로 종류가 나뉩니다.
  • Kinetics-400
    • 400개의 클래스를 갖는 대용량 비디오 데이터셋으로, 이에 대한 비디오 classification을 진행합니다.
    • 이 데이터셋에는 자연어 형태의 긴 caption이 없고 단순히 분류를 위한 action 클래스들이 주어지는데, 대부분 동사 형태로 구성되기 때문에 VFC의 동사 이해도를 평가하기 적절한 것으로 보입니다.
표 9

표 9는 MSR-VTT 데이터셋에서의 Multiple Choice 성능입니다. Verb_{H} 성능이 앞서 말씀드린 보기 5개 중 하나를 LLM이 생성한 HN으로 넣어뒀을 때의 성능입니다. 일반적인 validation set에 대한 성능도 VFC가 높지만, Verb_{H}에 대한 성능 하락 폭이 VFC가 적다는 것을 통해 확실히 다른 방법론들보다 동사에 대한 이해도와 구별력이 높아진 상황이라고 볼 수 있을 것입니다.

또한 InternVideo는 굉장히 큰 수의 파라미터를 갖는 비디오 도메인의 거대 foundation 모델인데, VFC가 훨씬 적은 파라미터 수로 더욱 높은 성능을 달성하고 있습니다. 그래도 InternVideo가 당시 39개 데이터셋에 대한 벤치마크에서 모두 SOTA를 달성했을 만큼 많은 downstream task들을 다룰 수 있다는 그만의 장점이 있는것도 사실입니다.

표 10
표 11

위 표 10은 NEXT-QA 데이터셋에서 Video Question Answering task에 대한 성능이고 표 11은 K-400 데이터셋에서의 비디오 분류 성능입니다.

우선 표 10을 통해 VFC가 다른 사전학습 방법론들에 비해 Zero-shot이나 Fine-tune 했을 때 더 높은 성능을 보여주고 있는 것을 볼 수 있고, ATP라는 방법론을 제안한 기존 논문에서 manual하게 annotate한 어려운 subset ATP_{hard}에 대한 성능도 타 방법론에 비해 높은 것을 알 수 있습니다.

또한 표 11은 Zero-shot 상황에서 Kinetics-400 분류 성능을 보이고 있는데, 타 방법론에 비해 높은 성능을 보여주고 있습니다. Flamingo는 Multi-modal LLM 모델로 굉장히 많은 파라미터를 가지고 있는데, Zero-shot에 대한 성능 측정 시 VFC가 훨씬 더 적은 개수의 파라미터로 높은 성능을 보이고 있습니다.

3.2 Ablation Study

저자는 VFC의 구성 요소들에 대해 이것저것 다양한 ablation을 진행합니다. 우선 기본적으로 모든 ablation에서 N^{hard} = 1로 설정하였다고 합니다.

표 2

표 2는 HN 생성 시 LLM의 사용 여부에 따른 ablation 성능입니다. 위 행은 LLM을 전혀 사용하지 않고, 캡션 내 동사를 랜덤으로 변경했을 때와 반의어로 변경했을 때의 성능을 보여주고 있고, 아래 행은 LLM을 사용하되 T5 모델을 사용할 것인지, PaLM 모델을 사용할 것인지에 따른 성능을 리포팅하고 있습니다. 랜덤으로 동사를 변경할 땐 UPenn XTag라는 라이브러리에서 랜덤으로 동사를 가져왔다고 하고, 반의어를 찾을 땐 NLTK 라이브러리를 사용했다고 합니다.

우선 놀라운 점은 LLM을 사용하지 않아도 추가적인 negative 캡션으로의 학습을 통해 성능이 꽤나 많이 향상된다는 것을 알 수 있어 negative 학습 자체에 대해서는 긍정적인 효과가 있었다는 것을 알 수 있습니다. 그러나 LLM을 사용했을 때의 성능 향상 폭이 훨씬 큰 것을 알 수 있는데, 이는 랜덤으로, 또는 반의어로 동사를 바꾸는 경우 바꾸는 동사가 말 그대로 ‘동사’인 것은 맞지만 변경했을 때 문장의 문맥을 해칠 수도 있기 때문이라고 합니다.

또한 NLTK 라이브러리를 사용하는 경우 반의어가 없는 경우도 많아 학습할 샘플 자체가 부족했다는 점도 지적하고 있습니다. LLM을 사용하면 그런 문제는 없으니 성능이 많이 올라간 것이겠죠. 그리고 LLM을 사용한다고 해도 어떠한 LLM을 사용하는지에 따라 성능 향상 폭이 좀 다른 것으로 보아, 여러 downstream task에 사용할 LLM을 잘 실험해보고 사용하는 점도 중요하다는 것을 알 수 있었습니다.

표 3

다음은 calibration 관련 실험입니다. 우선 HN의 사용 여부에 따른 성능 차이를 리포팅하고 있고, 저자가 제안하는 calibration 사용 여부에 따른 성능도 볼 수 있습니다. 우선 calibration을 진행 했을 때보다 진행하지 않았을 때 MSR-VTT 데이터셋 에 대한 실험 성능이 더 높은데, 이에 대해서 저자는 그냥 HN의 개수가 적어서라고 이야기하고 있습니다.

다만 K-400 데이터셋에 대한 분류 성능은 calibration을 진행했을 때 더욱 높은 것을 볼 수 있는데, 이에 대해서는 아래 confusion matrix를 함께 제시하며 설명하고 있습니다. R_{\omega{}}가 높은 경우 negative 개수가 많아 상대적으로 다른 동사들을 많이 밀어내고, 낮은 경우 상대적으로 다른 동사들과 많이 당겨져 있는 상태가 됩니다. Confision matrix에서는 다른 동사들에 비해 ‘brushing hair’가 이와 같은 모습을 보여주어 예측 시 ‘brushing hair’가 우세한 모습을 볼 수 있습니다. 하지만 오른쪽 matrix와 같이 calibration을 통해 R_{\omega{}}를 균형있게 맞춰준다면 contrastive learning을 통한 embedding space가 균형있게 형성된다는 점을 보여줍니다.

표 5

위 표 5의 왼쪽 테이블은 LLM이 생성하는 caption의 종류에 대한 ablation 실험입니다. 사실 calibration을 진행해줘야 할 정도로 negative의 개수가 너무 많은 경우, 가장 단순한 해결책으로는 LLM으로 positive 샘플들도 생성할 수 있습니다. 표 5 왼쪽의 Positive 행 성능은 LLM으로 문장 내 동사를 유의어로 변경하여 새로 생성하고 이를 positive로 두고 contrastive learning을 진행했을 때의 성능입니다.

하지만 실험 결과에 따르면 Positive 샘플을 생성하여 학습에 사용하는 경우 베이스라인 성능보다 더 낮게 나오는 것을 볼 수 있으며 이에 대해 저자는 동사가 아무리 유의어라고 하더라도 문맥에 맞는 각 동사만의 구별력을 가지도록 학습해야 하는데, 유의어라고 해서 positive sample로 두면 각 동사 간의 구별력을 해치고 동사가 다르더라도 특징을 유사하게 추출하는 ‘불변성’을 갖게 되어 성능이 오르지 않는 것이라고 분석하고 있습니다.

다음으로 표 5의 오른쪽은 저자가 제안한 마지막 기법인 Verb phrase 추출 방식에 대한 ablation입니다. MiT labels라는 것은 애초에 영상에 라벨링 되어있는 동사를 사용하는 상황이고, NLTK는 자연어 처리 라이브러리를 통해 형태소 분석으로 동사를 추출하는 상황, PaLM은 LLM에게 지시하여 캡션 내 동사를 뽑아오는 상황입니다. NLTK도 생각보다 성능 향상에 기여하는 것으로 보이지만, 가장 fine-grained한 정보를 추출하기에 좋은 성능을 냈다고 이야기하고 있습니다.

표 6

마지막으로 표 6은 저자가 VFC에서 제안하는 모듈들에 대한 ablation 성능입니다. 기본적으로 모두 사용하였을 때 MSR-VTT의 multiple choice task와 K-400의 비디오 분류 성능이 균형있게 올라가는 모습을 볼 수 있습니다. 저자가 방법론 부분에서 이야기했던 점이, verb-phrase loss의 경우 학습에 사용된 동사 구를 주로 사용하는 task에서의 성능 향상을 불러온다고 언급했었는데, K-400이 이에 해당한다고 볼 수 있습니다. 따라서 수행하고자 하는 downstream task에 따라 어떤 사전학습을 수행할 것인지 조정해줄 수 있을 것입니다.

4. Conclusion

방법론 자체는 간단하지만 해결하고자 하는 문제와 이에 대한 성능 향상 폭이 인상깊었던 논문이었습니다. 구글의 논문이라 코드 공개가 잘 되어있는데, LLM의 출력을 활용하는 방식을 살펴보고 도움을 받을 수 있을 것 같습니다. 전반적으로 최근의 LLM을 활용하는 비디오 관련 연구들을 보면, CLIP 때도 마찬가지였지만 그냥 거대 모델만을 가져와 사용해서는 여러 문제점이 존재하는 것 같습니다. 그러한 문제를 해결하기 위한 저자들만의 고유 contribution을 효과적으로 붙이는 것이, 방법론이 간단하더라도 좋은 논문이 될 수 있는 이유라는 생각이 듭니다.

이상으로 리뷰 마치겠습니다.

Author: 김 현우

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다