mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
46 lines
3.9 KiB
Markdown
46 lines
3.9 KiB
Markdown
# LLM Training
|
|
|
|
## Tokenizing
|
|
|
|
Tokenizing은 데이터를 특정 청크로 분리하고 각 청크에 특정 ID(숫자)를 할당하는 것입니다.\
|
|
텍스트에 대한 매우 간단한 토크나이저는 텍스트의 각 단어를 개별적으로 가져오고, 구두점 기호도 포함하여 공백을 제거하는 것일 수 있습니다.\
|
|
따라서, `"Hello, world!"`는: `["Hello", ",", "world", "!"]`가 됩니다.
|
|
|
|
그런 다음 각 단어와 기호에 토큰 ID(숫자)를 할당하기 위해 토크나이저 **어휘**를 생성해야 합니다. 예를 들어 책을 토크나이징하는 경우, 이는 **책의 모든 다른 단어**를 알파벳 순서로 나열하고 몇 가지 추가 토큰을 포함할 수 있습니다:
|
|
|
|
* `[BOS] (Beginning of sequence)`: 텍스트의 시작 부분에 배치되어 텍스트의 시작을 나타냅니다(관련 없는 텍스트를 구분하는 데 사용됨).
|
|
* `[EOS] (End of sequence)`: 텍스트의 끝에 배치되어 텍스트의 끝을 나타냅니다(관련 없는 텍스트를 구분하는 데 사용됨).
|
|
* `[PAD] (padding)`: 배치 크기가 일반적으로 1보다 클 때, 이 토큰은 해당 배치의 길이를 다른 배치와 같게 늘리는 데 사용됩니다.
|
|
* `[UNK] (unknown)`: 알려지지 않은 단어를 나타냅니다.
|
|
|
|
예를 따라, 텍스트를 토크나이징하여 각 단어와 기호에 어휘에서의 위치를 할당한 경우, 토크나이징된 문장 `"Hello, world!"` -> `["Hello", ",", "world", "!"]`는 다음과 같이 될 것입니다: `[64, 455, 78, 467]`라고 가정할 때 `Hello`는 위치 64에, "`,"`는 위치 `455`에... 결과 어휘 배열에서.
|
|
|
|
그러나 어휘를 생성하는 데 사용된 텍스트에 `"Bye"`라는 단어가 존재하지 않는 경우, 이는 다음과 같은 결과를 초래합니다: `"Bye, world!"` -> `["[UNK]", ",", "world", "!"]` -> `[987, 455, 78, 467]`라고 가정할 때 `[UNK]`의 토큰이 987에 있습니다.
|
|
|
|
### BPE - Byte Pair Encoding
|
|
|
|
모든 가능한 단어를 토크나이징해야 하는 문제를 피하기 위해, LLMs는 BPE를 사용합니다. 이는 기본적으로 **빈번한 바이트 쌍을 인코딩**하여 텍스트의 크기를 더 최적화된 형식으로 줄이는 것입니다. 더 이상 줄일 수 없을 때까지 진행됩니다(자세한 내용은 [**wikipedia**](https://en.wikipedia.org/wiki/Byte\_pair\_encoding)를 확인하세요). 이 방법에서는 어휘에 "알려지지 않은" 단어가 없으며, 최종 어휘는 발견된 빈번한 바이트 세트가 가능한 한 많이 그룹화된 것입니다. 빈번하게 연결되지 않은 바이트는 자체적으로 토큰이 됩니다.
|
|
|
|
## Data Sampling
|
|
|
|
LLMs는 이전 단어를 기반으로 다음 단어를 예측하여 작동하므로, 훈련을 위한 데이터를 준비하기 위해서는 데이터를 이와 같이 준비해야 합니다.
|
|
|
|
예를 들어, 텍스트 "Lorem ipsum dolor sit amet, consectetur adipiscing elit,"를 사용하여,
|
|
|
|
모델이 다음 단어를 예측하도록 학습하도록 준비하기 위해(각 단어가 매우 기본적인 토크나이저를 사용하여 토큰이라고 가정하고), 최대 크기를 4로 하고 슬라이딩 윈도우를 1로 사용하여, 텍스트는 다음과 같이 준비되어야 합니다:
|
|
```javascript
|
|
Input: [
|
|
["Lorem", "ipsum", "dolor", "sit"],
|
|
["ipsum", "dolor", "sit", "amet,"],
|
|
["dolor", "sit", "amet,", "consectetur"],
|
|
["sit", "amet,", "consectetur", "adipiscing"],
|
|
],
|
|
Target: [
|
|
["ipsum", "dolor", "sit", "amet,"],
|
|
["dolor", "sit", "amet,", "consectetur"],
|
|
["sit", "amet,", "consectetur", "adipiscing"],
|
|
["amet,", "consectetur", "adipiscing", "elit,"],
|
|
["consectetur", "adipiscing", "elit,", "sed"],
|
|
]
|
|
```
|
|
슬라이딩 윈도우가 2였다면, 입력 배열의 다음 항목이 1개가 아니라 2개의 토큰 후에 시작된다는 것을 의미합니다. 그러나 목표 배열은 여전히 1개의 토큰만 예측할 것입니다. pytorch에서 이 슬라이딩 윈도우는 매개변수 `stride`로 표현됩니다.
|