Thỉnh thoảng tôi thấy mọi người nhắc đến neural networks (mạng nơ-ron nhân tạo) chỉ là “một công cụ khác trong hộp công cụ machine learning (học máy) mà thôi”. Chúng có một số ưu và nhược điểm, hiệu quả ở một số nơi, và đôi khi bạn có thể sử dụng chúng để giành chiến thắng trong các cuộc thi Kaggle. Thật không may, cách giải thích này hoàn toàn bỏ lỡ rất nhiều thứ. Mạng nơ-ron nhân tạo không chỉ là một bộ phân loại khác, chúng đại diện cho sự khởi đầu của một sự thay đổi cơ bản trong cách chúng ta viết phần mềm. Chúng là Phần mềm 2.0 (Software 2.0).

“Ngăn xếp cơ bản” của Phần mềm 1.0 là những gì quen thuộc với chúng ta – được viết bằng những ngôn ngữ như Python, C++, v.v… Nó bao gồm các hướng dẫn tường minh cho máy tính được viết bởi một lập trình viên. 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 với một số hành vi mong muốn.

Ngược lại, Phần mềm 2.0 có thể được viết bằng ngôn ngữ trừu tượng, không thân thiện với con người, chẳng hạn như trọng số của một mạng nơ-ron nhân tạo. Không có con người nào tham gia vào việc viết mã này bởi vì có trọng số rất lớn (các mạng thông thường có thể có hàng triệu) và mã hóa trực tiếp trong từng mảng đó khá là khó (tôi đã thử rồi).

Software 2.0

Thay vào đó, cách tiếp cận của chúng tôi là xác định một số mục tiêu về hành vi của một chương trình mong muốn (ví dụ, “đáp ứng một tập dữ liệu các cặp đầu ra đầu vào của các ví dụ”, hoặc “giành chiến thắng trong một ván cờ vây”), viết một bộ khung thô những dòng lệnh (ví dụ một kiến trúc mạng nơ-ron nhân tạo), nhằm xác định một tập hợp con trong không gian của chương trình để tìm kiếm và sử dụng các tài nguyên tính toán mà ta có, để tìm kiếm không gian cho một chương trình có thể chạy được. Trong trường hợp cụ thể của các mạng nơ-ron nhân tạo, chúng tôi giới hạn tìm kiếm trong một tập hợp con liên tục thay đổi trong không gian chương trình, nơi quá trình tìm kiếm có thể được thực hiện hiệu quả (một cách ngạc nhiên) với backpropagation (truyền ngược)  và stochastic gradient descent (**).

software 2.0

Điều đó chỉ ra rằng một phần lớn các vấn đề trong thế giới thực có đặc tính là thu thập dữ liệu dễ dàng hơn một cách đáng kể (hay nói chung chung hơn là xác định một hành vi mong muốn) so với việc viết chương trình một cách tường minh. Trong những trường hợp này, các lập trình viên sẽ chia thành hai đội. Các Lập trình viên 2.0 tự sắp xếp, bảo trì, thay đổi, làm sạch và gắn nhãn bộ dữ liệu; mỗi bộ dữ liệu được gắn nhãn sẽ lập trình cho hệ thống cuối cùng vì bộ dữ liệu được biên dịch thành mã Phần mềm 2.0 thông qua bộ tối ưu hóa. Trong khi đó, các Lập trình viên 1.0 duy trì các công cụ xung quanh, phân tích, trực quan hóa, dán nhãn những interface, cơ sở hạ tầng và mã đào tạo.

Quá trình chuyển đổi đang diễn ra

Hãy xem qua một số ví dụ cụ thể về quá trình chuyển đổi đang diễn ra này. Trong mỗi lĩnh vực này, chúng tôi đã thấy những cải tiến trong vài năm qua khi chúng tôi từ bỏ việc cố gắng giải quyết một vấn đề phức tạp bằng cách viết mã một cách tường minh và thay vào đó chuyển mã vào ngăn xếp 2.0.

