딥러닝/NLP

Code Generation Survey 요약 정리

dnap512 2021. 5. 20. 14:45

Deep Learning for Source Code Modeling and Generation: Models, Applications and Challenges

이 논문은 딥러닝 기반 Code generation (CG)에 대한 ACM Computing Survey 2020 paper이다.

  • 섹션 2: 소스 코드에 대한 전통적인 언어 모델과 그 한계를 제시하여 DL 모델의 사용에 동기를 부여
  • 섹션 3: 인코더-디코더 프레임워크에서 소스 코드 모델링을 구성하고 이러한 프레임워크의 중요한 구성요소를 설명
  • 섹션 4: 딥 소스 코드 모델을 구축하기 위한 최근 연구 제시
  • 섹션 5: 다양한 빅 코드 작업에 대한 DL 기반 애플리케이션을 검토
  • 섹션 6: 이러한 작업에 사용할 수 있는 데이터 세트를 제시
  • 섹션 7: 현재 과제를 논의하고 소스 코드 모델링 및 생성을 위해 DL을 사용하는 데 있어 몇 가지 미래 방향을 제안
  • 섹션 8: 이 문헌 검토의 주요 기여에 대해 요약

본 글에서는 CG에 대해 최근 연구가 제시된 섹션 4에 대해 번역하여 정리해보고자 한다.

섹션 4는 섹션 3에 제시된 인코더-디코더 프레임워크에서 소스 코드에 대한 딥 러닝(DL) 모델에 대한 연구에 중점을 둔다. (i) 딥 인코더 모델, (ii) 딥 디코더 모델 및 (iii) DL 모델의 기능을 소스 코드 모델링 및 생성에 더 잘 일반화하기 위한 딥 컨트롤러 모델.

  1.  딥 인코더 모델 (Deep Encoder Model)

 많은 심층 소스 코드 작업의 경우, 입력은 코드 조각, 주석 또는 설명과 같은 시퀀스의 형태를 취하며, 여기서 우리는 추가 처리를 위해 입력의 의미와 컨텍스트를 캡처하기 위해 심층 모듈에 의존한다. 이런 종류의 모듈을 심층 인코더 모델이라고 부른다. 가장 널리 사용되는 인코더 모델은 RNN 및 그 변형과 같은 순차적 모델이다. General-purpose
software repository mining의 경우, RNN의 효과가 테스트되었다. 그러나 다음과 같은 제한 때문에 순차적 모델은 코드 모델링 및 생성에 효과적이지 않을 수 있다.

  • Syntatic context는 순차적 모델에서 잘 표현되지 않으며, 이는 프로그래밍 언어의 문법 규칙을 위반하는 결과를 초래할 수 있다.
  • Out-of-vocabulary 문제로 이어지는 코드의 Large vocabulary는 Deep code model의 일반화 능력에 영향을 미친다.
  • Recurrent model (예: RNN)은 Hidden-state vector의 크기가 모델이 시간을 통해 전달할 수 있는 정보를 제한하는 Hidden-state bottleneck으로부터 고통받는다.

