當前位置:
首頁 > 新聞 > 「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

1新智元編譯

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

背景

傳統觀點一般認為,深度神經網路通常比較擅長從高維數據中學習,例如圖像或者語言,但這是建立在它們有大量標記的樣本來訓練的情況下。然而,人類卻擁有單樣本學習的能力——如果你找一個從來沒有見過小鏟刀的人,給他一張小鏟刀的圖片,他應該就能很高效的將它從其他廚房用具裡面鑒別出來。

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

這是一種對人類來說很容易的任務,但是直到我們想寫一個演算法讓它去做這件事……那就GG了 。很明顯,機器學習系統很希望擁有這種快速從少量樣本中去學習的能力,因為收集和標記數據是一個耗時費力的工作。而且,我認為這是通往通用人工智慧的漫漫長路中很重要的一步。

最近湧現出來很多有趣的基於神經網路的單樣本學習論文,它們已經得到了一些不錯的結果。這是一個讓我很激動的新領域,所以我想去對它做一個簡要介紹,來讓深度學習新手更好的認識它。

在這篇博客中,我想:

  • 介紹並定義單樣本學習問題

  • 描述單樣本分類問題的基準,並給出一個其性能的baseline

  • 給出一個少樣本學習的例子,並部分實現這篇論文中提到的模型

  • 指出一些大家通常不會想到的小點子

定義問題:N類別單樣本學習(One-shot Learning)

在我們解決任何問題之前,我們應該精準的定義出這個問題到底是什麼,下面是單樣本分類問題的符號化表示: 我們的模型只獲得了很少的標記的訓練樣本S,它有N個樣本,每個相同維度的向量有一個對應的標籤y

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

再給出一個待分類的測試樣例 。因為樣本集中每個樣本都有一個正確的類別 「深度神經網路 One-shot Learning」孿生網路少樣本精準分類,我們的目標是正確的預測y∈S中哪一個是的正確標籤。

這裡有很多種定義問題的方式,但上面是我們的定義,注意這裡有一些事項需要記錄一下:

現實生活中可能約束更少,可能一張圖片並不見得只有一個正確的類別

這個問題很容易泛化到 k-shot 學習,我們只需要把每個類別「深度神經網路 One-shot Learning」孿生網路少樣本精準分類僅有單個樣本換成 k 個樣本就可以了

當N很高時候,可能有更多可能的類別,所以正確預測類別更難

隨機猜的正確率是 「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

這裡有一些在Omniglot數據集上單樣本學習的例子,我會在下一部分介紹它。圖示分別為9類,25類,36類的單樣本學習任務。

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

關於數據集 Omniglot!

Omniglot數據集擁有50種文字,1623類手寫字元。對於每類字元僅有20個樣本,每個樣本分別由不同的人繪製而成,解析度為105*105。

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

上面是Omniglot數據集的一些例子,如圖所示,這裡有很多種字元,如果你喜歡機器學習,你肯定聽說過 MNIST 數據集。Omniglot有時被成為 MNIST 的轉置,因為它有1623類字元,每類只有20個樣本,相比 MNIST 的10個類別,每個類別都有上千樣本,正好相反。Omniglot 還有創作的筆畫數據,但是我們這裡用不到它。

通常,我們把樣本分為30類訓練樣本,剩下20類作為評估。所有這些不同的字元可以組成很多種單樣本學習任務,所以它確實是單樣本學習的一個很好的評估標準。

一個單樣本學習的 Baseline:1 近鄰

最簡單的分類方式是使用 k-近鄰方法,但是因為每個類別只有一個樣本,所以我們需要用 1近鄰。這很簡單,只需要計算測試樣本與訓練集中每個樣本的歐式距離,然後選擇最近的一個就可以了:

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

根據Koch等人的論文,在Omniglot數據集中的20類上,單樣本分類,1-nn可以得到大約28%的精度,28%看起來很差,但是它已經是隨機猜測(5%)的 6 倍了。這是一個單樣本學習演算法最好的baseline 或者「合理性測試」了。

Lake等人的 Hierarchical Bayesian Program Learning,層次貝葉斯程序學習(以下簡稱 HBPL)得到了大約 95.2%的精度,非常不錯。我只看懂了30%,但它非常有趣,它與深度學習直接從原始像素上訓練相比,是風馬牛不相及的,因為:

  1. HBPL使用筆畫數據,而不是僅僅用原始像素;

  2. HBPL在Omniglot數據集上學習一個筆畫的生成模型,這個演算法需要更加複雜的標註,所以不像深度學習能直接從狗、卡車、大腦掃描圖以及小鏟子等圖片的原始像素上去做單樣本學習,這種圖片也不是由筆畫構成的。

