ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1급 기밀] 2021 인공지능 그랜드 챌린지 도전기
    Tech 2021. 8. 13. 17:26


    안녕하세요, 알고리마 머신러닝 엔지니어 조건우입니다. 오늘은 2021 인공지능 그랜드 챌린지에서 수상한 MWP 문제 풀이 모델 구축 과정을 소개하고자 합니다!

    부제: 알고리마 머신러닝 엔지니어가 일하는 방법

     

    들어가며

    안녕하세요 다시 돌아온 건태식이! 😉 알고리마 머신러닝 엔지니어 조건우입니다 >_<.

     

    시작부터 잠깐 자랑 아닌 자랑을 하자면 흠흠, 최근 알고리마는 과학기술정보통신부에서 주최한 인공지능 대회 '2021 인공지능 그랜드 챌린지'에 참여했는데요.

     

    인공지능 그랜드 챌린지! 주어진 수학문제를 해결하라!

    그리고 결과는? 짜잔,

     

     

    상위 20개팀 안에 들어 수상에 성공했답니다. 오늘은 어떻게! 알고리마가 인공지능 그랜드 챌린지에서 상을 탈 수 있었는지 적어보려고 합니다. 하는 김에 우리 머신러닝 엔지니어들이 어떤 식으로 문제에 접근했는지 그 비밀도 살짝 풀어볼게요. 

     

    이번 인공지능 그랜드 챌린지의 목표는 수학 문제를 푸는 인공지능 모델 개발입니다. 답만 맞추면 되냐고요? 놉. 그 답이 어떻게 나왔는지 설명하는 수식도 함께 알려줘야죠.

     

    예를 들어,

    29보다 어떤 수만큼 큰 수는 41입니다. 어떤 수보다 8 큰 수는 얼마입니까?

     

    문제를 주면 정답과 그 수식

    20, 41-29+8

     

    을 도출하는 모델이죠. 이 문제는 MWP(Math Word Problem)이라고도 불리는데요. MWP를 해결하는 여정, 같이 떠나보실까요?

     

     

    학습 환경 구축

     

    1) 데이터 찾기

    보통 인공지능 대회에서는 모델을 학습시킬 수 있는 데이터셋도 같이 제공합니다. 그러나 이번 대회에서는 데이터를 수집하는 것도 과제 내용 안에 포함되어 있었답니다.

     

    역사와 전통이 있는 문제인 MWP, 미리 데이터셋을 구축해두었다면 아무 걱정이 없었겠죠. 그러나 알고리마는 급하게 데이터셋을 만들어내야 했습니다. 마감을 얼마 남기지 않고 참여를 결정했거든요. (워낙 대회 일정이 촉박하기도 했고요) 이래저래 절차들을 마치고 자리에 앉아 데이터셋 구축에 쓸 수 있었던 시간은, 고작 3일.

     

    심지어 이 3일이 온전히 데이터셋 구축을 위한 것만도 아니었습니다. 모델 개발 시간 역시 포함해야 했죠. 슬프지만, 이가 없으면 잇몸으로! 자체적으로 구축한 신규 데이터셋 대신 기존 데이터셋으로 눈을 돌렸습니다. 그래서 찾아낸 것. IBM의 MWP 공개 데이터였습니다.

     

    그림 1. IBM MWP 공개 데이터 예시

     

    2) 데이터 가공하기

    문제는 또 있었습니다. (문제가 없으면 무언가 잘못된 것 같다니까요) 풀어야 할 문제가 한글이라는 점이죠. 아시다시피 질 좋은 한글 데이터는 잘 없을뿐더러 있다 해도 접근이 쉽지 않습니다. 모델을 학습하기 위해서는 IBM 데이터를 번역해야 했죠.

     

    번역은 Google Cloud Translation을 이용했습니다. 500,000 글자 미만은 무료, 그 이상은 백만 자당 $20를 지불해야 합니다. 전체 데이터는 150만자를 넘기지 않았습니다. 20불, 싸네요, 음. 빠르고 정확하고 저렴한 Google Cloud Translation. PPL 아닙니다

     

    번역 데이터의 품질이 좋지 않을까 걱정했지만 나름 성능도 괜찮았습니다. 아래 예시 정도.

    번역하고자 한 문장: what is 1 % of 2 ?
    번역된 문장: 2의 1%는 무엇입니까?

     

    이 수준이면 모델이 문제를 이해하기에 무리가 없을 것이라 판단했습니다. 1단계, 클리어.

     

    3) 환경 마련

    대회 측에서는 docker로 모델을 제출할 것을 요구했습니다. 이에 library dependency는 docker image로 build해 관리했습니다. 덕분에 다른 엔지니어와 함께 일하기도 좋았고요.

     

    docker image에 쓸 base image로는 pytorch 공식 라이브러리의 image를 썼습니다. 추가로 install이 필요한 dependency는 Dockerfile에 작성한 후 docker image를 build했죠.

     

    학습은 pytorch framework의 DataParallel을 이용하기로 합니다. GPU는 RTX 2080Ti 2장을 태웠습니다. 분산학습을 수행했죠.

     

     

    모델 선택

     

    1) Baseline Model

    옛말 틀린 말 없어요. 시작이 절반이라더니, 이 단계까지 오는데 주어진 시간의 절반이 들어갔습니다😭 그렇다고 남은 일이 쉽게 풀린다? 우리 ML 엔지니어의 벡터가 아닙니다.

     

    이번 문제는 중요한 의미를 지닌 수치와 단어를 추출하는 것이 전부가 아니었습니다. 뽑아낸 정보를 분석해 문제를 해결할 수식 역시 생성해야 했죠. specific한 모델을 설계할 아이디어가 필요했습니다.

     

    우선은 아이디어들이 뛰어놀 토대를 만들기로 했습니다. 구축한 데이터셋을 학습해 MWP 문제를 수행할 간단한(?) baseline model을 만들었습니다. HuggingFace에서 제공하는 transformer기반 sentence generation pretrained model을 가져왔습니다. layer를 모조리 앞서 만든 데이터셋으로 fine-tuning시킨 E2E 모델로 만들었고요. 이로써 해결! 이면 얼마나 좋을까요. 접어두고 현실로 돌아가 보겠습니다.

     

    2) 세부 task 해결

    우리는 이 MWP 문제를 3개 세부 task로 분리했습니다. 잘게 나눈 문제를 해결할 모델들을 하나씩 구축하고, 이를 앙상블해 최종 모델을 만드는 것.

     

    첫 번째 task 문장을 구성하는 단어들을 가장 잘 보여줄 embedding vector로 변환하기.

    두 번째 task 구축한 embedding vector로 단어들의 관계 분석하기.

    세 번째 task 분석한 단어 사이 관계를 바탕으로 문장을 재구성해 수식 형태로 바꿔주기.

     

    첫 task를 위해 pretrained KoBERT 모델에 약간의 fine-tuning을 시켰습니다. 이 BERT 모델의 embedding layer를 이용해 embedding vector값을 계산했죠. 우선순위에서 덜 중요한 task라고 판단해 기본적인 성능을 낼 수 있는 선에서 다음 단계로 넘어갔습니다.

     

    다음 task에서는 entity사이 관계를 분석하는 데 좋다고 알려진 Graph Neural Network를 썼습니다. GNN에도 여러 가지 모델이 있는데요. Graph Attention Network를 이용하고 싶었지만, 아쉽게도 Graph Convolutional Neural Network를 써보는 데 그쳤습니다. Graph Attention Network가 계산량이 많아 작업이 느리기에 우리가 가진 GPU 환경에서 활용하기 어려웠거든요. GCNN은 그래프를 구성하는 노드가 다른 노드로부터 정보를 수집할 때, 각 노드로부터 온 정보에 대한 가중치를 학습합니다.

     

    이 모델에 embedding layer를 통과한 embedding vector를 node vector와 같이 entity로 집어넣었습니다.

     

    그림2. GCNN의 동작 원리, 출처: https://towardsdatascience.com/graph-convolutional-networks-for-geometric-deep-learning-1faf17dee008

     

    마지막 task입니다. 의미 분석을 위해 해체한 문장을 수식 형태로 재구성하고자 우리가 쓸 수 있는 연산자의 종류를 정해뒀습니다. 이어 tree 형태 모델을 구축했고요. leaf node는 숫자나 미지수로, leaf node들이 모이는 지점에서 모델이 각종 연산자 중 적절한 값들을 자체적으로 선택하는 것을 학습의 목표로 삼았습니다. 2번과 3번 task를 해결할 모델은 하나의 모델로 구성해 학습시켰습니다.

     

     

    학습 결과

     

    1) 우려

    처음 구축한 Baseline model의 성능은 그리 좋지 않았습니다. 문제를 잘못 해석하거나 엉뚱한 답을 내놓기 일쑤였죠.

     

    baseline model에 대한 성능 평가. 모델이 정답을 잘 맞추지 못한다.

    시간 관계상 domain specific한 기법들을 적용하지 못한 채 model을 학습시킨 것도 걱정이었습니다. 머리 속에서 뛰어놀던 아이디어들이 갈 곳을 잃고 사라졌거든요...ㅠ

     

    2) 최종 성능

    여러분, 그런데 말입니다, 미리 분리해둔 test 데이터로 성능을 평가했을 때, 예상외로 모델이 정답을 잘 맞히었습니다! 결과가 좋게 나와서 하는 말이지만요, MWP라는 Domain에 specific한 아이디어로 구성된 모델이기에 한구석에서는 내심 성능을 기대하기도 했습니다.

     

    최종 모델에 대한 성능 평가. 한 문제를 제외하고 Answer와 Predict A가 모두 같다.

    아이디어를 모조리 반영하지 못해 아쉬운 마음 반, 그래도 우수한 성능을 냈던 모델에 거는 기대 반으로 모델을 냈습니다. 그리고 그 결과는 앞서 말했듯이! 하하하 🎉 🎉 🎉

     

     

    나오며

    대회를 준비하면서 아주 많이 고민했습니다. 이 데이터를 쓰는 것이 맞을까? 모델 개선을 여기서 멈춰도 될까? 이 방향성은 괜찮을까? 그만큼 아이디어도 넘쳐나게 많았고요.

     

    물론 생각한 기법들을 다 구현해보지 못한 채 대회가 마무리되어 한편으로는 섭섭한 마음이 있습니다. 대회를 준비하면서 이래저래 탈도 많았고요. (밤을 거의 꼬박...) 하지만요, 좋은 성과를 거두었다는 것에 해냈다는 뿌듯함과 함께 깊은 안도감이 들기도 합니다.

     

    저는 문제를 해결하기 위한 다양한 방법들을 러프하게 제시한 후 더 나은 방법들을 골라 구현에 착수했습니다. 시간에 쫓기기 전에 꼼꼼하게 계획을 세우고 개발에 임한 것이 좋은 성과의 비결이라고 생각합니다. 문제를 분석하고 환경을 구축해서 전에 없던 아이디어를 더해 해결책을 내놓는다! 클래식하지만, 그래서 더 강력한 방법. 이거야말로 알고리마 머신러닝 엔지니어들이 일하는 법이고요. 

     

    무엇보다 대회를 혼자 준비했다면, 결코 해내지 못했을 겁니다. 3일 동안 든든하게 옆을 지켜준 동료 개발자분이 있었기 때문이죠. 이 글을 통해 다시 한번 진심으로 감사하다고 말하고 싶습니다. (상훈님, 사..사..)

     

    그럼 이번 도전기는 여기까지. 다음 인공지능 그랜드 챌린지 때는! 우승을 넘어 SOTA 모델 개발을 목표로! 홧팅 홧팅 화이팅을 결심하며! ADIOS.

     

     


    <알고리마 채용> 알고리마에서는 '건우'님과 함께 성장하며 AI 에듀테크 시장을 이끌어갈 머신러닝 엔지니어를 기다립니다.

    (이미지를 클릭해 보세요!)

     

    댓글

Designed by Tistory.