Sampling Guide

Last contents updated 9/24/2024

Kevin's Sampling Laboratory

다른 샘플러를 활성화하지 않았다면 Randomness 1은 중립적인 샘플러입니다. 이는 모델의 출력을 변경하지 않습니다. 다른 샘플러는 이에 비교되어야 합니다. 중립에서 더 멀어질수록 더 이국적(exotic)이라고 할 수 있습니다. 그러나 이러한 이국적 샘플러는 적절하지 않으면 문제를 일으킬 가능성이 더 큽니다.

하지만 텍스트 품질 벤치마크에서는 Randomness만을 사용하는 것보다 Top K가, 그리고 Top K보다는 Top P(Nucleus)가 더 나은 성능을 발휘하는 것으로 알려져 있습니다. 따라서 중립 샘플러에서 벗어나는 것이 좋은데, 이는 확률이 가장 낮은 토큰들이 낮은 품질을 가진 경우가 많지만, 모델은 이를 알지 못하기 때문입니다. 따라서 이러한 토큰들을 가장 적절한 방식으로 제거하는 샘플러를 사용해야 합니다.

샘플러는 높고 낮은 확률의 균형이 무너지면 성능이 떨어집니다.

  1. 높은 확률의 토큰을 너무 강조하면 출력이 반복되거나 너무 단조로워 집니다.
  2. 낮은 확률의 토큰이 충분히 압축되지 않으면 출력에 이상한 텍스트나 문법적, 논리적 실수가 포함될 수 있습니다.

AI의 생성텍스트를 추가하기 전에 정확성과 품질을 위해 AI의 생성물을 편집하는 것은 도움이 됩니다. 모델은 기존 이야기와 유사한 텍스트를 생성하려고 하기 때문인데, 그 과정에서 문법 오류나 반복도 포함됩니다: 모델이 오류를 인식하면 동일한 유형의 오류를 더 많이 생성하게 됩니다. 오류가 컨텍스트 내에서 충분히 누적되면 출력물이 일관성을 잃게 됩니다. 이러한 문제는 오류가 발생할 때마다 제거하여 방지할 수 있습니다. 철자 오류는 발생하지 않으니 걱정할 필요는 없습니다.

샘플러는 오른쪽 상단 아이콘을 클릭하여 열 수 있는 Slider 섹션에서 제어됩니다. 각 샘플러에 대한 간략한 설명이 담긴 문서도 있습니다.

Change Samplers를 클릭하면 샘플러 목록이 나타나며, 여기서 샘플러를 활성화, 비활성화하거나 순서를 변경할 수 있습니다. Send를 클릭하여 텍스트를 생성하면 모델은 단어 내 각 토큰에 확률을 할당합니다. 목록에서 첫 번째 샘플러가 이 확률에 적용되며, 그런 다음 두 번째 샘플러가 변경된 확률에 적용된다. 이처럼 샘플러는 위에서 아래로 하나씩 순차적으로 적용됩니다. 따라서 샘플러의 정체성, 순서, 그리고 값이 모두 중요한데, 이는 이해하기 어려운 선택의 마비를 초래할 수 있습니다.

하지만 잘못된 옵션을 제거하고 나면 남은 선택은 사실 간단합니다.

Rule 1: Don't build a large chain of samplers.

규칙 1: 샘플러를 긴 체인으로 구성하지 마세요.

복잡한 샘플러들(Tail Free Sampling, Typical P, Mirostat)은 체인으로 연결될 때 제대로 작동하지 않습니다. 이들은 변경된 입력을 받을 경우 이 샘플러의 이론적 근거가 유효하지 않게되며, 의미를 알 수 없는 동작을 수행하게 됩니다.

