
Thành viên nhóm sáng lập OpenAI: Phần mềm 2.0 là gì?
Tuyển chọn TechFlowTuyển chọn TechFlow

Thành viên nhóm sáng lập OpenAI: Phần mềm 2.0 là gì?
Khi chúng ta phát triển trí tuệ nhân tạo tổng quát (AGI) vào một ngày nào đó, chắc chắn sẽ sử dụng phần mềm 2.0.
Tác giả: Andrej Karpathy (Thành viên sáng lập OpenAI, cựu Giám đốc bộ phận AI của Tesla)
Dịch: Cộng đồng OneFlow, ywh1bkansf
Andrej Karpathy là một trong những người đầu tiên làm rõ lý do vì sao làn sóng AI thực sự quan trọng. Ông cho rằng AI là một cách thức mới, mạnh mẽ để lập trình máy tính, và nếu một ngày nào đó chúng ta phát triển được trí tuệ nhân tạo tổng quát (AGI), thì chắc chắn sẽ thông qua phần mềm 2.0.
Dưới đây là toàn văn bài viết năm 2017 của Andrej Karpathy:
Tôi nhận thấy đôi khi mọi người xem mạng nơ-ron như “chỉ là một công cụ khác trong hộp công cụ học máy”. Nó có ưu điểm và nhược điểm, hữu ích trong một số lĩnh vực, và có thể giúp bạn chiến thắng các cuộc thi Kaggle. Thật không may, quan điểm này hoàn toàn là nhìn cây mà không thấy rừng. Mạng nơ-ron không chỉ đơn thuần là một bộ phân loại khác; nó báo hiệu sự khởi đầu của một bước chuyển căn bản về cách chúng ta phát triển phần mềm. Đó chính là phần mềm 2.0.
Chúng ta đã quen thuộc với phần mềm 1.0: chúng được phát triển bằng ngôn ngữ máy tính (như Python, C++...). Chúng gồm các chỉ dẫn rõ ràng do lập trình viên viết ra cho máy tính. Bằng cách viết từng dòng mã, lập trình viên xác định một điểm cụ thể trong không gian chương trình có hành vi mong muốn.

Ngược lại, phần mềm 2.0 được phát triển bằng một ngôn ngữ trừu tượng hơn, khó hiểu hơn đối với con người (ví dụ như trọng số trong mạng nơ-ron). Không ai có thể trực tiếp tham gia viết mã này, vì nó liên quan đến hàng triệu trọng số, và (tôi đã thử) việc viết trực tiếp trọng số là cực kỳ khó khăn.

Thay vào đó, chúng ta xác định mục tiêu hành vi của chương trình (ví dụ: "phù hợp với các cặp dữ liệu vào-ra trong tập dữ liệu", hoặc "thắng trò chơi cờ vây"), và viết khung chương trình (ví dụ cấu trúc mạng nơ-ron), từ đó xác định một tập con có thể tìm kiếm trong toàn bộ không gian chương trình, rồi dùng toàn bộ tài nguyên tính toán để tìm kiếm chương trình khả dụng trong không gian này.
Đối với mạng nơ-ron, chúng ta giới hạn việc tìm kiếm trong một tập con liên tục của không gian chương trình, và sử dụng lan truyền ngược (backpropagation) cùng phương pháp giảm dần gradient ngẫu nhiên (SGD) để tìm kiếm – điều đáng ngạc nhiên là cách này hoạt động khá hiệu quả.