Nhận diện trực quan thường bao gồm những tính năng được thiết kế kết hợp với một chút machine learning ở phía cuối (ví dụ: một SVM). Kể từ đó, chúng tôi đã phát hiện ra các tính năng trực quan mạnh mẽ hơn nhiều bằng cách lấy các bộ dữ liệu lớn (ví dụ: ImageNet) và tìm kiếm trong không gian của các kiến ​​trúc Convolutional Neural Network (mạng nơ-ron nhân tạo tích chập). Gần đây, chúng tôi không tin tưởng vào chính mình để tự viết mã các kiến ​​trúc và chúng tôi cũng đã bắt đầu tìm kiếm trên đó.

Nhận diện giọng nói đã từng liên quan rất nhiều quá trình tiền xử lý, mô hình gaussian hỗn hợp và mô hình markov ẩn, nhưng ngày nay hầu như bao gồm các công cụ mạng nơ-ron nhân tạo. Một trích dẫn khá liên quan và hài hước của Fred Jelinek từ năm 1985 như sau: “Mỗi khi tôi sa thải một nhà ngôn ngữ học, hiệu suất của hệ thống nhận dạng giọng nói của chúng tôi tăng lên.”

Tổng hợp giọng nói đã được tiếp cận trong lịch sử với các cơ chế ghép nối khác nhau, nhưng ngày nay, mọi người hay dùng là những ConvNet lớn (ví dụ WaveNet) có thể tạo ra tín hiệu âm thanh thô.

Dịch máy thường được tiếp cận với các kỹ thuật thống kê dựa trên cụm từ, nhưng mạng nơ-ron nhân tạo đang nhanh chóng chiếm thế độc tôn. Kiến trúc yêu thích của tôi được đào tạo trong môi trường đa ngôn ngữ, trong đó một mô hình duy nhất dịch từ bất kỳ ngôn ngữ nguồn nào được dịch sang bất kỳ ngôn ngữ đích và được cài đặt trong môi trường giám sát kém (hoặc hoàn toàn không được giám sát).

Trò chơi. Các chương trình dành riêng cho trò chơi cờ vây do con người lập trình đã được phát triển từ lâu, nhưng AlphaGo Zero (một ConvNet có thể nhìn vào trạng thái của bàn cờ và rồi thực hiện bước đi) giờ đã trở thành người chơi mạnh nhất của trò chơi. Tôi hy vọng chúng tôi sẽ thấy kết quả rất giống nhau trong các lĩnh vực khác, ví dụ: DOTA 2, hoặc StarCraft 2.

Cơ sở dữ liệu. Nhiều hệ thống truyền thống ngoài Trí tuệ nhân tạo cũng đang chứng kiến ​​những dấu hiệu đầu của quá trình chuyển đổi. Chẳng hạn, “Trường hợp cho các cấu trúc chỉ mục tự học” thay thế các thành phần cốt lõi của hệ thống quản lý dữ liệu bằng mạng nơ-ron nhân tạo, vượt trội hơn đến 70% tốc độ một B-Trees được tối ưu hóa bộ nhớ cache, trong khi đó tiết kiệm được rất nhiều bộ nhớ.

Bạn có thể nhận thấy rằng nhiều đường dẫn của tôi ở trên liên quan đến công việc được thực hiện tại Google. Điều này là do Google hiện đang đi đầu trong việc viết lại các đoạn lớn mã nguồn thành mã Phần mềm 2.0. “Một mô hình thống trị tất cả” cung cấp một bản phác thảo sơ khai về những gì phần mềm này có thể trở thành, là nơi mà sức mạnh thống kê của các lĩnh vực riêng lẻ được hợp nhất thành một phần mềm có 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 nên chuyển các chương trình phức tạp sang Phần mềm 2.0? Rõ ràng, một câu trả lời dễ dàng là chúng hiệu quả hơn trong thực tế. Tuy nhiên, có rất nhiều lý do thuận tiện khác để chọn loại ngăn xếp này. Hãy cùng xem một số lợi ích của Phần mềm 2.0 (nghĩ đến: một ConvNet) so với Phần mềm 1.0 (nghĩ đến: mã cơ sở C ++ cấp sản xuất). Phần mềm 2.0 sẽ:

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

