← 전체 프로젝트

프로젝트 / 01

동일 저자 판별(NLU Authorship Verification)

영어 글 두 편의 저자가 같은지 판별하는 공동 자연어 처리 프로젝트입니다. RoBERTa-Large와 문체 앙상블을 비교하고 문서 분리, 확률 보정, 입력 순서 및 저장 모델의 실행 재현성을 검증했습니다.

개발 기간2026년 2월~5월
PyTorchRoBERTa-LargeXGBoostLightGBM확률 보정GitHub소스와 문서 ZIP

사용 기술

프로젝트 개요

영어 글 두 편을 입력받아 같은 저자가 썼는지 판별하는 공동 프로젝트입니다. 표현 습관을 비교하는 문체 모델과 글의 문맥을 읽는 언어 모델을 구성했습니다. 학습에 사용한 글을 평가에서 다시 보는 문제를 막기 위해 문서 단위로 자료를 나누고, 학습 방식 비교부터 모델 선택과 최종 평가까지 하나의 검증 절차로 연결했습니다.

문체 모델은 표현의 등장 빈도와 희소성을 반영하는 TF-IDF에 24개 문체 측정값을 더합니다. 이 특징으로 학습한 XGBoost와 LightGBM의 예측을 결합하는 방식을 앙상블이라고 합니다. 다른 모델인 RoBERTa-Large는 사전 학습한 언어 표현을 활용해 두 글의 문맥을 함께 처리합니다. 두 모델 계열을 각각 실행할 수 있게 제공하며, 기본 실행은 CPU 비용이 낮은 문체 앙상블을 사용합니다.

RoBERTa-Large에서는 학습할 때 예측 오류에 부과하는 값을 정하는 손실 함수를 비교했습니다. 선택적으로 제공하는 Large 배포 모델은 정답에 낮은 확률을 줄수록 큰 손실을 부과하는 교차 엔트로피(CE)로 학습했습니다. 비교 모델에는 이미 잘 맞히는 예제의 영향을 줄이는 focal 방식과, 그 정도를 동일 저자 및 다른 저자에 다르게 적용하는 ASL의 비대칭 focusing을 사용했습니다.

직접 구현한 손실은 두 클래스에 서로 다른 감마를 적용하는 커스텀 ASL(클래스별 비대칭 이진 focal)이며, 공동 학습 노트북의 함수 이름은 ASLoss입니다. 감마는 쉬운 예제의 학습 비중을 얼마나 낮출지 조절하는 계수입니다. 일반 focal 손실에도 쓰이므로, 감마의 존재만으로 특정 ASL 구현을 판별하지 않고 아래에서 실제 계산식과 설정을 함께 설명합니다.

핵심 결과

Macro F1은 동일 저자와 다른 저자 각각에 대해, 판정이 얼마나 정확한지와 실제 해당 사례를 얼마나 찾아냈는지를 함께 평가한 뒤 두 점수를 같은 비중으로 평균한 값입니다. 높을수록 좋지만 전체 정답 비율인 정확도와는 다른 지표입니다. 확률 보정 오차(ECE)는 모델이 제시한 동일 저자 확률과 실제 동일 저자 비율이 얼마나 어긋나는지 나타내며, 낮을수록 확률이 관측 비율에 가깝습니다. 확률 보정은 별도 자료를 이용해 이 차이를 줄이는 과정입니다.

배포 Large Macro F1
0.8084
고정한 CE 파이프라인, 정확도 80.86%
문체 앙상블 Macro F1
0.7415
XGBoost와 LightGBM을 유지한 기본 실행 모델
최종 평가 규모
4,708쌍
학습, 모델 선택 및 보정 자료와 문서를 분리
CE 확률 보정 오차
0.0248
동일 저자 확률의 ECE 0.0454 → 0.0248

최종 평가 전에 모델과 입력 순서 정책, 보정값을 고정했습니다. 비교 모델인 커스텀 ASL은 최종 평가에서 더 높았지만, 사전에 선택한 CE 배포 모델을 유지했습니다. 공동 학습 노트북의 점수는 자료 분리와 학습 조건이 달라 이 평가와 직접적인 성능 차이로 비교하지 않습니다.

