Mã Hóa Vị Trí Xoay (Rotary Position Embedding - RoPE) LLaMA từ Gốc
Với vector 2D [x1, x2] ở vị trí thứ m và tần số góc θ:
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: multi-head-attention-from-scratch.
Nội dung đề bài
Mục tiêu kiến thức
- RoPE (Su et al., 2021) là chuẩn mã hóa vị trí thống trị trong các LLM hiện đại (LLaMA-3, Mistral, Qwen, DeepSeek).
- Thay vì cộng thêm positional embedding vào input token, RoPE nhân vector Query và Key với một ma trận quay trực giao:
Với vector 2D [x1, x2] ở vị trí thứ m và tần số góc θ: x1'
x2' = cos(mθ) & -sin(mθ)
sin(mθ) & cos(mθ) x1
x2 = x1 cos(mθ) - x2 sin(mθ)
x1 sin(mθ) + x2 cos(mθ)
- Tần số góc: θi = base-2i / d với i ∈ {0, 1, …, d/2 - 1}, thường base = 10000.0.
- Tích vô hướng giữa Q ở vị trí m và K ở vị trí n:
langle RTheta, m Q, RTheta, n K rangle = QT RTheta, n - m K Tích vô hướng tự nhiên chỉ phụ thuộc vào khoảng cách tương đối (m - n), giúp mô hình có khả năng ngoại suy chiều dài ngữ cảnh (length extrapolation) vượt trội.
Yêu cầu
Xây dựng lớp RotaryEmbedding(torch.nn.Module):
class RotaryEmbedding(nn.Module):
def __init__(self, dim: int, max_seq_len: int = 2048, base: float = 10000.0):
pass
def forward(self, x: torch.Tensor, seq_len: int | None = None) -> tuple[torch.Tensor, torch.Tensor]:
# Returns cos, sin cached tensors of shape (seq_len, dim)
pass
def apply_rotary_pos_emb(x: torch.Tensor, cos: torch.Tensor, sin: torch.Tensor) -> torch.Tensor:
# x shape: (B, num_heads, seq_len, head_dim)
passInput
- Hàm
rotate_half(x): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng. - Hàm
apply_rotary_pos_emb(x,cos,sin): Các tham số đầu vào chứa dữ liệu Tensor/mảng NumPy hoặc giá trị siêu tham số tương ứng.
Output
- Hàm
rotate_half: Trả về kết quả kiểutorch.Tensortheo đúng đặc tả kỹ thuật và kích thước quy định. - Hàm
apply_rotary_pos_emb: Trả về kết quả kiểutorch.Tensortheo đúng đặc tả kỹ thuật và kích thước quy định.
Ràng buộc
- Thời gian chạy tối đa: 3000ms.
- Giới hạn bộ nhớ: 512MB.
- Dữ liệu đầu vào hợp lệ theo đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
dim = 16
seq_len = 4
rope = RotaryEmbedding(dim=dim, max_seq_len=128)
x = torch.randn(1, 2, seq_len, dim)
cos, sin = rope(x, seq_len=seq_len)
x_rot = apply_rotary_pos_emb(x, cos, sin)
norm_orig = torch.norm(x, dim=-1)
norm_rot = torch.norm(x_rot, dim=-1)Output
Tensor shape: (1, 2, 4), dtype=torch.float32Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Ví dụ 2
Input
rope = RotaryEmbedding(dim=4, max_seq_len=4)
x = torch.tensor([[[[1.0, 2.0, 3.0, 4.0], [2.0, -1.0, 5.0, 3.0]]]])
cos, sin = rope(x, seq_len=2)
actual = apply_rotary_pos_emb(x, cos, sin)
rotated_half = torch.cat((-x[..., 2:], x[..., :2]), dim=-1)Output
Tensor shape: (1, 1, 2, 4), dtype=torch.float32Giải thích
Hàm/lớp được gọi với các tham số mẫu trên và trả về kết quả số học / kích thước tensor tương ứng theo đúng thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
