Dịch từ bài viết Software 2.0 của tác giả Andrej Karpathy - giám đốc mảng AI của Tesla.

Đôi khi tôi thấy người khác nhìn những mạng neuron chỉ như “một món mới trong bộ công cụ Machine Learning”. Suy nghĩ đó có một số ưu nhược điểm, nó đúng ở đâu đấy, và đôi khi nó giúp bạn thắng ít trận Kaggke1. Không may là sự diễn dịch này hoàn toàn là thấy cây mà quên mất rừng. Những mạng neuron không đơn thuần chỉ là một loài khác trong bảng phân loại, chúng đại diện cho sự khởi đầu của một cuộc chuyển dịch lớn trên nền tảng lập trình của chúng ta. Đó là Phần-mềm-2.0.

Stack cổ điển của Phần-mềm-1.0 là những gì tất cả chúng ta đã quen thuộc – chúng được viết bởi C++, Python hay vân vân ngôn ngữ nào đó khác. Chúng chứa những hướng dẫn cho máy tính được viết tường mibh bởi một lập trình viên nào đấy. Với mỗi dòng mã, lập trình viên đặt ra một điểm cụ thể trong không gian chương trình với một hành vi mong muốn.

Ngược với đó, Phần mềm 2.0 được tạo ra từ những trọng số của mạng neuron. Chẳng con người nào dính dáng vào việc viết chúng vì trọng số quá sức phức tạp (một mạng điển hình có thể có tới hàng triệu trọng số) và viết trực tiếp trọng số là một việc rất khó (tôi từng thử rồi). Thay vào đó, chúng ta đặt ra một số ràng buộc trên hành vi của chương trình được kỳ vọng (một tập hợp các đầu vào và đầu ra mẫu là một ví dụ) và sử dụng những tài nguyên tính toán theo ý của chúng ta để tìm kiếm không gian chương trình đáp ứng được các ràng buộc. Trong trường hợp của mạng neuron, chúng ta hạn chế tìm kiếm những vùng không gian liên tục nơi mà (hơi lạ thường) các kỹ thuật Truyền-ngược và Gradient-Descent-Ngẫu-nhiên2 hoạt động hiệu quả.

Điều đó gợi ra rằng phần lớn các vấn đề của thế giới thực có một tính chất là dễ thu thập dữ liệu (hay tổng quát là nhận diện hành vi) của chúng hơn là viết tường minh chúng thành chương trình. Phần lớn các lập trình viên ngày mai sẽ không bảo trì những kho phần mềm phức tạp, viết những chương trình lộn xộn, hay làm những phép đo thời gian thực thi. Thay vào đó, họ thu thập, làm sạch, thao tác, đính nhãn, phân tích, và trực quan hoá dữ liệu được sử dụng cho những mạng neuron.

Phần-mềm-2.0 sẽ không thay thế cho thế hệ trước của nó (trong thực tế, nó cần một lượng lớn hạ tầng của 1.0 cho việc huấn luyện và suy luận ra “mã” 2.0), nhưng nó đang thay thế một lượng lớn và ngày càng tăng những Phần-mềm-1.0 đang hoạt động. Hãy thử điểm qua một số ví dụ về những chuyển đổi đang diễn ra để nhìn rõ hơn:

Nhận dạng hình ảnh đang sử dụng kết hợp công nghệ máy học (ví dụ SVM3) vào một phẩn *nhỏ của những tính năng kỹ thuật hiện tại. Kể từ đó, chúng ta có thể phát triển những máy *nhận diện hình ảnh mạnh mẽ hơn (trong họ kiến trúc mạng ConvNet), và mới gần đây thôi *chúng ta đã bắt đầu tìm kiếm trên những kiến trúc.

Nhận diện giọng nói từng sử dụng rất nhiều tiến trình tiền xử lý, các mô hình Gau-xơ, *và các mô hình Markov ẩn, nhưng ngày nay hầu như toàn bộ sử dụng mạng neuron. *Một bài báo hài hước được trích dẫn bởi Fred Jelinek từ năm 1985 viết: “Mỗi khi tôi bắn *một nhà ngôn ngữ học, hiệu suất nhận dạnh giọng nói của chúng ta lại tăng lên.”