Dễ dàng đến thung lũng Silicon. Như một hệ quả tất yếu, vì tập lệnh của mạng lưới nơ-ron nhân tạo tương đối nhỏ, việc triển khai các mạng này vào các công ty ở Silicon trở nên dễ dàng hơn rất nhiều, ví dụ: với ASIC tùy chỉnh, chip biến đổi thần kinh , v.v. Thế giới sẽ thay đổi khi trí thông minh năng lượng thấp trở nên phổ biến xung quanh chúng ta. Ví dụ: các chip nhỏ, rẻ tiền có thể đi kèm với ConvNet trước khi được luyện tập, bộ nhận dạng giọng nói và mạng tổng hợp giọng nói WaveNet đều được tích hợp trong một protobrain (nguyên mẫu não) nhỏ mà bạn có thể gắn vào mọi thứ..

Có running time (Thời gian chạy) liên tục. Mỗi lần lặp của một lần chuyển tiếp mạng nơ-ron nhân tạo điển hình sẽ lấy chính xác cùng một lượng FLOPS. Sẽ không có thay đổi nào dựa trên các đường dẫn thực thi khác nhau mà mã của bạn có thể đi qua một số cơ sở mã C ++ đang mở rộng. Tất nhiên, bạn có thể có các biểu đồ tính toán động nhưng luồng thực thi thường vẫn bị hạn chế đáng kể. Bằng cách này, chúng tôi cũng gần như được đảm bảo để không bao giờ thấy mình trong các vòng lặp vô hạn ngoài ý muốn.

Sử dụng bộ nhớ liên tục. Cũng liên quan đến vấn đề trên, không có bộ nhớ được phân bổ động ở bất cứ đâu nên cũng có rất ít khả năng hoán đổi vào đĩa hoặc rò rỉ bộ nhớ mà khiến bạn phải tìm kiếm trong mã của mình.

Rất di động. Một chuỗi các phép nhân ma trận sẽ dễ dàng chạy trên các cấu hình tính toán tùy ý một cách đơn giản hơn nhiều so với các mã nhị phân hoặc tập lệnh cổ điển.

Rất nhanh. Nếu bạn có mã C ++ và ai đó muốn bạn làm cho nó nhanh gấp đôi (với chi phí hiệu năng nếu cần), thì việc điều chỉnh hệ thống với thông số kỹ thuật mới là rất khó. Tuy nhiên, trong Phần mềm 2.0, ta có thể lấy mạng lưới của mình, loại bỏ một nửa số kênh, đào tạo lại và xong – nó sẽ chạy chính xác với tốc độ gấp đôi tuy sẽ chạy kém hơn một chút. Ngược lại, nếu bạn có thể  nhận được thêm nhiều dữ liệu/sức 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 thêm nhiều kênh và đào tạo lại.

Các mô-đun có thể kết hợp thành một tổng thể tối ưu. Phần mềm của chúng tôi thường được phân tách thành các mô-đun có thể giao tiếp thông qua các public functions (hàm công cộng), API (giao diện lập trình ứng dụng) hoặc endpoints (điểm cuối). Tuy nhiên, nếu hai mô-đun Phần mềm 2.0 được đào tạo tương tác riêng lẻ từ đầu, chúng tôi có thể dễ dàng truyền ngược toàn bộ quá trình. Hãy suy nghĩ về mức độ tuyệt vời của nó nếu trình duyệt web của bạn có thể tự động thiết kế lại các hướng dẫn hệ thống cấp thấp 10 ngăn xếp cùng lúc để đạt được hiệu quả cao hơn trong việc tải các trang web. Với 2.0, đó là hành vi mặc định.

Nó tốt hơn bạn. Cuối cùng, và quan trọng nhất, mạng nơ-ron nhân tạo là một đoạn mã tốt hơn bất cứ thứ gì bạn hay tôi có thể nghĩ ra trong phần lớn các ngành từ lớn đến nhỏ, hiện ít nhất cũng phải liên quan đến với hình ảnh/video và âm thanh/giọng nói .

Hạn chế của Phần mềm 2.0

Ngăn xếp 2.0 cũng có một số nhược điểm riêng của nó. Vào cuối quy trình tối ưu hóa, những gì có được là những hệ thống lớn làm việc hiệu quả, nhưng sẽ rất khó để chỉ ra rằng nó làm việc như thế nào. Trong nhiều lĩnh vực ứng dụng, ta sẽ có thể chọn hoặc là sử dụng mô hình chính xác 90% mà ta hiểu hoặc hai là sử dụng mô hình chính xác 99% mà ta không hiểu.

