Neural Architecture Search (NAS)
Tìm kiếm kiến trúc mạng nơ-ron (NAS) tự động hóa việc thiết kế mạng nơ-ron bằng cách tìm kiếm trên các lớp và kết nối. Tìm hiểu các phương pháp, chi phí tính toán và model được tạo bằng NAS.
Tìm kiếm kiến trúc mạng nơ-ron (NAS) là nhánh machine learning tự động (AutoML) tự động thiết kế cấu trúc của một mạng nơ-ron. Thay vì để kỹ sư tự chọn tích chập và các loại layer khác, độ sâu, độ rộng và kết nối, thuật toán tìm kiếm đề xuất các kiến trúc ứng viên, ước tính hiệu quả của từng kiến trúc trên tác vụ rồi dùng kết quả để đề xuất kiến trúc tốt hơn. Mục tiêu thường là độ chính xác, đôi khi kết hợp với chi phí như độ trễ suy luận, số lượng tham số hoặc FLOPs trên phần cứng đích. NAS đã tạo ra một số backbone thị giác máy tính được sử dụng rộng rãi, bao gồm EfficientNet và MobileNetV3.
Cách NAS hoạt động#
Bài tổng quan trên Journal of Machine Learning Research phân loại các phương pháp NAS theo ba khía cạnh:
- Không gian tìm kiếm: Tập hợp các kiến trúc có thể xây dựng, chẳng hạn các loại phép toán, kích thước kernel và kết nối skip được phép, cũng như cách nối chúng. Nhiều phương pháp tìm kiếm một cell nhỏ có mẫu lặp lại rồi xếp chồng các bản sao của cell đó; cách này thu hẹp không gian tìm kiếm và cho phép chuyển cell tìm được trên dataset nhỏ sang dataset lớn.
- Chiến lược tìm kiếm: Thuật toán chọn các ứng viên để thử, từ bộ điều khiển học tăng cường và thuật toán tiến hóa đến phương pháp dựa trên gradient và lấy mẫu ngẫu nhiên đơn giản.
- Chiến lược ước tính hiệu năng: Cách chấm điểm ứng viên mà không cần huấn luyện đầy đủ, bằng cách giảm số epoch huấn luyện, dùng ảnh hoặc dataset nhỏ hơn, dự đoán độ chính xác cuối cùng hoặc chia sẻ trọng số giữa các ứng viên.
Từ hàng nghìn GPU-ngày xuống còn vài giờ#
Các phương pháp NAS đời đầu tốn kém vì từng ứng viên đều được huấn luyện đến khi hội tụ. Trong nghiên cứu năm 2016 của Zoph và Le, một bộ điều khiển hồi quy được huấn luyện bằng học tăng cường tạo ra các mạng; quá trình tìm kiếm chạy đồng thời trên 800 GPU. Nghiên cứu tiếp theo về NASNet dùng 500 GPU trong bốn ngày để tìm một cell trên CIFAR-10 có thể chuyển sang ImageNet. AmoebaNet đạt kết quả tương tự bằng thuật toán tiến hóa có regularization với chi phí khoảng 3,150 GPU-ngày. ENAS rút ngắn thời gian tìm kiếm xuống dưới 16 giờ trên một GPU bằng cách chia sẻ trọng số model giữa mọi ứng viên, xem chúng như các đồ thị con của một mạng lớn; còn DARTS chuyển lựa chọn phép toán rời rạc thành trọng số liên tục để có thể tối ưu chính kiến trúc bằng gradient descent trong vài GPU-ngày. Kết quả benchmark cũng giúp điều chỉnh kỳ vọng trong lĩnh vực này: tìm kiếm ngẫu nhiên có dừng sớm đạt kết quả ít nhất ngang ENAS trên benchmark Penn Treebank và CIFAR-10.
NAS có nhận biết phần cứng và các model được xây dựng bằng NAS#
Tác động thực tiễn lớn nhất của NAS là tạo ra các model hiệu quả cho AI edge, nơi cần cân bằng độ chính xác với tốc độ trên một thiết bị cụ thể. MnasNet đưa độ trễ đo trên điện thoại thực vào hàm mục tiêu tìm kiếm, đạt độ chính xác top-1 trên ImageNet là 75.2% ở mức 78 ms trên điện thoại Pixel, nhanh hơn MobileNetV2 1.8 lần và chính xác hơn 0.5%. EfficientNet được tạo ra từ một quy trình tìm kiếm tương tự rồi mở rộng thành họ B1-B7 bằng phương pháp scale kết hợp; MobileNetV3 kết hợp NAS có nhận biết phần cứng với thuật toán NetAdapt để tinh chỉnh cho CPU di động. Trong lĩnh vực phát hiện đối tượng, các model YOLO-NAS của Deci, được tìm ra bằng công cụ tìm kiếm AutoNAC và thiết kế để giảm thiểu tổn thất độ chính xác sau lượng tử hóa INT8, có thể chạy trong package Ultralytics thông qua class NAS để suy luận, validation và export, nhưng không hỗ trợ huấn luyện. NVIDIA đã mua lại Deci; nhóm phát triển ban đầu không còn cập nhật các model này.
Ví dụ NAS tối giản#
Ví dụ sau chạy chiến lược tìm kiếm đơn giản nhất, tức lấy mẫu ngẫu nhiên, trên một không gian tìm kiếm nhỏ gồm các perceptron đa lớp với bộ chữ số viết tay của scikit-learn. Mỗi ứng viên chỉ được huấn luyện trong 30 epoch để ước tính hiệu năng với chi phí thấp, rồi được chấm điểm trên dữ liệu validation:
import random
import warnings
from sklearn.datasets import load_digits
from sklearn.exceptions import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
warnings.simplefilter("ignore", ConvergenceWarning) # short training runs are the cheap estimate
X, y = load_digits(return_X_y=True)
X_train, X_val, y_train, y_val = train_test_split(X / 16, y, random_state=0)
# Search space: 1-3 hidden layers, each 8-128 units wide. Search strategy: 12 random samples
random.seed(0)
space = [8, 16, 32, 64, 128]
candidates = {tuple(random.choices(space, k=random.randint(1, 3))) for _ in range(12)}
# Performance estimation: train each candidate for only 30 epochs, then score it on validation data
scores = {}
for layers in candidates:
model = MLPClassifier(hidden_layer_sizes=layers, max_iter=30, random_state=0)
scores[layers] = model.fit(X_train, y_train).score(X_val, y_val)
worst, best = min(scores, key=scores.get), max(scores, key=scores.get)
print(f"{len(scores)} architectures: worst {worst} {scores[worst]:.3f}, best {best} {scores[best]:.3f}")12 mẫu tạo ra 10 kiến trúc riêng biệt; độ chính xác validation dao động từ 0.398 với hai lớp, mỗi lớp có 8 unit, đến 0.978 với các lớp lần lượt có 128, 128 và 16 unit, nên chỉ riêng lựa chọn kiến trúc đã làm độ chính xác chênh gần 60 điểm. Một lần chạy NAS đầy đủ sẽ huấn luyện lại kiến trúc chiến thắng đến khi hội tụ và báo cáo điểm số trên một tập kiểm tra riêng biệt.
NAS và các thuật ngữ liên quan#
- Tinh chỉnh siêu tham số: Tối ưu hóa các thiết lập huấn luyện, chẳng hạn như learning rate, cho một kiến trúc cố định. NAS xem chính kiến trúc là biến cần tối ưu, và hai phương pháp này thường được chạy cùng nhau.
- Cắt tỉa model và chưng cất tri thức: Thu nhỏ hoặc bắt chước một mạng hiện có sau khi huấn luyện, trong khi NAS tìm kiếm một thiết kế hiệu quả trước khi huấn luyện.
- Học chuyển giao: Tái sử dụng các trọng số đã học của một model được huấn luyện trước. NAS quyết định cấu trúc mà các trọng số đó sẽ lấp đầy, và các mạng do NAS tìm ra, chẳng hạn như EfficientNet, cũng là những backbone được huấn luyện trước phổ biến.