Tổng hợp giọng nói có một lịch sử phát triển với nhiều cơ chế khác nhau, nhưng ngayf *nay nghệ thuật mẫu mực là những mạng ConvNet lớn (ví dụ [WaveNet][wavenet]) có khả năng *xuất ra tín hiệu âm thanh thô.

Máy dịch trước đây thường sử dụng phương án dịch dựa trên thôgns kê cụm từ, nhưng *những mạng neuron đã nhanh chóng trở nên vượt trội. Những kiến trúc yêu thích của tôi *được huấn luyện trong môi trường đa ngôn ngữ, nơi mà một mô hình dịch đơn *lẻ dịch bất kỳ ngôn ngữ nguồn nào sang bất kỳ ngôn ngữ đích nào, bởi những tùy chỉnh được *giám sát hời hợt (hoặc hoàn toàn không được giám sát).

Trò chơi. Trò chơi cờ vây đã tồn tại hàng nghìn năm, nhưng AlphaGo Zero (một *mạng ConvNet quan sát trạng thái thô của bàn cờ và ra nước đi) giờ đây đã trở thành tân *vô địch. Tôi chờ đợi chúng ta được thấy điều tương tự xảy ra với những lĩnh vực trò chơi *khác, như DOTA 2 hay [StarCraft][starcraft].

Công nghệ robot có một truyền thống lâu dài về việc chia nhỏ vấn đề thành các khối của *cảm biến, dự đoán, lập kế hoạch, điều khiển, lập mô hình không chắc chắn… bằng cách sử *dụng các biểu diễn và thuật toán tường minh lên các đại diện trung gian. Chúng tôi không *chắc chắn lắm vào thời điểm này, nhưng những nghiên cứu mới đây tại UC *BerkeleyGoogle gợi ra một thực tế rằng Phần-mềm-2.0 có thể đã đủ *khả năng để làm công việc tái biểu diễn này một cách tốt hơn.

Trong trường hợp Cơ sở Dữ liệu. Các hệ thống truyền thống ngoài Trí tuệ Nhân tạo cũng đã nhìn thấy những gợi ý để chuyển đổi. Ví dụ, Học chọn Cấu trúc Chỉ mục thay thế các phần cốt lõi của DMS bằng mạng neuron, vượt trội hơn các cây nhị phân tối ưu cho bộ nhớ cache tới 70% về mặt tốc độ trong khi vẫn giữ được thang độ lớn trong bộ nhớ.

Bạn sẽ phát hiện ra rằng rất nhiều liên kết trong phần trên đang được thực hiện tại Google. Bởi vì chính Googke hiện đang đi đầu trong việc viết lại phần lớn mã nguồn của chính nó thành Phần-mềm-2.0. Một mô hình cho tất cả cung cấp một bản phác thảo ban đầu của bức tranh, ở nơi mà sức mạnh thống kê ở những lĩnh vực riêng biệt được hợp nhất lại thành một sự hiểu biết nhất quán về thế giới.

Lợi ích của Phần mềm 2.0

Tại sao chúng ta phải 1 quan tâm đến việc chuyển đổi những chương trình phức tạp thành Phần-mềm-2.0? Mặc dù đã có ngay đấy một câu trả lời dễ dàng là chúng hoạt động tốt hơn trong hành dụng. Nhưng vẫn còn rất nhiều nguyên nhân khác nữa thúc đẩy điều này. Hãy thử nhìn qua một vài nguyên nhân đã thúc đẩy Phần-mềm-2.0 (đơn cử như ConvNet) so với Phần-mềm-1.0 (hãy nghĩ về một sản phẩm đang phát hành được phát triển dựa trên mã C++). Những phần mềm 2.0 thì:

Đồng nhất. Một mạng neuron điển hình, thì đầu tiên, được tạo thành chỉ từ hai lớp vận *hành: phép nhân ma trận và ngưỡng ở mức không (ReLU). So với tập chỉ dẫn của những phần *mềm cổ điển thì nó bớt sự bất đồng và phức tạp đi đáng kể. Bởi vì bạn chỉ phải triển khai *Phần-mềm-1.0 cho một lượng nhỏ các tính toán cốt lõi (ví dụ nhân ma trận), nên về tổng *thể sẽ dễ dàng đảm bảo tính chính xác và hiệu năng hơn nhiều.

Dễ dập vào silic. Như một hệ quả, bởi vì tập chỉ lệnh của một mạng neuron là khá nhỏ, *ta có thể dễ dàng triển khai nó vào các con chip hơn nhiều, chúng ta đã có các con chíp *ASIC tùy biến, các chip neuromorphic, và nhiều nữa. Thế giới sẽ *thay đổi khi những trí thông minh tốn ít điện trở nên phổ biến xung quanh chúng ta. Ví *dụ, những con chip nhỏ và không hề đắt đỏ, chứa những mạng ConvNet được huấn luyện trước, *một máy nhận dạng giọng nói, và một máy tổng hợp giọng nói, tất cả được tích hợp vào một *đơn vị nhỏ mà bạn có thể đính vào bất cứ thứ gì.

Thời gian thực thi cố định. Mỗi vòng lặp của một mạng neuron điển hình có cùng một *lượng FLOPS. Không hề có sự biến thiên theo các đường thực thi khác nhau giống như khi *gặp phải ở mã C++. Tất nhiên, bạn có thể có đồ thị tính toán động, nhưng sự biến thiên *vẫn được hạn chế đáng kể. Nhờ đó chúng ta gần như được đảm bảo không bị sa vào những vòng *lặp vô hạn.

Lượng bộ nhớ sử dụng cố định. Liên quan đến vấn đề trên, không hề cần phân bổ bộ nhớ *động vào bất cứ đâu nhờ đó hạn chế đến tối thiểu nhu cầu ghi đệm vào ổ cứng, hay những *nguy rò rỉ bộ nhớ có thể hạ gục mã của bạn.

Khả năng di động cao. Một chuỗi các phép nhân ma trận hoàn toàn dễ thực thi trên các *cấu hình tính toán độc đoán hơn nhiều so với mã nhị phân hay chỉ thị cổ điển.

Vô cùng linh hoạt. Nếu bạn có mã C++ và ai đó muốn bạn làm cho mã nhanh gấp đôi (tốn *chi phí nếu cần thiết), công sức cần thiết để tinh chỉnh hệ thống đạt được điều đó sẽ rất *đáng kể. Tuy nhiên, trong trường hợp của Phần-mềm-2.0 chúng ta có thể lôi mạng của chúng *ta ra, bỏ đi một nửa số kênh, huấn luyện lại, và thế thôi - nó chạy nhanh hơn đúng hai *lần và làm việc tệ hơn một chút - như phép. Ngược với đó, nếu bỗng nhiên bạn có nhiều dữ *liệu và phép tính hơn, bạn có thể ngay lập tức làm cho chương trình của bạn hoạt động tốt *hơn chỉ bằng cách tăng thêm số kênh và huấn luyện lại.

Các mô-đun có thể hợp nhất thành chỉnh thể một cách tối ưu. Phần mềm của chúng ta *thường bị phân mảnh thành các mô-đun giao tiếp với nhau qua các hàm public, các API hay *các điểm đầu cuối. Tuy nhiên, nếu hai mô-đun Phần-mềm-2.0 được huấn luyện riêng biệt *tương tác với nhau, chúng ta có thể dễ dàng áp dụng truyền ngược trên toàn khối. Thử nghĩ *sẽ đáng kinh ngạc thế nào nếu trình duyệt của bạn có thể tự tái thiết kế lại hệ thống chỉ *lệnh mức thấp xuống 10 ngăn xếp để đạt được khả năng tải các trang web tốt hơn. Với 2.0, *khả năng đó là cố hữu.

Nó tốt hơn chính bạn. Cuối cùng, và cũng là quan trọng nhất, một mạng neuron là một *phần mã tốt hơn bất kỳ thứ gì bạn hay tôi có thể đưa ra cho một mảng lớn dọc theo những *gì có giá trị, trong đó ít nhất phải kể tới hình ảnh/video, âm thanh/giọng nói, và tài *liệu.