다른 샘플러들은 체인에서 깨지지는 않지만, 샘플러의 혼합이 서로의 장점과 약점을 보완하는 경우는 드뭅니다. 대부분의 경우, 하나의 샘플러가 올바르게 작동하면 다른 하나는 그렇지 않습니다. 예외적으로 Top K는 일부 체인의 마지막에 사용할 수 있으며, Unified 샘플러 이후에는 아주 약한 임계값 샘플러가 유용할 수 있습니다.

1개의 샘플러를 사용하거나, 수학에 대해 충분히 이해한다면 최대 2개까지만 사용하세요. 특히 샘플러를 하나씩 추가하며 조정하는 방식으로 체인을 구성하지 마세요.

실제로, 더 많은 샘플러를 포함한 프리셋은 대개 더 나쁜 결과를 가져옵니다. 이는 샘플러가 제대로 조정되지 않았기 때문이며, 경험이 많은 프리셋 디자이너도 마찬가지입니다.

Rule 2: If you don't understand the math, use a closer-to-neutral sampler.

규칙 2: 수학적 개념을 이해하지 못한다면 중립에 가까운 샘플러를 사용하세요.

공식문서 페이지에서는 샘플러를 쉽게 이해할 수 있도록 간단한 영어로 요약하고 있습니다. 하지만 이러한 요약은 각 샘플러의 장단점을 깊이 이해하기에는 충분하지 않습니다. 이 설명들은 또한 지나치게 낙관적인 경향이 있어 샘플러의 한계보다는 기대와 이상을 설명합니다. 이러한 정보만으로는 결정을 내리기가 어렵습니다.

특히 샘플러를 여러 개 쌓아 사용할 경우, 각 샘플러를 완전히 이해하는 것이 매우 중요합니다.

샘플러를 조정하려는 경우, 해당 샘플러의 알고리즘을 읽고 이해한 후, Token Probabilities 뷰어(왼쪽 하단의 두뇌 아이콘)를 사용하여 그 효과를 확인해야 합니다. 샘플러가 BeforeAfter 확률을 어떻게 변형하는지 비교하고, 그것이 아래에 설명된 샘플러가 가져야 할 특성에 맞는지 확인하십시오.

Goals of a sampler

  1. 샘플러는 가장 낮은 확률의 토큰을 걸러내야 합니다. 확률이 매우 낮은 Before 토큰들은 LLM의 내재적인 문제로 인해 자주 낮은 품질의 결과를 초래합니다. 이러한 토큰을 제거함으로써 출력 품질이 개선됩니다. 하지만 Token Probabilities 뷰어에서는 최대 10개의 토큰만 보여주므로, 어떤 토큰에서부터 말이 안되는 토큰이 시작하는지를 판단하기가 어렵습니다. 게다가 이 임계점은 모델이 얼마나 분포에 맞는지에 따라 달라지므로, 단어와 이야기마다 다를 수 있습니다. 적절한 제거 기준을 설정하는 것은 어렵지만 시도해볼 수 있습니다. 참고로 NovelAI의 숨겨진 옵션을 사용하면 최대 30개의 토큰을 볼 수 있습니다.

  2. 몇몇 사용자들은 높은 확률의 토큰들을 평탄화하는 것을 원할 수 있습니다. 즉, 20% 이상의 입력 다른 확률을 가진 토큰들이 비슷한 출력 확률을 가지도록 압축하는 것입니다. 이는 더 독특한 토큰을 이끌어냅니다. AI가 탐험적인 결과를 내기를 원하는 사용자에게 적합하지만, 부적절한 결과가 나올 가능성도 높아져 재시도를 자주 해야 할 수 있습니다.

  3. 샘플러는 갑작스러운 확률 변화가 없어야 합니다. 예를 들어, 0.05 이하의 확률을 가진 Before 토큰들이 0으로 설정되면, 0.06의 확률을 가진 Before 토큰의 After 확률도 0에 근접해야 합니다. 큰 변화 없이 부드럽게 확률이 0으로 수렴해야 합니다.

  4. 샘플러는 토큰의 순서를 바꾸면 안됩니다. Token Probabilities 뷰어의 Before 섹션에서 A > B라면, After 섹션에서도 A > B를 유지해야 합니다. (이 규칙은 샘플러 리스트에 있는 샘플러들에만 적용됩니다. Phrase Repetition Penalty, Repetition Penalty, Phrase Bias와 같은 다른 변환들은 다른 속성을 갖기 때문에 토큰 순서를 변경해도 됩니다.)