Lake等人也指出,人類可以在Omniglot 數據集 20類樣本上達到 95.5%的精度,僅僅比 HBPL高一點。在鑽牛角尖思想的引導下,我親自試驗了一下20類任務,達到了97.2%的精度。我並不是做的真正的單樣本學習,因為很多符號我本來就認識,因為我熟悉希臘字母、平假名和片假名,我把這些我本來就認識的移除,我還是得到了96.7%的精度。我認為是我從自己嚇人的字跡中練就了超人般的字元識別能力。

使用深度神經網路來做單樣本學習?!

如果我們單純的訓練一個用交叉熵損失的softmax分類器神經網路來做單樣本學習,很明顯,網路會嚴重過擬合。即便是每類給出上百個樣本,現代的神經網路依然會過擬合。深度網路有百萬級別的參數來擬合訓練數據,所以它們可以學習到一個巨大的函數空間(正式來說,是因為它們有一個很高的VC維,這就是為什麼它們可以很好的從複雜的高維數據中學習的部分原因)。

很不幸的是,神經網路這個優勢又成為了它們做單樣本學習的一大障礙。當有百萬級的參數需要做梯度下降,有這麼多可能學習到的映射關係,我們怎麼能設計一個網路,讓他可以從單個樣本去學習呢?

人類很容易從單個樣本就能學會小鏟刀或者字母Θ的意思,因為我們一輩子一直都在從相似對象中觀察和學習。把一個隨機初始化的神經網路與人類這種花了一輩子時間去識別物體和符號相比,的確不太公平,因為隨機初始化的神經網路對數據的映射結構缺乏先驗。這也是為什麼我看到的單樣本學習論文都是採用的從其他任務上的知識遷移方法。

神經網路非常擅長從結構化的複雜/高維數據中(例如圖像)提取特徵。如果給神經網路與單樣本學習任務相似的訓練數據,它或許能夠從這些數據中學習到有用的特徵,這些特徵可能不需要調整就能用到單樣本學習。這樣,我們仍舊能叫他單樣本學習,因為輔助的訓練數據與單樣本測試的數據不是相同的類別。(注意:這裡的特徵指的是「被用來訓練的數據的映射數據」——譯者註:例如經過CNN提取到的特徵)。

接下來以一個有趣的問題就是,我們如何設計一個神經網路讓它來學習特徵?最顯而易見的方法就是用遷移學習(如果有標記數據的話)——在訓練數據上訓練一個softmax分類器,然後在單樣本學習任務的數據集上微調最後一層的權重。實際上,神經網路分類器在Omniglot數據集上不會有什麼良好的表現,因為每類的樣本僅有幾個,即使是微調最後一層的權重,網路也會在訓練集上過擬合。但這種方法也比使用L2距離的 k-近鄰方法要好很多了(參考Matching Networks for One shot learning 中對各種單樣本學習方法的效果的比較)。

這裡還是有一種方法來做單樣本學習的!忘了1近鄰方法?這個簡單的,非參的單樣本學習器,計算測試集中的樣本與訓練集中每個樣本的L2距離,並選擇最近的作為它的類別。這種方法是ok的,但是L2距離會陷入嚴重的維度災難問題,所以它在成千維的數據上(像Omniglot)上表現不太好。

另外,如果你有兩個接近相同的圖片,如果你把其中一張圖片的像素向右移動一點,那麼兩張圖片的L2距離會從0一下子變得非常高。L2距離在這種任務上是一個非常糟糕的度量。深度學習能奏效嗎?我們可以使用深度卷積神經網路來學習一種非參的近鄰分類器可以使用的相似性函數。

孿生網路(Siamese Networks)

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

我原本打算放一張連顱雙胎作為這一節的介紹圖片呢,但是我最終認為孿生的小貓的圖片可能更好一點。

我在這篇教程中會實現一篇極好的論文中的方法(Siamese Neural Networks for One-shot lmage Recognition)。Koch 等人的單樣本學習方法是同時給神經網路兩張圖片以讓他來猜測兩張圖片是否是同一個類別。當我們做上面提到的單樣本分類任務的時候,網路可以比較測試集與訓練集中的每張圖片,然後挑選出哪一張與它最可能是同樣類別。所以我們想讓神經網路架構同時輸入兩張圖片,輸出它們屬於同一個類別的概率。

