参考資料とリソース¶
論文¶
基礎論文¶
- Attention Is All You Need (Vaswani et al., 2017)
- Transformerの原論文
-
BERT: Pre-training of Deep Bidirectional Transformers (Devlin et al., 2018)
- 双方向Transformerの事前学習
-
Language Models are Few-Shot Learners (Brown et al., 2020)
- GPT-3の論文
- arXiv:2005.14165
効率化技術¶
- FlashAttention (Dao et al., 2022)
- メモリ効率的なアテンション
-
LoRA: Low-Rank Adaptation (Hu et al., 2021)
- 効率的なファインチューニング
-
Mixtral of Experts (Jiang et al., 2024)
- Sparse MoE アーキテクチャ
- arXiv:2401.04088
実装リソース¶
PyTorchベース¶
# 公式PyTorch Transformer実装
import torch.nn as nn
# 基本的なTransformer
transformer = nn.Transformer(
d_model=512,
nhead=8,
num_encoder_layers=6,
num_decoder_layers=6
)
# より詳細な制御が必要な場合
encoder_layer = nn.TransformerEncoderLayer(
d_model=512,
nhead=8,
dim_feedforward=2048
)
Hugging Face Transformers¶
from transformers import AutoModel, AutoTokenizer
# 事前学習済みモデルの使用
model = AutoModel.from_pretrained("bert-base-uncased")
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# カスタムモデルの定義
from transformers import PreTrainedModel, PretrainedConfig
class MyTransformerConfig(PretrainedConfig):
model_type = "my_transformer"
def __init__(self, vocab_size=30000, d_model=512, **kwargs):
self.vocab_size = vocab_size
self.d_model = d_model
super().__init__(**kwargs)
JAX/Flax実装¶
import jax
import jax.numpy as jnp
from flax import linen as nn
class TransformerBlock(nn.Module):
d_model: int
n_heads: int
@nn.compact
def __call__(self, x, mask=None):
# Multi-head attention
attn_output = nn.MultiHeadDotProductAttention(
num_heads=self.n_heads,
qkv_features=self.d_model
)(x, x, mask=mask)
x = nn.LayerNorm()(x + attn_output)
# Feed-forward
ff_output = nn.Sequential([
nn.Dense(4 * self.d_model),
nn.gelu,
nn.Dense(self.d_model)
])(x)
return nn.LayerNorm()(x + ff_output)
学習リソース¶
オンラインコース¶
- Stanford CS224N: Natural Language Processing with Deep Learning
- Transformerの詳細な解説
-
Fast.ai Practical Deep Learning
- 実践的なNLP実装
-
Hugging Face Course
- Transformersライブラリの使い方
- Course Website
インタラクティブな可視化¶
- The Illustrated Transformer (Jay Alammar)
- 図解によるTransformerの説明
-
Transformer Explainer
- インタラクティブな可視化ツール
-
BertViz
- アテンションの可視化ライブラリ
実践的なプロジェクト¶
1. ミニGPTの実装¶
# 完全なGPTモデルの実装例
class MiniGPT(nn.Module):
def __init__(self, config):
super().__init__()
self.config = config
# Token + Position embeddings
self.tok_emb = nn.Embedding(config.vocab_size, config.d_model)
self.pos_emb = nn.Parameter(torch.zeros(1, config.max_len, config.d_model))
# Transformer blocks
self.blocks = nn.ModuleList([
TransformerBlock(config) for _ in range(config.n_layers)
])
# Output projection
self.ln_f = nn.LayerNorm(config.d_model)
self.head = nn.Linear(config.d_model, config.vocab_size, bias=False)
def forward(self, idx, targets=None):
b, t = idx.size()
# Embeddings
tok_emb = self.tok_emb(idx)
pos_emb = self.pos_emb[:, :t, :]
x = self.dropout(tok_emb + pos_emb)
# Transformer blocks
for block in self.blocks:
x = block(x)
# Output
x = self.ln_f(x)
logits = self.head(x)
# Loss calculation
loss = None
if targets is not None:
loss = F.cross_entropy(
logits.view(-1, logits.size(-1)),
targets.view(-1)
)
return logits, loss
2. カスタムトークナイザー¶
# SentencePieceを使った日本語トークナイザー
import sentencepiece as spm
class JapaneseTokenizer:
def __init__(self, model_path):
self.sp = spm.SentencePieceProcessor()
self.sp.load(model_path)
def encode(self, text):
return self.sp.encode_as_ids(text)
def decode(self, ids):
return self.sp.decode_pieces(ids)
def train(self, texts, vocab_size=8000):
# 訓練用テキストファイルを作成
with open('train.txt', 'w') as f:
for text in texts:
f.write(text + '\n')
# SentencePieceモデルを訓練
spm.SentencePieceTrainer.train(
input='train.txt',
model_prefix='tokenizer',
vocab_size=vocab_size,
character_coverage=0.9995,
model_type='bpe'
)
3. 効率的な推論サーバー¶
# FastAPIを使った推論API
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import torch
from typing import List, Optional
app = FastAPI()
class GenerationRequest(BaseModel):
prompt: str
max_length: int = 100
temperature: float = 0.8
top_p: float = 0.9
class GenerationResponse(BaseModel):
generated_text: str
tokens_generated: int
generation_time: float
# モデルをグローバルに読み込み
model = load_model()
tokenizer = load_tokenizer()
@app.post("/generate", response_model=GenerationResponse)
async def generate_text(request: GenerationRequest):
try:
start_time = time.time()
# トークン化
input_ids = tokenizer.encode(request.prompt)
# 生成
output_ids = model.generate(
input_ids,
max_length=request.max_length,
temperature=request.temperature,
top_p=request.top_p
)
# デコード
generated_text = tokenizer.decode(output_ids)
return GenerationResponse(
generated_text=generated_text,
tokens_generated=len(output_ids) - len(input_ids),
generation_time=time.time() - start_time
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
デバッグとプロファイリング¶
メモリプロファイリング¶
import torch.profiler as profiler
# プロファイラーの設定
with profiler.profile(
activities=[
profiler.ProfilerActivity.CPU,
profiler.ProfilerActivity.CUDA,
],
record_shapes=True,
profile_memory=True,
with_stack=True
) as prof:
# モデルの実行
output = model(input_ids)
loss = criterion(output, targets)
loss.backward()
# 結果の表示
print(prof.key_averages().table(sort_by="cuda_memory_usage", row_limit=10))
# TensorBoardに出力
prof.export_chrome_trace("trace.json")
アテンション重みの分析¶
def analyze_attention_patterns(model, input_ids):
"""アテンションパターンの分析"""
model.eval()
with torch.no_grad():
# アテンション重みを取得
outputs = model(input_ids, output_attentions=True)
attentions = outputs.attentions # 各層のアテンション重み
# 統計情報の計算
for layer_idx, layer_attention in enumerate(attentions):
# [batch, heads, seq_len, seq_len]
avg_attention = layer_attention.mean(dim=1) # ヘッド間で平均
# エントロピー計算(注意の分散度)
entropy = -(avg_attention * torch.log(avg_attention + 1e-9)).sum(dim=-1)
print(f"Layer {layer_idx}:")
print(f" Average entropy: {entropy.mean():.4f}")
# 最も注目されているトークン
max_attention_idx = avg_attention.sum(dim=1).argmax(dim=-1)
print(f" Most attended positions: {max_attention_idx}")
コミュニティとサポート¶
フォーラムとディスカッション¶
- Hugging Face Forums: https://discuss.huggingface.co/
- PyTorch Forums: https://discuss.pytorch.org/
- Reddit r/MachineLearning: https://reddit.com/r/MachineLearning
日本語リソース¶
- 日本語BERT: https://github.com/cl-tohoku/bert-japanese
- Japanese GPT-2: https://github.com/tanreinama/gpt2-japanese
- Fugaku-LLM: https://github.com/fujitsu/fugaku-llm
ベンチマークとデータセット¶
- GLUE Benchmark: 英語の言語理解タスク
- JGLUE: 日本語版GLUE
- OpenWebText: GPT訓練用データセット
- CC-100: 多言語コーパス
今後の学習ステップ¶
- 最新の研究動向をフォロー
- arXivの新着論文をチェック
-
主要な研究機関のブログ(OpenAI, Google Research, Meta AI)
-
実装プロジェクト
- 独自のタスクでTransformerをファインチューニング
- 新しいアーキテクチャの実験
-
効率化技術の実装
-
コントリビューション
- オープンソースプロジェクトへの貢献
- 自分の実装を公開
- ブログや技術記事の執筆
継続的な学習と実践を通じて、Transformerとその応用についての理解を深めていってください!