Ngăn xếp 2.0 có thể thất bại theo những cách không trực giác và đáng xấu hổ, hoặc tệ hơn, chúng có thể âm thầm thất bại, ví dụ, bằng cách âm thầm áp dụng các khuynh hướng không mong muốn ​​trong dữ liệu đào tạo của chúng, là thứ rất khó để phân tích và xem xét cẩn thận khi kích thước của chúng có thể lên đến hàng triệu trong phần lớn trường hợp.

Cuối cùng, chúng tôi vẫn phát hiện ra một số tính chất riêng biệt của ngăn xếp này. Ví dụ, sự tồn tại của các ví dụ và các cuộc tấn công đối nghịch làm nổi bật bản chất không có trực giác của ngăn xếp này.

Lập trình trong ngăn xếp 2.0

Phần mềm 1.0 là mã chúng ta viết. Phần mềm 2.0 là mã được viết bởi sự tối ưu hóa dựa trên một tiêu chí đánh giá (chẳng hạn như phân loại chính xác dữ liệu đào tạo này). Rất có khả năng bất cứ cài đặt nào mà chương trình không thể thấy một cách hiển nhiên nhưng lại có thể liên tục đánh giá hiệu suất của nó (ví dụ: bạn đã phân loại một số hình ảnh chính xác chưa? Bạn có thắng trò chơi cờ vây không?) sẽ là đối tượng cho sự chuyển dịch này, vì sự tối ưu hóa có thể tìm ra mã tốt hơn nhiều so với những gì con người có thể viết.

Những lăng kính mà từ đó giúp chúng ta nhìn thấy những xu hướng rất quan trọng. Nếu như bạn nhận thấy Phần mềm 2.0 là một mô hình lập trình mới và đang phát triển thay bằng việc coi mạng nơ-ron nhân tạo như một bộ phân loại khá ổn trong kỹ thuật machine learning thì phép ngoại suy trở nên hiển nhiên hơn, và ta có thể thấy rõ rằng còn rất nhiều việc phải làm.

Cụ thể, chúng tôi đã xây dựng một số lượng lớn công cụ hỗ trợ con người trong việc viết mã 1.0, chẳng hạn như các IDE mạnh mẽ với các tính năng như highlight lại cú pháp, debugger (trình tìm lỗi), trình biên dịch, tích hợp định nghĩa, tích hợp git, v.v. Trong ngăn xếp 2.0, lập trình được thực hiện bằng cách tích lũy, nhào nặn và dọn dẹp bộ dữ liệu. Ví dụ: khi mạng bị lỗi trong một số trường hợp khó hoặc hiếm thấy, chúng tôi không khắc phục các dự đoán đó bằng cách viết mã, mà bằng cách thêm nhiều những ví dụ được có dán nhãn liên quan đến các trường hợp đó. Ai sẽ là người phát triển IDE Phần mềm 2.0 đầu tiên giúp tất cả các quy trình công việc trong việc tích lũy, trực quan hóa, dọn dẹp, dán nhãn và tìm nguồn dữ liệu? Có lẽ IDE sẽ có thể tạo ra các hình ảnh mà hệ thống nghi ngờ đã bị gắn nhãn sai dựa trên mỗi ví dụ thiếu xót hoặc hỗ trợ việc dán nhãn bằng cách gán rải rác nhãn với các dự đoán, hay gợi ý các ví dụ hữu ích để gắn nhãn dựa trên những dự đoán không chắc chắn của hệ thống.

Tương tự, Github là một ngôi nhà rất thành công cho mã Phần mềm 1.0. Liệu có không gian cho Phần mềm 2.0 Github không? Trong trường hợp này, kho lưu trữ là các bộ dữ liệu và các commits được tạo thành từ các bổ sung và chỉnh sửa của các nhãn.

Trong ngắn hạn / trung hạn, Phần mềm 2.0 sẽ ngày càng trở nên phổ biến trong bất kỳ lĩnh vực nào mà việc đánh giá lặp đi lặp lại có thể thực hiện và có chi phí rẻ, và ở đó thuật toán khó có thể thiết kế rõ ràng. Và về lâu dài, tương lai của mô hình này rất sáng lạn bởi vì ngày càng nhiều người biết rõ rằng khi chúng tôi phát triển AGI, nó chắc chắn sẽ được viết bằng Phần mềm 2.0.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.