욤미의 개발일지

[논문 리뷰] CodeBERT: A Pre-Trained Model for Programming and Natural Languages 본문

Paper Review

[논문 리뷰] CodeBERT: A Pre-Trained Model for Programming and Natural Languages

욤미 2023. 6. 3. 16:13
728x90
반응형

Zhangyin 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

 

Paper


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 관련 작업에 적용하고 더 많은 프로그래밍 언어로 확장할 계획이다. 
    • 일반화를 잘 하려면 유연하고 강력한 도메인/언어 적응 방법이 필요하다.
728x90
반응형
Comments