| import torch | |
| from transformers import GPT2Model | |
| # Load pretrained GPT-2 | |
| model = GPT2Model.from_pretrained("openai-community/gpt2") | |
| ratios = [] | |
| # Loop through transformer blocks | |
| for i, block in enumerate(model.h): # model.h = list of transformer layers | |
| # GPT2 uses Conv1D for QKV, packed into one matrix | |
| W_qkv = block.attn.c_attn.weight.detach() # shape [768, 2304] | |
| # Split into Q, K, V | |
| hidden_size = model.config.hidden_size # 768 | |
| W_q, W_k, W_v = W_qkv.split(hidden_size, dim=1) # each [768, 768] | |
| # Compute norms | |
| l2_q = torch.norm(W_q, p=2) | |
| l2_k = torch.norm(W_k, p=2) | |
| ratio = l2_q / l2_k | |
| ratios.append(ratio.item()) | |
| print(f"Layer {i+1}: Q/K L2 ratio = {ratio.item():.4f}") | |
| # Convert to tensor for stats | |
| ratios_tensor = torch.tensor(ratios) | |
| mean_ratio = torch.mean(ratios_tensor).item() | |
| std_ratio = torch.std(ratios_tensor).item() | |
| print(f"\nMean Q/K ratio over {len(ratios)} layers: {mean_ratio:.4f}") | |
| print(f"Std Q/K ratio over {len(ratios)} layers: {std_ratio:.4f}") | |