- Trong không gian embedding nhiều chiều, có thể biểu diễn vô số khái niệm bằng cách tận dụng tính gần trực giao (quasi-orthogonality) thay vì yêu cầu trực giao hoàn toàn
- Bổ đề Johnson-Lindenstrauss đảm bảo rằng dữ liệu nhiều chiều bất kỳ có thể được chiếu xuống số chiều thấp hơn mà gần như không mất thông tin
- Trong quá trình tối ưu hóa, thiết kế của hàm mất mát là yếu tố quan trọng, vì hàm mất mát cơ bản có thể tạo ra cách sắp xếp vector kém hiệu quả hoặc bị lệch
- Kết quả thực nghiệm cho thấy dung lượng thực tế của không gian embedding lớn hơn rất nhiều so với suy đoán lý thuyết ban đầu, cho phép hàng triệu đến hàng tỷ khái niệm cùng tồn tại một cách tự nhiên
- Phát hiện này có ý nghĩa thực tiễn lớn đối với thực hành machine learning như biểu diễn dữ liệu và giảm chiều trong xử lý ngôn ngữ tự nhiên, thiết kế embedding
Giới thiệu: Câu hỏi về dung lượng của không gian embedding trong mô hình ngôn ngữ
Trong loạt video gần đây của 3Blue1Brown về mô hình transformer, Grant Sanderson đã đặt ra một câu hỏi thú vị: làm sao không gian embedding 12.288 chiều của GPT-3 có thể chứa hàng triệu khái niệm của thế giới thực
Câu hỏi này gắn với hình học nhiều chiều và một kết quả toán học là bổ đề Johnson-Lindenstrauss (JL)
Quá trình khám phá vấn đề này đã dẫn đến những hiểu biết mới về các tính chất nền tảng của không gian vector và tối ưu hóa, thậm chí còn dẫn tới sự hợp tác với Grant
Tính gần trực giao của vector và dung lượng của không gian embedding
- Trong không gian N chiều chỉ tồn tại N vector trực giao hoàn toàn
- Nhưng nếu cho phép quan hệ gần trực giao (quasi-orthogonal), tức góc lệch nhẹ khỏi 90 độ (ví dụ 85~95 độ), thì số vector có thể biểu diễn trong cùng không gian tăng theo cấp số nhân
- Trong video của Grant, có một hình minh họa cho thấy 10.000 vector đơn vị được sắp xếp gần như trực giao trong không gian 100 chiều
- Tuy nhiên, trong quá trình tái hiện lại thí nghiệm này, người ta phát hiện ra một cạm bẫy tinh vi trong thiết kế hàm mất mát tối ưu hóa
Vấn đề và các mẫu hình của hàm mất mát
- Hàm mất mát cơ bản:
loss = (dot_products.abs()).relu().sum() - Trên thực tế, với mặt cầu đơn vị, hàm mất mát này gây ra hai vấn đề
- Gradient Trap: khi góc giữa các vector tiến gần 90 độ thì gradient hoạt động mạnh, nhưng gần 0 độ hoặc 180 độ thì gradient gần như bằng 0, khiến việc cải thiện bị chặn lại
- Lời giải 99%: kỹ thuật tối ưu hóa sẽ tối thiểu hóa tổng mất mát bằng cách tạo ra một cấu hình trong đó mỗi vector trực giao đúng cách với 9.900 vector, nhưng lại gần như song song với 99 vector còn lại (tức là các bản sao của vector chuẩn) trong tập 10.000 vector
- Nếu nhìn tổng thể, lời giải này khác về bản chất so với điều mong đợi, nên cần một hàm mất mát tinh vi hơn
- Vì vậy, hàm mất mát được đổi sang dạng áp dụng penalty theo hàm mũ: loss = exp(20*dot_products.abs()**2).sum()
- Cách này tạo ra kết quả gần hơn với phân bố mong muốn (góc cặp lớn nhất khoảng 76,5 độ)
Bổ đề Johnson-Lindenstrauss (JL): Bảo đảm hình học
- Bổ đề JL đảm bảo rằng ngay cả khi chiếu ngẫu nhiên một tập điểm dữ liệu nhiều chiều bất kỳ xuống không gian có số chiều thấp hơn, khoảng cách Euclid vẫn được bảo toàn gần như nguyên vẹn
- Với từ 1 đến N điểm, hệ số sai số ε và số chiều chiếu k:
(1-ε)||u-v||² ≤ ||f(u)-f(v)||² ≤ (1+ε)||u-v||² - Số chiều tối thiểu cần thiết là:
k ≥ (C/ε²) * log(N)
trong đó C là hằng số điều chỉnh xác suất thành công - Thông thường, người ta lấy C khá bảo thủ trong khoảng 4~8, nhưng với những cách chiếu đặc biệt (ví dụ Hadamard matrix, phương pháp tối ưu hóa), có thể đạt C nhỏ hơn
Các lĩnh vực ứng dụng thực tiễn
- Giảm chiều:
- Ví dụ: chuyển đổi hiệu quả sở thích khách hàng trong thương mại điện tử từ không gian có số chiều bằng hàng chục nghìn sản phẩm xuống vài nghìn chiều
- Có thể áp dụng cho phân tích thời gian thực và hệ gợi ý trên dữ liệu nhiều chiều
- Phân tích giới hạn dung lượng của không gian embedding:
- Thay vì trực giao hoàn toàn, không gian có thể biểu diễn tự nhiên phổ tương đồng/khác biệt giữa các khái niệm
- Ví dụ từ thực tế như "archery", "fire", "gelatinous", "green" cho thấy các nghĩa vật lý và trừu tượng được chồng lấp trong không gian nhiều chiều
Phân tích thực nghiệm về dung lượng embedding
- Khi tối ưu bằng các phép biến đổi như Hadamard matrix, giá trị C đạt khoảng 2,5~4; còn với tối ưu hóa dựa trên GPU thì có thể thấp hơn nhiều
- Phương pháp thí nghiệm: lần lượt chiếu N vector basis chuẩn vào không gian k chiều, rồi lặp tối ưu hóa 50.000 lần
- Kết quả quan sát:
- Giá trị C tăng đến mức cực đại (~0,9) khi N tăng, rồi dần giảm xuống
- Khi tỷ lệ N/k càng cao, C giảm xuống dưới 0,2
- Điều này xuất phát từ hiệu quả sphere packing trong không gian nhiều chiều
- Nó cho thấy trên thực tế có thể biểu diễn nhiều khái niệm hơn giới hạn trên theo lý thuyết
Ý nghĩa thực tế của embedding trong mô hình ngôn ngữ
- Tùy theo số chiều embedding k, góc gần trực giao F(90°-góc thực tế), và giá trị C, số khái niệm có thể chứa là
Vectors ≈ 10^(k * F² / 1500)
- k=12,288, F=1(89°) → 10^8
- F=2(88°) → 10^32
- F=3(87°) → 10^73
- F=5(85°) → có thể lưu trữ hơn 10^200 vector
- Chỉ với 86° cũng đã nhiều hơn số nguyên tử trong vũ trụ quan sát được (10^80)
- Nói cách khác, mô hình ngôn ngữ thực tế có thể bảo toàn phong phú hàng triệu ý nghĩa ngay cả trong số chiều tương đối nhỏ
Ứng dụng thực tiễn và hướng đi tương lai
- Giảm chiều hiệu quả:
- Thông qua các phương pháp chiếu ngẫu nhiên kết hợp biến đổi Hadamard, mã hóa BCH, v.v., có thể giảm chiều dữ liệu quy mô lớn và tính toán nhanh mà không cần tối ưu hóa phức tạp
- Thiết kế không gian embedding:
- Những hiểu biết về dung lượng không gian giúp giải thích vì sao các mô hình ngôn ngữ lớn như transformer có thể đồng thời bảo toàn quan hệ ngữ nghĩa, kể cả với những khái niệm tinh tế như "Canadian", "Muppet-like"
- Kết luận lại, các chuẩn embedding hiện nay (1.000~20.000 chiều) là đủ để biểu diễn tri thức của con người; điều quan trọng là học được cách sắp xếp lý tưởng trong không gian đó
Kết luận
- Bắt đầu từ việc khám phá những vấn đề tối ưu hóa tinh vi trong hàm mất mát, câu chuyện này dẫn tới những hiểu biết sâu sắc về hình học nhiều chiều và cấu trúc nền tảng của machine learning
- Bổ đề JL được công bố năm 1984 hiện vẫn cung cấp nền tảng cốt lõi cho embedding, biểu diễn thông tin và nguyên lý giảm chiều trong machine learning ngày nay
- Bài viết cũng bày tỏ lời cảm ơn tới Grant Sanderson, kênh 3Blue1Brown và Suman Dev vì sự hợp tác, đồng thời chia sẻ niềm vui trong quá trình nghiên cứu và biên soạn này
Đọc thêm
- Sphere Packings, Lattices and Groups – Conway & Sloane
- Database-friendly random projections: Johnson-Lindenstrauss with binary coins – Achlioptas
- Hadamard Matrices, Sequences, and Block Designs – Seberry & Yamada
1 bình luận
Ý kiến trên Hacker News
Hàm ý của đặc tính hình học này thực sự gây sốc. Có thể nghĩ ra một cách đơn giản để ước lượng xem trong không gian k chiều ta có thể nhét được bao nhiêu vector gần như trực giao. Nếu chỉ tập trung vào góc tối thiểu giữa các vector, thì về bản chất đây là phân tích về mã cầu (
spherical codes). Vậy mà bài viết này hoàn toàn không trích dẫn nghiên cứu trước đó về mã cầu, và phần lớn trông như được viết bởi mô hình ngôn ngữ. Thêm vào đó, vô số điểm không nhất quán cơ bản làm giảm độ tin cậy của kết luận. Ví dụ, trong đồ thị thể hiện giá trị C theo K và N, trục x là K hay N? Chú thích nói trục x là N (số lượng vector), nhưng sau đó lại giải thích rằng trong một "không gian rất lớn" thì C=0.2, trong khi trên đồ thị chỉ khi N=30,000 và K=2 thì mới đạt C=0.2 — tức là có 30,000 vector trong không gian 2 chiều! Ngược lại, nếu trục x là K, thì bài này đang ngoại suy từ kết quả đo với 2 vector trong không gian 30,000 chiều sang trường hợp 10^200 vector trong không gian 12,888 chiều, điều này vô lý. Tôi muốn tiếp cận công việc của người khác với thái độ tích cực và thiện chí, nhưng dạo này làn sóng bài viết do LLM tạo ra trên Hacker News thực sự đang trở nên quá áp đảoNói rằng thứ gì đó được tạo bởi LLM thì vừa không thể chứng minh, vừa kém trực diện và kém ý nghĩa hơn việc chỉ ra rằng "có lỗi". Việc bạn chỉ ra lỗi thực sự hữu ích hơn. Với hình đó, có vẻ đúng là nên hiểu trục x là N
Tôi không biết về mã cầu, nên có cảm giác thuật ngữ của lĩnh vực này khá xa lạ. Ngay cả Wikipedia dường như cũng gần như không biết đến nó, còn kết quả Google thì chủ yếu lại nói về tối ưu đóng gói kiểu golf trên mặt cầu ở dưới 32 chiều. Đôi khi có những trường hợp toán học vốn đã tồn tại được tái khám phá dưới một lớp thuật ngữ chuyên ngành khó trực giác như vậy
Đúng vậy. Tôi muốn biết có bài nào giải thích tốt hơn về đặc tính hình học của không gian vector cao chiều, về thông tin, và về mã cầu không
Tôi không thấy trong đồ thị mà bạn nhắc đến chỗ K=2 đạt C=0.2. K=3 cũng chỉ lên tới C=0.3 rồi dừng. Mà tôi cũng không rõ tại sao đó lại là vấn đề. Có vẻ tác giả đang chiếu N vector cơ sở vào K chiều, và C giống như một thước đo sai số khi ánh xạ từ không gian N sang không gian K; nếu có lý do khiến ý tưởng này không khớp với đồ thị thì tôi muốn nghe giải thích chi tiết hơn. Trong lập luận của bạn có vẻ chưa đụng tới chính khái niệm đó
Tôi nghĩ tác giả tập trung quá nhiều vào trường hợp mọi vector hoàn toàn trực giao, nên đã đánh giá quá cao mức sai số có thể chấp nhận trong thực tế. Điều thực sự quan trọng không phải là giữ các vector trực giao gần như trực giao, mà là bảo toàn được thứ tự khoảng cách ngay cả giữa những vector vốn cách xa trực giao. Ngay cả khi epsilon nhỏ hơn rất nhiều thì trên thực tế vẫn có thể phát sinh vấn đề. Nói cách khác, tôi cho rằng tuyên bố kiểu “như nghiên cứu này chỉ ra, khoảng 1,000~20,000 chiều là đủ để chứa toàn bộ tri thức và suy luận của con người” là quá lạc quan
Các vector thường được chuẩn hóa lên bề mặt của n-cầu, và trong thực tế khoảng cách có ý nghĩa chính là độ tương đồng cosine. Vì vậy trong ứng dụng thật, "gần như trực giao" là điều quan trọng. Trong quá trình huấn luyện, mục tiêu là đẩy các biểu diễn không có ý nghĩa về phía “trực giao” hơn trên mặt cầu. Khi triển khai trên phần cứng thực tế, độ chính xác số thực dấu chấm động cũng có giới hạn, nên cách này đặc biệt hiệu quả. Nhân tiện, ý tưởng này không phải do bài blog hay video YouTube đó đề xuất đầu tiên. Ý nghĩa của bổ đề này trong AI, hoặc ít nhất là trong huấn luyện mạng nơ-ron, đã được C. Eliasmith nhắc đến từ khoảng 10 năm trước, rất lâu trước khi các mạng tri thức siêu cao chiều như GPT thực sự có thể được huấn luyện trong thực tế
Logic trong lập luận của OP không mấy thuyết phục, nhưng dù vậy khả năng biểu diễn ở tầm khoảng 20 nghìn chiều vẫn khá đáng hy vọng
Tôi cũng không hề nghĩ rằng mọi vector đều hoàn toàn trực giao hay độc lập. Cũng có bài đáng đọc về đo khoảng cách, không gian cong (
curvilinear space), và tọa độ lệch (skew coordinate): https://news.ycombinator.com/item?id=41873650. Có những câu hỏi nền tảng như: “độ đo khoảng cách thay đổi đến mức nào tùy theo thứ tự đặc trưng?”, “nếu đảo thứ tự mọi trục trực giao thì đầu ra thuật toán có thay đổi không?”, “các đặc trưng trong không gian cao chiều có thật sự đều trực giao 90 độ không?”. Nếu các đặc trưng không độc lập về mặt thống kê, thì trên thực tế khó có khả năng hoàn toàn trực giao, và tính hữu ích của những độ đo khoảng cách dựa trên giả định độc lập có thể bị giới hạn. Các mô hình tuyến tính như naive Bayes, hồi quy tuyến tính, hồi quy logistic, LDA, PCA đều kém tin cậy hơn khi đặc trưng không độc lập. Những kỹ thuật như chuẩn hóa L1 lasso hay L2 ridge cũng có rủi ro khi gặp dữ liệu ngoại lai hoặc dữ liệu không độc lập, không trực giao. Vì rất khó nén cưỡng ép [tính trực giao hoàn toàn], nên khó nói mô hình là đủ. Và sâu xa hơn còn có câu hỏi liệu có thể mã hóa đồng thời tronggbithay khôngCái chất ChatGPT toát ra từ phần lớn bài viết khiến tôi khá khó chịu và khó tập trung. Tôi cũng dùng AI để trau chuốt tiếng Anh, nhưng cố tránh mức đó bằng cách yêu cầu đừng thay đổi tông hay hình thức quá nhiều. Dù vậy, tôi vẫn thấy quan sát toán học này thực sự rất thú vị. Nó gợi ra những hàm ý nền tảng giúp ta nhìn vào cách mà mô hình ngôn ngữ lớn và các hệ thống AI khác thực sự vận hành. Khi xem cách dữ liệu cao chiều được chiếu xuống không gian thấp chiều mà vẫn bảo toàn cấu trúc, có thể thấy chính cơ chế này là cốt lõi của hiệu quả và khả năng mở rộng
Trớ trêu là ngay ở đoạn thứ hai của bạn, những từ như “fascinating”, “crucial”, “delving” cùng cấu trúc đoạn văn lại khiến nó có cảm giác như vừa đi qua ChatGPT vậy
Tôi tò mò là những chỗ nào khiến bạn thấy đậm chất GPT? Có phải vì lối viết liệt kê quá nhiều không?
Kiểu lý thuyết trực giác này cùng với bổ đề Johnson-Lindenstrauss (JL) là nền tảng cốt lõi giúp các nghiên cứu diễn giải máy móc như SAE (sparse autoencoder) khả thi trong lĩnh vực AI an toàn. Nhiều ý tưởng trong số này được Anthropic tổng hợp khá tốt trong bài báo năm 2022: https://transformer-circuits.pub/2022/toy_model/index.html
Mô hình ngôn ngữ không “nhồi” các “khái niệm” một cách cố định vào C chiều của một lớp duy nhất đâu (có lẽ con số 12k đang được dùng theo kiểu đó). Cũng không cần có trực giao hoàn toàn giữa các vector thì vẫn có thể phân biệt và xử lý các khái niệm. LLM không chỉ đơn thuần làm cho khoảng cách giữa các khái niệm trong không gian vector trở nên xa nhau, mà ý nghĩa còn chồng lấp khắp nơi. Chính đặc điểm đó là cốt lõi của biểu diễn dày đặc (
dense representation). Nếu huấn luyện sparse autoencoder, ta có thể thấy nơ-ron nào được kích hoạt theo từng chủ đề. Neuronpedia cho thấy khá rõ hình thái thực tế đó: https://www.neuronpedia.org/Chính nghiên cứu về sparse autoencoder đó dựa trên khái niệm “gần như trực giao” mà bài này đang nói tới. Ban đầu nó được gọi là ‘giả thuyết superposition’: https://transformer-circuits.pub/2022/toy_model/index.html SAE đóng vai trò phân rã các vector dày đặc thành những “khái niệm” thưa, gần như trực giao trong một không gian overcomplete. Cách này thực sự hoạt động tốt, thậm chí còn có thể dùng để căn chỉnh hiệu quả các không gian embedding giữa những LLM khác nhau
Nếu nới lỏng điều kiện trực giao hoàn hảo, ta có thể nhét được nhiều thông tin hơn rất nhiều. Về bản chất, đó là gom thêm thông tin (theo nghĩa chiều phân số) vào các chiều sẵn có. Nói cách khác, nhiều khái niệm không hoàn toàn trực giao với nhau mà có chồng lấp hoặc tương quan ở mức nào đó. Vì vậy nội dung bài không phải là điều gì quá đột phá. Và việc lạm dụng các từ như “remarkable”, “fascinating”, “profound” tạo ra cảm giác hơi mang chất LLM, như đang âm thầm lôi kéo người đọc
Một điểm hơi vụn vặt nhưng thú vị: bạn cũng có thể chứa hàng tỷ khái niệm trong từng ấy không gian. Ngay cả nếu chỉ quan tâm 4 bit ở mỗi thành phần vector, thì một vector 12000 chiều ở
fp4cũng chỉ khoảng 6KB, tương đương vài trang văn bản UTF-8. Cỡ một embedding 64K cho 3K token. Số khả năng của một “ý nghĩ” được biểu diễn theo cách này là cực kỳ lớn. Ngay cả khi xử lý một token, mỗi lớp cũng trộn “ý nghĩ” trước đó khoảng 60 lần với attention và dữ liệu được học qua FFN. Đó là lý do toàn bộ hệ thống này có thể làm được các tác vụ phức tạp như chuyển Bash sang Python hay giải toán đố bằng lời. Tất nhiên tôi không kỳ vọng nó hiệu quả không gian 100%. Nó cần hoạt động tốt khi tổng hợp vector với những “cường độ” khác nhau, và việc huấn luyện cũng không phải lúc nào cũng hội tụ về phương án nén hiệu quả nhất. Nhưng ngay cả khi chỉ xem giới hạn lý thuyết như một cận trên, điều này vẫn đem lại một trực giác mới rằng trong vector siêu cao chiều có thể nhồi nhét gần như mọi thứ xứng đáng gọi là “ý nghĩ” theo nghĩa thực dụngTrực giác của tôi đơn giản hơn nhiều — giả sử các khái niệm có cấu trúc phân cấp ở mức nào đó, thì có thể ước lượng khá thô xem không gian 12000 chiều chứa được bao nhiêu khái niệm. Nếu coi mỗi khái niệm là trực giao với mọi khái niệm khác ít nhất trên một trục nào đó, thì điều đó có nghĩa là luôn tồn tại một hàm tách tuyến tính hai khái niệm ngay cả khi khoảng cách cosine không đủ lớn. Trong trường hợp đó, về cực hạn có thể lên tới 12,000! khái niệm, nên với hầu hết các hệ phân loại thì không gian là quá dư dả
Để hiện thực hóa 12,000! khái niệm thì phải ánh xạ thứ tự các chiều cho từng khái niệm, trong khi mô hình thực tế không gán ý nghĩa cho thứ tự chiều. Nghĩa là
[weight_1, weight_2,...]và[weight_2, weight_1,...]là hoàn toàn tương đương trong mô hình. Trong thực tế, có thể coi mô hình ngôn ngữ chỉ có một trong ba trạng thái dương, âm hoặc 0 trên mỗi trục, tức cỡ3^12,000khái niệm. Thực tế thì trong đa số vector, gần như mọi trục đều xấp xỉ 0 ngoại trừ vài chục trục (do giới hạn thời gian huấn luyện)Con số đó còn lớn hơn rất nhiều so với số nguyên tử trong toàn bộ vũ trụ (
10^80) (khoảng10^43741)Ngay ở chỗ “khoảng cách cosine không lớn lắm” đã có một giới hạn mang tính quyết định rồi
Nếu từng chơi 20Questions thì sẽ biết rằng không cần tới 1000 chiều để biểu diễn hàng tỷ khái niệm. Các vector khổng lồ như thế còn có thể chứa thông tin phức tạp hơn hàng tỷ khái niệm rất nhiều. Thực tế, toàn bộ một bài thơ và cả vị trí lỗi chính tả trong đó cũng có thể được biểu diễn và truy xuất trong dạng vector này. Ví dụ như khi dán một bài thơ vào GPT rồi hỏi vị trí lỗi chính tả, ở đâu đó trong các lớp bên trong hẳn có thông tin đó được phân biệt khá cụ thể
Thực ra đó không phải là công việc của một vector đơn lẻ mà là của toàn bộ mô hình. Toàn bộ mô hình hành xử giống như một vector cỡ một nghìn tỷ chiều
Nếu dùng vector nhị phân, thì 20 chiều đã biểu diễn được hơn một triệu khái niệm một chút. 30 chiều thì thành một tỷ khái niệm
Nhiều bình luận đã chỉ ra các vấn đề khác nhau trong bài báo đó, nhưng tôi chỉ muốn thêm một quan sát thật cơ bản: bản thân tuyên bố rằng 12k chiều có thể chứa
10^200khái niệm đã là điều quá lố bịch. Đúng là không gian vector 12k có thể chứa vô số giá trị riêng biệt, nhưng không phải tất cả những thứ đó đều là khái niệm. Tuyên bố kiểu này là vô nghĩa. Shannon hẳn cũng sẽ muốn nhắc rõ điểm nàySai lầm cốt lõi là trên thực tế không hề tồn tại hàng tỷ khái niệm. “Khái niệm” mà con người sử dụng khác hẳn với “instance” hay “entity” theo nghĩa máy móc. Instance có thể là vô hạn, nhưng số lượng khái niệm trừu tượng mà ta thực sự dùng để tư duy thì bị giới hạn hơn rất nhiều