效能超過人類煉丹師,AutoGluon 低調開源

機器之心發表於2020-01-20

近日,亞馬遜正式推出了開原始碼庫 AutoGluon。開發者依靠僅僅幾行程式碼,就可以編寫出 AI 嵌入應用程式。

一個多月前,AutoGluon 在 GitHub 已經悄悄上線,但最近幾天才正式公開發布。

開發者「Justin ho」搶先體驗了一下 AutoGluon,以下是他的心得體會:

效能超過人類煉丹師,AutoGluon 低調開源

「ResNet-50 backbone + FasterRCNN 騎臉怎麼輸嘛。」

但,最終測試整合績非常出人意料,AutoGluon 通過 NAS 搜尋的結果直接高了六個點

效能超過人類煉丹師,AutoGluon 低調開源

對此,李沐表示:

效能超過人類煉丹師,AutoGluon 低調開源

知乎使用者 @Justin ho。

李沐在知乎上回應:

AutoML 使用大概 15 倍於單次訓練的代價,得到的結果可能比手調的要好。這個主要是對於 CV 而言,尤其是 detection 模型,預計 GluonCV 裡面模型很快贏來一大波提升。

AutoGluon 取了一個巧,我們目前只支援 GluonCV 和 GluonNLP 裡面的任務,和額外的 Tabular 資料(因為一個小哥之前有過經驗)。所以我們可以把以前的很有經驗東西放進去來減小搜參空間,從而提升速度。

當然 AutoGluon 還是早期專案,我本來想是讓團隊再開發一些時間再公開。還有太多有意思的應用、演算法、硬體加速可以做的。非常歡迎小夥伴能一起貢獻。

AutoGluon:新特性

效能超過人類煉丹師,AutoGluon 低調開源圖解 AutoGluon。

AutoGluon 支援易使用和易擴充套件的 AutoML,並專注於涵蓋影像、文字或表格資料的深度學習和實際應用。AutoGluon 適用於機器學習初學者和專家,能夠使他們:

  • 通過幾行程式碼即可快速地為資料構建深度學習原型方案;

  • 利用自動超引數微調、模型選擇/架構搜尋和資料處理;

  • 無需專家知識即可自動使用深度學習 SOTA 方法;

  • 輕鬆地提升現有定製模型和資料管道,或者根據用例自定義 AutoGluon。

支援功能

現在 AutoGluon 已經支援了以下一些應用:

  • 表格預測:基於資料表中一些列的值預測其他列的值;

  • 影像分類:識別影像中的主要物件;

  • 物件檢測:藉助影像中的邊界框檢測多個物件;

  • 文字分類:基於文字內容做出預測。

效能超過人類煉丹師,AutoGluon 低調開源

除了這些之外,AutoGluon 還可以進行神經架構搜尋,使用起來較為簡便。

怎樣使用 AutoGluon 呢?官方文件中提供了示例程式碼,機器之心進行了節選:

示例程式碼

表格預測

對於用表格形式(儲存為 CSV 檔案等)來表示的標準資料集來說,AutoGluon 可以自動根據其他列的值來預測某一列值。只需要呼叫一次 fit(),就可以在標準的監督學習任務(包括分類和迴歸)中實現很高的準確性,而無需資料清洗、特徵工程、超引數優化、模型選擇等等繁瑣的流程。

首先,匯入 AutoGluon 中預測表格的相關 api。

import autogluon as ag
from autogluon import TabularPrediction as task

載入資料(這裡使用官方教程提供的資料集)。

train_data = task.Dataset(file_path='https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv')
train_data = train_data.head(500) # subsample 500 data points for faster demo
print(train_data.head())

表格 train_data 中的每一行都對應單獨的訓練樣本。在官方教程提供的資料集中,每一行對應單個人,並且表格列包含各種統計特徵。

我們先來用這些特徵預測一下某個人的收入是否超過 5 萬美元,相關資訊記錄在該表的 class 列中。

效能超過人類煉丹師,AutoGluon 低調開源

然後進行訓練:

dir = 'agModels-predictClass' # specifies folder where to store trained models
predictor = task.fit(train_data=train_data, label=label_column, output_directory=dir)

載入測試集並測試:

test_data = task.Dataset(file_path='https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv')
y_test = test_data[label_column] # values to predict
test_data_nolab = test_data.drop(labels=[label_column],axis=1) # delete label column to prove we're not cheating
print(test_data_nolab.head())

影像分類

和表格預測任務類似,AutoGluon 可以自動對影像進行分類,並使用 GPU 進行訓練。

首先載入影像分類 api:

import autogluon as agfrom autogluon import ImageClassification as task

然後只需要短短几行程式碼就可以構建一個影像分類器(資料集為教程自帶資料集):

classifier = task.fit(dataset,epochs=10,ngpus_per_trial=1,verbose=False)

列印訓練結果中最好的:

print('Top-1 val acc: %.3f' % classifier.results['best_reward'])

對單一影像進行測試,這裡的 ag.get_gpu_count() 用於檢測是否有 GPU,如有則大於 0。

# skip this if training FashionMNIST on CPU.if ag.get_gpu_count() > 0:   
image = 'data/test/BabyShirt/BabyShirt_323.jpg'   
ind, prob = classifier.predict(image)
print('The input picture is classified as [%s], with probability %.2f.' % (dataset.init().classes[ind.asscalar()], prob.asscalar()))

在測試集上測試並列印結果:

test_acc = classifier.evaluate(test_dataset)
print('Top-1 test acc: %.3f' % test_acc)

神經架構搜尋

