[딥러닝 기초] 데이터셋에 대한 고찰
처음 딥러닝 공부를 시작할 때 흔히 모델 구조와 구현 위주로 공부를 하게 됩니다. 그리고 그 과정에서는 MNIST와 같이 항상 잘 처리된 좋은 데이터셋이 제공되죠. 그렇기 때문에 데이터셋에 대해서 고민해 볼 기회가 적은 것 같습니다. 하지만 실제로는 딥러닝에서 가장 중요한 것은 데이터라고 봐도 무방할 정도로 데이터셋이 모델 성능에 미치는 영향은 큽니다. 게다가 실전에서는 이렇게 퀄리티가 좋은 데이터셋이 주어지지도 않습니다. 심지어 본인이 데이터셋을 직접 수집하고 만들어야 할 수도 있습니다.
이런 상황에 맞닥뜨리게 되면 데이터셋을 어떤 식으로 만들어야 할지, 어떤 데이터셋이 좋은 데이터셋인지에 대해 고민해야 합니다. 좋은 데이터셋을 구축하기 위해선 자신이 하려고 하는 task의 목적을 확실히 해야 합니다. 내가 하고자 하는 것이 어떤 데이터를 대상으로 어떤 작업을 수행하려는건지를 확실히 해야 그에 맞는 데이터셋도 구축할 수 있는 것이죠.
이런 데이터셋에 관련된 다양한 사례들을 보면서 데이터셋에 대해 어떤 고민을 해야 할지에 대해서 생각해 보도록 합시다.
1. 같은 모델이라도 학습된 데이터셋에 따라 성능이 다르다
같은 모델구조를 가졌더라도 어떤 데이터로 학습되었느냐에 따라서 모델의 성능이 달라집니다. 가장 쉽게 생각해볼 수 있는 인공지능으로 TTS를 생각해 볼 수 있습니다. 아이유 목소리로 학습된 TTS 모델이 손석희 목소리로 말을 할 순 없겠죠? 다른 인공지능들도 마찬가지입니다. 학습하지 않은 데이터는 모델이 예측할 수 없습니다. 그렇기 때문에 목표 데이터에 맞춰서 학습 데이터를 구성하는 것이 무엇보다도 중요합니다.
1-1. Poly-Encoder의 대화로그 데이터셋
Poly-Encoder라는 모델의 연구 논문에서 이와 관련된 실험이 나오는데요. 여기서 실험하고자 하는 task는 어떤 문장이 주어졌을 때 해당 문장과 관련이 깊은 다른 문장을 찾는 문제입니다.
모델 성능을 확인하기 위해 사용할 데이터셋은 DSTC7이라는 데이터셋으로 우분투의 대화로그로 이뤄진 데이터셋입니다. 여기선 '사전학습 모델이 어떤 데이터셋으로 학습되었는가에 따라서 모델의 성능이 달라지는가?' 에 관해서 알아보기 위해 한가지 실험을 수행합니다.
실험에 사용되는 2개의 사전학습 모델은 다음과 같습니다. 하나는 WikiPedia와 Toronto Books라는 데이터셋으로 학습된 모델이고, 하나는 reddit에 있는 글들 위주로 학습된 모델입니다. 두 모델은 학습된 데이터셋만 다르고 완전히 같은 구조의 모델입니다. 이 2가지 사전학습 모델 중 어느 모델이 DSTC7 데이터셋에서 더 좋은 성능을 발휘했을까요?
모델 성능 평가에 사용된 지표는 Recall@1/100이라는 지표로, 모델이 찾은 100개의 관련 문장 중 정답 문장이 존재하는 확률을 나타냅니다. WikiPedia로 학습된 모델은 65.8점, Reddit으로 학습된 모델은 71.4점을 기록했다고 합니다. 왜 이런 결과가 나타났을까요?
집중해야 할 것은 데이터셋입니다. DSTC7 데이터셋은 사람들의 '대화' 기록을 담은 데이터셋이라는 것입니다. 그렇다면 Wikipedia와 Reddit의 데이터 중 '대화 기록'에 더 가까운 형태를 갖는 데이터셋은 무엇일까요? 당연히 Reddit이겠죠. 이렇게 데이터셋의 차이만으로도 꽤 큰 점수 차이를 보여주게 됩니다.
그렇다고 Wikipedia로 학습한 모델은 안 좋은 모델일까요? 이번 task에서는 좋지 못했지만, 대화기록이 아닌 단어의 뜻이나 단어에 대한 정보가 주가 되는, 구어체로 구성되지 않은 데이터셋을 사용하는 task라면 오히려 Wikipedia로 사전학습된 모델이 Reddit으로 사전학습된 모델보다 더 좋은 성능을 발휘할 수도 있습니다. 목적에 따라서 달라지는 것일뿐, 두 모델의 성능의 우열을 가리기는 힘들겠죠.
2. 데이터셋 정제
최근 대규모 언어모델들이 잇따라 공개되면서 데이터 양의 중요성이 강조되고 있습니다. 하지만 데이터의 양만큼이나 데이터셋의 퀄리티 역시 중요합니다. 다양한 연구들에서 데이터셋을 수집하면서 어떤 식으로 데이터를 정제하여 퀄리티를 높이는지 살펴보도록 하겠습니다.
2-1. Blip : 이미지 캡션 데이터셋 구축하기
https://arxiv.org/pdf/2201.12086.pdf
Blip은 인공지능 모델로 하여금 이미지와 텍스트 사이의 관계를 이해시키는 방법에 대해서 연구한 모델입니다. 모델을 학습하기 위해선 이미지와 적절한 자막 쌍으로 이루어진 데이터셋이 필요합니다. Blip 논문에선 모델뿐만 아니라 데이터셋 수집 방법에 대해서도 설명하고 있습니다.
데이터셋을 구축하는 가장 좋은 방법은 사람이 이미지를 보고 직접 자막을 생성하는 것입니다. 하지만 사람이 직접 자막을 생성하는 것은 시간이 너무 오래 걸려 대량의 데이터셋을 구축하기가 어렵습니다. 그렇기 때문에 컴퓨터를 이용해 자동으로 데이터셋을 구축할 수 있는 방법을 생각해낼 필요가 있습니다.
가장 많이 사용되는 방법은 인터넷에서 크롤링하는 것입니다. 인터넷에는 이미지에 자막이나 태그 등 이미지와 관련된 여러가지 정보들이 함께 있는 경우가 많으니 이걸 이미지의 자막으로 사용하는 것입니다. 이 방법을 사용할 경우 인터넷에 있는 방대한 양의 데이터셋들을 빠르게 수집할 수 있습니다. 하지만 이미지와 전혀 관련 없는 자막이 달려있을 수도 있는 등 데이터셋의 품질은 장담을 할 수가 없죠.
Blip은 이런 저품질의 데이터를 무한정 수집하는 것보다 고품질 데이터의 양을 조금이라도 늘리는 것이 더 중요하다고 판단했습니다. 그래서 고품질의 이미지-텍스트 쌍 데이터를 수집하기 위한 방법을 고민합니다. Blip은 인공지능 모델을 이용해 자막을 생성하기로 결정합니다.
Captioner는 Coco 데이터셋의 이미지-텍스트 쌍을 이용해 이미지에 알맞는 텍스트를 생성하는 것을 학습합니다. 그리고 Filter는 Coco 데이터셋의 이미지와 텍스트를 각각 입력 받았을 때 텍스트가 이미지에 적절한 자막인지를 판별하는 것을 학습합니다. 이렇게 학습한 Captioner를 이용해 인터넷에서 수집한 이미지의 자막을 생성하고, Filter를 이용해 자막의 퀄리티를 검증하는 방식을 활용해 고품질의 이미지와 텍스트 쌍을 빠르게 수집할 수 있었다고 합니다.
2-2. AVSpeech : 사람의 얼굴과 목소리 쌍 데이터 수집하기
https://arxiv.org/pdf/1804.03619.pdf
동영상에서 여러 명의 화자가 섞여서 말할 때 이들을 분리하고 싶습니다. 이를 위해서 말하는 사람의 음성과 얼굴 사이의 연관성을 모델이 파악하게 할 필요가 있습니다. 따라서 말하는 사람의 얼굴 이미지와 음성 쌍의 데이터셋이 필요합니다. 이를 위해 본 논문에선 AVSpeech 데이터셋을 만듭니다.
여러 사람이 말하는 동영상에서는 사람 얼굴과 목소리가 매칭되는 장면을 찾기가 어렵습니다.(그게 이 연구의 목표이기도 하고...) 그렇기 때문에 한 사람만 등장하는 동영상을 찾는 것이 유리할겁니다. 그리고 주변 소음도 되도록이면 적으면 좋겠죠. 이런 영상을 찾으려면 어떻게 하는게 좋을까요? 연구진들은 강의 영상을 사용하면 강의를 하는 한명의 사람과, 그 사람의 목소리 쌍을 구하기 쉬울 것이라고 생각했습니다. 미국의 TED 강연과 같은 영상들을 이용하는 겁니다. 이들은 유튜브에서 "lecture", "how-to video" 등을 검색하여 290,000개의 영상을 수집했다고 합니다.
영상을 구했으면 그 영상에서 말하는 사람의 얼굴 정면사진과 그 사람의 목소리가 필요합니다. 여기선 Hoover et al. [2017]의 인공지능 모델을 이용해 현재 말하고 있는 사람의 음성과 얼굴을 캡처한 이미지를 추출했습니다.
이렇게 수집된 얼굴-음성 데이터 쌍은 바로 사용하는 것이 아니라 품질 검증을 수행합니다.
얼굴 이미지의 경우 Google Cloud Vision API를 이용해 온전한 정면 얼굴이 나타나지 않은 이미지들은 걸러내는 방식으로 필터링을 수행했습니다.
음성의 경우 노이즈나 다른 사람의 목소리와 섞인 음성은 걸러낼 필요가 있습니다. 이를 위해 노이즈를 제거하는 denoise를 적용한 뒤, 음성의 노이즈 비율을 측정하는 인공지능 모델을 학습해 denoise된 음성이 깨끗한지를 확인하고 필터링하는 과정을 거쳤습니다.
2-3. 대규모 텍스트 데이터 정제 작업. C4 데이터셋
https://arxiv.org/pdf/1910.10683.pdf
NLP는 대규모 텍스트 데이터셋을 이용한 비지도 사전학습을 한 모델을 사용하는 것이 정석적으로 받아들여지고 있습니다. 이런 사전학습 모델은 얼마나 많은, 어떤 종류의 데이터로 학습되느냐에 따라서 성능이 달라지게 됩니다. 당연히 데이터셋의 양도 중요하지만 데이터셋의 퀄리티 역시 중요하겠죠. T5 모델은 데이터의 양도 중요하지만 퀄리티도 챙기기 위해 Common Crawl이라는 대규모 데이터셋을 정제하여 학습 데이터로 사용하기로 합니다.
Common Crawl 데이터셋은 웹에서 대규모 데이터를 크롤링해주는 서비스입니다. 이를 이용하면 달에 20TB에 달하는 텍스트를 수집할 수 있습니다. 문제는 이렇게 수집된 데이터에는 말이 안되는 문장이나 에러 메세지, 스타일 텍스트 등 필요 없는 텍스트가 대량 포함되어 있습니다. 아무리 데이터의 양이 중요해도 이런 텍스트들을 포함해서는 제대로 된 모델을 만들 수 없기 때문에 이 데이터를 정제해서 사용하기로 합니다.
Common Crawl의 데이터 정제를 위해 아래와 같은 방법들로 데이터를 필터링해서 사용합니다.
- 문장 끝이 확실한 마침표, 물음표 등의 문장기호로 끝난 문장들만 사용.
- 5문장 이하의 문서와 3단어 이하의 짧은 문장들은 제거. 이런 짧은 텍스트들은 쓸모없는 내용이나 중복되는 내용을 담고 있을 확률이 높습니다.
- 혐오 표현을 포함한 문서 제거.
- Javascript 코드와 관련된 문서 제거. Common Crawl은 인터넷의 텍스트들을 날것 그대로 크롤링하기 때문에 그 과정에서 이런 코드들이 포함되기도 합니다. 사람의 언어를 학습시키는 것이 목표기 때문에 이런 코드들은 필요 없습니다.
- "lorem ipsum" 텍스트가 포함된 페이지는 제거. ("lorem ipsum"이란 실제 내용이 아닌 디자인을 나타내기 위한 임의의 글자들을 뜻함)
- 중괄호('{', '}')는 프로그래밍 코드에 자주 사용되는 기호기 때문에 이 기호가 들어간 문서는 제거.
- 중복 방지를 위해 3문장 이상 내용이 겹치는 문서들은 제거.
- "langdetect"라는 라이브러리를 사용해 영어가 아닌 문장들은 제거.
위 방법들 모두 간단한 알고리즘 구현이나 오픈소스들을 이용해 자동으로 빠르게 적용할 수 있는 방법들입니다. 이 과정들을 통해 총 750GB에 달하는 대규모 텍스트 데이터셋 C4 데이터셋을 구축하여 모델 훈련에 사용했다고 합니다.
3. 마무리
지금까지 딥러닝에서 데이터셋에 관해 고민한 사례들을 살펴봤습니다. 이처럼 실제 문제해결에선 모델 설계 뿐만 아니라 데이터 설계도 굉장히 중요합니다. 처음 딥러닝을 공부할 때 간과되는 경우가 많은 것 같아 한 번 주제로 다뤄봤습니다. 저 개인적으로도 모델에 사용한 데이터와 실제 테스트 데이터 사이의 차이를 간과하고 모델을 훈련했다가 '왜 안되지..?' 하고 고민했던 적이 있었습니다... 이 때 데이터의 중요성을 제일 크게 느꼈던 것 같네요.
앞으로 공부할 때도 데이터가 어떻게 구성되어 있는지, 데이터가 정말 괜찮은 데이터인지 고민하면서 하면 좋을 것 같습니다.