AI Detection

AI 탐지를 위한 토큰 확률과 로그우도

Perplexity가 주목을 받지만, 그 아래의 산술은 토큰 확률입니다. 즉, 모델이 다음 단어에 대해 실제로 가지는 분포의 내용, 탐지 수학이 왜 원시 확률이 아니라 로그 공간에서 수행되는지, 그리고 토큰별 점수의 연속이 어떻게 하나의 수가 되는지입니다.

6 min
Diagram illustrating token probability ai detection: a language model's next-token distribution turning into a log-likelihood score

검출기에 그 점수가 어떻게 산출되었는지 묻는다면, 대부분의 사용자 인터페이스는 같은 응답을 보여줍니다. 일부 단어가 다른 단어보다 더 짙게 음영 처리된 문단입니다. 그 음영은 추측이 아닙니다. 그것은 검출기가 perplexity, burstiness, 또는 최종 백분율에 닿기 전에 계산하는, 해당 구절의 모든 token에 붙은 수치에서 비롯됩니다.

그것은 token probability이며, 모든 token probability ai detection은 처음부터 그것에 기반합니다. 검출기가 보고하는 어떤 수치의 지표든, 이 사이트의 다른 곳에서 다루는 두 가지를 포함하여, 결국은 이러한 수치들의 연속에 대해 수행한 산술일 뿐입니다. 대부분의 설명이 멈추는 층 아래에는 token이 실제로 무엇인지, 그것에 대한 model의 distribution이 무엇을 의미하는지, 그리고 왜 산술이 raw probability가 아니라 log space에서 수행되는지가 있습니다. 대부분의 설명은 거기서 멈춥니다.

이 모든 것은 불투명하게 남아 있을 필요가 없습니다. token, probability distribution, logarithm은 독점적 비밀이 아니라 일상적인 도구이며, 이 세 가지 생각만으로 AI detectors가 실제로 어떻게 작동하는지를 raw text에서 보고서의 단일 수치에 이르기까지 설명할 수 있습니다.

Token Probability AI Detection: Distribution에서 Score까지

Token probability ai detection은 세 단계로 작동합니다. language model은 앞선 내용이 주어졌을 때 가능한 다음 token마다 probability를 부여합니다. 이러한 token별 probability는 logarithm으로 변환되어 구절 전체에 걸쳐 합산되며, 이는 raw multiplication이 거의 즉시 맞닥뜨리는 수치적 문제를 피하게 해 줍니다. 그 결과로 얻어진 합은 평균화되고 다시 조정되어, 결국 perplexity 수치로 나타나거나 classifier의 판단에 입력됩니다. 각 단계는 검증 가능한 구체적 산술이며, 블랙박스가 아닙니다.

Token이 실제로 무엇인가

토큰은 단어가 아니다. 현대의 언어 모델은 byte-pair encoding과 같은 알고리즘을 사용해 텍스트를 하위 단어 조각으로 분할하므로, 'the' 같은 흔한 단어는 보통 하나의 토큰이지만, 'perplexity' 같은 덜 흔한 단어는 두세 개의 조각으로 나뉘고, 낯선 이름은 개별 문자 수준까지 분해될 수 있다. 평범한 영어 문단은 단어 수보다 더 많은 조각으로 안정적으로 토큰화되므로, 도구가 돌려주는 단어 수를 그대로 신뢰하기 전에 알아둘 만하다.

모델은 독자가 단어를 읽는 방식으로 단어를 보지 않는다. 모델은 정수의 연속을 보며, 각 정수는 모델이 학습된 고정 어휘집 안의 하나의 색인이다. 이 시점부터 token probability ai detection이 하는 모든 일은 원래의 문자 문자열이 아니라 그 정수 연속을 대상으로 작동하며, 이것이 바로 탐지기의 내부 작동이 사람이 실제로 문장을 읽는 방식과 동떨어져 느껴질 수 있는 이유의 일부이다.

다음 토큰에 대한 모델의 분포

연속의 각 위치에서 자기회귀 언어 모델은 하나의 예측만을 출력하지 않는다. 그것은 전체 어휘집에 걸친 완전한 확률 분포를 출력하는데, 이는 합이 1이 되는 수만 개의 수이며, 앞선 모든 내용을 바탕으로 가능한 다음 토큰을 가장 가능성이 높은 것부터 가장 낮은 것까지 순위화한다. 모델에 'the results of the'라는 구를 입력하면, 모델은 그 확률 질량의 대부분을 'study,' 'experiment,' 'analysis,' 같은 몇몇 그럴듯한 명사에 분배하고, 'marmalade' 같은 것에는 극히 작은 비중만을 할당한다.