對於 AutoML 的框架來說,神經架構搜尋是很重要的一個應用。近來,流行的 NAS 方法,如 ENAS 和 ProxylessNAS 都通過構建一個超網路(supernet)並在不同的架構之間共享權重,從而加速搜尋速度。

效能超過人類煉丹師,AutoGluon 低調開源

ProxylessNAS 架構。

AutoGluon 也提供了相應的功能。

以「為硬體裝置搜尋合適的神經網路架構」為例:

首先,匯入相關 api。

import autogluon as ag
import mxnet as mx
import mxnet.gluon.nn as nn

然後使用 MXNet 框架構建一個 CNN 的基礎架構:

class Identity(mx.gluon.HybridBlock):   
  def hybrid_forward(self, F, x):     
    return x

class ConvBNReLU(mx.gluon.HybridBlock):   
  def __init__(self, in_channels, channels, kernel, stride):     
    super().__init__()     
    padding = (kernel - 1) // 2     
    self.conv = nn.Conv2D(channels, kernel, stride, padding, in_channels=in_channels)         self.bn = nn.BatchNorm(in_channels=channels)     
    self.relu = nn.Activation('relu')    
  def hybrid_forward(self, F, x):      
    return self.relu(self.bn(self.conv(x)))

構建一個 ENAS 單元用於架構搜尋:

from autogluon.contrib.enas import *

@enas_unit()
class ResUnit(mx.gluon.HybridBlock):   
  def __init__(self, in_channels, channels, hidden_channels, kernel, stride): 
    super().__init__()   
    self.conv1 = ConvBNReLU(in_channels, hidden_channels, kernel, stride)   
    self.conv2 = ConvBNReLU(hidden_channels, channels, kernel, 1)   
    if in_channels == channels and stride == 1:     
      self.shortcut = Identity()   
    else:     
      self.shortcut = nn.Conv2D(channels, 1, stride, in_channels=in_channels)       

  def hybrid_forward(self, F, x):     
    return self.conv2(self.conv1(x)) + self.shortcut(x)

使用序列程式碼塊(Sequential Block)建立 ENAS 網路。

mynet = ENAS_Sequential(   ResUnit(1, 8, hidden_channels=ag.space.Categorical(4, 8), kernel=ag.space.Categorical(3, 5), stride=2),   ResUnit(8, 8, hidden_channels=8, kernel=ag.space.Categorical(3, 5), stride=2),   ResUnit(8, 16, hidden_channels=8, kernel=ag.space.Categorical(3, 5), stride=2),   ResUnit(16, 16, hidden_channels=8, kernel=ag.space.Categorical(3, 5), stride=1, with_zero=True),   ResUnit(16, 16, hidden_channels=8, kernel=ag.space.Categorical(3, 5), stride=1, with_zero=True),   nn.GlobalAvgPool2D(), nn.Flatten(), nn.Activation('relu'), nn.Dense(10, in_units=16),)

mynet.initialize()#mynet.graph

定義獎勵函式:

reward_fn = lambda metric, net: metric * ((net.avg_latency / net.latency) ** 0.1)

最後開始訓練即可:

scheduler = ENAS_Scheduler(mynet, train_set='mnist',reward_fn=reward_fn, batch_size=128, num_gpus=1,warmup_epochs=0, epochs=1, controller_lr=3e-3,plot_frequency=10, update_arch_frequency=5)
scheduler.run()

AutoGluon 使用怎麼樣

目前 AutoGluon 網站已經有眾多教程了,開發者能用它快速處理各種結構化與非結構化資料。對於資深開發者,AutoGluon 還提供了一系列定製化的指南,我們能學會如何使用 AutoGluon 的 API 自動提升預測效能。

當然,由於 AutoGluon 目前仍在完善中,有些開發者表示,目前 AutoGluon 文件主要包含了核心流程,還有一些額外的工具沒有詳細介紹。

在知乎評論中,很多開發者表示 AutoGluon 在視覺任務上的效果很好,甚至如果採用 AutoGluon 自帶的 YOLOV3(mobilenet1.0 backbone),它的效果還要優於手動調參的 FasterRCNN(resnet50 backbone)。

這是非常令人驚訝的,畢竟 YOLOV3 是一種單階段的檢測器,它更擅長推理速度。而 FasterRCNN 這種二階段檢測器,雖然推理速度沒那麼快,但效果一般要更好。更不用說 AutoGluon 採用的骨幹網路只是 MobileNet 1.0,它的表達能力遠沒有 ResNet 50 強。綜合這兩種因素,AutoGluon 超過手動效果,就顯得非常令人驚訝了。

之前李沐就曾表示 AutoGluon 的使用代價差不多是單次訓練的 15 倍,所以在 15 次嘗試中,我們還真不一定能找到超越 AutoGluon 的整套超參。不過也有開發者認為要是有一個比較好的搜尋空間,隨機搜尋 15 次也能找到比較好的超參。李沐說:「AutoGluon 15 次 Search 的結果差不多類似於 Random Search 30 次,但前提是 Search Space 構造的比較好,不要太大與太小。」

目前很多開發者與研究者都已經在嘗試 AutoGluon 的效果,有些簡單調參工作既然機器做得更好,那麼為什麼不交給它們呢?演算法工程師該做的,應該是理解業務與資料,並作出新的調整與創新。

參考連結:

https://github.com/awslabs/autogluon
https://www.amazon.science/amazons-autogluon-helps-developers-get-up-and-running-with-state-of-the-art-deep-learning-models-with-just-a-few-lines-of-code
https://venturebeat.com/2020/01/09/amazons-autogluon-produces-ai-models-with-as-little-as-three-lines-of-code/

相關文章