[논문 리뷰] Break-It-Fix-It: Unsupervised Learning for Program Repair
Break-It-Fix-It (BIFI) 무감독으로 코드 수리기를 학습하는 방식은 실제 나쁜 코드를 수리하고 학습된 브레이커로 현실적인 나쁜 코드를 생성하는 사이클을 통해, 비평가( critic )의 가이드를 받으며 이루어진다. 라벨이 없는 데이터로 GitHub-Python과 DeepFix에서 최첨단 수리 정확도를 달성한다.
We consider repair tasks: given a critic (e.g., compiler) that assesses the quality of an input, the goal is to train a fixer that converts a bad example (e.g., code with syntax errors) into a good one (e.g., code with no syntax errors). Existing works create training data consisting of (bad, good) pairs by corrupting good examples using heuristics (e.g., dropping tokens). However, fixers trained on this synthetically-generated data do not extrapolate well to the real distribution of bad inputs. To bridge this gap, we propose a new training approach, Break-It-Fix-It (BIFI), which has two key ideas: (i) we use the critic to check a fixer's output on real bad inputs and add good (fixed) outputs to the training data, and (ii) we train a breaker to generate realistic bad code from good code. Based on these ideas, we iteratively update the breaker and the fixer while using them in conjunction to generate more paired data. We evaluate BIFI on two code repair datasets: GitHub-Python, a new dataset we introduce where the goal is to repair Python code with AST parse errors; and DeepFix, where the goal is to repair C code with compiler errors. BIFI outperforms existing methods, obtaining 90.5% repair accuracy on GitHub-Python (+28.5%) and 71.7% on DeepFix (+5.6%). Notably, BIFI does not require any labeled data; we hope it will be a strong starting point for unsupervised learning of various repair tasks.
연구 동기 및 목표
- 라벨이 없는 데이터에서 평가자(critic)를 이용해 수리 품질을 판단하도록 코드 수리기를 학습시키는 동기를 부여한다.
- 합성 학습 데이터와 실제 코드 오류 간의 분포 차이를 해소한다.
- 브레이커와 수리기가 서로 개선하며 현실적인 페어 데이터를 생성하는 순환 프레임워크를 개발한다.
제안 방법
- 합성된 나쁜/좋은 쌍으로 초기화를 하고 초기 수리기와 브레이커를 학습한다.
- 실제 나쁜 코드에 수리기를 반복 적용하고 출력이 평가자에 의해 실제로 고쳐진 것으로 확인되는지 확인한다(실제 페어 데이터).
- 실제 페어 데이터에서 현실적인 오류를 생성하기 위해 브레이커를 학습한다(좋은 코드에 대하여).
- 좋은 코드에 브레이커를 적용하고 실제로 고장난 출력만 남긴다(평가자에 의해 검증).
- 실제 페어와 브레이커가 생성한 쌍의 조합으로 수리기를 재학습시켜 실제 오류 분포에 맞춘다.
실험 결과
연구 질문
- RQ1비지도 프레임워크가 레이블이 없는 코드와 품질 평가자에서 코드 수리기를 학습할 수 있는가?
- RQ2현실적인 오류를 adversarial과 유사하게 생성하는 것이 순수 합성 데이터보다 수리 성능을 개선하는가?
- RQ3BIFI는 비지도 코드 수리에서 역번역(backtranslation)과 어떻게 비교되는가?
주요 결과
- BIFI는 GitHub-Python에서 초기 합성 데이터로 학습된 수리기보다 우수한 성능을 보이며, Round-2에서 90.5%의 수리 정확도(Repair accuracy)를 달성했고, 초기에는 62.0%였다.
- BIFI는 DrRepair(66.1%)에서 시작하여 DeepFix에서 71.7%의 수리 정확도(Round-2)로 새로운 최첨단을 달성한다.
- 실제 나쁜 코드와 브레이커가 생성한 나쁜 코드를 사용하는 것이 합성 데이터만 사용할 때보다 수리 정확도를 더 높인다(수리기단독 vs. BIFI).
- 평가자와 실제 나쁜 데이터 없이 역번역(backtranslation)하는 것은 BIFI보다 열등하며, GitHub-Python에서 대략 10% 포인트 정도의 우위를 BIFI가 차지한다.
더 나은 연구,지금 바로 시작하세요
논문 읽기부터 검토까지, 연구 시간을 획기적으로 줄여보세요.
카드 등록 없음 · 무료 플랜 제공
이 리뷰는 AI가 만들고, 인간 에디터가 검토했습니다.