Numbers to consider

Token Probabilities 뷰어를 보고, BeforeAfter 확률을 비교해보세요. 앞서 언급한 것 외에도 다음과 같은 속성을 관찰해야 합니다:

  • 큰 확률: Before 열에서 확률이 25%를 초과하는 두 확률이 있을 경우, After 열에서 그 두 확률의 비율은 Before 열에서의 비율과 같거나 1에 더 가까워야 합니다. After 확률이 Before 확률보다 크거나 작아질 수 있으며, 둘 다 허용됩니다.

  • 중간 확률(5% ~ 30% 사이): After 확률은 Before 확률과 같거나 더 커야 합니다.

  • 작은 확률: 일정한 낮은 확률 이하에서는 After 확률이 Before 확률보다 작아야 합니다. 많은 샘플러들은 After 확률을 0으로 설정하는 임계값을 사용합니다. 이는 토큰의 품질이 저하되기 시작하는 시점에서 확률을 줄이는 것이 목표입니다.

Advice for specific samplers

이 문서의 나머지 내용은 다소 불공평할 수 있습니다. Unified를 만들 때 사용된 연구가 다른 샘플러들을 평가하는 데 사용되기 때문에 Unified에 유리한 편향이 있을 것입니다.

Unified: RandomnessLinear와 중복되므로 비활성화하세요. Linear는 원하는 토큰의 독특함 정도에 따라 0에서 1 사이로 설정하세요. 0은 최대한의 탐험적 출력을, 1은 일반적인 출력을 의미합니다. 더 낮은 값은 더 독특하고 창의적인 출력을 생성하지만, 더 자주 다시 생성하거나 편집해야 할 것입니다. Quad = 0.25 - Linear / 5로 설정하세요. Conf는 변경하지 마세요.

많은 노력을 들여 세부 조정을 하고자 하는 사람들을 위해: Unified의 공식은 다음과 같습니다.

output logit = (input log-probability) * (Linear + entropy * Conf) - (input log-probability)^2 * Quad

출력 확률은 출력 logits을 지수화하고, 그 합을 1로 정규화하여 계산됩니다(이를 "softmax"라고 부릅니다). Linear가 음수일 경우 최적은 아니지만 유효합니다. 음수 Linear는 최적은 아니지만 가능은 합니다. 그 결과 음의 확률 기울기가 생깁니다: 입력 확률이 증가하면 해당 토큰의 출력 확률은 감소합니다. Linear 또는 Conf가 음수일 경우, Quad는 양수여야 하며 그렇지 않으면 출력이 엉망이 되어 엉뚱한 결과를 낼 수 있습니다.

Quad는 logits을 0으로 만들 수는 없지만, 중요하지 않을 정도로 낮게 만들 수 있습니다. 진정한 컷오프를 원한다면 Unified 이후에 매우 높은 Top P (Nucleus 0.999)나 매우 낮은 Min P (0.0001)을 선택하십시오.

Conf는 현재 토큰의 불확실성(엔트로피로 측정됨)에 따라 Randomness를 변화시킵니다. 이론적으로는 Conf가 0.01처럼 아주 작은 양수일 때 도움이 될 수 있다고 예측되지만, 실제로는 문법 오류가 많은 이야기에서 한 번만 관찰되었습니다.

Unified의 목표는 간단하면서도 완전한 프리셋을 능가하는 성능을 발휘하는 것입니다. 복잡한 샘플러 체인을 Unified 하나로 대체하는 것이 목표이며, 슬라이더와 문제점이 적어 사용자가 합리적인 옵션을 선택할 수 있도록 설계되었습니다. 그 수학적 기반은 실험보다는 이론에서 나왔습니다.