假設和是數據集中的2個類別,我們讓「深度神經網路 One-shot Learning」孿生網路少樣本精準分類表示 和 是同一個類別。注意,與「深度神經網路 One-shot Learning」孿生網路少樣本精準分類是等價的——這意味這如果我們顛倒輸入圖片的順序,輸出的概率是完成相同的,與「深度神經網路 One-shot Learning」孿生網路少樣本精準分類相等。這被稱為對稱性,孿生網路就是依賴它設計的。

對稱性是非常重要的,因為它要學習一個距離度量——到的距離應該等於到的距離。

如果我們僅僅把兩個樣本拼接起來,把它作為神經網路的單一的輸入,每個樣本將會是與一個不同權重集合的矩陣相乘(或纏繞),這會打破對稱性。沒問題,這樣子網路依然能成功的為每個輸入學習到完全相同的權重,但是對兩個輸入學習相同的權重會更容易一些。所以我們可以讓兩個輸入通過完全相同,共享參數的網路,然後使用絕對差分作為線性分類器的輸入--這是孿生網路必須的結構。兩個完全相同的雙胞胎,共用一個頭顱,這就是孿生網路的由來。

CNN 孿生網路的網路架構

不幸的是,如果我們想介紹清楚為什麼卷積神經網路可以工作,那這篇博客就會長了去了。如果你想理解卷積神經網路,我建議你去學習CS231然後去colah。對於沒有深度學習經驗的讀者,我只能這樣概況CNN:

一張圖像是3D像素矩陣,一個卷積層是一個神經元連接到前面一層神經元的一小部分(譯者註:局部連接性,比如用3*3的卷積核),然後使用與這個神經元相同的連接權重在一張圖片或者特徵塊上滑動一遍,生成另外一個3d的神經元。一個最大池化層是在空間上縮小特徵圖用的。很多這樣的層按照順序堆疊到一起就可以用梯度下降來訓練了,它們在圖像任務上表現良好。

我僅對CNN做一個精簡介紹,因為這不是本文的重點。Koch等人使用卷積孿生網路去分類成對的Omniglot圖像,所以這兩個孿生網路都是卷積神經網路。這兩個孿生網路每個的架構如下:64通道的10×10卷積核,relu->max pool->128 通道的 7×7卷積核,relu->max pool->128通道的4×4卷積核,relu->max pool->256 通道的 4×4卷積核。

孿生網路把輸入降低到越來越小的 3d 張量上,最終它們經過一個4096神經元的全連接層。兩個向量的絕對差作為線性分類器的輸入。這個網路一共有38,951,745個參數——96%的參數屬於全連接層。這個參數量很大,所以網路有很高的過擬合風險,但是成對的訓練意味著數據集是很大的,所以過擬合問題不會出現。

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

架構的草圖

輸出被歸一化到[0,1]之間,使用sigmoid函數讓它成為一個概率。當兩個圖像是相同類別的時候,我們使目標 t=1,類別不相同的時候使 t=0。它使用邏輯斯特回歸來訓練。這意味著損失函數應該是預測和目標之間的二分類交叉熵。損失函數中還有一個L2權重衰減項,以讓網路可以學習更小的或更平滑的權重,從而提高泛化能力:

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

當網路做單樣本學習的時候,孿生網路簡單的分類一下測試圖像與訓練集中的圖像中哪個最相似就可以了:

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

這裡使用argmax而不是近鄰方法中的argmin,因為類別越不同,L2度量的值越高,但是這個模型的輸出,所以我們要這個值最大。這個方法有一個明顯的缺陷:對於訓練集中的任何一個「深度神經網路 One-shot Learning」孿生網路少樣本精準分類,概率「深度神經網路 One-shot Learning」孿生網路少樣本精準分類與訓練集中每個樣本都是獨立的!這意味著概率值的和不為 1。言歸正傳,測試圖像與訓練圖像應該是相同類型的……

觀察:成對訓練的有效數據集的大小

經過與UoA大學的博士討論後發現,我認為這個是過分誇大的,或者就是錯的。憑經驗來說,我的實現沒有過擬合,即使它沒有在每個可能的成對圖像上充分訓練,這與該節是衝突的。在有錯就說思想的指引下,我會保留這個問題。(這是原作者的自言自語吧~)

