← 최신 논문
🤖 machine learning

Invariant Pretraining for Robust Code Representations

이 논문은 마스크드 언어 모델링(masked language modeling)과 의미론적으로 변형된 코드에 대한 다중 양성 지도 대조 학습(multi-positive supervised contrastive learning)을 결합하여, 표준 정확도를 유지하면서도 인코더 기반 모델의 구문적 변이에 대한 강건성을 크게 향상시키는 코드 전용 지속 사전 학습 방법인 불변 사전 학습(Invariant Pretraining, InvPT)을 소개한다.

원저자: Yifeng He, Yundi Xu, Christopher Castro Gaw Gonzalo, Zili Wang, Hao Chen

게시일 2026-08-18
📖 4 분 읽기☕ 가벼운 읽기

원저자: Yifeng He, Yundi Xu, Christopher Castro Gaw Gonzalo, Zili Wang, Hao Chen

원본 논문은 CC0 1.0 (http://creativecommons.org/publicdomain/zero/1.0/)에 따라 공공 도메인에 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기

현대 컴퓨팅의 광활한 풍경 속에서, 우리 디지털 세계를 움직이는 소프트웨어 내부에서는 조용한 혁명이 일어나고 있습니다. 수년 동안 컴퓨터 코드를 이해하기 위한 가장 강력한 도구들은 거대한 생성형 모델들이었습니다. 이들은 마치 소설가가 이야기를 짓는 것처럼, 처음부터 새로운 프로그램을 작성하도록 설계된 시스템입니다. 이 거인들은 인상적이지만, 무겁고 실행 비용이 많이 들며, 단순히 코드의 기능을 파악하는 데 필요한 작업에는 과하게 강력한 경우가 많습니다. 수십 년 동안, 이러한 특정 작업들을 위한 실질적인 일꾼은 다른 종류의 도구인 인코더(encoder)였습니다. 인코더를 코드 블록을 읽어 이를 압축된 수학적 요약, 즉 그 의미를 포착하는 지문으로 변환하는 번역가라고 생각하십시오. 이 지문들은 중복 코드를 찾거나, 프로그램의 용도를 분류하거나, 보안 결함을 탐지하는 데 사용됩니다. 이들은 작고, 빠르며, 효율적입니다. 그러나 이 도구들이 작동하는 방식에는 숨겨진 취약성이 존재합니다. 이들은 프로그래머가 사용하는 특정 단어와 기호들을 인식하도록 훈련되었지만, 동일한 단어들이 다른 스타일로 재배열되거나 다시 쓰여질 경우, 비록 프로그램의 동작은 정확히 동일하더라도 종종 실패하곤 합니다.

이러한 취약성은 소프트웨어 분석의 신뢰성에 심각한 문제를 야기합니다. 현실 세계에서 프로그래머들은 수없이 다양한 방식으로 코드를 작성합니다. 어떤 개발자는 항목을 세기 위해 "for" 루프를 사용하는 반면, 다른 개발자는 정확히 똑같은 일을 하기 위해 "while" 루프를 사용할 수 있습니다. 인간에게 이들은 기능적으로 동일하지만, 표준 코드 인코더에게 이들은 완전히 다른 것으로 보일 수 있습니다. 연구자들이 이 모델들을 테스트했을 때, 단순히 프로그램을 다른, 그러나 동등한 스타일로 다시 쓰는 것만으로도 모델의 이해도가 무너질 수 있다는 것을 발견했습니다. 모델은 두 코드가 같은 작업을 수행하고 있다는 사실을 인식하지 못하게 되며, 이는 보안 점검이나 중복 탐지에서의 오류로 이어집니다. 이 분야가 직면한 질문은 단순히 더 나은 모델을 어떻게 만드느냐가 아니라, 코드가 어떻게 작성되었는지와 상관없이 표면적인 변화를 넘어 근본적인 논리를 이해할 수 있을 만큼 얼마나 견고하게 만드느냐 하는 것이었습니다.

한 연구팀은 이 모델들이 정확히 얼마나 취약한지 측정하고, 이를 해결할 간단한 방법을 찾기 위해 나섰습니다. 그들은 새로운 유형의 인공지능을 발명하거나 복잡한 새로운 목적 함수를 만들려 하지 않았습니다. 대신, 그들은 '불변 사전 훈련(invariant pretraining)'이라고 부르는 방법에 집중했습니다. 핵심 아이디어는 간단했습니다. 서로 다르게 보이는 코드가 같은 의미를 가질 수 있다는 것을 모델에게 가르치는 것이었습니다. 그들은 기존에 널리 사용되는 코드 모델들을 가져와 방대한 양의 프로그래밍 언어 데이터로 계속해서 훈련시켰습니다. 이 훈련 과정 중에, 그들은 코드에 일련의 구체적인 규칙 기반 변환을 적용했습니다. 이 변환들은 "while" 루프를 "for" 루프로 바꾸거나, 변수 이름을 "count"에서 "x"로 변경하거나, "if" 문의 논리를 뒤집는 등, 프로그램이 여전히 정확하게 작동하도록 보장하면서도 일종의 엄격한 편집 규칙처럼 작동하는 규칙들이었습니다. 그 후 모델에게 원본 코드와 이렇게 재작성된 버전들을 나란히 보여주며, 이들이 서로 다른 예시가 아니라, 서로 다른 가면을 쓴 동일한 예시임을 학습하도록 강제했습니다.

연구진은 네 가지 서로 다른 코드 모델을 대상으로 Java, Python, C++에서 추출한 수백만 줄의 코드가 포함된 여러 대규모 데이터셋에서 이 접근 방식을 테스트했습니다. 그들은 두 가지 핵심 작업, 즉 중복 코드 찾기와 프로그램의 용도 분류에 대해 모델을 평가했습니다. 결과는 놀라웠습니다. 이 새로운 훈련 전에는 모델들이 재작성된 코드에 직면했을 때 성능이 저조했습니다. 즉, 동등한 프로그램을 인식하는 능력이 크게 떨어졌습니다. 불변 사전 훈련 이후, 모델들은 훨씬 더 탄력적이 되었습니다. 중복 코드를 찾는 작업에서 모델들은 재작성된 버전을 인식하는 능력이 중앙값 기준으로 8퍼센트 포인트 향상되었으며, 일부 모델은 최대 11포인트까지 향상되었습니다. 코드 분류 작업에서도 평균적인 향상 폭은 더 작았지만 여전히 유의미했으며, 일부 사례에서는 거의 20포인트 가까이 급증하기도 했습니다. 결정적으로, 이러한 견고함의 향상은 기존의 성능을 희생시키면서 이루어지지 않았습니다. 모델들은 표준 작업에서도 여전히 우수한 성능을 유지했으며, 이는 표면적인 변화를 무시하도록 배우는 것이 코드를 읽는 법을 잊게 만들지 않는다는 것을 입증했습니다.

가장 놀라운 발견 중 하나는 이 훈련이 서로 다른 프로그래밍 언어 전반에 걸쳐 작동했다는 점입니다. 연구진은 Java와 Python의 코드만을 사용하여 모델을 훈련시켰음에도 불구하고, 이 모델들을 이 특정 훈련 단계에서 본 적이 없는 언어인 C++ 코드에 테스트했을 때, 모델들은 향상된 견고함을 보여주었습니다. 이는 모델들이 구조적 불변성(structural invariance)이라는 일반적인 개념, 즉 프로그램의 논리가 그것을 작성하는 데 사용된 특정 구문과는 별개라는 이해를 학습했음을 시사합니다. 또한 연구는 성공의 열쇠가 단순히 모델에게 코드의 다른 버전을 보여주는 것이 아니라, 그들을 어떻게 비교하느냐에 있었다는 것을 밝혀냈습니다. 연구진은 동일한 소스 함수의 모든 변형을 서로 밀어내는 별개의 예시가 아니라 긍정적인 매치(positive matches)로 취급하는 기술을 사용했습니다. 이를 통해 모델은 변수 이름 변경이나 루프 교체가 근본적인 의미의 변화가 아니라 사소한 세부 사항임을 학습할 수 있었습니다.

연구진은 자신들의 발견에 대한 한계를 명확히 정의했습니다. 그들은 자신들의 방법이 훈련 중에 사용된 특정 변환 계열(예: 루프 변경 또는 변수 이름 변경)에 대해서는 모델을 견고하게 만들지만, 더 복잡하거나 완전히 다른 프로그래밍 언어를 포함하는 모든 가능한 코드 재작성 방식에 대해 면역력을 보장하는 것은 아니라고 언급했습니다. 더욱이, 주석이나 문서화와 같은 자연어 설명을 훈련 데이터에 추가하는 것이 큰 도움이 되지 않는다는 것을 발견했습니다. 모델들은 코드 자체로부터 필요한 견고함을 학습했으며, 이는 프로그래밍 언어의 구조 자체가 그 의미를 이해하는 열쇠를 쥐고 있음을 시사합니다. 이 연구는 소프트웨어를 분석하는 도구를 더 신뢰할 수 있게 만드는 명확하고 실용적인 경로를 제공하며, 프로그래머가 코드를 어떻게 쓰기로 선택하든 프로그램의 논리적 진실을 볼 수 있도록 보장합니다.

연구 분야의 논문에 파묻히고 계신가요?

연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.

Digest 사용해 보기 →