diff --git a/SUMMARY.md b/SUMMARY.md index 33ae4e36e..d1df1089d 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -838,6 +838,7 @@ * [Low-Power Wide Area Network](todo/radio-hacking/low-power-wide-area-network.md) * [Pentesting BLE - Bluetooth Low Energy](todo/radio-hacking/pentesting-ble-bluetooth-low-energy.md) * [Industrial Control Systems Hacking](todo/industrial-control-systems-hacking/README.md) +* [LLM Training](todo/llm-training.md) * [Burp Suite](todo/burp-suite.md) * [Other Web Tricks](todo/other-web-tricks.md) * [Interesting HTTP](todo/interesting-http.md) diff --git a/todo/llm-training.md b/todo/llm-training.md new file mode 100644 index 000000000..bf9469b1b --- /dev/null +++ b/todo/llm-training.md @@ -0,0 +1,46 @@ +# 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`로 표현됩니다.