Cụ thể hơn, phần mềm 1.0 chuyển đổi mã nguồn do con người thiết kế (ví dụ file .cpp) thành tệp nhị phân hoạt động hiệu quả. Trong khi đó, mã nguồn phần mềm 2.0 thường gồm hai phần: 1) tập dữ liệu định nghĩa hành vi mục tiêu; 2) cấu trúc mạng nơ-ron định rõ hình dạng tổng quát nhưng cần điền chi tiết. Quá trình huấn luyện mạng nơ-ron chính là quá trình biên dịch tập dữ liệu thành tệp nhị phân — mạng nơ-ron cuối cùng. Ngày nay, trong hầu hết ứng dụng thực tế, cấu trúc mạng nơ-ron và hệ thống huấn luyện đã trở nên chuẩn hóa và phổ biến như một mặt hàng, do đó phần lớn công việc "phát triển phần mềm" hiện nay thực chất là tổ chức, bổ sung, điều chỉnh và làm sạch tập dữ liệu có nhãn. Điều này làm thay đổi căn bản mô hình lập trình và quy trình lặp phần mềm, chia nhóm phát triển thành hai phe: các lập trình viên phần mềm 2.0 (người gắn nhãn dữ liệu) phụ trách chỉnh sửa và mở rộng tập dữ liệu, và một nhóm nhỏ duy trì hạ tầng huấn luyện cùng các giao diện phân tích, trực quan hóa và gắn nhãn.
Thực tế cho thấy, đối với nhiều vấn đề trong thế giới thực, việc thu thập dữ liệu (nói rộng hơn là xác định hành vi mong đợi) dễ dàng hơn rất nhiều so với việc viết chương trình một cách tường minh. Do những lợi ích trên và những lợi ích dưới đây của phần mềm 2.0, chúng ta đang chứng kiến một sự dịch chuyển lớn trong ngành công nghiệp, khi lượng lớn mã nguồn đang chuyển từ phần mềm 1.0 sang phần mềm 2.0. Phần mềm 1.0 từng nuốt chửng cả thế giới, giờ đây phần mềm 2.0 (AI) đang nuốt chửng phần mềm 1.0.
Sự chuyển dịch đang diễn ra
Hãy xem xét một vài ví dụ cụ thể về sự chuyển dịch này trong các lĩnh vực riêng biệt. Chúng ta thấy rằng trong vài năm gần đây, thay vì cố gắng giải quyết các vấn đề phức tạp bằng cách viết mã tường minh, chúng ta đã chuyển sang phần mềm 2.0.
-
Nhận dạng hình ảnh: Trước đây, nhận dạng hình ảnh chủ yếu dựa vào kỹ thuật trích chọn đặc trưng (feature engineering), chỉ kết hợp chút ít học máy ở cuối (ví dụ SVM). Sau đó, nhờ dùng tập dữ liệu lớn hơn (ví dụ ImageNet) và tìm kiếm trong không gian cấu trúc mạng nơ-ron tích chập, chúng ta tìm ra các đặc trưng thị giác mạnh mẽ hơn. Gần đây, chúng ta thậm chí còn không tin tưởng vào cấu trúc mạng tự viết, mà bắt đầu tìm kiếm cấu trúc tối ưu bằng các phương pháp tương tự.
-
Nhận dạng giọng nói: Các hệ thống nhận dạng giọng nói trước đây đòi hỏi xử lý tín hiệu nặng nề, mô hình hỗn hợp Gauss và mô hình Markov ẩn, nhưng nay gần như chỉ cần mạng nơ-ron. Có một câu nói đùa nổi tiếng liên quan của Fred Jelinek năm 1985: “Mỗi lần tôi sa thải một nhà ngôn ngữ học, độ chính xác hệ thống nhận dạng giọng nói của tôi lại tăng lên.”
-
Tổng hợp giọng nói: Trước kia, tổng hợp giọng nói sử dụng nhiều kỹ thuật nối ghép âm thanh, nhưng hiện nay các mạng tích chập lớn hiện đại (SOTA) như WaveNet có thể sinh trực tiếp tín hiệu âm thanh thô.
-
Dịch máy: Dịch máy từng dùng các phương pháp thống kê dựa trên cụm từ, nhưng mạng nơ-ron đang nhanh chóng chiếm ưu thế. Tôi thích nhất là các kiến trúc đa ngôn ngữ: một mô hình duy nhất có thể dịch bất kỳ ngôn ngữ nguồn nào sang bất kỳ ngôn ngữ đích nào, chỉ cần giám sát yếu hoặc thậm chí hoàn toàn không giám sát.
-
Trò chơi: Trong thời gian dài, con người viết chương trình cờ vây thủ công để chơi, nhưng giờ đây AlphaGo Zero (một mạng tích chập quan sát trạng thái bàn cờ thô và chơi trực tiếp) đã trở thành người chơi mạnh nhất. Tôi dự đoán các trò chơi khác như DOTA 2 hay StarCraft cũng sẽ có kết quả tương tự.
-
Cơ sở dữ liệu: Nhiều hệ thống truyền thống vốn nằm ngoài lĩnh vực AI cũng bắt đầu bộc lộ dấu hiệu ban đầu của sự chuyển dịch sang phần mềm 2.0. Ví dụ, trong “học cấu trúc chỉ mục”, mạng nơ-ron thay thế các thành phần cốt lõi quản lý dữ liệu, đạt tốc độ nhanh hơn tới 70% so với cây B đã tối ưu cache, đồng thời tiết kiệm một bậc độ nhớ.
Bạn có thể nhận thấy nhiều nghiên cứu kể trên do Google thực hiện. Bởi vì hiện tại Google đang dẫn đầu trong việc chuyển đổi lượng lớn mã nguồn của mình sang phần mềm 2.0. Khái niệm “một mô hình vạn năng” đang được phác thảo: gộp các hiệu suất thống kê rải rác khắp các lĩnh vực thành một mô hình duy nhất để hiểu thế giới.
Lợi ích của phần mềm 2.0
Tại sao chúng ta lại muốn chuyển các chương trình phức tạp sang phần mềm 2.0? Dĩ nhiên, lý do đơn giản là thực tiễn chứng minh nó hiệu quả hơn. Tuy nhiên, còn nhiều lý do khác khiến chúng ta lựa chọn phần mềm 2.0. Hãy xem xét các lợi ích của phần mềm 2.0 (đại diện là mạng nơ-ron tích chập) so với phần mềm 1.0 (đại diện là kho mã C++ cấp sản xuất):
-
Tính đồng nhất về tính toán: Một mạng nơ-ron điển hình chỉ gồm hai phép toán kết hợp: nhân ma trận và hàm kích hoạt ReLU. So với các lệnh trong phần mềm truyền thống, điều này đơn giản và đồng nhất hơn nhiều. Vì chỉ cần triển khai đúng một số lượng nhỏ mã cốt lõi (ví dụ nhân ma trận) bằng phần mềm 1.0, việc kiểm tra tính đúng đắn và hiệu năng sẽ dễ dàng hơn rất nhiều.
-
Thân thiện với chip: Vì tập lệnh cần thiết cho mạng nơ-ron tương đối nhỏ, do đó việc triển khai chúng trên chip sẽ dễ dàng hơn, ví dụ dùng chip ASIC tùy chỉnh, chip thần kinh (neuromorphic chips)... Khi các thiết bị thông minh tiêu thụ điện năng thấp lan tràn khắp nơi, thế giới sẽ thay đổi theo hướng đó. Ví dụ, bạn có thể tích hợp mạng tích chập tiền huấn luyện, nhận dạng giọng nói, mạng tổng hợp giọng nói WaveNet vào các thiết bị nhỏ gọn và rẻ tiền, để kết nối với các thiết bị khác.
-
Thời gian chạy hằng định: Mỗi lần lặp tiến (forward pass) của mạng nơ-ron điển hình yêu cầu lượng tính toán (FLOPs) rất ổn định. Các nhánh thực thi phức tạp thường gặp trong mã C++ do con người viết sẽ không tồn tại trong phần mềm 2.0. Tất nhiên, bạn có thể cần đồ thị động, nhưng luồng thực thi thường bị giới hạn chặt chẽ. Ngay cả trong trường hợp đó, chúng ta gần như đảm bảo không rơi vào vòng lặp vô hạn ngoài dự kiến.
-
Tiêu thụ bộ nhớ hằng định: Liên quan đến điểm trên, vì không cần cấp phát bộ nhớ động, nên gần như không thể xảy ra tình trạng swap với ổ cứng, và cũng không thể có rò rỉ bộ nhớ trong mã.
-
Khả năng di động cao: So với các tệp nhị phân hoặc kịch bản truyền thống, một chuỗi các phép nhân ma trận dễ dàng chạy trên nhiều môi trường máy tính khác nhau hơn.
-
Phát triển linh hoạt: Nếu bạn đang viết C++, và ai đó yêu cầu bạn tăng gấp đôi tốc độ phát triển (có thể đánh đổi hiệu năng), thì việc điều chỉnh hệ thống để đáp ứng yêu cầu mới không phải chuyện nhỏ. Nhưng trong phần mềm 2.0, chúng ta chỉ cần loại bỏ một nửa các đường đi trong đồ thị tính toán, sau đó huấn luyện lại, là có được kết quả chậm hơn một chút nhưng nhanh gấp đôi về tốc độ huấn luyện. Điều này thật kỳ diệu. Ngược lại, nếu bạn có thêm dữ liệu và sức mạnh tính toán, bạn có thể mở rộng đồ thị tính toán và huấn luyện lại để nhanh chóng cải thiện hiệu suất thực tế.
-
Hợp nhất module để tối ưu: Phần mềm thông thường thường được chia thành nhiều module, giao tiếp giữa các module thông qua hàm chung, API hoặc theo kiểu end-to-end. Nhưng với phần mềm 2.0, nếu ban đầu hai module tương tác được huấn luyện độc lập, chúng ta vẫn dễ dàng lan truyền ngược trong toàn bộ hệ thống. Hãy tưởng tượng nếu trình duyệt của bạn có thể tự động thiết kế các lệnh底层 để tăng tốc độ tải trang; hoặc thư viện thị giác máy tính bạn nhập vào (ví dụ openCV) có thể tự động điều chỉnh hành vi theo dữ liệu cụ thể của bạn — thật tuyệt vời biết bao. Trong phần mềm 2.0, đây là các thao tác cơ bản.
-
Tốt hơn bạn: Cuối cùng và quan trọng nhất, trong nhiều lĩnh vực chuyên sâu, mã do mạng nơ-ron tạo ra tốt hơn mã do bạn hay tôi viết. Hiện tại, ít nhất trong các lĩnh vực hình ảnh, video, giọng nói là như vậy.
Nhược điểm của phần mềm 2.0
Phần mềm 2.0 cũng có một số nhược điểm. Sau khi tối ưu hóa, chúng ta có được mạng lớn hoạt động hiệu quả trong thực tiễn, nhưng rất khó giải thích tại sao nó hiệu quả. Trong nhiều lĩnh vực, chúng ta phải chọn giữa mô hình dễ hiểu nhưng chỉ đạt độ chính xác 90%, hoặc mô hình không hiểu được nhưng đạt 99%.
Phần mềm 2.0 có thể mắc lỗi phi logic, sai lầm khó chịu, hoặc tệ hơn nữa, “lỗi âm thầm”. Ví dụ, nếu trong quá trình huấn luyện âm thầm đưa vào dữ liệu thiên vị, khi khối lượng dữ liệu lên tới hàng triệu mẫu, việc phân tích và kiểm tra nguyên nhân sẽ cực kỳ khó khăn.
Cuối cùng, các đặc tính kỳ lạ của phần mềm 2.0 tiếp tục xuất hiện. Ví dụ, sự tồn tại của các mẫu đối nghịch (adversarial samples) và tấn công đối nghịch làm nổi bật thêm vấn đề khó giải thích của phần mềm 2.0.
Lập trình phần mềm 2.0
Mã phần mềm 1.0 là mã do chúng ta viết tay. Mã phần mềm 2.0 là mã được tối ưu dựa trên tiêu chí đánh giá (ví dụ: “phân loại đúng dữ liệu huấn luyện”). Với các chương trình mà nguyên lý không rõ ràng nhưng hiệu suất có thể được đánh giá lặp lại, sự chuyển đổi này đều phù hợp, bởi vì phương pháp tối ưu tìm ra mã tốt hơn nhiều so với mã do con người viết.

