前回までの実験で、Hello を Tokenize すると 9707 になることを確認した。
Hello
↓
Tokenize
↓
9707
では、この 9707 は LLM に入ったあと、最初に何になるのだろうか。
今回はそこを少しだけ観察してみる。
今回の疑問
現在わかっているのはここまで。
Hello
↓
Token
↓
Token ID
↓
9707
↓
?
今回は、この ? の部分を観察する。
まだ Transformer の仕組みから答えを探すことはせず、まず実際にモデルの中で何が起きているのかを見てみる。
実験
使用するモデルはこれまでと同じ。
Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf
llama.cpp に含まれている llama-eval-callback を使って、Hello を入力してみる。
/opt/llama.cpp/build-rocm/bin/llama-eval-callback \
-m /data/models/Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf \
-p "Hello" \
-n 1
結果の最初に、入力された Token が表示された。
number of input tokens = 1
9707
前回確認した通り、
Hello → 9707
になっている。
そして、その直後に次の処理が表示された。
common_debug_cb_eval: embd = (f32) GET_ROWS(token_embd.weight{2048, 151936, 1, 1}, inp_tokens{1, 1, 1, 1}}) = {2048, 1, 1, 1}
[
[
[ -0.0021, 0.0273, -0.0070, ..., -0.0360, 0.0022, 0.0022 ],
],
]
sum = 0.902983
観察してみる
まず目につくのがこれ。
GET_ROWS(
token_embd.weight{2048, 151936, 1, 1},
inp_tokens{1, 1, 1, 1}
)
そして結果は、
embd = (f32)
で、
{2048, 1, 1, 1}
という形になっている。
中身も見ることができた。
-0.0021
0.0273
-0.0070
...
-0.0360
0.0022
0.0022
つまり、今回実際に観察できたところだけを並べると、
Hello
↓
9707
↓
GET_ROWS(
token_embd.weight,
inp_tokens
)
↓
2048個の f32 の値
となった。
以前モデル情報を確認したとき、
qwen3moe.embedding_length = 2048
n_embd = 2048
であることも確認している。
今回出てきた 2048 と一致している。
まだわからない
名前を見ると、
token_embd.weight
embd
GET_ROWS
かなり意味ありげに見える。
ただし、名前だけを見て、
Token ID
9707が Embedding に変換された
と結論づけるのはまだ早い。
今回の実験で直接確認できたのは、
9707
↓
GET_ROWS(token_embd.weight, inp_tokens)
↓
2048個の f32 の値
というところまで。
まだ、
GET_ROWS は何をしているのか?
inp_tokens の中に 9707 はどう入っているのか?
token_embd.weight の
2048 × 151936 は何を意味しているのか?
なぜ結果が2048個になるのか?
は確認していない。
今回の結論
前回までは、
Hello
↓
9707
↓
?
だった。
今回、その ? を少しだけ覗くことができた。
Hello
↓
Token ID = 9707
↓
GET_ROWS(
token_embd.weight,
inp_tokens
)
↓
2048個の f32 の値
Token ID の先には、少なくともこの処理が存在していることを実際に観察できた。
ただ、これが何を意味しているのかはまだわからない。