Thao tác shape: view, reshape, permute, unsqueeze, cat

Bài 2/620 phút

Đọc mã nguồn mô hình, phần lớn là thao tác shape. Các hàm cần thuộc:

shape.py
x = torch.randn(2, 3, 8)        # (B, T, C)

x.view(2, 3, 2, 4)              # tách C=8 thành (2 đầu, 4 chiều) — cần bộ nhớ liền
x.reshape(6, 8)                 # như view nhưng tự sao chép nếu cần
x.transpose(1, 2)               # đổi 2 trục → (2, 8, 3)
x.permute(0, 2, 1)              # sắp lại nhiều trục tùy ý
x.unsqueeze(1)                  # thêm trục độ dài 1 → (2, 1, 3, 8)
x.squeeze()                     # bỏ mọi trục độ dài 1
torch.cat([x, x], dim=-1)       # nối theo trục có sẵn → (2, 3, 16)
torch.stack([x, x], dim=0)      # tạo trục mới → (2, 2, 3, 8)

Ví dụ kinh điển — tách đầu cho multi-head attention: (B, T, C) → view(B, T, h, C//h) → transpose(1, 2) → (B, h, T, C//h). Sau khi tính xong, làm ngược lại: transpose(1, 2).contiguous().view(B, T, C).

view báo lỗi "not contiguous" sau transpose/permute → thêm .contiguous() trước view, hoặc dùng reshape.

?x có shape (4, 10). x.unsqueeze(-1) có shape gì?