실제 문서에서 실제로 다음에 나타나는 토큰은 그 순위의 어딘가에 위치하며, 그에 할당된 확률은 나머지 모든 것이 구축되는 원재료이다. 자신의 텍스트를 생성하는 모델은 이 분포를 직접 활용하여, 반복적으로 상위권에서 선택할 수 있다. 다른 사람이 완성한 텍스트를 읽는 탐지기는 사후적으로, 실제로 선택된 항목에 모델이 얼마나 큰 확률을 부여했을지를 물을 수 있을 뿐이다.

전체 시퀀스의 확률은 그 이전의 모든 것을 조건으로 한 각 토큰의 확률의 곱이다. 이 토큰별 질문을 결합 확률에 대한 표준 규칙을 사용하여 전체 문서에 걸쳐 연결하면, 최종 결과는 전체 구절이 얼마나 예상 가능한지를 설명하는 하나의 수가 된다. 이 곱셈에서 산술이 무너지기 시작하며, 이것이 다음 절이 존재하는 이유이다.

자신의 논문을 인간적으로 다듬기

중요한 단어나 인용은 건드리지 않고, AI 보조로 작성한 텍스트를 자연스럽고 사람처럼 들리게 바꾸세요.

무료로 시작하기

왜 로그 우도가 원시 확률을 대체하는가

확률을 서로 곱하는 것은 수학적으로는 올바르지만, 몇십 개의 토큰을 넘어서면 실용적으로는 쓸모가 없다. 개별 확률은 모두 1보다 작은 분수이므로, 누적 곱은 또 다른 토큰이 곱해질 때마다 줄어들고, 그 감소는 빠르다. 수백 개의 토큰이 지나면, 원시 곱은 컴퓨터가 표현할 수 있는 가장 작은 수보다 훨씬 아래로 떨어져 정확히 0으로 반올림될 수 있는데, 이를 언더플로라고 한다.

그렇게 되면 그 수는 아무 정보도 담지 못한다. 단지 가능성이 낮았던 문서와 극단적으로, 혼란스럽게 가능성이 낮았던 문서는 모두 동일한 0으로 붕괴하며, 이후에는 둘을 구별할 방법이 없다. 로그는 곱의 로그가 로그의 합과 같다는, 기초 대수의 항등식이므로 이를 해결한다. 일반적인 음수들의 합은 작은 분수들을 계속 곱할 때처럼 언더플로하지 않으며, 계산 비용도 더 적다.

구절 길이, 예시원시 확률, 누적 곱로그 확률의 합
예시로 각 0.1인 12개 토큰1 x 10 to the power of -12, 여전히 표현 가능대략 -27.6
예시로 각 0.1인 350개 토큰1 x 10 to the power of -350, 정확히 0으로 언더플로대략 -805.9

이것은 단순화한 설명이다. 실제 토큰당 확률은 0.1처럼 평평하게 머무는 것이 아니라 엄청나게 달라지지만, 문제의 방향성은 정확하다. 원시 곱이 0으로 언더플로되면, 탐지기가 실제로 필요로 하는 비교, 즉 이 문서가 저 문서보다 더 예상되었는지 덜 예상되었는지의 판단은 불가능해진다. 로그 확률의 합은 그런 식으로 실패하지 않는다. 문장이 얼마나 길어지든 정확하고, 평범하며, 비교 가능한 수치로 남는데, 이것이 바로 탐지 가능성이 원시 확률 공간이 아니라 로그 공간에서 측정되는 실제 이유이다.

토큰당 점수에서 탐지 점수로

문장 전체에 걸쳐 로그 확률을 합하면 기준 모델 아래에서 해당 문서의 총 로그 우도(log-likelihood)가 생성된다. 이를 토큰 수로 나누면 길이의 효과가 제거되고 토큰당 평균 로그 우도가 남는데, 이는 500단어 에세이와 5000단어 논문 장(chapter) 사이에서도 마침내 비교 가능한 수치이다. 그 평균에 음수를 취하고 지수화하면 퍼플렉서티 점수가 나오며, 이 지표는 이 클러스터가 퍼플렉서티가 실제로 무엇을 측정하는지에 대해 별도의 글에서 자세히 다룬다.

같은 문장별 수치는 문서 전체에서 하나의 평균으로 평탄화하는 대신 변동성을 추적할 때 버스티니스가 구성되는 방식이며, 퍼플렉서티와 관련되지만 별개의 신호이다. 둘 다 위에서 설명한 동일한 토큰당 수치에서 시작한다. 다만 그 위에서 서로 다른 산술을 수행할 뿐이다.