我注意到,採用逐對訓練的話,將會有平方級別對的圖像對來訓練模型,這讓模型很難過擬合,好酷。假設我們有E類,每類有C個樣本。一共有C? E 張圖片,總共可能的配方數量可以這樣計算:

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

對於Omniglot中的964類(每類20個樣本),這會有185,849,560個可能的配對,這是巨大的!然而,孿生網路需要相同類的和不同類的配對都有。每類E個訓練樣本,所以每個類別有「深度神經網路 One-shot Learning」孿生網路少樣本精準分類對,這意味著這裡有「深度神經網路 One-shot Learning」孿生網路少樣本精準分類個相同類別的配對。

對於Omniglot有183,160對。即使 183,160對已經很大了,但只是所有可能配對的千分之一,因為相同類別的配對數量隨著E平方級的增大,但是隨著C是線性增加。這個問題非常重要,因為孿生網路訓練的時候,同類別和不同類別的比例應該是1:1。或許,它表明逐對訓練在那種每個類別有更多樣本的數據集上更容易訓練。

代碼

如果你更喜歡用 jupyter notebook,這裡是傳送門:https://github.com/sorenbouma/keras-oneshot

下面是模型定義,如果你見過keras,那很容易理解。我只用Sequential來定義一次孿生網路,然後使用兩個輸入層來調用它,這樣兩個輸入使用相同的參數。然後我們把它們使用絕對距離合併起來,添加一個輸出層,使用二分類交叉熵損失來編譯這個模型。

from keras.layers import Input, Conv2D, Lambda, merge, Dense, Flatten,MaxPooling2D
from keras.models import Model, Sequential
from keras.regularizers import l2
from keras import backend as K
from keras.optimizers import SGD,Adam
from keras.losses
import binary_crossentropy
import numpy.random as rng
import numpy as np
import os
import dill as pickle
import matplotlib.pyplot as plt
from sklearn.utils import shuffle

def W_init(shape,name=None): """Initialize weights as in paper""" values = rng.normal(loc=0,scale=1e-2,size=shape) return K.variable(values,name=name)#//TODO: figure out how to initialize layer biases in keras.

def b_init(shape,name=None): """Initialize bias as in paper""" values=rng.normal(loc=0.5,scale=1e-2,size=shape) return K.variable(values,name=name)

input_shape = (105, 105, 1)
left_input = Input(input_shape)
right_input = Input(input_shape)
#build convnet to use in each siamese "leg"
convnet = Sequential
convnet.add(Conv2D(64,(10,10),activation="relu",input_shape=input_shape, kernel_initializer=W_init,kernel_regularizer=l2(2e-4)))
convnet.add(MaxPooling2D)
convnet.add(Conv2D(128,(7,7),activation="relu", kernel_regularizer=l2(2e-4),kernel_initializer=W_init,bias_initializer=b_init))
convnet.add(MaxPooling2D)
convnet.add(Conv2D(128,(4,4),activation="relu",kernel_initializer=W_init,kernel_regularizer=l2(2e-4),bias_initializer=b_init))
convnet.add(MaxPooling2D)
convnet.add(Conv2D(256,(4,4),activation="relu",kernel_initializer=W_init,kernel_regularizer=l2(2e-4),bias_initializer=b_init))
convnet.add(Flatten)
convnet.add(Dense(4096,activation="sigmoid",kernel_regularizer=l2(1e-3),kernel_initializer=W_init,bias_initializer=b_init))
#encode each of the two inputs into a vector with the convnet
encoded_l = convnet(left_input)
encoded_r = convnet(right_input)
#merge two encoded inputs with the l1 distance between them
L1_distance = lambda x: K.abs(x[0]-x[1])
both = merge([encoded_l,encoded_r], mode = L1_distance, output_shape=lambda x: x[0])
prediction = Dense(1,activation="sigmoid",bias_initializer=b_init)(both)
siamese_net = Model(input=[left_input,right_input],output=prediction)
#optimizer = SGD(0.0004,momentum=0.6,nesterov=True,decay=0.0003)

optimizer = Adam(0.00006)
#//TODO: get layerwise learning rates and momentum annealing scheme described in paperworking

siamese_net.compile(loss="binary_crossentropy",optimizer=optimizer)

siamese_net.count_params