Góc nhìn xu hướng rất quan trọng. Khi bạn nhận ra mạng nơ-ron không chỉ đơn thuần là một bộ phân loại hữu ích trong hộp công cụ học máy, mà phần mềm 2.0 là một mô hình lập trình hoàn toàn mới đang trỗi dậy, thì các suy luận sẽ trở nên rõ ràng hơn, và hiển nhiên vẫn còn rất nhiều việc phải làm.
Cụ thể, chúng ta đã phát minh ra hàng loạt công cụ hỗ trợ lập trình viên phát triển phần mềm 1.0, như IDE mạnh mẽ với các chức năng như tô sáng cú pháp, bộ gỡ lỗi, công cụ phân tích, nhảy ký hiệu, tích hợp git, v.v. Trong phần mềm 2.0, lập trình được thực hiện thông qua việc tích lũy, tổ chức và làm sạch tập dữ liệu. Ví dụ, khi mạng nơ-ron thất bại trong một số trường hợp hiếm, chúng ta sẽ không sửa lỗi bằng cách viết mã, mà chỉ cần thêm nhiều dữ liệu trong các trường hợp đó.
Ai sẽ phát triển IDE đầu tiên dành cho phần mềm 2.0? Nó nên hỗ trợ tất cả các quy trình làm việc liên quan đến tập dữ liệu: tích lũy dữ liệu, trực quan hóa, làm sạch dữ liệu, gắn nhãn dữ liệu, tạo dữ liệu. Có thể IDE này sẽ lọc ra các hình ảnh mà mạng nghi ngờ bị gắn nhãn sai dựa trên tổn thất của từng mẫu, hoặc hỗ trợ gắn nhãn bằng cách dự đoán gợi ý nhãn phù hợp, hoặc đề xuất các mẫu cần gắn nhãn dựa trên độ bất định của mạng.
Tương tự, Github là một website cực kỳ thành công trong thời đại phần mềm 1.0. Liệu có thể có một Github thời đại phần mềm 2.0? Trong thời đại phần mềm 2.0, kho chứa sẽ là tập dữ liệu, và commit sẽ gồm việc thêm và chỉnh sửa nhãn dữ liệu. Các công cụ quản lý gói và triển khai truyền thống như pip, conda, docker giúp chúng ta triển khai và cài đặt phần mềm dễ dàng hơn. Trong thời đại phần mềm 2.0, làm thế nào để triển khai, chia sẻ, nhập và chạy phần mềm hiệu quả hơn? Trong mạng nơ-ron, thứ tương đương với conda sẽ là gì?
Tóm lại, trong các lĩnh vực mà việc đánh giá lặp lại với chi phí thấp là khả thi và thuật toán khó thiết kế tường minh, phần mềm 2.0 sẽ ngày càng phổ biến. Khi xem xét toàn bộ hệ sinh thái phát triển và cách thích nghi với mô hình lập trình mới này, chúng ta thấy có rất nhiều cơ hội hấp dẫn. Về lâu dài, mô hình lập trình này có tương lai tươi sáng, bởi ngày càng rõ ràng rằng: nếu một ngày nào đó chúng ta phát triển được trí tuệ nhân tạo tổng quát (AGI), thì chắc chắn sẽ thông qua phần mềm 2.0.
Chào mừng tham gia cộng đồng chính thức TechFlow
Nhóm Telegram:https://t.me/TechFlowDaily
Tài khoản Twitter chính thức:https://x.com/TechFlowPost
Tài khoản Twitter tiếng Anh:https://x.com/BlockFlow_News










