어떤 문제를 인공지능으로 해결하려 할 때 가장 먼저 듣게 될 질문
"그래서, 데이터는?"
내가 원하는 학습 데이터를 무한정 얻을 수만 있다면 얼마나 좋을까요? 물론 현실은 절대 녹록치 않습니다. 데이터의 양이 적거나, 레이블이 완전하지 않거나, 편향되어 있거나, 혹은 아예 존재하지 않을 가능성이 훨씬 높습니다.
공개된 데이터는 점점 늘어나는데, 그 중에 하나는 가져다 쓸 수 있지 않을까?
수년 사이에 인공지능 제작에 특화된 데이터가 많이 풀렸습니다. 하지만 인공지능이 적용되는 범위가 점점 넓어지고 세분화되면서, 기성복 같은 공개 데이터로 풀 수 있는 문제는 빠르게 소진되고 있습니다.
데이터의 제한된 유효성도 큰 문제입니다. 대표적인 예로, Netflix가 영화 추천 알고리즘 대회에 사용한 데이터는 영화 DVD를 우편으로 배달받아 보는 행태를 담고 있었는데요. 스트리밍 시대로 넘어오면서 그 데이터와 학습된 모델은 무용지물이 되고 말았습니다. 정반대의 케이스로, 인공지능으로 바둑을 두거나, 시각 정보로 물체를 구분하려 한다면, 데이터는 유효기간도 길고 대부분의 상황에 적용 가능하죠.
고퀄의 데이터를 지속적으로 제공하는 파이프라인이 없다면,
그 문제는 생각보다 어렵다.
인공지능 모델에 input이 들어가서 output이 나오는 과정을 오로지 데이터에 의존해서 찾아내는 걸 end-to-end learning이라고 합니다. 예를 들어서, "지금 바깥은 얼마나 추워?"라는 음성(input)에 인공지능이 "경기도 분당은 지금 12도입니다"라고 말(output)해야 한다고 가정해 봅시다.
전통적인 인공지능에서는 input과 output사이에 꽤나 많은 과정을 둡니다. (1; transcription) 음성 질문을 텍스트 질문으로 바꾸고, (2; intent detection) 핵심 키워드('온도')와 부가 정보('바깥')를 검출하고, (3; entity resolution) '바깥'이 한국의 경기도 분당을 뜻한다는 걸 알아내고, (4) 데이터 베이스에서 온도 정보를 가져와서, (5; text generation) 적절한 문장 형태로 변환하고, (6; text-to-speech) 스피커를 통해 사용자에게 전달합니다.
이 문제를 진정한 end-to-end로 해결하려 한다면 모델의 input은 녹음된 음성, output도 역시 스피커에서 나오는 음성이 됩니다. 중간에 어떤 과정을 거치는지는 철저히 모델의 소관입니다. 신경망 모델이라면 수만개의 노드를 거쳐서 어떤 식으로건 output이 생성되겠죠. kNN (k-nearest-neighbor)라면 학습 데이터에 있는 음성 중에서 가장 그럴싸한 것을 찾아서 그대로 읊을 테구요.
최근의 AI붐은 end-to-end방식에서 요구되는 (대량의 학습 데이터+신경망+컴퓨팅 자원)이 갖춰지면서 전통 방식으로 어려웠던 문제들(e.g. 물체 인식, 기계 번역)을 의외로 간단히 풀어버렸기 때문에 시작되었습니다. 하지만 두 방식 중 어느 것이 더 낫다고 딱 잘라서 말할 수는 없어요. end-to-end의 대표적인 단점을 꼽자면,
- 충분한 학습 데이터가 없으면 무용지물
- 블랙박스라서 어떤 결과가 나와도 중간 과정을 설명할 수 없다
- 오동작이 발생했을 때 그 원인이 뭔지, 얼마나 광범위한 문제인지 찾아낼 방도가 없다
당연하게도 대부분의 시스템은 end-to-end와 traditional을 적절히 섞어서 만들게 되는데, 각각의 장점을 살리면서 단점을 보완해야 성공적인 프로젝트가 되겠죠.
이전 챕터의 연장선에서, "어려운 문제일수록 사람과 인공지능의 협업이 중요해지더라"는 말을 드리고 싶습니다. 사람과 인공지능의 업무분장은 human-in-the-loop, mixed-initiative interaction, interactive machine learning 등의 키워드로 표현됩니다. human-in-the-loop은 input과 output중간에 사용자나 그 외 사람의 역할이 있는 겁니다. 예를 들어서, "지금 바깥은 얼마나 추워?"라는 input이 들어왔을 때, "경기도 분당 말이니?"라고 사용자의 확인을 요구하는 것도 human-in-the-loop이죠. 같은 역할을 사용자가 아닌 전문 인력(e.g. mechanical turker)에 분담시켜도 되구요.
유튜브에서 우연히 찾은 영상에서 start-up ML engineer인 David Ma가 말하는 조언에 100% 공감했습니다. https://youtu.be/fB7nyxXaczY?t=1518
당신이 인공지능을 써서 어떤 문제를해결하려 한다면, 먼저 본인이 직접 하거나 다른 사람들에게 시켜봐야 합니다. 작업이 반복적이고 사람들이 너무 많은 실수를 저지르지 않으면 최소한의 가능성이 보이는 거죠. 다음 스텝은 heuristic (경험)에 기반한 간단한 코드를 만들어서 돌려봅니다. 휴리스틱의 정확도(precision / recall)은 당연히 낮겠지만, 이 때 두 종류의 오류(false-positive / false-negative)를 어떻게 처리할 것인지 고민하죠. 앞 단계를 모두 통과하고 나면 비로소 machine learning 알고리즘을 써서 정확도를 향상시키고, 필요한 경우 deep neural network를 적용할 수 있습니다.
결론. 마지막 take-away message는 롤링스톤즈가 전합니다.
You can't always get what you want.
But if you try sometimesyou get what you need.
https://www.youtube.com/watch?v=oqMl5CRoFdk
You can't always get what you want.
But if you try sometimes
you just might find
you get what you need.