Conf가 테스트에서 거의 이점을 보여주지 않았기 때문에, 이를 제거하여 Unified를 더 간소화하는 것이 논리적인 선택일 수 있습니다. 하지만 프리셋을 대체하려면 Unified는 프리셋이 가진 모든 좋은 특성을 재현할 수 있어야 합니다. 다른 샘플러들은 이론에 의해 명확히 지지되거나 금지된 행동을 하지 않으며, Conf는 이러한 특이한 행동을 재현합니다. 예를 들어, Conf = -1.5 * Quad는 부드러운 Min P를, 높은 Conf는 부드러운 Top K를 나타냅니다. 따라서 Conf의 목적은 기존 프리셋의 동작을 포괄하는 것입니다.

  • Mirostat의 알고리즘은 특이합니다. 다이내믹 샘플링은 깔끔하며 반복을 줄이는데 도움이 될 겁니다. 그러나 Mirostat의 혼잡도 제어 목표는 의문스러우며, Top K와 Zipf을 조합한 방법도 매우 미흡합니다. 반복 방지 효과는 기껏해도 적을 것입니다. 다이내믹 샘플링이 필요하다면, 양수 Conf 값과 낮은 Linear 값을 대신 사용할 수 있습니다. 비록 이는 과거 기록을 인식하지는 못하겠지만요.

  • Top A를 사용하지 마세요. 성능이 나쁩니다. Top A를 Min P로 교체하고 슬라이더 값에 1/2 또는 1/3를 곱하세요; 명확한 개선이 있을 것입니다.

  • Tail-Free Sampling (TFS)는 확률의 꼬리를 계산하지만, 이는 부정확한 수학적 이론에 기반하고 있습니다. 또한 TFS는 logit 양자화에 민감하게 반응하는데, 이는 낮은 확률에서의 미세한 변화가 이차 도함수에 큰 영향을 미치는 경우를 의미합니다. 만약 TFS가 유용한 무언가를 수행한다면, Top P가 일부 숫자 X > 1에 대해 Linear X -> Top P -> Randomness X와 같은 방식으로 더 잘 수행할 수 있습니다.

  • Typical은 높은 확률과 낮은 확률의 토큰을 모두 삭제합니다. 이것은 토큰 순서를 변경하며 이는 위에 언급된 Goal 4를 위반합니다. Typical은 높은 확률의 말이 되는 토큰을 삭제할 충분한 정보를 제공받지 못합니다. 높은 *ogit을 억제하고 싶다면, 음수 Linear가 더 나은 해결책입니다.

  • Top K는 가장 오래된 샘플러입니다. 사람들이 LLM을 다룬 경험이 없을 때 만들어졌습니다. 디버깅에 사용할 수 있는Top K 1을 제외하면 일반적으로 사용되지 않ㅅ브니다.

  • Top P (**Nucleus)**는 Top K보다 발전된 샘플러입니다. 이는 분포의 다양성을 유지하는데, 이는 중요한 두 가지 요소 중 하나입니다(다른 하나는 품질입니다). Top P의 뛰어난 성능은 널리 벤치마킹되었으며, 모든 샘플러들이 비교되는 기준이 됩니다. 1에 가까운 값이 적절합니다(0.9처럼).

  • Min P는 최근에 등장한 샘플러입니다. 이 샘플러는 Top P 같은 특별한 논리 없이도 최소 하나의 토큰이 존재할 수 있도록 보장하는 임계값을 사용합니다. 가장 확률이 높은 토큰의 확률이 토큰의 확실성을 나타내는 완벽한 지표는 아니지만, Min P는 문제없이 작동하며 이해하기 쉽습니다. 0에 가까운 값이 적절합니다(0.04처럼).