mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
46 lines
5.5 KiB
Markdown
46 lines
5.5 KiB
Markdown
# LLM Training
|
||
|
||
## Tokenizing
|
||
|
||
Tokenizing полягає в розділенні даних на конкретні частини та присвоєнні їм специфічних ID (номерів).\
|
||
Дуже простий токенізатор для текстів може просто отримати кожне слово тексту окремо, а також знаки пунктуації та видалити пробіли.\
|
||
Отже, `"Hello, world!"` буде: `["Hello", ",", "world", "!"]`
|
||
|
||
Тоді, щоб присвоїти кожному з слів і символів токен ID (номер), потрібно створити **словник** токенізатора. Якщо ви токенізуєте, наприклад, книгу, це може бути **всі різні слова книги** в алфавітному порядку з деякими додатковими токенами, такими як:
|
||
|
||
* `[BOS] (Початок послідовності)`: Розміщується на початку тексту, вказує на початок тексту (використовується для розділення нерелевантних текстів).
|
||
* `[EOS] (Кінець послідовності)`: Розміщується в кінці тексту, вказує на кінець тексту (використовується для розділення нерелевантних текстів).
|
||
* `[PAD] (доповнення)`: Коли розмір партії більший за один (зазвичай), цей токен використовується для збільшення довжини цієї партії, щоб вона була такою ж великою, як інші.
|
||
* `[UNK] (невідомий)`: Для представлення невідомих слів.
|
||
|
||
Слідуючи прикладу, маючи токенізований текст, присвоївши кожному слову та символу тексту позицію в словнику, токенізоване речення `"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, такі як GPT, використовують BPE, який в основному **кодує часті пари байтів** для зменшення розміру тексту в більш оптимізованому форматі, поки його не можна буде зменшити більше (перевірте [**вікіпедію**](https://en.wikipedia.org/wiki/Byte\_pair\_encoding)). Зверніть увагу, що таким чином немає "невідомих" слів для словника, і фінальний словник буде всіма виявленими наборами частих байтів, згрупованими якомога більше, тоді як байти, які не часто пов'язані з тим самим байтом, будуть токеном самі по собі.
|
||
|
||
## Data Sampling
|
||
|
||
LLMs, такі як GPT, працюють, передбачаючи наступне слово на основі попередніх, тому для підготовки деяких даних для навчання необхідно підготувати дані таким чином.
|
||
|
||
Наприклад, використовуючи текст "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, це означало б, що наступний запис у вхідному масиві почнеться на 2 токени пізніше, а не лише на один, але цільовий масив все ще передбачатиме лише 1 токен. У pytorch це ковзаюче вікно виражається в параметрі `stride`.
|