hacktricks/todo/llm-training.md
2024-09-14 17:16:27 +00:00

46 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
すべての可能な単語をトークナイズする必要があるという問題を避けるために、GPTのようなLLMはBPEを使用します。これは基本的に**頻繁に出現するバイトのペアをエンコード**して、テキストのサイズをより最適化された形式で縮小するものです。これ以上縮小できなくなるまで続けます([**wikipedia**](https://en.wikipedia.org/wiki/Byte\_pair\_encoding)を参照)。この方法では、語彙に「不明な」単語はなく、最終的な語彙は、頻繁に発見されたバイトのセットができるだけまとめられたものになります。一方、同じバイトと頻繁にリンクされていないバイトは、それ自体がトークンになります。
## Data Sampling
GPTのようなLLMは、前の単語に基づいて次の単語を予測することによって機能します。したがって、トレーニング用のデータを準備するためには、このようにデータを準備する必要があります。
たとえば、テキスト「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`で表現されます。