최종 4708쌍에서 문체 앙상블 Macro F1 0.7415, 배포 Large CE 0.8084, 커스텀 ASL 0.8152
동일한 최종 평가의 고정 파이프라인을 비교했습니다. 비대칭 focal의 높은 최종 점수를 보고 배포 모델을 다시 선택하지 않았습니다.
동일 저자 확률의 보정 오차 ECE는 문체 앙상블 0.0321에서 0.0195, CE 0.0454에서 0.0248, 커스텀 ASL 0.0578에서 0.0336으로 감소
선택한 입력 순서를 유지하고 별도 보정 자료에서 정한 값을 적용했습니다. 확률 오차의 감소가 분류 F1의 향상을 보장하지는 않습니다.
전체 분류 성능과 배포 선택 기준
모델 원래 입력 순서의 Macro F1 고정 파이프라인 Macro F1 정확도 정답
문체 앙상블 0.7433 0.7415 74.15% 3,491/4,708
RoBERTa-Large CE, 배포 모델 0.8077 0.8084 80.86% 3,807/4,708
RoBERTa-Large 커스텀 ASL(비대칭 이진 focal) 0.8082 0.8152 81.52% 3,838/4,708

원래 입력 순서는 글 A와 B를 순서대로 넣고, 같은 저자로 판정하는 기준값인 임계값 0.5를 적용한 결과입니다. 고정 파이프라인은 입력 처리부터 모델 예측과 확률 보정까지의 설정을 미리 정해 둔 실행 절차입니다. 선택 자료에서 정한 입력 순서 정책과 별도 보정값을 적용하며, Large 두 모델은 A와 B를 넣었을 때와 B와 A를 넣었을 때의 점수를 평균 냅니다. 이때 확률로 변환하기 전의 모델 점수인 logit을 평균에 사용합니다. 표의 전체 분류 결과에는 사용자에게 판정을 보류한 사례도 내부적으로 계산한 두 범주 중 하나의 예측으로 포함합니다.

보정값을 고정한 파이프라인을 모델 선택 3,139쌍에서 비교했을 때 CE의 F1은 0.8012, 비대칭 focal은 0.7991이었습니다. Focal이 사전 개선 기준 +0.002를 충족하지 못해 CE를 선택했습니다. 최종 평가에서 focal이 F1 0.0068과 정답 31쌍만큼 높았다는 관찰은 보존하되, 모델을 다시 고르거나 손실 함수의 보편적 우월성을 주장하지 않습니다.

평가 자료의 구성이 달라질 때 점수가 얼마나 흔들리는지 살펴보기 위해, 같은 문서를 공유하는 사례를 묶은 문서 그룹 3,207개를 단위로 다시 뽑아 모든 모델을 함께 비교했습니다. 이 1,000회 분석의 조건부 95% F1 구간은 CE 0.7922–0.8219, focal 0.7997–0.8281, 문체 앙상블 0.7237–0.7586입니다. Focal과 CE를 같은 표본에서 비교한 대응 F1 차이 구간은 0.0001–0.0135입니다. 학습 한 번과 제공된 문서 그룹을 조건으로 입력 순서 및 보정까지 포함한 파이프라인을 비교하며, 반복 학습의 안정성이나 새 저자에 대한 일반화 구간은 아닙니다.

문제와 접근 방법

글 쌍이 달라도 같은 글이 학습과 평가에 함께 들어가면 저자 판별 성능을 과대평가할 수 있습니다. 공동 학습 노트북의 평가 5,993쌍 중 630쌍이 학습 자료와 완전히 같았고, 2,738쌍은 적어도 한 편의 글을 학습 자료에서 재사용했습니다. 해당 문체 모델의 TF-IDF도 학습과 개발 자료를 함께 사용했습니다. 같은 개발 자료가 모델과 임계값 선택에 사용됐으므로 노트북의 Large Macro F1 0.8348은 별도의 최종 평가 성능으로 제시할 수 없었습니다.

이 문제를 막기 위해 같은 글을 공유하는 글 쌍이 하나의 묶음에 남도록 연결했습니다. 이런 묶음을 연결 성분이라고 하며, 묶음 전체를 같은 용도의 자료에 배정해 글이 학습과 평가에 걸쳐 재사용되지 않게 했습니다. 원문과 전처리 결과의 여섯 가지 식별 기준에 따라 문서를 분리한 뒤, 정리한 31,388쌍을 학습 21,972쌍, 모델 선택 3,139쌍, 확률 보정 1,569쌍과 최종 평가 4,708쌍으로 나눴습니다. TF-IDF의 어휘와 가중치는 분리한 학습 부분에서만 정하고, 두 모델 계열을 같은 분할에서 학습했습니다.

시스템 구조

글의 순서를 바꿔도 같은 저자인지는 같아야 하므로, 두 순서의 모델 점수를 함께 사용하는 대칭 추론을 검토했습니다. 확률 보정에 사용하는 ’온도’는 점수 분포가 얼마나 뾰족하거나 완만한지 조절하는 계수입니다. 보정된 확률에 분류 기준과 보류 기준을 적용해 최종 판정을 만듭니다.

