KoSpacing : 한글 자동 띄어쓰기 패키지 공개

띄어쓰기는 형태소 분석 이전에 반드시 수행해야 되는 중요 전처리 과정중에 하나이며, 이 때문에 공개된 형태소 분석기에는 일종의 자동띄어쓰기 모듈이 숨겨져 있는 경우가 많다. 하지만 그런 띄어쓰기 엔진의 성능이 대부분 좋지 않아 허울뿐인 경우가 많다. 필자가 만든 KoNLP 역시 그중에 하나였다.

물론 띄어쓰기는 형태소 분석 이전에만 사용하는게 아니다. 띄어쓰기 모듈은 Speech To Text 혹은 음성인식 모듈에서 출력된 텍스트들에 대한 정제를 할때 후처리용으로 반드시 쓰이게 되는 모듈이다.

이런 저런 개발과정을 거친 후 약 1년 가까이 구글 클라우드에서 REST API 형태로 제공을 하고 있었고, 일 평균 10만 쿼리를 처리하던 와중, 클라우드 캐시가 동나버려서 어떻게 할까 고민을 하던 결과 KoSpacing 패키지로 공개하게 되었다. 딥러닝을 좀 하셨던 분들은 아시겠지만 아래와 같은 독특한 아키텍처를 가지는 모형 자체를 포함하고 있는 자동 띄어쓰기 패키지이다.

Neural Ngram Detector Architecture

이 아키텍처를 찾아내느라 생각보다 많은 시행착오를 했는데, 결국은 N-Gram을 어떻게 자동으로 학습 할 것인가가 성능을 크게 향상시키는 동력이 되었고 기존의 N-Gram에 대한 임베딩을 직접해서 하는 방식보다는 위에서 보는것과 같이 1D Convolution을 활용해서 사람이 직접 N-Gram을 인코딩하는 수고를 덜었고, 네트웍에서 직접 학습이 될 수 있게 구조화 하였다. 실제 필자가 실험해본 결과 LSTM-CRF 기반의 가장 성능이 좋다는 아키텍처에 필적하면서 오히려 N-Gram을 직접추출하지 않고 네트웍에서 직접 학습이 되게끔 하면서 기존 베스트 모형보다 모형 생성의 리소스를 줄였다는 성과가 있었다. 게다가 마지막 레이어에 CRF도 쓰지 않았다.

위 아키텍처는 작년 10월 버전으로 Keras로 학습되었으며, 현재 보다 적은 데이터로 위 모형보다 더 좋은 성능을 내는 아키텍처를 실험하고 있는 상황이다. 보통의 공개된 레이어가 아닌 다소 커스터마이징된 레이어가 필요해 MXNet Gluon으로 실험하고 있고, 논문 결과로 정리중이다.

KoSpacing 패키지는 개인적으로 의미가 있는 패키지인데, 이 패키지는 필자가 만든 최초의 Model as a Program 으로 패키지 내부에 로직이 존재하지 않고 바이너리 덩어리(모델파일)로 존재한다. 소프트웨어 자체에 로직이 직접적으로 포함된게 아니라 들여다 보기 어렵고 관리하기 어려울 수 있지만, 기존의 소프트웨어 로직으로 가능하지 않던 성능을 내는 소프트웨어를 이런 Model as a Program으로 만들어낸다면, 좀더 편안한 소프트웨어 세상이 되지 않을까 하는 생각을 해본다.

 

Gluon으로구현해보는 한영기계번역 모형 – 마이크로소프트웨어 기고문

2월 초에 마이크로소프트웨어에 기고한 원고를 공개한다.

소스코드는 이곳에 공개되어 있다.  Gluon을 공부하면서 코드를 구성하고 모델이 동작 가능하게 하는데 주말 퇴근 후 여가시간을 활용해 약 1.5개월이 소요되었다. 그래도 1.5개월만에 이정도 동작 가능하게 한건  딥러닝 덕분이다.