原論文中每個層的學習率和衝量都不相同--我跳過了這個步驟,因為使用keras來實現這個太麻煩了,並且超參數不是該論文的重點。Koch等人增加向訓練集中增加失真的圖像,使用150,000對樣本訓練模型。因為這個太大了,我的內存放不下,所以我決定使用隨機採樣的方法。載入圖像對或許是這個模型最難實現的部分。因為這裡每個類別有 20個樣本,我把數據重新調整為 N_classes×20×105×105的數組,這樣可以很方便的來索引。

class Siamese_Loader: """For loading batches and testing tasks to a siamese net""" def __init__(self,Xtrain,Xval): self.Xval = Xval self.Xtrain = Xtrain self.n_classes,self.n_examples,self.w,self.h = Xtrain.shape self.n_val,self.n_ex_val,_,_ = Xval.shape def get_batch(self,n): """Create batch of n pairs, half same class, half different class""" categories = rng.choice(self.n_classes,size=(n,),replace=False) pairs=[np.zeros((n, self.h, self.w,1)) for i in range(2)] targets=np.zeros((n,)) targets[n//2:] = 1 for i in range(n): category = categories[i] idx_1 = rng.randint(0,self.n_examples) pairs[0][i,:,:,:] = self.Xtrain[category,idx_1].reshape(self.w,self.h,1) idx_2 = rng.randint(0,self.n_examples) #pick images of same class for 1st half, different for 2nd category_2 = category if i >= n//2 else (category + rng.randint(1,self.n_classes)) % self.n_classes pairs[1][i,:,:,:] = self.Xtrain[category_2,idx_2].reshape(self.w,self.h,1) return pairs, targets def make_oneshot_task(self,N): """Create pairs of test image, support set for testing N way one-shot learning. """ categories = rng.choice(self.n_val,size=(N,),replace=False) indices = rng.randint(0,self.n_ex_val,size=(N,)) true_category = categories[0] ex1, ex2 = rng.choice(self.n_examples,replace=False,size=(2,)) test_image = np.asarray([self.Xval[true_category,ex1,:,:]]*N).reshape(N,self.w,self.h,1) support_set = self.Xval[categories,indices,:,:] support_set[0,:,:] = self.Xval[true_category,ex2] support_set = support_set.reshape(N,self.w,self.h,1) pairs = [test_image,support_set] targets = np.zeros((N,)) targets[0] = 1 return pairs, targets def test_oneshot(self,model,N,k,verbose=0): """Test average N way oneshot learning accuracy of a siamese neural net over k one-shot tasks""" pass n_correct = 0 if verbose: print("Evaluating model on {} unique {} way one-shot learning tasks ...".format(k,N)) for i in range(k): inputs, targets = self.make_oneshot_task(N) probs = model.predict(inputs) if np.argmax(probs) == 0: n_correct+=1 percent_correct = (100.0*n_correct / k) if verbose: print("Got an average of {}% {} way one-shot learning accuracy".format(percent_correct,N)) return percent_correct

下面是訓練過程了。沒什麼特別的,除了我監測的是驗證機精度來測試性能,而不是驗證集上的損失。

evaluate_every = 7000
loss_every=300
batch_size = 32
N_way = 20
n_val = 550

siamese_net.load_weights("PATH")best = 76.0

for i in range(900000): (inputs,targets)=loader.get_batch(batch_size) loss=siamese_net.train_on_batch(inputs,targets) if i % evaluate_every == 0: val_acc = loader.test_oneshot(siamese_net,N_way,n_val,verbose=True) if val_acc >= best: print("saving") siamese_net.save("PATH") best=val_acc if i % loss_every == 0: print("iteration {}, training loss: {:.2f},".format(i,loss))

結果

一旦學習曲線變平整了,我使用在 20 類驗證集合上表現最好的模型來測試。我的網路在驗證集上得到了大約 83%的精度,原論文精度是93%。或許這個差別是因為我沒有實現原論文中的很多增強性能的技巧,像逐層的學習率/衝量,使用數據失真的數據增強方法,貝葉斯超參數優化,並且我迭代的次數也不夠。我並不擔心這個,因為這個教程側重於簡要介紹單樣本學習,而不是在那百分之幾的分類性能上鑽牛角夾。這裡不缺乏這方面的資源。

我很好奇,模型的精度是怎麼隨樣本的類別數目N變化的,所以我把它畫了出來,與1近鄰,隨機猜測以及模型在訓練集上的精度的比較。

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

如圖所示,驗證集上的精度要比訓練集上差一些,尤其是當N的數量很多的時候,這裡面肯定有過擬合的問題。我們也想測試一下傳統的正則化方法(像dropout)在驗證集與訓練集完全不同的時候的表現。對於較大的N,它比我期待中的要好,在50-60種類別上,仍舊有65%的平均精度。

討論

現在我們只是訓練了一個來做鑒別相同還是不同的二分類網路。更重要的是,我們展現了模型能夠在沒有見過的字母表上的20類單樣本學習的性能。當然,這不是使用深度學習來做單樣本學習的唯一方式。

正如我前面提到的,我認為這個孿生網路的最大缺陷是它要拿測試圖像與訓練集中圖像逐個比較。當這個網路將測試圖像與任何圖像x1相比,不管訓練集是什麼,都是相同的。這很愚蠢,假如你在做單樣本學習任務,你看到一張圖片與測試圖像非常類似。然而,當你看到訓練集中另外一張圖片也與測試集非常相似,你就會對它的類別沒那麼自信了。訓練目標與測試目標是不同的,如果有一個模型可以很好的比較測試圖片與訓練集,並且使用僅僅有一個訓練圖片與之擁有相同類別的限制,那模型會表現的更好。

Matching Networks for One Shot learning 這篇論文就是做這個的。它們使用深度模型來端到端的學習一個完整的近鄰分類器,而不是學習相似度函數,直接在單樣本任務上訓練,而不是在一個圖像對上。Andrej Karpathy』s notes 很好的解釋了這個問題。因為你正在學習機器分類,所以你可以把他視為元學習(meta learning)。

One-shot Learning with Memory-Augmented Neural Networks 這篇論文解釋了單樣本學習與元學習的關係,它在Omniglot數據集上訓練了一個記憶增強網路,然而,我承認我看不懂這篇論文。

下一步是什麼?

Omniglot 數據集是2015年的了,現在已經有了可拓展機器學習演算法,在特定的單樣本學習上達到了人類的水平。希望未來有一天,Omniglo t數據集會像 MNIST 之於監督學習那樣,成為單樣本學習的標準檢測數據集。

圖像分類挺酷的,但我並不認為它是機器學習界最有趣的問題。現在我們知道了深度單樣本學習有了不錯的效果,我想如果嘗試把單樣本學習應用到更有挑戰性的任務上,那樣才是真酷。

單樣本學習的想法可以被用到樣本效率更高的增強學習上面,尤其是像OpenAI"s Universe這樣的問題,這些問題有很多馬爾科夫決策過程或者環境,它們擁有類似的視覺和動態信息。如果有一個增強學習機制能以類似馬爾科夫決策過程學習後可以有效的探索新環境,那樣簡直酷斃了。

OpenAI 的比特世界

「深度神經網路 One-shot Learning」孿生網路少樣本精準分類

《單樣本模仿學習》是我最喜歡的單樣本學習論文。它的目標是建立一個可以學習魯棒的策略的機制,它在人類展示一次任務後就能解決這個任務。它是這樣做的:

  1. 建立一個神經網路,它可以映射當前狀態和一個序列狀態(人類示範)到一個動作;

  2. 把這個模型在人類示範動作和微小的變動任務對上訓練,目標是讓模型可以基於第一個示範來複現第二個示範動作。

這真是震驚我了,這提供了一種通往製造可以廣泛應用的,可以學習的機器人的康庄大道啊。

把單樣本學習引入到NLP也是一個很酷的idea。Matching Networks在單樣本語言模型上進行了嘗試,僅給出很小的訓練集,在測試集上填充缺失單詞,這看起來工作的不錯。棒!

結語

總而言之,謝謝你的閱讀!我希望你已經通過單樣本學習的方式掌握了單樣本學習的概念:) 如果沒有學會,我很樂於聽到你們的反饋和問題。

原文地址:https://sorenbouma.github.io/blog/oneshot/

點擊閱讀原文可查看職位詳情,期待你的加入~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 新智元 的精彩文章:

「爭搶90後」福布斯評美國千禧一代最喜歡的10家公司,微軟第一
GAN網路圖像翻譯機:圖像復原、模糊變清晰、素描變彩圖
普京:領導AI者將統領世界,未來戰爭派無人機上場即可

TAG:新智元 |