다음의 방법들은 이러한 단점들을 극복하기 위해 제안되어왔다.

  • Structural representation
    • 추상 구문 트리(Abstract Syntax Tree, AST)는 프로그램의 구문 구조를 캡처하는 자연스러운 방법이다. AST에서 프로그램은 프로그래밍 언어의 구문에 기초하여 비단자와 터미널(리프) 노드의 계층으로 구문 분석된다. 코드 표현을 위해 AST를 활용하기 위해, 가장 간단한 방법은 깊이 우선 검색 (DFS)을 사용하여 AST를 시퀀스로 변환하는 것이다. 다른 연구는 구문 분석 트리의 계층 구조에 직접 작업하기 위해 DL 모델(Recursive Neural Networks, Tree-LSTM 또는 CNN)을 제안했다. 최근에는 AST를 코드문 하위 트리로 분할하면 트리 기반 표현의 성능을 향상시킬 수 있다는 연구도 보였다. 최근 연구(즉, code2vec 및 code2seq)에서도 AST 경로를 코드에 대한 표현으로 사용할 것을 제안했으며, 여기서 추출된 경로는 Attention-based 신경망을 사용하여 집계될 것이다. 최근에는 소스 코드를 Directed graph로 나타내는 새로운 Gated Graph 신경망을 제시했다. 구체적으로, 그들은 소스 코드의 구문 및 의미 구조를 보다 효과적으로 포착하기 위해 변수의 데이터/제어 흐름 정보를 AST에 통합했다. Structural representation 방법은 최근 커뮤니티의 관심을 얻고 있다.
  • Open vocabulary model
    • 소스 코드의 어휘는 고정적이 아니라 개방적이다. 따라서 전체 어휘를 사용하여 분류기를 훈련시키는 것은 비현실적이므로, 가장 빈도가 높은 1,000개 또는 10,000개의 용어만 유지하고 나머지는 Out-of-Vocabulary token (즉, <unk>)으로 대체함으로써 분류기를 잘라내는 것이 더 일반적이다. 이 Truncation의 단점은 테스트셋의 OoV 토큰(neologisms [4])을 예측할 수 없다는 것이다. OoV 문제를 해결하기 위해 Karampatis et al. [124]는 소스 코드 모델링을 위한 새로운 Open-vocabulary neural language 모델을 제안했다. 이 연구는 GRU를 사용하여 Byte pair encoding 알고리즘에 의해 생성된 Subword(코드 토큰의 문자 시퀀스) 단위 위에 신경 언어 모델을 구축했다[67]. 대규모 실험은 제안된 하위 단어 신경 프로그램 모델이 최첨단 프로그램 모델보다 낫고 다른 프로그래밍 언어와 프로젝트에 걸친 OoV 문제에 대해서도 더 강력하다는 것을 보여주었다. 문자 기반 DL 모델[125, 128]도 OoV 문제를 해결하기 위한 하위 단어의 대안이다. 최근에, Cvitkovic et al. [52]는 그래프 기반 코드 표현[6]을 확장하여 새로운 단어/토큰이 캐시된 [78] 노드로 기존 AST에 추가되는 그래프 구조화 캐시를 사용하여 개방형 어휘를 통합하였다.
  • Attention mechanism
    • Attention은 OoV 문제와 RNN의 Hidden-state bottleneck을 모두 해결하기 위해 사용될 수 있다. Boopchand 등[24]은 Pointer network를 사용하여 코드 완성(자동으로 키워드 추천해주는 기능) 중 최근 과거의 OoV 토큰을 복사했다. Pointer network는 이전의 입력 임베딩에 대한 Soft attention이다. 컨트롤러는 복사 위치 또는 언어 모델 배포에서 선택할지 결정하는 스칼라를 생성한다. 리 외 연구진[149]은 최근 유사한 모델을 제안했지만 Previous hidden state에 attention하는 점이 다르다. 디코더 네트워크의 Attention layer와 유사하게 Attention 출력은 입력에 Concat된다. 이러한 모델에 사용된 주의는 MLP[16]를 사용하여 계산된다. 이 접근법의 단점은 Hidden-state cache의 수정과 Attention 연산이 매우 연산적으로 매우 무겁다는 점이다. 우리는 또한 포인터 네트워크가 없는 것과 비교하여, 토큰 복사를 추가하면 토큰 예측의 정밀도가 떨어질 수 있다는 것을 확인했다. Hidden states를 포인터 네트워크와 컨텍스트 인코딩을 위한 별도의 부분으로 분할하면 이 문제가 해결된다. Attention 메커니즘은 또한 일부 Non-recurrent 모델에 사용되기도 한다. 예를 들어, Das와 Shah[56]는 피드-포워드 신경망에 대한 임베딩 단어 위에 게이트 장치를 사용했다. 이 모델은 상황별 코드 완성을 위한 반복자 변수 이름과 같이 일반적으로 발생하는 값 유형을 나타내기 위해 사용되었다.

 

2. Deep Decoder Models

인코더 모델에 의해 생성된 Embeded feature를 고려할 때, 디코더 모델은 Target domain(예: 코드 및 자연어)에 대한 출력을 생성한다. 자연어와 달리 소스 코드는 프로그래밍 언어의 Target syntax를 준수해야 한다. Xu 외 [275]는 SQL 생성 템플릿과 훈련된 신경망에 대한 스케치를 사용하여 Column attention mechanism을 사용하여 특정 부분을 이러한 슬롯에 복사했다. 또한, 디코딩 템플릿은 DSL을 도입하여 강화될 수 있다. AST와 같은 직접 구문 정보를 사용하여 모델을 훈련시킴으로써 코드 생성에 대해 훨씬 더 나은 결과를 얻을 수 있다. 동과 라파타[61]는 언어를 논리적 형태로 전달하기 위한 Seq2Tree 모델을 제안했다. 트리 구조는 하위 트리의 루트로 "비단자" 토큰을 예측하여 디코딩됩니다. 부모 정보는 주의 메커니즘을 모든 이전 상태와 통합하여 공급된다. 이 모델을 사용하면 구조 정보를 더 쉽게 보관할 수 있지만, 이 간단한 수정은 제한된 문법 규칙만 지원할 뿐 구문 정확성을 보장할 수 없다.
 Yin et al. [281]은 자연어 문장을 해당하는 Python AST로 변환하기 위해 Syntax-driven 신경 모델을 설계하고 구현했다. 이 모델은 10+ BLEU를 얻었으며 여러 코드 생성 작업에서 상당한 정확도를 얻었다. 직접적으로 소스 코드 c를 생성하는 대신, 주어진 AST y의 분포를 표현하는 Probabilistic grammar model g 

... 계속

 

3. 딥 컨트롤러 모델

'딥러닝 > NLP' 카테고리의 다른 글

Meet in the Middle: A New Pre-training Paradigm  (0) 2023.03.31