단순 평균이 이 원자료를 사용하는 유일한 방법은 아니며, 연구는 이미 그것을 훨씬 넘어섰다. ICML 2023에서 Mitchell, Lee, Khazatsky, Manning and Finn이 발표한 DetectGPT는 같은 확률 함수의 다른 성질에서 출발한다. 언어 모델에서 샘플링된 텍스트는 작은 재표현이 로그 확률을 상승시키기보다 하락시키는 영역에 위치하는 경향이 있는데, 논문은 이 패턴을 음의 곡률이라고 부른다.

분류기를 학습시키거나 워터마크를 사용하는 대신, 이 방법은 한 구절에 교란을 가해, 표현이 바뀌는 방식에 작은 변형들을 만들어 내고, 그런 다음 같은 모델로 각 변형을 다시 채점한다. 이 논문은 이를 최상의 zero-shot 기준선과 비교하며, 20-billion-parameter 모델이 생성한 텍스트에서 이 방법이 0.95 AUROC를 달성하는 반면 최상의 zero-shot 기준선은 0.81 AUROC를 달성한다고 밝힌다.

탐지 대신 워터마크에 사용되는 동일한 분포

지금까지는 모두 확률 분포를 사후에 읽어 들이는 것으로 다루었다. 그러나 그것은 생성 시점에도 건드릴 수 있으며, 그렇게 되면 문제의 방향이 완전히 뒤집힌다. Kirchenbauer, Geiping, Wen, Katz, Miers and Goldstein의 2023년 방법은 각 단어가 생성되기 전에, 앞서 나온 내용의 해시를 바탕으로 허용되는 토큰의 무작위화된 후보 목록을 선택하고, 샘플링을 그 후보 목록 쪽으로 부드럽게 유도한다. 이 편향은 독자에게는 보이지 않으며, 나중에는 원래 모델에 접근할 필요 없이 짧은 텍스트 구간에 대한 통계적 검정으로 복원할 수 있다.

Google DeepMind의 SynthID는 이 아이디어의 한 버전을 실제 서비스에 적용한다. 생성 시점에 다음 토큰의 확률 점수를 조정하며, 현재 Gemini 앱과 웹 경험에서 사용되고 있다. OpenAI는 유사한 시스템을 구축했지만 출시하지는 않았다. 보도에 따르면, 그 결정은 부분적으로 ChatGPT 사용자 중 거의 30 percent가 워터마킹이 제품 사용을 줄이게 할 것이라고 답한 설문조사와, 워터마크가 패러프레이징을 얼마나 잘 견딜 수 있는지에 대한 우려에 기인한다.

탐지기의 보고서는 음영 처리된 단어 하나나 단일 percentage를 보여 준 뒤 거기서 멈추며, 그 모든 것이 나온 분포는 끝내 보여 주지 않는다. TextPulse의 free perplexity checker는 자신의 초안에 대해 동일한 per-token 채점의 단순화된 버전을 실행하며, 이는 판정을 간접적으로 읽는 것보다 한 구절이 어디에 위치하는지 더 직접적으로 확인하는 방법이다.

인접한 두 페이지가 이를 다룹니다. 탐지기가 여전히 burstiness에 의존하는지는 2023년 이후 달라졌으며, GPTZero가 이러한 동일한 확률을 점수로 바꾸는 방식은 별도의 페이지에서 설명됩니다.

이는 TextPulse의 나머지 무료 도구와 함께 배치되어 있으므로, 같은 초안을 단어 수준의 예측 가능성뿐 아니라 리듬과 구조 측면에서도 확인할 수 있으며, 이를 위해 여러 개의 별도 탭을 열 필요가 없습니다.

XLinkedInFacebook

자주 묻는 질문

토큰 확률 AI 탐지는 다른 모든 탐지 지표의 아래에 있는 층입니다. 언어 모델은 이전에 나온 모든 내용을 바탕으로, 시퀀스의 각 토큰에 하나씩 확률을 할당합니다. Perplexity, 분류기 점수, 그리고 보고서의 퍼센트는 모두 그 뒤에 이 숫자들의 시퀀스에 대해 수행되는 산술이며, 별도의 독립적인 측정이 아닙니다.

Moe

PhD in natural language processing, with years spent building NLP applications end to end. Moe works on text analysis: lexical and syntactic structure, and what separates machine-generated prose from human prose statistically. He has been experimenting with computational linguistics since the early days of NLTK, spaCy and WordNet, and still writes most of his tooling in Python.