시스템 처리 흐름
  1. 글 두 편 입력

    문체와 문맥을 비교할 글 A 및 B 준비

  2. 모델별 표현

    문체 특징 또는 RoBERTa-Large의 문맥 표현

  3. 동일 저자 점수

    문체 앙상블 또는 글 순서를 바꿔 얻은 점수의 평균

  4. 확률 보정

    별도 자료에서 정한 온도와 임계값 적용

  5. 판별 또는 보류

    같은 저자, 다른 저자 또는 판단 보류 반환

구성 요소 역할
문체 앙상블 TF-IDF와 문체 특징으로 XGBoost 및 LightGBM의 예측 결합
RoBERTa-Large 글 쌍의 문맥을 함께 처리하는 CE 및 커스텀 ASL 모델
대칭 추론 Large에 글의 두 순서를 입력하고 평균 logit을 사용
확률 보정 별도 보정 자료에서 온도 조정과 분류 임계값 적합
판정 보류 확신이 부족한 입력을 보류하고 처리 비율 및 정확도 함께 보고
실행기 고정 명세로 모델 파일을 검사하고 CPU 예측과 전체 평가 실행

입력 순서를 바꾸었을 때의 차이를 모델 선택 자료에서 검토했습니다. 보정값과 보류 기준은 별도 자료에서 정한 뒤 최종 평가 전에 고정했으며, 최종 점수로 손실이나 임계값을 다시 선택하지 않았습니다.

실험과 검증

RoBERTa-Large의 구조를 유지한 채 T4 GPU에서 학습 오차를 계산하고 모델 가중치를 갱신할 수 있는지 먼저 확인했습니다. 한 번에 GPU로 처리하는 작은 묶음인 마이크로 배치는 2로 두고, 계산 결과를 누적해 한 번의 가중치 갱신에 반영하는 유효 배치 32를 유지했습니다. 더 큰 마이크로 배치 후보는 사전 속도 개선 기준을 충족하지 못해 채택하지 않았습니다. CE와 커스텀 ASL은 같은 초기 가중치, 자료, 학습 순서와 최적화 조건에서 비교했습니다. 두 모델은 각각 T4 하나에서 전체 학습 자료를 여섯 번 읽는 6에포크를 학습하고, 검증에서 선택한 5번째 에포크의 모델 저장본인 체크포인트를 보존했습니다.

문체 모델은 전체 특징과 TF-IDF만 사용한 특징, 문체 측정값만 사용한 특징을 비교했습니다. 제한된 CPU 실험에서 트리 모델과 결합 가중치를 검토하고, 배포에는 두 분류기를 모두 사용하는 앙상블을 유지했습니다.

커스텀 손실과 공식 ASL의 차이 및 실험 자원

노트북의 ASLoss는 두 클래스의 점수를 합이 1인 확률로 바꾸는 softmax를 사용하고, 정답 클래스의 손실을 계산합니다. 다른 저자에는 지수 2를, 동일 저자에는 지수 1을 적용해 이미 잘 맞히는 사례의 학습 비중을 클래스마다 다르게 줄입니다. 평가에 사용한 구현은 이 클래스별 focal 형태를 32비트 실수 연산인 FP32의 log-softmax로 계산해 수치 안정성을 높였습니다. log-softmax는 확률과 그 로그를 따로 계산할 때 발생할 수 있는 수치 문제를 줄이는 계산 방식입니다. 노트북 로그 계산의 확률 하한을 제거했으므로 극단적으로 작은 확률에서 값까지 완전히 같은 구현이라는 뜻은 아닙니다.

손실 함수 구현의 구분
공식 다중 레이블 ASL 여러 범주가 동시에 정답일 수 있는 분류에 사용. 범주별 점수를 sigmoid로 확률화하고 정답인 양성 항과 정답이 아닌 음성 항에 서로 다른 집중 계수 및 음성 확률 이동을 적용
공식 ASLSingleLabel 하나의 범주만 정답인 분류용 별도 구현. 정답 및 비정답 항의 가중치와, 학습용 정답 확률을 완화하는 레이블 스무딩을 지원
이 프로젝트의 커스텀 ASL 정답 클래스의 softmax 확률에 클래스별 지수 2와 1을 적용