Những giới hạn của Phần-mềm-2.0

Trong stack 2.0 có một số điểm bất lợi. Sau khi kết thúc việc tối ưu hoá chúng ta sẽ để những mạng neuron đấy lại với công việc của chúng, và chúng làm tốt, nhưng chúng ta khó mà biết được là bằng cách nào. Trải qua rất nhiều lĩnh vực ứng dụng, chúng ta sẽ phải lựa chọn giữa việc sử dụng một mạng cho độ chính xác 90% mà chúng ta hiểu, hay một mạng cho độ chính xác 99% mà chúng ta không.

Stack 2.0 có thể hỏng theo những cách không hề dễ nhận biết hoặc tệ hơn là hoàn toàn âm thầm. Ví dụ, một thành kiến được âm thầm áp dụng trong dữ liệu được đùng để huấn luyện, thứ rất khó để phân tích cẩn thận và chính xác khi mà kích thước của chúng dễ dàng hoà lẫn vào hàng triệu trường hợp khác.

Cuối cùng, chúng ta vẫn đang khám phá một vài đặc tính riêng có của stack này. Ví dụ, sự tồn tại của các mẫu đối kháng và các cuộc tấn công làm lộ ra bản chất mơ hồ của stack này.

Một vài suy ngẫm.

Nếu bạn nghĩ mạng neuron như một stack phần mềm và không chỉ là một lớp phần mềm khá tốt, bạn sẽ nhanh chóng nhận ra rằng chúng có một lượng lớn lợi thế và rất nhiều tiềm năng để chuyển đổi phần mềm nói chung.

Hơn thế nữa, góc nhìn này ngay lập tức cho thấy còn rất nhiều việc phải làm trong lĩnh vực này. Ví dụ, trong stack 1.0, LLVM IR đã ổn cố tầng trung gian của một lượng lớn tiền điểm (các ngôn ngữ) và hậu điểm (các kiến trúc) và cung cấp cơ hội tối ưu hoá. Với mạng neuron chúng ta đã thấy một sự bùng nổ của các tiền điểm (PyTorch, TF, Chainer, mxnet, …) và hậu điểm (CPU, GPU, TPY?, IPU?…) nhưng thứ thì sẽ đóng vai của IR, và làm thế nào chúng ta có thể tối ưu hoá nó?

Một ví dụ khác, chúng ta có một số lượng lớn công cụ hỗ trợ con người viết mã 1.0, như các IDE mạnh mẽ với những tính năng như nổi bật cú pháp, tầm lỗi, tạo hồ sơ, nhảy tới định nghĩa, …Với 2.0 chúng ta không viết mã, nhưng chúng ta tập hợp các bộ dữ liệu mà ngụ ý về mã thông qua quá trình tối ưu hoá. Ai sẽ đi phát triển những IDE mạnh mẽ đầu tiên cho 2.0, thứ sẽ giúp chúng ta tích trữ, hình dung, làm sạch, đính nhãn, và sử dụng đữ liệu? Có thể IDE sẽ làm nổi lên những bức ảnh mà mạng cho rằng đã bị gắn sai nhãn, hoặc hỗ trợ ghi nhãn, hoặc gợi ý cho chúng ta đi tìm thêm mẫu ở những điểm mà mạng của chúng ta không chắc chắn.

Cuối cùng, về lâu về dài, tương lai của Phần-mềm-2.0 là rất sáng sủa bởi vì càng ngày càng nhiều người nhận thức được rằng khi chúng tôi phát triển AGI, nó chắc chắn sẽ được viết trong ngữ cảnh 2.0. Còn phần mềm 3.0? Nó hoàn toàn phụ thuộc vào AGI4.

  1. Một nền tảng tổ chức các cuộc thi xử lý dữ liệu với giải thưởng rất có giá trị.  

  2. Một kỹ thuật tính đạo hàm biến thiên nhỏ nhất được sử dụng phổ biến trong Machine Learning. 

  3. Support Vector Machine 

  4. Artificial General Intelligence