mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-llm-architecture/2.-data-sampling.md'] to ko
This commit is contained in:
parent
23a312bd1f
commit
507ac40846
@ -18,7 +18,7 @@ GPT와 같은 LLM은 이전 단어가 제공하는 맥락을 이해하여 텍스
|
||||
1. **토큰화:** 텍스트를 토큰(예: 단어, 하위 단어 또는 문자)이라고 하는 더 작은 단위로 나누는 과정.
|
||||
2. **시퀀스 길이 (max_length):** 각 입력 시퀀스의 토큰 수.
|
||||
3. **슬라이딩 윈도우:** 토큰화된 텍스트 위에 창을 이동시켜 겹치는 입력 시퀀스를 생성하는 방법.
|
||||
4. **스트라이드:** 슬라이딩 윈도가 다음 시퀀스를 생성하기 위해 앞으로 이동하는 토큰 수.
|
||||
4. **스트라이드:** 슬라이딩 윈도우가 다음 시퀀스를 생성하기 위해 앞으로 이동하는 토큰 수.
|
||||
|
||||
### **단계별 예제**
|
||||
|
||||
@ -76,7 +76,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
|
||||
|
||||
<table><thead><tr><th width="222">토큰 위치</th><th>토큰</th></tr></thead><tbody><tr><td>1</td><td>Lorem</td></tr><tr><td>2</td><td>ipsum</td></tr><tr><td>3</td><td>dolor</td></tr><tr><td>4</td><td>sit</td></tr><tr><td>5</td><td>amet,</td></tr><tr><td>6</td><td>consectetur</td></tr><tr><td>7</td><td>adipiscing</td></tr><tr><td>8</td><td>elit.</td></tr></tbody></table>
|
||||
|
||||
**보폭이 1인 슬라이딩 윈도우:**
|
||||
**보폭 1의 슬라이딩 윈도우:**
|
||||
|
||||
- **첫 번째 윈도우 (위치 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **타겟:** \["ipsum", "dolor", "sit", "amet,"]
|
||||
- **두 번째 윈도우 (위치 2-5):** \["ipsum", "dolor", "sit", "amet,"] → **타겟:** \["dolor", "sit", "amet,", "consectetur"]
|
||||
@ -89,7 +89,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
|
||||
- **보폭 2:** 윈도우가 매번 두 토큰씩 앞으로 이동하여 겹침을 줄입니다. 이는 중복성과 계산 부하를 감소시키지만, 일부 맥락적 뉘앙스를 놓칠 수 있습니다.
|
||||
- **max_length와 같은 보폭:** 윈도우가 전체 윈도우 크기만큼 앞으로 이동하여 겹치지 않는 시퀀스를 생성합니다. 이는 데이터 중복성을 최소화하지만, 시퀀스 간의 의존성을 학습하는 모델의 능력을 제한할 수 있습니다.
|
||||
|
||||
**보폭 2의 예:**
|
||||
**보폭 2의 예시:**
|
||||
|
||||
같은 토큰화된 텍스트와 `max_length` 4를 사용하여:
|
||||
|
||||
@ -97,9 +97,9 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
|
||||
- **두 번째 윈도우 (위치 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **타겟:** \["sit", "amet,", "consectetur", "adipiscing"]
|
||||
- **세 번째 윈도우 (위치 5-8):** \["amet,", "consectetur", "adipiscing", "elit."] → **타겟:** \["consectetur", "adipiscing", "elit.", "sed"] _(계속된다고 가정)_
|
||||
|
||||
## 코드 예제
|
||||
## 코드 예시
|
||||
|
||||
[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb)에서 코드 예제를 통해 이를 더 잘 이해해 봅시다.
|
||||
[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb)에서 코드 예시를 통해 이를 더 잘 이해해 봅시다.
|
||||
```python
|
||||
# Download the text to pre-train the LLM
|
||||
import urllib.request
|
||||
@ -230,9 +230,70 @@ tensor([[ 367, 2885, 1464, 1807],
|
||||
[ 3285, 326, 11, 287]])
|
||||
]
|
||||
```
|
||||
## 고급 샘플링 전략 (2023-2025)
|
||||
|
||||
### 1. 온도 기반 혼합 가중치
|
||||
최신 LLM은 단일 말뭉치에서 훈련되는 경우가 드뭅니다. 대신, 여러 이질적인 데이터 소스(코드, 웹, 학술 논문, 포럼 등)에서 샘플링합니다. 각 소스의 상대적인 비율은 하위 성능에 강한 영향을 미칠 수 있습니다. 최근 오픈 소스 모델인 Llama 2는 **온도 기반 샘플링 방식**을 도입하여 말뭉치 *i*에서 문서를 추출할 확률이 다음과 같이 됩니다.
|
||||
```
|
||||
p(i) = \frac{w_i^{\alpha}}{\sum_j w_j^{\alpha}}
|
||||
```
|
||||
• *w<sub>i</sub>* – 코퍼스 *i*의 원시 토큰 비율
|
||||
• *α* ("온도") – (0,1]의 값. α < 1은 분포를 평평하게 하여 더 작은 고품질 코퍼스에 더 많은 가중치를 부여합니다.
|
||||
|
||||
Llama 2는 α = 0.7을 사용하였고, α를 줄이면 훈련 혼합을 안정적으로 유지하면서 지식 중심 작업에서 평가 점수를 높인다는 것을 보여주었습니다. 같은 기법이 Mistral (2023)와 Claude 3에 의해 채택되었습니다.
|
||||
```python
|
||||
from collections import Counter
|
||||
|
||||
def temperature_sample(corpus_ids, alpha=0.7):
|
||||
counts = Counter(corpus_ids) # number of tokens seen per corpus
|
||||
probs = {c: c_count**alpha for c, c_count in counts.items()}
|
||||
Z = sum(probs.values())
|
||||
probs = {c: p/Z for c, p in probs.items()}
|
||||
# Now draw according to probs to fill every batch
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
### 2. Sequence Packing / Dynamic Batching
|
||||
GPU memory is wasted when every sequence in a batch is padded to the longest example. "Packing" concatenates multiple shorter sequences until the **exact** `max_length` is reached and builds a parallel `attention_mask` so that tokens do not attend across segment boundaries. Packing can improve throughput by 20–40 % with no gradient change and is supported out-of-the-box in
|
||||
|
||||
* PyTorch `torchtext.experimental.agents.PackedBatch`
|
||||
* HuggingFace `DataCollatorForLanguageModeling(pad_to_multiple_of=…)`
|
||||
|
||||
Dynamic batching frameworks (e.g. FlashAttention 2, vLLM 2024) combine sequence packing with just-in-time kernel selection, enabling thousand-token context training at 400+ K tokens/s on A100-80G.
|
||||
|
||||
### 3. Deduplication & Quality Filtering
|
||||
Repeated passages cause memorization and provide an easy channel for data-poisoning. Modern pipelines therefore:
|
||||
|
||||
1. MinHash/FAISS near-duplicate detection at **document** and **128-gram** level.
|
||||
2. Filter documents whose perplexity under a small reference model is > µ + 3σ (noisy OCR, garbled HTML).
|
||||
3. Block-list documents that contain PII or CWE keywords using regex & spaCy NER.
|
||||
|
||||
The Llama 2 team deduplicated with 8-gram MinHash and removed ~15 % of CommonCrawl before sampling. OpenAI’s 2024 "Deduplicate Everything" paper demonstrates ≤0.04 duplicate ratio reduces over-fitting and speeds convergence.
|
||||
|
||||
## Security & Privacy Considerations During Sampling
|
||||
|
||||
### Data-Poisoning / Backdoor Attacks
|
||||
Researchers showed that inserting <1 % backdoored sentences can make a model obey a hidden trigger ("PoisonGPT", 2023). Recommended mitigations:
|
||||
|
||||
* **Shuffled mixing** – make sure adjacent training examples originate from different sources; this dilutes gradient alignment of malicious spans.
|
||||
* **Gradient similarity scoring** – compute cosine similarity of example gradient to batch average; outliers are candidates for removal.
|
||||
* **Dataset versioning & hashes** – freeze immutable tarballs and verify SHA-256 before each training run.
|
||||
|
||||
### Membership-Inference & Memorization
|
||||
Long overlap between sliding-window samples increases the chance that rare strings (telephone numbers, secret keys) are memorized. OpenAI’s 2024 study on ChatGPT memorization reports that raising stride from 1 × `max_length` to 4 × reduces verbatim leakage by ≈50 % with negligible loss in perplexity.
|
||||
|
||||
Practical recommendations:
|
||||
|
||||
* Use **stride ≥ max_length** except for <1B parameter models where data volume is scarce.
|
||||
* Add random masking of 1-3 tokens per window during training; this lowers memorization while preserving utility.
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
|
||||
- [Build a Large Language Model from Scratch (Manning, 2024)](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||||
- [Llama 2: Open Foundation and Fine-Tuned Chat Models (2023)](https://arxiv.org/abs/2307.09288)
|
||||
- [PoisonGPT: Assessing Backdoor Vulnerabilities in Large Language Models (BlackHat EU 2023)](https://arxiv.org/abs/2308.12364)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user