내부 과제

내부 과제 2017-12-07T07:29:47+00:00
내부 과제

Pix2Code 논문 리뷰 및 성능 측정 실험(이광희, 서기호)

작성자
kwanghee Lee
작성일
2017-12-07 08:24
조회
661
서론

GUI 코딩은 많은 작업이 요구되는 일입니다. 디자인으로 사용자를 만족시켜야되면서 코딩은 필수로 해야합니다. 지난 5월에 arxiv에 올라온 GUI 이미지에 해당코드로 바꿔주는 논문인 Pix2Code(https://arxiv.org/pdf/1705.07962.pdf)는 많은 연구자들과 개발자들의 관심을 받았습니다. 밑에 그림의 왼편의 GUI를 입력 받아서 오른쪽의 DSL(Domain Specific Language)코드를 생성하고 컴파일을 해서 코드를 실행시켜서 나온 GUI가 입력받은 GUI와 같아지게 하는게 목적입니다.



논문에서 accuracy측정을 multi-class token prediction으로 Android, iOS, 그리고 web으로 했는데 약 77%, 77%, 89%를 기록했는데 여기서 개선을 더 해보기 위해서 연구를 시작하게 되었습니다.

논문소개

입력으로 이미지와 앞에 토큰들을 받게 됩니다. 토큰은 한단어 혹은 한 쉼표나 괄호에 해당하는데 논문에서는 앞에 48개의 토큰을 받고 해당 위치에 토큰을 예상하게 되어있습니다. 앞에 토큰들을 전체 다 보면 좋겠지만 연산량도 감안해서 48을 썼다고 합니다.이런 코드 생성 문제에서는 보통 Seq2Tree와 같은 hierarchical과 같은 구조의 뉴럴네트워크를 사용하는데 이 논문에서의 네트워크 구조는 상대적으로 간단합니다. 이미지는 CNN 그리고 앞에 토큰들은 LSTM으로 받고 Concat해서 LSTM을 통해서 DSL 코드를 출력합니다.



여기서 DSL(Domain Specific Language)은 단순화된 코드로 볼수 있는데 탐색범위가 작아져서 학습하기가 더 쉬워집니다. 학습을 마치고 코드를 생성할때는 학습된 모델로 DSL 코드를 만들고 컴파일해서 해당코드를 생성합니다. 웹 같은 경우에는 html, 안드로이드는 xml, ios는 storyboard 파일을 만들어서 그 파일을 실행 시키면 해당 GUI가 나오게 됩니다.

데이터는 기존 pix2code의 web, android, iOS 데이터셋을 사용 했습니다. Web은 training set이 GUI 이미지 1500장 그리고 코드가 1500장이 있었습니다. 이 GUI들은 각 플렛폼에서 default를 제공해주는 컴포넌트들로 이루어져있고 현실에서 쓰기에는 상대적으로 간단한 GUI 였습니다.  

논문 재현 실험

논문에서는 10 epoch를 학습해서 위에 언급한 모바일에서의 77% 그리고 웹에서의 89%의 결과를 얻었다고 했습니다. 저자가 코드를 올린 Github서는 GTX 1080Ti와 성능이 비슷한 Tesla K80 GPU을 사용해서 약 5시간동안만 학습했다고 합니다.

일단, 기존 코드를 그대로 다운받아서 학습하였습니다. 기존코드를 논문에서와 같게 10 epoch를 학습시키고 논문에서는 LSTM에서 dropout 0.1을 적용하였다고 언급되어있지만, 저자코드에 빠져있어서 추가 하였습니다.

위에서 언급한 multi-class token prediction으로 accuracy측정을 수행하였습니다. 논문에 accuracy에 대한 명확한 설명이 되어있지 않아서 저자에게 문의를 하였고, 측정방식은 아래와 같다고 답변을 받았습니다.

총 에러는 생성된 token과 ground truth간의 classification error와 length difference error의 합으로 측정되고 전체 token에 대해서 평균을 취합니다.

classification error는 생성된 token 과 GT token각각을 비교해서 잘못 prediction된 갯수입니다.

(예시) classification error :  1

  1. a b c d e (GT tokens)

  2. a b d d e (generated tokens)


Length difference error는 총 생성된 token 갯수와 GT token 갯수의 차이를 나타냅니다.

(예시) length difference error : 5-3 = 2

  1. a b c d e (GT tokens)

  2. a b c  (generated tokens)


2가지를 다 고려하면 아래 예시와 같이 에러가 계산됩니다.

(예시) classification error :  2, length difference error: 2, total error :  4

  1. a b c d e

  2. b b d


하나의 DSL 코드에 대략 100 토큰이 있었고 test set이 250개 있었는데 25000 중에 16000개를 맞추면 64%의 정확도라고 볼수 있습니다.

논문에서 언급한 바와같이 10 epoch를 학습하여 논문과 동등수준의 성능(77%)이 나왔습니다.

추가학습 실험

저자코드를 통해 재현실험을 한 뒤에 혹시나 하는 생각에 epoch를 늘려가며 추가 실험을 하였습니다.  50 epoch를 학습시킨후 측정을 해봤는데 안드로이드에서의 정확도가 90%가 넘었습니다. 혹시라도 우리의 evaluation코드가 의심되어 코드리뷰를 하였으나 문제가 없었습니다. 표 1은 10 epoch, 100 epoch, 150 epoch에 대한 Multi-class token prediction 정확도 측정 결과입니다. Android의 경우 성능이 99%에 가깝게 나온것을 볼 수 있습니다.

여기서 Multi-class token prediction 는 test data의 전체 token prediction에 대한 정확도 측정입니다. 우리는 Multi-class token prediction (Accuracy per token)보다 좀 더 엄격한 기준으로 정확도를 판단하고자,GUI file당 정확도(Accuracy per GUI file)를 측정해 보았습니다.

이것은 하나의 GUI에 해당하는 코드를 완벽하게 생성하는 경우에 success로 평가하고, DSL 코드에서 하나라도 틀리면 그 코드는 잘못 생성된것으로 판단하게 됩니다. 예상했던 대로 10 epoch에서는 web 1%, Android 49%의 형편없는 정확도를 보였습니다. 그러나, 150 epoch까지 학습해보니 web 93%, Android 95%의 높은 정확도를 보였습니다.

실험 결과는 아래와 같습니다. 상단 표는 토큰당 정확도 (Accuracy per token) 그리고 하단 표는 파일당 정확도 (Accuracy per GUI file) 입니다.

표 1. Accuracy per token
Accuracy per Token 10 epochs 100 epochs 150 epochs
Web 70% 96% 97%
Android 74% 99% 99%
표2. Accuracy per GUI file
Accuracy per DSL file 10 epochs 100 epochs 150 epochs
Web 1% 83% 93%
Android 49% 94% 95%
성능개선을 위한 아이디어

논문을 접하고 77%의 성능을 높이기 위해 간단한 아이디어 적용해보고자 시작한 일인데 재현실험을 하다보니 논문에서 보여준 정확도보다 훨씬 더 좋은 성능을 보였고, 결과적으로 개선의 필요성을 못느끼게 되었습니다.

큰 의미는 없지만, 성능 개선을 위해 생각했던 아이디어는 다음과 같습니다.

CycleGAN의 cyclic loss에서 영감을 얻어와서 아래 그림처럼 하나의 DSL 파일 학습 시 Feedback Loop를 돌면서 Ground Truth 이미지와 생성된 코드에 해당하는 이미지를 비교하여 GUI reconstruction loss를 추가하여 학습성능을 향상하려고 했습니다. 구현을 하면서 몇가지 이슈들이 있었는데 기존 방법과 달리 GUI reconstruction loss를 반영하기 위해서는 DSL파일당 처리를 해야하기 때문에 미니배치의 사이즈가 가변적으로 되어야하는 이슈가 있었습니다. 또한, 학습을 하면서 생성된 DSL code로 부터 GUI를 생성하기 위해 컴파일러가 학습과정에 포함되어야하는 문제와 매번 모델을 load하고 save를 해야하기 때문에 학습시간이 상당히 길어지는 문제가 있었습니다.



결론

보통 논문을 쓸때 실제로 안좋은 결과를 좋은 결과로 바꿔서 쓸때가 있는데 Pix2Code는 더 학습하면 더 좋은 결과를 얻었을수도 있었음에도 불구하고 최상의 결과를 논문에 안쓴게 의문이 들었습니다. 아마 학회에 시간이 없어서 급하게 쓰고 나중에 공개할때는 처음에 논문을 arxiv에 올렸을때 보다 코드 수정을 많이 하고 난 후에 공개 했을수도 있을것 같습니다.

이미 기존 모델에서의 데이터로 좋은 결과를 얻어서 현재 데이터로 연구하기에는 큰 의미가 없을것 같고 좀 더 난이도가 있는 새로운 데이터셋을 만든다면, 개선이 필요할 수 있을것이라는 생각 입니다.