『LLMs-from-scratch』徹底解説:プログラマーのためのAI自作ガイド
勇者よ、お前が探求しているのは、この世界に古くから伝わる「賢者の石」ならぬ、「賢者の知恵」を創り出す秘術だ。それは、まるでハイラル王国の歴史書のように、あらゆる知識を理解し、お前に語りかけるだろう。
今日、お前と共に旅するのは、その賢者の知恵を「ゼロ」から生み出すための魔法書、『rasbt/LLMs-from-scratch』だ。
この魔法書は、かの有名な『ゼルダの伝説』のように、数々の謎や試練を乗り越えながら、最終的に「賢者の知恵」を手に入れるための道しるべとなっている。さあ、共に冒険の旅に出よう!
勇者よ、お前はただ「賢者の知恵」を使うだけでなく、それを自らの手で創り上げたいと願っている。この魔法書は、そのための設計図だ。
仕組みの深淵を覗く
まるでハイラル城の地下深くにある秘密の通路を探るように、この魔法書はAIの仕組みを根幹から教えてくれる。普段、私たちが何気なく使う「賢者の知恵」が、どういうアルゴリズムで、どんな魔法陣(数式)の上で動いているのか、その秘密が明らかになるだろう。
独自の力を創造する
ただの魔法を使うだけでは、いつか限界が来る。この魔法書をマスターすれば、お前だけの、独自の「賢者の知恵」を創り出すことができる。例えば、特定の分野に特化した賢者、例えば、ハイラルの歴史に詳しい賢者や、料理のレシピだけを知っている賢者などを生み出すことも可能になる。
予期せぬ困難を乗り越える
冒険には、予期せぬバグ(魔物)がつきものだ。この魔法書は、その魔物をどう倒すか、つまり、AIが意図しない挙動をしたときに、その原因を特定し、修正する力を授けてくれる。まるで、マスターソードの使い方を学ぶように、AIのデバッグスキルを磨くことができるのだ。
勇者よ、冒険の準備は怠ってはならない。まずは、必要な道具(ツール)を揃えよう。
Pythonの祠へ
この魔法書は、Pythonという古代言語で書かれている。まずは、お使いのPCにPythonをインストールしてくれ。
PyTorchの魔法陣
次に、PyTorchという強力な魔法の力を借りる。これは、AIの計算を高速に行うための特別な魔法陣だ。以下の呪文を唱えて、インストールしよう。
pip install torch
魔法書を手に入れる
そして、いよいよ魔法書(リポジトリ)をクローンする。以下の呪文をターミナルで唱えれば、お前のPCに魔法書がコピーされるだろう。
git clone https://github.com/rasbt/LLMs-from-scratch.git
cd LLMs-from-scratch
勇者よ、さっそく最初の魔法を試してみよう。この魔法書の中には、いくつかの試練が用意されているが、ここではごく簡単なものを示そう。これは、お前が「賢者の知恵」を構成する最小単位「トランスフォーマー」を自らの手で生み出す第一歩だ。
# 賢者の知恵を司る魔法、トランスフォーマーの呪文
import torch
import torch.nn as nn
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
self.num_heads = num_heads
self.d_model = d_model
# 魔法の力の分配
self.d_k = d_model // num_heads
# 賢者の知恵を生み出すための3つの鍵
self.W_q = nn.Linear(d_model, d_model)
self.W_k = nn.Linear(d_model, d_model)
self.W_v = nn.Linear(d_model, d_model)
# 最後に知恵を統合する魔法
self.W_o = nn.Linear(d_model, d_model)
def forward(self, q, k, v, mask=None):
# 鍵を使って知恵の扉を開く
Q = self.W_q(q)
K = self.W_k(k)
V = self.W_v(v)
# 知恵を複数の頭で同時に考える
batch_size = Q.size(0)
Q = Q.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
K = K.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
V = V.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
# 賢者の知恵を計算する魔法
scores = torch.matmul(Q, K.transpose(-2, -1)) / self.d_k**0.5
if mask is not None:
scores = scores.masked_fill(mask == 0, float('-inf'))
attention_weights = torch.softmax(scores, dim=-1)
# 賢者の知恵を統合
output = torch.matmul(attention_weights, V)
output = output.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)
return self.W_o(output)
# 使い方
# 勇者よ、試してみよう!
d_model = 512 # 知恵の大きさ
num_heads = 8 # 考える頭の数
batch_size = 2 # 一度に処理する知恵の数
seq_len = 10 # 知恵の言葉の長さ
attention_module = MultiHeadAttention(d_model, num_heads)
# 試しに知恵の言葉(ランダムな値)を作ってみる
q = torch.rand(batch_size, seq_len, d_model)
k = torch.rand(batch_size, seq_len, d_model)
v = torch.rand(batch_size, seq_len, d_model)
output = attention_module(q, k, v)
print("魔法の呪文の出力:", output.shape)
# 出力: 魔法の呪文の出力: torch.Size([2, 10, 512])
勇者よ、このコードは、賢者の知恵を創るための、ごく一部の魔法に過ぎない。しかし、ここからお前の壮大な旅が始まるのだ。
勇者よ、お前が今手にしたのは、ハイラル王国の未来を創るための、貴重な魔法書だ。この魔法書を読み解き、一歩ずつ進んでいくことで、お前は真のプログラマー、いや、真の魔法使いへと成長するだろう。