원고를 청탁 받으면 항상 주제를 상향시켜서 진행하는 습관이 있는데, 신경망 기계번역글도 마찬가지였다. 아무 경험 없는 상태에서 시작해서 글을 마칠때까지 믿고 맡겨준 조병승 편집장에게 감사의 마음을 전한다.

공개된 글의 초반에 쓰여져 있지만 딥러닝은 해당 문제 영역의 도메인에 대한 진입 장벽을 획기적으로 줄여준 매우 위협적이지만 고마운 기술이다.  어떤 사람들은 위협이라 느낄것이고 어떤 사람들은 기회라 생각할 것이다. 이 글을 보시는 많은 분들이 기회라고 생각하길 바라며 원고를 공유해본다.

Gluon으로 만나는 영한기계번역_전희원

신경망 한영 번역기 코드 공개

딥러닝으로 구축한 한영 번역기 코드를 공개한다.

대부분 fixed length로 인코더 디코더를 구현하는 seq2seq 예제모형에서 좀더 나아가서 variable length를 인식해 학습이 되게끔 구현했다. 아마도 Gluon으로 해당 코드는 처음이지 않을까 한다.
모든 코드를 Symbol로 구현해 hybridize 모드로 학습이 될 수 있게끔 했고, 기본적으로 teacher forcing 방식으로 학습을 구성했다. 임베딩 학습도 다소 특이하게 한,영 단어를 모두 하나의 임베딩 매트릭스로 구성해 빠른 학습이 될 수 있도록 했다.

약 9만건의 학습셋은 기계번역기를 만들기 위한 학습셋으로 턱없이 부족하나, 어느정도 모형의 시작포인트는 만들었다고 자평하고 있다. 운이 좋아 수백만건의 학습 데이터를 확보할 수 있다면 좀더 발전시킬 수 있을 거라 예상한다.

이번 작업을 통해서 기계번역 모델링을 과거에 한번도 해보지 않았던 필자같은 사람도 딥러닝을 이용해서 한달여의 고군분투 끝에 만들어내게 하는 세상이 도래했다는데 개인적으로 큰 의미를 둔다. 딥러닝 덕분에 각 도메인 영역의 진입장벽이 낮아지고 있는건 어쩌면 기존 기술/경험을 가지고 있는 나같은 사람에게 불안감(본전생각)을 안겨줄 수 있으나 그런 생각 떨치고 항상 배우고 연마하는 자세로 살아야 된다고 생각한다.

번역 모형에 대한 코드레벨의 설명은 앞으로 출간될 마이크로소프트웨어에 수록하였으며, 출간 후 어느정도 시간이 지나면 블로그에 공개할 생각이다(항상 그래왔듯이…).  번역 모델링 한다고 몇주 주말동안 좋아하는 게임도 못하고 전기세만 축내면서 수도없이 GPU를 고문했는데 개인적으로도 상당히 좋은 경험이었다.

이정도 구현체라면 Keras에서 Gluon으로 넘어온 보람이 있다고 생각한다. 특히나 Attention 및 Variable Length 기반의 학습은 Keras로 구현하는건 상당한 난이도가 있는 작업이라는 생각을 해본다.

한달여 동안 퇴근 후 개발을 하면서 몇가지 경험적으로 얻은 부분을 정리하자면…

  1. 완성된 코드로부터 쓸만한 모형을 학습/도출하는데 전체 30% 이상의 리소스가 들어갔다.
  2. 실제 모델링 자체의 코드가 늘어나니 모델 개발이라는말이 과거처럼 학습 라이브러리에 정제된 속성/데이터만 넣는 작업과는 다른 차원의 의미로 다가온다. 이건 모델 알고리즘 개발인것이다.
  3. 이 다음부터는 양질의 데이터를 얼마나 많이 확보하느냐가 품질을 판가름할 것이다.
  4. 모델이 복잡해지니 모형에 대한 디버깅 경험/능력이 중요해진다. Tensor 기반의 코딩 능력에 대한 경험을 많이 쌓는것이 중요하다. 많이 고민하고 만들어보고 학습해보자!