- Setelah melatih decoder-only Transformer dengan sekitar 10 juta parameter pada TinyShakespeare, penulis melacak lewat kondisi internal dan eksperimen bagaimana hasil komputasi setelah self-attention berubah menjadi probabilitas token berikutnya
- Hipotesis utamanya adalah bahwa setiap blok Transformer menghubungkan prompt dengan sekumpulan string tertentu dalam korpus pelatihan, dan distribusi frekuensi token yang benar-benar muncul setelah string-string itu mendekati prediksi token berikutnya dari blok tersebut
- Prosedur aproksimasi yang diimplementasikan mencari string pelatihan yang mirip dengan output feed-forward network tiap blok, menjumlahkan distribusi karakter yang mengikutinya, lalu merekonstruksi output model dengan penjumlahan berbobot per blok
- Pada 20.000 prompt sepanjang 10, Hellinger distance rata-rata antara output aproksimasi dan output Transformer sebenarnya sekitar 0,17, sedangkan jarak antara model asli dan model alternatif dengan struktur yang sama tetapi dilatih dengan seed berbeda sekitar 0,11 ± 0,08
- Analisis ini mendukung interpretasi bahwa output feed-forward berperan besar dalam transformasi blok dan bahwa attention memetakan prompt ke kelas string pelatihan yang tepat, tetapi belum jelas apakah temuan ini dapat digeneralisasi di luar model kecil
Model Eksperimen dan Pertanyaannya
- Penulis mengimplementasikan dan melatih Transformer dengan sekitar 10 juta parameter mengikuti Let’s build GPT: from scratch, in code, spelled out dari Andrej Karpathy
- Kode inti model bahasa berasal dari karya Karpathy, sedangkan analisis internal dan kode pendukung merupakan kontribusi terpisah
- Kode terkait tersedia di transformer-experiments
- Modelnya adalah decoder-only Transformer yang terdiri dari 6 blok
- Data pelatihannya adalah TinyShakespeare, yang berisi 40.000 baris drama Shakespeare
- Setelah dilatih sekitar 1 jam di GPU RTX 4000, model menghasilkan teks Shakespeare palsu yang secara struktur terlihat masuk akal
- Token yang digunakan bukan kata, melainkan karakter
- Ukuran kosakatanya 65, dan model memprediksi distribusi probabilitas karakter yang akan muncul setelah prompt input
- Misalnya, setelah
'my most gr', model memprediksiadengan 0,819,edengan 0,081, danidengan 0,059
- Pertanyaan utamanya bukan self-attention itu sendiri, melainkan bagaimana hasil setelah attention berubah menjadi probabilitas token berikutnya final
Struktur Blok dan Bobot Feed-Forward Network
- Setiap blok Transformer mencakup multi-head self-attention dan feed-forward network
- Dalam struktur PyTorch, output blok berbentuk penambahan
x + self.sa(self.ln1(x)), lalux + self.ffwd(self.ln2(x)) - Jika ditulis dengan variabel perantara, output blok dapat dilihat sebagai
x + sa_out + ffwd_out
- Dalam struktur PyTorch, output blok berbentuk penambahan
- Dalam model yang dianalisis, feed-forward network menyumbang 65,71% dari seluruh parameter yang dapat dilatih
- Parameter feed-forward: 7.089.408
- Total parameter yang dapat dilatih: 10.788.929
- Output feed-forward network tampak menjadi faktor utama yang mengubah input blok menjadi output
- Dalam eksperimen berikutnya pun, output feed-forward menunjukkan pengaruh lebih besar pada distribusi probabilitas akhir dibanding output self-attention saja
Mencari String dengan Output Feed-Forward yang Mirip
- Prosedur aproksimasi menggunakan kemiripan output feed-forward antara prompt dan string dalam korpus pelatihan
- Masukkan prompt ke model dan simpan output feed-forward network dari tiap blok
- Untuk setiap blok, cari string dalam korpus pelatihan yang output feed-forward-nya mirip
- Jumlahkan distribusi frekuensi token yang muncul setelah string-string tersebut
- Gabungkan distribusi per blok dengan penjumlahan berbobot dan normalisasi menjadi distribusi probabilitas
- Pada prompt demo
'And only l', ditemukan 94 string sepanjang 10 dengan cosine similarity 0,95 atau lebih terhadap output feed-forward blok 1- String yang ditemukan, seperti
hat only l,\nMy only l,I dearly l,ng Henry l,And only l, umumnya berakhir dengany latauly l - Distribusi frekuensi ternormalisasi karakter yang muncul setelah string-string ini sangat mirip dengan prediksi karakter berikutnya dari model sebenarnya
- String yang ditemukan, seperti
- Pada contoh
'And only l', aproksimasi dan prediksi model sebenarnya cukup dekat- Model:
i0,437,o0,204,a0,195,e0,160 - Aproksimasi:
i0,389,o0,250,a0,222,e0,139 - Hellinger distance-nya 0,0711
- Model:
- Menggunakan satu blok saja kadang gagal
- Pada prompt
'hing tremb', jika hanya memakai blok 1, model memprediksil0,999, tetapi aproksimasi menghasilkane0,543 danl0,343, sehingga Hellinger distance-nya 0,6305 - Jika semua blok diperhitungkan, pada contoh yang sama aproksimasi memprediksi
l0,997 dan Hellinger distance turun menjadi 0,0233
- Pada prompt
Skala Komputasi dan Tuning Manual
- Demi efisiensi, seluruh analisis terutama dilakukan pada string sepanjang 10
- Korpus pelatihan berisi 1.115.394 karakter, dan substring unik sepanjang 10 berjumlah 858.923
- Output feed-forward berupa vektor
float32berdimensi 384, masing-masing satu dari 6 blok
- Sebanyak 20.000 string sepanjang 10 dipilih secara acak sebagai prompt eksperimen
- Cosine similarity per blok antara setiap prompt dan 858.923 substring unik dihitung terlebih dahulu dan disimpan ke disk
- Karena matching yang menarik tidak muncul di bawah cosine similarity 0,7, hanya nilai 0,7 ke atas yang dipra-filter
- Similarity threshold per blok ditentukan lewat tuning manual
- Blok 0: 0,95
- Blok 1: 0,94
- Blok 2: 0,85
- Blok 3: 0,76
- Blok 4: 0,81
- Blok 5: 0,89
- Saat menggabungkan distribusi frekuensi per blok, digunakan juga bobot manual
- Bobot yang digunakan adalah
[0.01, 0.01, 0.1, 1.5, 6, 0.01] - Penulis juga mencoba mencari bobot dengan pendekatan deep learning, tetapi tidak memperoleh hasil yang lebih baik daripada tuning manual
- Bobot yang digunakan adalah
Evaluasi pada 20.000 Prompt
- Untuk seluruh 20.000 prompt, dihitung Hellinger distance antara distribusi aproksimasi dan distribusi output model
- Rata-rata: 0,1677
- Simpangan baku: 0,1215
- Nilai minimum: 0,0013
- Nilai maksimum: 0,9994
- Hellinger distance mengukur overlap antara distribusi probabilitas; 0 berarti identik, 1 berarti tidak ada overlap
- Untuk membandingkan kualitas aproksimasi, arsitektur yang sama dilatih 3 kali lagi dengan random seed berbeda
- Seed model asli: 1337, estimasi training loss 0,9334, validation loss 1,5063
- Alternate 1 seed: 1442, training loss 0,9293, validation loss 1,5038
- Alternate 2 seed: 88, training loss 0,9294, validation loss 1,4991
- Alternate 3 seed: 99999, training loss 0,9339, validation loss 1,4941
- Hellinger distance rata-rata antara model asli dan model alternatif sekitar 0,11 ± 0,08
- Original vs Alternate 1: 0,1064 ± 0,0823
- Original vs Alternate 2: 0,1057 ± 0,0817
- Original vs Alternate 3: 0,1053 ± 0,0828
- Jarak rata-rata antara aproksimasi dan model sebesar 0,17 lebih tinggi daripada jarak 0,11 antarmodel alternatif, tetapi masih dalam rentang simpangan baku, sehingga menjadi dasar untuk menilai aproksimasi ini cukup baik
Interpretasi Cara Kerja Internal Transformer
- Model dapat dilihat sebagai beberapa tahap transformasi ruang setelah embedding
- Enam blok Transformer mengubah embedding input menjadi embedding output di dalam ruang embedding 384 dimensi
- LayerNorm terakhir dan linear layer mengubah ruang embedding menjadi ruang logit 65 dimensi, lalu softmax menghasilkan probabilitas token berikutnya
- Transformasi di dalam blok dapat dilihat sebagai penjumlahan vektor
- Output blok adalah jumlah input
x, output self-attentionsa_out, dan output feed-forwardffwd_out - Dalam analisis, diamati bahwa vektor output feed-forward umumnya memiliki norm lebih besar daripada output self-attention, dan pada tiap blok kedua output tersebut cenderung menunjuk ke arah yang mirip
- Output blok adalah jumlah input
- Menambahkan output feed-forward saja pun umumnya menghasilkan arah yang mirip dengan vektor output final
- Output yang hanya memakai feed-forward memiliki norm lebih kecil, tetapi arahnya dekat dengan output asli
- Karena LayerNorm final, perbedaan norm tidak terlalu penting pada input ke linear layer akhir
- Hasil ini bukan berarti komputasi self-attention dapat dihapus
- Feed-forward network menyertakan output self-attention dalam inputnya, seperti
ffwd_out = self.ffwd(self.ln2(x + sa_out)), sehingga jika self-attention dihapus, output feed-forward itu sendiri akan berubah
- Feed-forward network menyertakan output self-attention dalam inputnya, seperti
Hipotesis Subspace Token
- Embedding tertentu dapat membuat model memprediksi token tertentu hampir dengan kepastian penuh
- Misalnya, embedding yang akan masuk ke LayerNorm dan linear layer setelah blok final dapat dilatih agar probabilitas token
ahampir menjadi 1 - Bobot Transformer dibuat tetap, dan hanya tensor embedding yang dioptimalkan
- Misalnya, embedding yang akan masuk ke LayerNorm dan linear layer setelah blok final dapat dilatih agar probabilitas token
- Untuk setiap token, tidak hanya ada satu embedding, melainkan banyak embedding
- Ini ditafsirkan sebagai subspace embedding nonlinier yang kompleks untuk tiap token
- Untuk tiap token, ribuan embedding unik dapat dilatih dengan mudah
- Subspace tersebut tidak berhasil diturunkan secara matematis dengan tepat, tetapi pada tahap akhir aproksimasi linier bekerja dengan baik
- Embedding yang dilatih untuk tiap token ditumpuk, lalu SVD dijalankan
- Satu right singular vector pertama berfungsi baik sebagai aproksimasi linier 1 dimensi bagi subspace token tersebut
- Dengan mengombinasikan vektor aproksimasi subspace dari beberapa token secara linier, dapat dibuat embedding yang menyebarkan probabilitas ke beberapa token
- Menambahkan vektor aproksimasi
adanbmenghasilkan distribusi yang membagi probabilitas ke kedua token - Namun, karena galat aproksimasi, ketidakortogonalan vektor subspace, dan perbedaan besaran logit per token, distribusinya tidak menjadi 50:50 sempurna
- Menambahkan vektor aproksimasi
Korespondensi antara Output Feed-Forward dan Subspace Token
- Output feed-forward ditafsirkan sebagai penyesuaian output blok ke arah subspace token tertentu
- Token-token itu cocok dengan token yang diprediksi oleh prosedur aproksimasi, yaitu token yang muncul setelah string pelatihan yang menghasilkan output feed-forward serupa
- Pada contoh
med me Aut, jika hanya melihat blok terakhir, aproksimasi memprediksiosebagai token berikutnya yang paling mungkin, laluhberikutnya- Saat vektor output feed-forward yang sama diproyeksikan ke aproksimasi subspace token, token yang paling mirip juga berurutan
o,h,i,u,y
- Saat vektor output feed-forward yang sama diproyeksikan ke aproksimasi subspace token, token yang paling mirip juga berurutan
- Pada contoh
if and thy, korespondensi serupa juga muncul- Aproksimasi memilih spasi,
s, dan newline sebagai token prediksi utama - Subspace yang paling selaras dengan output feed-forward juga mendekati urutan spasi,
s, newline
- Aproksimasi memilih spasi,
- Untuk seluruh 20.000 prompt, penulis membuat kriteria arbitrer dan mengagregasikannya
- Kriterianya adalah “apakah subspace dari token-token yang menyumbang 90% massa probabilitas dalam prediksi aproksimasi masuk ke separuh teratas peringkat cosine similarity terhadap output feed-forward”
- Berdasarkan blok final, 16.357 prompt, yaitu 81,78%, memenuhi kriteria tersebut
Hasil Agregat per Blok dan Perbandingan dengan Chance
- Saat menggunakan aproksimasi subspace yang dilatih pada setiap posisi blok, tingkat pemenuhan kriteria lebih tinggi pada blok-blok belakang
- Blok 6: 16.357, 81,78%
- Blok 5: 10.142, 50,71%
- Blok 4: 7.760, 38,80%
- Jika aproksimasi subspace tahap final diterapkan ke semua blok, hasilnya lebih baik
- Blok 6: 81,78%
- Blok 5: 68,26%
- Blok 4: 58,15%
- Blok 3: 57,34%
- Blok 2: 52,02%
- Blok 1: 49,71%
- Kemungkinan kriteria terpenuhi secara kebetulan melalui cosine similarity acak juga disimulasikan
- Blok 6: 20,76% ± 0,25%
- Blok 5: 20,55% ± 0,26%
- Blok 4: 18,37% ± 0,24%
- Blok 3: 18,20% ± 0,24%
- Blok 2: 17,04% ± 0,23%
- Blok 1: 16,31% ± 0,23%
- Hasilnya jauh lebih tinggi daripada chance, tetapi karena noise pengukuran dan keterbatasan aproksimasi subspace, ini sulit dianggap sebagai bukti definitif
Peran Self-Attention
- Dalam interpretasi ini, prediksi yang baik bergantung pada pemetaan prompt ke kelas string yang tepat dalam korpus pelatihan
- Sumbu yang bertanggung jawab atas pemetaan itu adalah self-attention
- Attention layer mengidentifikasi pola di antara token-token prompt
- Polanya bisa berupa pola string sederhana seperti
y ldi bagian akhir, atau jenis token yang lebih umum seperti vokal atau huruf kapital di posisi tertentu
- Bobot terlatih pada attention head menentukan pola mana yang akan direspons
- Saat output attention head melewati feed-forward network, ia menjadi representasi di ruang embedding yang memuat informasi distribusi token yang muncul setelah string pelatihan yang mirip
- Model yang dianalisis memiliki 6 blok dan 6 attention head per blok, sehingga satu prompt dapat dievaluasi terhadap berbagai pola laten
Kesimpulan dan Keterbatasan
- Ada bukti kuat bahwa prosedur aproksimasi dan output Transformer sebenarnya mirip
- Bukti bahwa prosedur aproksimasi tersebut benar-benar berkorespondensi dengan komputasi internal Transformer kurang jelas, tetapi setidaknya menunjukkan kemungkinan bahwa interpretasi itu sebagian benar
- Belum diketahui apakah hasil dari satu Transformer kecil ini dapat digeneralisasi ke model yang lebih besar atau dataset lain
- Proyek ini merupakan proses mengajukan pertanyaan pada bagian dalam model dan merancang eksperimen, dan alih-alih mereduksi “keajaiban” model bahasa menjadi mekanisme sederhana, ia membantu melihat kompleksitasnya dengan lebih baik
1 komentar
Komentar Hacker News
Beberapa topik dalam tulisan induknya seharusnya tidak terlalu mengejutkan bagi orang yang pernah membaca https://people.math.harvard.edu/~ctm/home/text/others/shanno...
Jika tidak membaca literatur dasar di bidang sendiri, bahkan fenomena yang muncul sebagai konsekuensi alami dari pekerjaan yang sudah dirumuskan pun akan terlihat seperti misteri yang tak bisa dijelaskan
Meski begitu, eksperimennya sekilas tampak cukup menyeluruh, dan saya sangat menghargai banyaknya pekerjaan detail yang masuk ke dalamnya
Ada kompromi yang sulit antara mempelajari teori yang sudah ada dan mencoba menurunkannya kembali dari awal. Tanpa landasan tradisional, penemuan baru mungkin terjadi, tetapi dengan landasan itu, kita bisa memahami fenomena tertentu dengan lebih mendalam
Di komentar di sini, tampak beberapa orang terkejut bahwa model yang memaksimalkan log-likelihood suatu sekuens saat diberi data tidak secara ajaib menyimpang dari perilaku itu pada saat inferensi. Ini adalah model estimasi densitas; apakah kita berharap ia mendeklamasikan Shakespeare dari kehampaan?
Dengan kembali ke dasar, eksperimen seperti ini jadi jauh lebih mudah dipahami. Sudah ada landasan matematis yang sangat jelas yang menjelaskan hal ini, dan juga apa yang disebut fenomena emergen
Lebih spesifik lagi, ada beberapa lapisan, dan cara Shannon menangani sistem ergodik adalah titik awal yang baik. Di sini ada bagian yang sedikit melenceng, tetapi tampaknya cukup dekat sebagai korespondensi untuk memahami dinamika keseluruhan
Bukan hal langka orang-orang pintar berkata, “struktur matematis ini mirip dengan ide itu; tambahkan atau kurangi beberapa struktur saja, maka semuanya akan terjelaskan.” Namun kenyataannya, masih banyak yang tidak kita ketahui
Saya belum pernah melihat para teoritikus di bidang ini datang membawa teori lalu menciptakan sesuatu yang baru atau menghasilkan prediksi yang berguna. Biasanya mereka mencoba ini-itu, dan jika berhasil, belakangan menempelkan penjelasan yang terdengar masuk akal tentang mengapa itu berhasil; jika tidak berhasil, mereka menguburnya
Baru-baru ini juga ada tulisan yang melihat transformer sebagai kernel smoothing: https://arxiv.org/abs/1908.11775
Penemuan ulang yang berulang tidak selalu pemborosan; bisa jadi itu adalah proses mengonfirmasi dan memverifikasi kebenaran mendalam yang memiliki beberapa jalur untuk dicapai
Banyak buku teks teori informasi sudah menyinggung sifat content-addressable dari jaringan semacam ini[1], dan karena tujuan ini jaringan juga digunakan dalam aplikasi seperti kompresi[2][3]
Jadi, tidak mengherankan bahwa ketika NYT memasukkan beberapa paragraf artikelnya sendiri sebagai prompt ke model OpenAI, hasilnya direproduksi nyaris persis
[1] https://www.inference.org.uk/itprnn/book.pdf
[2] https://bellard.org/nncp/
[3] https://pub.towardsai.net/stable-diffusion-based-image-compr...
Saat melihat Google menunjukkan bahwa jika diminta mengulang kata yang sama terus-menerus, ChatGPT bisa dibuat memuntahkan data latihnya apa adanya [0][1], saya langsung terpikir ide yang persis sama. Senang ada orang yang benar-benar mengimplementasikannya
Dari sini muncul dua pertanyaan tambahan
[0] Dulu ini mungkin dilakukan. OpenAI sekarang memblokir generasi jika jendela konteks diisi dengan satu kata
[1] https://arxiv.org/abs/2311.17035
Tidak banyak langkah yang dilewati, malah banyak pekerjaan tambahan yang ditambahkan
Saya rasa hasilnya akan hampir sama meskipun korpus untuk melatih model dan korpus untuk pencarian string aktivasi yang mirip dipisahkan sepenuhnya. Bagian sulitnya sejak awal adalah membuat string dengan statistik token berikutnya yang mirip menghasilkan aktivasi yang mirip
Dalam bobot per lapisan [0.01, 0.01, 0.1, 1.5, 6, 0.01], yang paling penting adalah lapisan tepat sebelum lapisan terakhir, dan pada titik itu inputnya sudah banyak ditransformasikan. Jadi jangan berharap ini bisa menggantikan transformer dengan grep sederhana atas data latih
Alasan bobot lapisan tepat sebelum terakhir jauh lebih besar daripada lapisan akhir mungkin karena induction head. Seperti di https://transformer-circuits.pub/2021/framework/index.html, strukturnya bisa saja mengimplementasikan fungsi untuk menyalin string berulang dari input, dengan lapisan tepat sebelum terakhir menentukan apa yang harus dicari dan lapisan akhir melakukan penyalinan
Kontribusi tulisan ini, seperti yang dikatakan penulisnya, adalah menunjukkan hal itu kepada pembaca teknis yang membuat GPT sendiri, berbeda dari tulisan-tulisan “bagaimana implementasinya?” yang berfokus pada transformer itu sendiri
Jika dilihat lebih teliti, bentuknya seperti README GitHub yang tidak ada dan tidak nyambung konteksnya, brosur panduan kosong, atau percakapan acak
Namun mengeruk seluruh internet untuk melatih model seperti ini sama sekali tidak pernah disebut serangan
Kalau begitu, mengapa kita tidak boleh menganggap bahwa mereka juga memiliki hak atas distribusi probabilitas karakter di dalam karya itu?
Begitu mengetahui NanoGPT dari Andrej Karpathy, saya mencobanya melatih versi bahasa Rusia War and Peace, dan menariknya, meski modelnya hanya 3 MB, ia hampir memahami tata bahasa Rusia
Bahasa Rusia memiliki struktur sintetis dan infleksi yang rumit. Misalnya, setelah preposisi “na” (“upon”) harus muncul nomina akusatif, yang untuk nomina maskulin bernyawa ditandai dengan -a, untuk nomina tak bernyawa tanpa akhiran, untuk nomina yang berakhir dengan “soft consonant” dengan -ia, untuk nomina feminin dengan -u, dan seterusnya
Selain itu, verba “menggunakan” menuntut kasus instrumental jika diikuti nomina yang dipakai sebagai alat
Tidak sempurna dan masih ada kesalahan, tetapi menarik bahwa NanoGPT dapat menyimpulkan aturan spesifik yang rumit hanya dengan pelatihan 3 menit. Saya mencari contoh kalimat persis yang dihasilkannya di teks asli, tetapi tidak ada yang cocok apa adanya
Namun meski tata bahasanya sampai taraf tertentu dipahami, secara semantik hasilnya benar-benar omong kosong
Ada visualisasi 3D yang bagus yang menunjukkan sistem yang sama, dan sepertinya akan sangat efektif jika dibaca bersama
LLM Visualization (https://bbycroft.net/llm)
https://news.ycombinator.com/item?id=38505211
Mungkin karena mencoba menampilkan semua hal sekaligus, dan tidak menunda detail ke konsep abstrak, tetapi saya tidak yakin
Proyek yang bagus, tetapi model yang dianalisis pada dasarnya adalah model mainan, baik dari sisi ukuran maupun jumlah data latih
Jadi model ini mungkin bisa didekati dengan model yang lebih sederhana, mungkin model bahasa n-gram, tetapi sulit menganggapnya mewakili cara kerja model bahasa yang lebih besar
Saya penasaran apakah penulis mengklaim bahwa LLM adalah generator teks rantai Markov.
Dengan kata lain, apakah ini berarti distribusi probabilitas token berikutnya yang dihasilkan sama dengan probabilitas urutan token tersebut dalam data pelatihan?
Jika demikian, apakah itu berarti kalau kita “sekadar” membuat rantai Markov dari data pelatihan asli, kita bisa mendapatkan performa yang mirip dengan LLM?
State-nya adalah vektor token sepanjang panjang konteks, dan model mendeskripsikan matriks transisi. Untuk vektor token dengan ukuran panjang konteks tertentu, ia menghasilkan probabilitas vektor token berikutnya dengan ukuran panjang konteks berikutnya.
Bagian sulitnya adalah klasifikasi untuk mengetahui teks data pelatihan mana yang “mirip” dengan teks prompt.
Mengambil contoh dari posting blog, seperti berikut:
Original string: 'And only l'
Similar strings: 'hat only l' 's sickly l' ' as\nthey l' 'r kingly l'
Ini berarti mungkin ada cara untuk melewati transformer dan mendapatkan hasil yang sama. Saya penasaran apakah itu lebih efisien.
Misalnya, ketika diberikan model dasar, mungkin kita bisa melatih sesuatu yang lain dan menjalankannya di perangkat yang jauh lebih kecil.
Cukup sulit memahami apa tepatnya yang penulis klaim telah ditunjukkan.
Saya sudah membaca bagian “Interpretation: Why Does the Approximation Work?” beberapa kali, tetapi rasanya seperti penjelasan mekanis tentang tahapan transformer. Saya tidak tahu apa klaim utamanya.
Saya penasaran apakah fenomena bahwa pergeseran attention dan FF umumnya menunjuk ke arah yang sama sudah diketahui.
Fakta bahwa keduanya berada di ruang laten yang sama melintasi layer saja cukup mengejutkan. Bukankah jaringan FF bisa melakukan rotasi arbitrer? Sepertinya saya salah memahami sesuatu.
Pasti ada hal yang hilang, dan mendeskripsikan secara akurat rotasi arbitrer di ruang berdimensi tinggi adalah salah satu hal yang hilang itu.