공식 구현은 ASL 저장소에서 확인할 수 있습니다. 공식 다중 레이블 ASL의 음성 확률 이동을 끄고 감마를 2와 1로 설정하며 focal 가중치의 역전파를 유지하면, 단일 이진 sigmoid와 두 클래스 softmax에서 같은 기본 목적함수를 표현할 수 있습니다. 합계와 평균의 정규화 및 로그 하한에는 차이가 남습니다. 따라서 이 프로젝트는 ASL의 이진 변형으로 설명하되, 공식 코드의 기본 설정을 그대로 재현한 실험과 구분합니다. 같은 자료 분할에서 비교한 모델은 CE와 직접 구현한 커스텀 ASL이며, 공개 실행기와 모델 파일의 custom_asl은 호환 식별자로 유지합니다.

두 Large 모델은 같은 초기화 해시와 난수 생성의 시작값인 시드(seed) 378, 학습 스케줄 및 최적화 조건을 공유했습니다. 시드를 맞춘 것은 학습에서 사용하는 무작위 선택을 같은 조건으로 비교하기 위한 설정입니다. 다만 16비트 실수 연산인 FP16의 표현 범위를 넘는 값이 발생해 CE 갱신 7회와 focal 6회를 생략했으므로 성공한 가중치 갱신 수까지 같다는 의미는 아닙니다. 대응 학습의 실제 경과 시간은 약 6.40시간, 고정 평가까지의 전체 실행은 약 7.55시간입니다. 준비와 동기화 대기를 포함한 GPU 작업자 시간 합계는 약 12.78시간이며 계정의 공식 할당량 차이와 구분합니다.

별도 문체 실험은 120분 상한 안에서 95.06분에 끝났습니다. 선택한 XGBoost와 LightGBM의 결합 가중치는 0.25와 0.75이며, 더 큰 모델 후보는 선택 성능을 넘지 못해 채택하지 않았습니다. 모델, 글을 입력 단위로 나누는 토크나이저, 코드, 데이터 및 보정값에는 파일 내용이 같은지 확인하는 해시를 함께 기록해 측정 결과와 연결했습니다.

Windows 11과 Ubuntu 24.04 WSL2의 분리된 환경에서 구현 검사 각각 109개를 통과했습니다. 모델 세 개 모두 두 환경에서 최종 4,708쌍 전체 추론을 완료했고, 여섯 번의 이진 판별과 판정 보류 및 F1과 정확도가 일치했습니다. 다만 Large의 일부 확률값은 GPU 참조와의 사전 허용 오차 1e-5를 넘어 엄격한 수치 재현 실패로 기록했습니다.

확률 재현 판정과 CPU 실행 비용

문체 앙상블은 두 환경에서 원래 수치 허용 오차를 충족했습니다. CE의 보정 확률 최대 차이는 Windows 1.79e-5, Linux 8.81e-6이었습니다. Linux CE의 보정 확률은 기준 안이었지만 원래 입력 순서의 확률 차이가 기준을 넘었습니다. 커스텀 ASL의 보정 확률 최대 차이는 각각 1.80e-4와 1.10e-4였으며 환경마다 한 쌍이 기준을 넘었습니다. Windows와 Linux 간 엄격한 확률 비교도 실패했습니다. 참조와 보정값 및 허용 오차를 바꾸지 않았습니다.

같은 i7-11800H 노트북에서 선택 자료의 첫 32쌍, CPU 스레드 1과 배치 1, 준비 예측 5회와 측정 3회를 사용했습니다. 지연 시간은 전처리와 보정을 포함하고 Large는 두 입력 순서를 각각 추론합니다.

중앙 지연 시간은 측정 시간을 순서대로 놓았을 때 가운데 값이며, 95백분위는 약 95%의 요청이 그 시간 안에 끝났음을 나타냅니다. 상주 메모리는 실행 중인 프로세스가 실제 메모리에 차지한 공간입니다.

환경과 모델 중앙 지연 시간 95백분위 지연 시간 모델 적재 최대 상주 메모리
Windows, 문체 앙상블 29.17ms 73.28ms 3.21초 0.272 GiB
Windows, Large CE 3,601.84ms 5,845.42ms 9.96초 1.571 GiB
Windows, Large focal 3,550.39ms 5,777.96ms 9.27초 1.571 GiB
Linux, 문체 앙상블 24.68ms 74.45ms 2.69초 0.320 GiB
Linux, Large CE 3,436.91ms 5,735.41ms 5.75초 1.699 GiB
Linux, Large focal 3,403.69ms 5,915.93ms 5.33초 1.701 GiB

두 운영체제는 같은 물리적 컴퓨터를 사용했으므로 외부 제3자의 독립 검증이 아닙니다. 분류 결과의 일치와 확률값의 수치 재현은 구분합니다. 메모리는 전체 프로세스의 상주 메모리 최대치이며, 운영체제별 집계 방식과 32쌍의 측정 범위 때문에 일반적인 속도 및 메모리 우열로 해석하지 않습니다. 전체 재현 평가는 배치 4와 CPU 스레드 4로 실행해 이 속도 측정과 구분했습니다.

