욤미의 개발일지
[논문 리뷰] CodeBERT: A Pre-Trained Model for Programming and Natural Languages 본문
[논문 리뷰] CodeBERT: A Pre-Trained Model for Programming and Natural Languages
욤미 2023. 6. 3. 16:13Zhangyin Feng1∗,Daya Guo2∗,Duyu Tang3, Nan Duan3, Xiaocheng Feng1
Ming Gong4, Linjun Shou4, Bing Qin1, Ting Liu1, Daxin Jiang4, Ming Zhou3
1 Research Center for Social Computing and Information Retrieval, Harbin Institute of Technology, China
2 The School of Data and Computer Science, Sun Yat-sen University, China
3 Microsoft Research Asia, Beijing, China
4 Microsoft Search Technology Center Asia, Beijing, China
EMNLP 2020
Introduction
1. Pre-Trained Models in NLP
- ELMo, GPT, BERT, XLNET, RoBERTa같은 대규모 사전학습 모델은 다양한 자연어 처리 작업에서 SOTA를 달성했다.
- 사전학습 모델은 대부분 self-supervised 목적 함수에 의해 레이블이 없는 대규모 텍스트 데이터에서 효과적인 컨텍스트 표현을 학습한다.
- 예를들어, masked language modeling
- 인공적으로 마스킹된 입력 시퀀스가 주어지면 주변 컨텍스트를 기반으로 마스킹된 단어를 예측하는 방법을 학
- 대표적인 아키텍처 중 하나는 Transformer로 본 논문에서도 이를 활용한다.
- 여러 개의 self-attention layer를 포함
- end-to-end 방식으로 적절한 gradient를 사용하여 학습 가능
2. Multi-Modal Pre-Trained Models
- NLP에서 사전학습 모델의 성공은 다양한 양식의 입력 간의 정렬을 학습하는 multi-modal 사전학습 모델의 개발을 주도
- 언어-이미지 ViLBERT(2019), 언어-비디오 VideoBERT(2019) ← bimodal 데이터에서 학습
- CodeBERT도 NL과 PL을 다른 modality로 간주하기 때문에 multimodal연구로 불 수 있다.
- 자연어-프로그래밍 언어 → 의미적 연결 포착
- NL-PL 이해 작업(예, 자연어 코드 검색)과 생성 작업(예. 코드 문서 생성)을 위한 범용 표현 생성
3. 이전 연구와의 차이점
- NL-PL 쌍의 bimodal 데이터로 cross-modal 학습되고 unimodal PL/NL 데이터를 모두 활용한다.
- 6개 프로그래밍 언어에 대해 학습한다.
- 대체된 토큰 감지(RTD)를 기반의 새로운 학습 목적 함수로 훈련된다.
Code BERT
2.1 Model Architecture
- 모델 아키텍처로 다층 양방향 Transformer를 사용
- RoBERTa과 정확히 동일한 모델 아키텍처를 사용하여 CodeBERT를 개발한다.
2.2 Input/Output Representations
Input Representation
- 사전학습 단계에서 입력을 스페셜 토큰과 2개의 세그먼트를 연결하여 사용
Output Representation
- 자연어와 코드 모두에 대한 각 토큰의 컨텍스트 벡터
- 집계된 시퀀스 표현으로 작동하는 [CLS]
2.3 Pre-Training Data
- 최신의 대규모 데이터 세트 Husain et al. CodeSearchNet를 사용
- 6가지 프로그래밍 언어 Python, Java, JavaScript, PHP, Ruby, Go 포함
- 210만 개의 bimodal 데이터, 640만 개의 unimodal 코드가 포함
- 일련의 제약 조건 및 규칙으로 필터링
- 각 프로젝트는 적어도 하나의 다른 프로젝트에서 사용해야 한다.
- 각 문서는 첫 번째 단락으로 잘린다.
- 3개의 토큰보다 짧은 문서는 제거한다.
- 3줄보다 짧은 기능은 제거한다.
- 문자열 "test"가 있는 포함된 함수 이름은 제거한다.
2.4 Pre-Training CodeBERT
NL-PL 쌍의 bimodal 인스턴스와 사용 가능한 많은 양의 unimodal 코드를 모두 사용하고자 함
BERT에서 제안한 표준 masked language modeling과 replaced token detection 를 목적 함수로 CodeBERT를 훈련
Objective 1: Masked Language Modeling (MLM)
- BERT, RoBERTa, VideoBERT에서 효과가 입증된 masked language modeling(MLM)
- NL-PL 쌍의 bimodal 데이터에 적용
- 입력: NL-PL 쌍(x = {w, c})의 데이터 (w: NL 단어의 시퀀스, C: PL 토큰의 시퀀스)
- NL과 PL 모두에 대해
- 임의의 위치를 선택하여 마스크 아웃 → 선택한 위치를 [MASK] 토큰으로 변경
- BERT를 따라 x의 토큰 중 15%가 마스킹
- MLM의 목적은 다음과 같이 공식화되어 마스킹된 원래 토큰을 예측하는 것
Objective #2: Replaced Token Detection (RTD)
- 대규모 unimodal 데이터를 추가로 사용
- 학습을 위해 bimodal과 unimodal 데이터를 모두 사용하는 이점과 함께 시나리오에 적용
- unimodal 코드는 RTD가 더 나은 대체 토큰을 생성하기 위한 생성기를 학습에 도움을 줌
- 수식12, 13: θ 에 의해 매개변수화된 판별자에 대한 RTD의 손실 함수
- 판별자는 단어가 원래 단어인지 여부를 판별하도록 훈련 = 이진 분류 문제
- RTD 목표는 입력의 모든 위치에 적용되며 생성기가 올바른 토큰을 생성하는 경우 해당 토큰의 레이블이 "가짜"가 아닌 "실제"라는 점에서 GAN과 다름
- 생성자를 구현하는 방법에는 여러 가지가 있는데, CodeBERT는 양방향 컨텍스트로 두 개의 효율적인 n-gram 언어 모델 구현
- NL, PL 각각 해당하는 unimodal 모델 데이터에서 학습
- PL 훈련 데이터는 unimodal 코드
- NL 훈련 데이터는 bimodal 데이터의 문서
- 이 두 훈련 데이터 세트를 더 많은 양으로 쉽게 확장 가능
3.5 Fine-Tuning CodeBERT
- 다운스트림 NL-PL 작업에서 CodeBERT를 사용하기 위한 다양한 설정이 있다.
- 예를 들어 자연어 코드 검색에서 사전 훈련 단계와 동일한 방식으로 입력을 제공하고 [CLS] 표현을 사용하여 코드와 자연어 쿼리 간의 의미적 관련성을 측정한다.
- 생성 시 인코더 디코더 프레임워크를 사용하고 CodeBERT로 생성 모델의 인코더를 초기화한다.
- 자세한 내용은 실험 섹션에 나와 있다.
Experiment
3.1 Natural Language Code Search
- 코드 검색의 목적은 입력으로 자연어가 주어지면 코드 모음에서 가장 의미적으로 관련된 코드를 찾는 CodeSearchNet Corpus에 대해 실험 수행
- 고정된 999개 코드 세트에서 테스트 데이터(c, w)의 각 쌍에 대한 MRR(Mean Reciprocal Rank)을 계산
- 추가로 전체 평가 지표로 모든 언어에 대한 macro averagae MRR을 계산
- 훈련은 multilingual BERT와 유사한 설정에서 수행
- 입력 PL을 표시하는 명시적 마커 없이 6개의 프로그래밍 언어에 대해 하나의 사전학습 모델이 학습
- 6개 각 PL에 대해 언어별 모델을 fine tuning
- 소프트맥스 레이어가 [CLS] 토큰에 연결된 이진 분류 손실 함수로 각 모델을 훈련
- 훈련 및 검증 데이터 세트는 모두 positive와 negative 샘플이 균형을 이루는 방식으로 생성
- negative 샘플은 NL과 PL이 무작위로 대체된 인스턴스로 구성
3.1 Natural Language Code Search
- NL과 PL의 공동 임베딩하는 위의 4개의 행은 CodeSearchNet 논문에 의해 보고
- 코드를 토큰 시퀀스로 간주하여 모든 사전학습 모델을 훈련
- MLM을 사용하여 CodeSearchNet의 코드에 대해서만 RoBERTa를 훈련한다.
- CodeBERT가 RoBERTa와 코드만으로 사전학습 모델보다 일관되게 더 나은 성능을 보임
- 처음부터 학습한 CodeBERT(MLM)는 RoBERTa보다 성능이 좋음
- 당연히 RoBERTa로 CodeBERT를 초기화하면 성능이 향상됨
3.2 NL-PL Probing
Task Formulation and Data Construction
- 기존 작업이 없기 때문에 NL-PL probing 문제를 공식화하고 데이터 세트를 직접 생성
- 주어진 NL-PL 쌍(c, w)에서 마스킹된 관심 토큰(코드 토큰 또는 단어 토큰)을 올바르게 예측/복구하는 모델 능력을 테스트하는 것이 목표
- CodeBERT의 매개변수를 미세 조정하지 않는 zero-shot 시나리오에서 테스트
- 선택지(혼란 요소) 두 가지 주요 유형
- masked language modeling 목적함수에 사용되는 전체 대상 어휘
- 테스트 능력에 대한 전문가의 이해를 기반으로 필터링되거나 선별된 후보 ✔
- NL-PL probing을 객관식 질문 답변 작업으로 공식화
- 질문은 특정 토큰이 [MASK]로 대체되고 방해 요소 후보 답변이 저자들의 전문 지식을 기반으로 선별되는 클로즈 스타일
- CodeSearchNet의 검증 및 테스트 세트 모두에서 NL-PL 쌍에서 자동으로 데이터를 수집하며 둘 다 사전학습 단계에서는 볼 수 없음
NL의 경우
- NL 문서에 6개 키워드 max, maximize, min, minimize, less, greater 중 하나가 포함된 NL-PL 쌍 선택
- 처음 2개 키워드, 중간 2개 키워드 병합 → 4개 후보로 그룹화
- 사전학습 모델에게 다른 세 가지 방해 요소 대신 올바른 답을 선택하도록 하는 것이 목표
- 입력: 완전한 PL 코드, 마스크된 NL 문서
PL의 경우
- 키워드 max과 min을 포함하는 코드를 선택
- 양자택일 문제로 공식화
- 코드 완성은 중요한 시나리오이므로 선행 PL 컨텍스트를 기반으로 올바른 토큰을 예측하는 모델의 능력을 테스트
- 입력: 완전한 NL 문서, 마스킹된 PL 코드
- 각 프로그래밍 언어에 대해 정확도, 즉 모든 인스턴스 수에 대해 올바르게 예측된 인스턴스 수를 확인
- 다른 프로그래밍 언어의 데이터 세트는 매우 불균형하므로 누적 메트릭을 확인
- CodeBERT가 NL 및 PL probing 모두에서 거의 모든 언어에서 baseline보다 더 나은 성능을 보임
- 선행 컨텍스트만 있는 숫자는 양방향 컨텍스트의 숫자보다 낮으므로 코드 완성이 어렵다는 → 앞으로 풀어야 할 과제
- NL-PL probing에 대한 사례 연구도 진행
- NL 토큰과 PL 토큰을 별도로 마스킹하고 RoBERTa와 CodeBERT의 예측 확률을 확인
- RoBERTa는 두 경우 모두 실패하는 반면 CodeBERT는 NL 및 PL 설정 모두에서 올바른 예측을 수행
3.3 Code Documentation Generation
- Code-to-NL 생성을 연구하고 CodeSearchNet Corpus에 대한 문서 생성 작업에 대한 결과를 6개 프로그래밍 언어로 보고
- 생성된 문서가 짧기때문에 고차 n-gram은 겹치지 않을 수 있으므로 smoothed BLEU 점수를 사용하여 이 문제를 해결
- Attention 메커니즘이 있는 RNN 기반 모델, Transformer, RoBERTa 및 코드로만 사전학습 모델을 포함한 여러 baseline들과 비교
- 프로그래밍 언어에 대해 사전학습 모델은 RoBERTa보다 성능이 우수하며, 이는 프로그래밍 언어에 대한 사전학습 모델이 코드-NL 생성을 개선 가능
- RTD와 MLM 함수로 사전학습된 CodeBERT가 전체적으로 RoBERTa보다 BLEU 점수가 1.3 더 높고 SOTA를 달성함
3.4 Generalization to Programming Languages NOT in Pre-training
- C # 코드의 자연어 요약을 생성하는 작업을 연구
- StackOverflow에서 자동으로 수집된 66,015쌍의 질문과 답변으로 구성된 CodeNN 데이터 세트에 대한 실험을 수행
- MLM 및 RTD 사전학습 목적함수를 사용한 모델
- BLEU score 22.36 달성
- RoBERTa보다 2.55점 향상
→ 사전학습 단계에서 볼 수 없는 다른 프로그래밍 언어로 더 잘 일반화할 수 있음을 보여줌
- code2seq보다 약간 낮은 점수
- CodeBERT는 원본 코드만 입력으로 사용
- code2seq가 추상 구문 트리(AST)에서 구성 경로를 사용
- 특정 순서에 따라 AST의 트리 구조를 순회하여 CodeBERT을 훈련했지만 해당 모델을 적용해도 생성 작업이 개선되지 않았음 → 앞으로 풀어야 할 과제
Conclusion
- 본 논문은 최초로 자연어와 프로그래밍 언어에 대한 최초의 대규모 bimodal 사전학습 모델인 CodeBERT를 제시한다.
- bimodal과 unimodal 데이터 모두에 대해 CodeBERT를 훈련하였다.
- 사전학습 모델을 더 조사하기 위해 NL-PL probing 작업을 공식화하고 Probing을 위한 데이터 세트를 만든다.
- CodeBERT를 fine-tuning하면 자연어 코드 검색과 코드-문서 생성 작업에서 SOTA를 달성한다.
- 고정된 모델 매개변수를 사용한 CodeBERT가 RoBERTa와 코드만 사용하여 지속적으로 훈련된 모델보다 더 나은 성능을 보여준다.
- 대체된 토큰 탐지 목적 함수를 개선하기 위해 bimodal 증거와 더 복잡한 신경 아키텍처를 사용하여 더 나은 생성기를 학습할 수 있다.
- 코드-문서 생성에서 강력한 BLEU 점수를 달성했지만 생성 관련 학습 목표를 통해 더욱 성능이 향상될 수 있다.
- AST를 사전학습 단계에 통합하는 것도 매력적인 방향이다.
- CodeBERT를 더 많은 NL-PL 관련 작업에 적용하고 더 많은 프로그래밍 언어로 확장할 계획이다.
- 일반화를 잘 하려면 유연하고 강력한 도메인/언어 적응 방법이 필요하다.