한계와 해석

CE의 Macro F1은 짧은 쪽 글이 50단어 미만인 1,988쌍에서 0.7418, 50–199단어인 2,715쌍에서 0.8568이었습니다. 200단어 이상은 다섯 쌍뿐이어서 모두 맞힌 결과로 긴 글의 성능을 일반화할 수 없습니다. 모델이 읽는 토큰은 단어나 단어의 일부에 해당하는 단위로, 단어 수와 일치하지 않습니다. 최종 자료의 197쌍은 두 글을 합친 길이가 입력 한도인 512토큰을 넘어 일부 내용이 잘리는 영향을 받았습니다.

CE는 전체 입력의 82.31%에 판정하고, 그 사례에서 정확도 86.37%를 기록했습니다. 처리 비율 80% 이상과 판정한 사례 정확도 90% 이상이라는 목표 중 정확도 조건을 충족하지 못했습니다. 다른 모델도 같은 목표에 미달했으며 최종 결과에 맞춰 보류 기준을 조정하지 않았습니다.

저자 식별자와 분야 레이블이 없어 새 저자 및 분야에 대한 일반화는 확인하지 못했습니다. 문서를 분리한 최종 평가도 이미 검토한 원본 자료에서 구성했으며, 의미적으로 유사한 문서를 모두 제거했다고 보장하지 않습니다. 결과는 제공된 글 쌍의 라벨 예측이며 사람의 신원을 입증하는 용도로 사용할 수 없습니다. 이 프로젝트는 평가 경계를 설정하고 두 모델 계열의 선택과 보정, 재현의 성공 및 실패를 함께 검증한 사례입니다.

실행 방법

소스와 문서 ZIP을 내려받아 압축을 풀고 아래 명령으로 환경과 기본 모델을 준비합니다. Docker와 로컬 GPU 없이 CPU에서 실행하며 기본 모델은 문체 앙상블입니다.

.\launch-nlu.bat doctor
.\launch-nlu.bat download
.\launch-nlu.bat predict

Linux에서는 같은 인자를 sh ./launch-nlu.sh에 전달합니다. Large CE를 사용하려면 다음 명령으로 선택적 모델을 준비하고 글 두 편을 입력합니다.

.\launch-nlu.bat download --model transformer
.\launch-nlu.bat predict --model transformer --text-file-1 passage-a.txt --text-file-2 passage-b.txt
공개 모델 설치와 전체 평가 재현

자동 다운로드는 공개 모델 데이터셋의 버전 1 개별 파일과 SHA-256을 고정합니다. 로그인 없이 모델 파일 21개, 총 2,856,189,574바이트를 내려받아 크기와 해시를 모두 확인했습니다. 전체 모델 ZIP, 배포 버전 2는 같은 파일을 다시 묶은 자료이며 실제 다운로드와 내부 파일 해시를 검증했습니다.

전체 ZIP은 Kaggle의 평면 파일 이름을 유지하므로 실행 경로에 설치할 때는 자동 다운로드 명령을 사용합니다. 모델별 ZIP을 직접 전달받은 경우에는 artifacts/runtime에 해제합니다. 실행기는 설치 파일을 고정 명세에 대조하며 직접 설치에는 자동 다운로드 명세가 필요하지 않습니다.

.\launch-nlu.bat evaluate --model stylometric --model-name stylometric --model-dir artifacts/runtime/models/stylometric --output .local/replay-stylometric --batch-size 4 --threads 4

전체 재현 평가의 배치와 스레드는 실행 비용을 고려해 지정한 설정입니다. CLI 기본값은 배치 8과 스레드 1이며, 실행 설정 변경으로 모델 선택이나 보정값을 바꾸지 않습니다. Large 전체 평가 명령은 소스 ZIP의 README.ko.md와 재현 안내에 제공합니다.

코드와 자료

GitHub 설명은 영어를 기본으로 제공하며 한국어 문서도 함께 제공합니다. 소스 다운로드의 reports 폴더에 파일 해시와 원본 순서의 예측을 포함합니다. 공동 학습 노트북과 발표 포스터는 개발 근거로 보존했고, Drive에 보관한 모델은 문서를 분리해 학습한 공개 평가 모델과 구분합니다. GitHub 연결이 어려우면 소스 ZIP에서 같은 코드와 문서를 확인할 수 있습니다.

소스와 문서 ZIPGitHub에서 소스 코드 보기