做網站webform mvc百度競價怎么做效果好
內容摘自王老師的B站視頻,大家還是盡量去看視頻,老師講的特別好,不到一小時的時間就縷清了小樣本學習的基礎知識點~Few-Shot Learning (1/3): 基本概念_嗶哩嗶哩_bilibili
Few-Shot Learning(小樣本分類)
假設現在每類只有一兩個樣本,計算機能否做到像人一樣的正確分類?
-
這個例子Support Set有兩類,每類只有一兩個樣本,靠這些樣本,難以訓練出一個深度神經網絡,這個集合只能提供一些參考信息。對于小樣本問題,不能用傳統(tǒng)的分類方法。
小樣本分類與傳統(tǒng)的監(jiān)督學習有所不同,小樣本學習的目標不是讓機器通過學習訓練集中圖片,知道哪類是什么樣子;當我拿一個很大的訓練集來訓練神經網絡后進行小樣本分類,預訓練模型的目的是讓機器自己學會學習-----也就是學習事物的異同,學會區(qū)分不同的事物。
現在訓練集有五類,其中并沒有松鼠這個類別
訓練完成之后,可以問模型這兩張圖片是否是相同的東西呢?這時候模型已經學會分辨了事物的異同,比如給出兩張松鼠圖片,模型知道這兩個動物之間長得很像,模型能夠告訴你兩張圖片很可能是相同的東西。
支持集
給出一張圖片,神經網絡不知道這是什么。
這時候就需要支持集(Support Set),每類給出少樣本(1~2)張,神經網絡將Query圖片和支持集中的每個類別依次對比,找出最相似的。
訓練集和支持集的區(qū)別
-
訓練集規(guī)模很大,每類有很多張圖片,可以訓練一個深度神經網絡
-
支持集每類只有一張或幾張圖片,不足以訓練一個大的神經網絡,只能在做預測時候提供一些額外信息。
-
用足夠大的訓練集訓練的目的不是讓模型識別訓練集中的大象、老虎,而是知道事物的異同。對于訓練的模型,只要提供含有該類別的小樣本信息,模型就能區(qū)分類別,盡管訓練集中沒有這個類別。
小樣本分類:Learn To Learn
帶小朋友去動物園,小朋友不知道這個動物是什么,但是小朋友只需要翻一遍卡片(將目標與卡片上動物對應),就知道看到的動物是什么,這個卡片就是支持集,前提是小朋友有讀卡片的能力,也就是得先經過訓練學習。
如果卡片中每類只有一張,那就是One-Shot Learning(單樣本學習)
傳統(tǒng)監(jiān)督學習 和 小樣本學習 步驟的區(qū)別
-
傳統(tǒng)監(jiān)督學習:測試圖片雖然不是訓練集中圖片,但包含在訓練集類別,模型已經見過上千張該類別圖片,能夠判斷出是哪類。
-
小樣本學習:測試圖片不但不包含在訓練集中,也不是訓練集中的類別。所以小樣本學習比傳統(tǒng)監(jiān)督學習更難。因為不是訓練集中的類別,所以要提供支持集,提供更多信息(給模型看小卡片,每張卡片有一個圖片和一個標簽,模型發(fā)現測試圖片和某張卡片相似度高,就知道測試圖片屬于哪個標簽)
小樣本學習兩個術語
-
k-way :支持集含有的種類數
-
n-shot : 支持集中每個種類有多少張圖片
小樣本學習預測準確率
-
橫軸是支持集類別數量。隨著類別數量增加,分類準確率會降低。
-
比如從三選一變成六選一
-
-
每類樣本越多,做預測越容易
相似度函數
sim(x, x'), x,x'為兩個input
理想情況:sim(x1,x2) = 1 , sim(x1,x3) = 0, sim(x2,x3) = 0
從一個很大的訓練集上學習一個相似度函數,它可以判斷兩張圖片的相似度有多高。
孿生神經網絡就可以作為相似度函數,可以拿大規(guī)模數據集做訓練,訓練結束之后,可以拿得到的相似度函數做預測。給一個測試圖片,可以拿他跟支持集中的圖片逐一對比,計算相似度,找到相似度最高作為預測結果。
-
Omniglot 特點:小樣本(20個,105*105)
孿生網絡(Siamese Network)
孿生網絡要解決的問題
-
第一類,分類數量較少,每一類的數據量較多,比如ImageNet、VOC等。這種分類問題可以使用神經網絡或者SVM解決,只要事先知道了所有的類。
-
第二類,分類數量較多(或者說無法確認具體數量),每一類的數據量較少,比如人臉識別、人臉驗證任務。(少樣本問題)
孿生網絡的優(yōu)點
-
這個網絡主要的優(yōu)點是淡化了標簽,使得網絡具有很好的擴展性,可以對那些沒有訓練過的小樣本類別進行分類,這點是優(yōu)于很多算法的。
第一種訓練孿生網絡方法:每次取2樣本,比較相似度 。
-
訓練這個神經網絡要用一個大的數據集,每類有標注,每類下面都有很多個樣本。
-
-
我們需要用訓練集來構造正樣本和負樣本
-
正樣本告訴神經網絡什么東西是同一類。
-
負樣本告訴神經網絡事物之間的區(qū)別。
-
-
正樣本獲取
-
每次從訓練集中抽取一張圖片(老虎),然后從同一類中隨機抽取另一張圖片(老虎),標簽設置為1 (tiger, tiger, 1),意思是相似度滿分。
-
-
負樣本獲取
-
每次從訓練集中抽取一張圖片(汽車),排除汽車這個類別,再從數據集中隨機抽樣(大象),標簽設計為(car, elephant, 0),意思是相似度為0
-
-
-
搭建一個卷積神經網絡CNN用來提取特征,這個神經網絡有很多卷積層,Pooling層,以及一個flatten層。輸入是一張圖片x,輸出是提取的特征向量 f(x)
-
-
現在開始訓練神經網絡,輸入為(x1, x2 , 0或1),把這兩張圖片輸入神經網絡,把剛才搭建的卷積神經網絡記作函數f。
-
對于提取的特征向量,第一張圖片特征向量記作h1 = f(x1),第二張圖片特征向量記作h2 = f(x2),如果都是用CNN,這兩個f需要是相同的卷積神經網絡,共享相同的權值W(之所以叫孿生,就是因為共享特征提取的部分)。也可以不同權值,則不同場景,允許不同神經網絡。
-
然后拿h1 - h2 得到一個向量,再對這個向量所有元素求絕對值,記作z = ||h1 - h2||,表示兩個特征向量之間的區(qū)別,再用一些全連接層來處理z向量,輸出一些標量。
-
最后用Sigmoid激活函數,得到輸出是一個介于0~1之間的實數,可以衡量兩個圖片之間的相似度。如果兩張圖片是同一個類別,輸出應該接近1,如果兩張圖片不同類別,輸出應該接近0(希望神經網絡的訓練輸出接近1),把標簽與預測之間的差別作為損失函數。
-
損失函數可以是標簽與預測的交叉熵損失函數cross-entropy loss function,可以衡量標簽與預測的差別。
-
有了損失函數可以用反向傳播計算梯度,用梯度下降來更新模型參數。
-
-
模型主要有兩部分,一個是卷積神經網絡f用來從圖片提取特征,一個是全連接層預測相似度,訓練部分就是更新這兩個的參數
-
做反向傳播,梯度從損失函數傳回到向量z以及全連接層的參數,有了損失函數關于全連接層的梯度,就可以更新全連接層的參數了。
-
然后梯度進一步從向量z傳回到卷積神經網絡,更新卷積神經網絡參數,這樣就完成了一輪訓練
-
-
做訓練時候,我們要準備同樣數量正樣本和負樣本。負樣本標簽設置為0,希望神經網絡預測接近0,意思是這兩張圖片不同。還是用同樣方法做反向傳播,更新參數。
訓練好模型之后,可以做One-Shot Prediction
-
六個類別,每個類別一張圖片,這六個類別可以都不在訓練集中
-
-
將Query與Support Set支持集中圖片作對比:
-
將Query圖片與支持集中某一類一張圖片作為input1 和 input2 ,輸入到孿生網絡中,孿生網絡會輸出一個0~1之間的值。用同樣方法算出Query與所有圖片相似度,查找相似度最高的。
-
孿生網絡第二種訓練方法:Triplet Loss
準備數據
-
有這樣一個訓練集,每次選出三張圖片
-
首先從訓練集隨機選一張圖片,作為anchor(錨點),記錄這個錨點,然后從同類中隨機抽取一張圖片作為正樣本Positive;排除該類別,從數據集中作隨機抽樣,得到不同類別的負樣本Negative。
-
-
現在有錨點x^a,正樣本x+,負樣本x-,把三張圖片分別輸入卷積神經網絡f來提取特征(f指的是同一個卷積神經網絡),得到三個特征向量
-
計算正樣本和錨點再特征空間上的距離,將特征向量 f(x+)與f(xa)求差,然后算二范數的平方,得到距離d+
-
類似操作得到d-
-
-
我們希望得到的神經網絡有這樣性質,像同類別特征向量聚在一起,不同類別的特征向量能夠被分開,所以d+應該很小,d-應該很大
-
這個坐標系是特征空間,卷積神經網絡可以把圖片映射到這個特征空間
-
-
d-應該比d+大很多,否則模型分辨不了同類和不同類
-
所以鼓勵正樣本在特征空間接近錨點(d+盡量小),鼓勵負樣本在特征空間遠離錨點(d-盡量大)
-
指定一個margin :α,α>0。如果d- >= d+ + α,我們就認為沒有損失loss=0,分類正確。假如條件不滿足,則會有l(wèi)oss = d+ + α - d- , 我們希望loss越小越好
-
有了損失函數,就可以求損失函數關于神經網絡的梯度,作梯度下降來更新模型參數
-
測試模型
-
給一個query,一個支持集,用神經網絡提取特征,把所有這些圖片變?yōu)樘卣飨蛄?#xff0c;比較特征向量之間的距離。找出距離最小的。
-
總結
我們使用了Siamese Network解決了少樣本學習
基本思路:
-
用一個比較大的訓練集來訓練孿生網絡,讓孿生網絡知道事物之間的異同
-
訓練結束之后拿孿生網絡作預測,解決少樣本問題。少樣本的問題是少樣本的類別不在訓練集中。比如query是松鼠,但訓練集中沒有松鼠這個類別,需要額外的信息來識別query的圖片,這個額外的信息就是少樣本支持集。
-
支持集稱為k-way, n-shot,k個類別,類別越多,預測越困難,n個樣本,樣本越少,預測越困難,one-shot learning單樣本預測最困難。
-
有了訓練好的孿生網絡,我們就可以將query與support set中的樣本逐一對比,選出距離最小或相似度最高作為分類結果。
-
兩種訓練孿生網絡方法:1.兩個input,標簽0或1,輸出0~1之間數值,與標簽差值作為loss,目標是讓預測盡量接近標簽。 2.另一種是Triplet Loss,xa,x+,x-,用CNN提取得到三個特征向量,輸出d+,d-,目標是讓d+盡量小,d-盡量大。有了這樣一個神經網絡就可以用它提取特征,比較兩張圖片在特征空間距離,作出few-shot分類
Fine Tuning
基本思路
在大規(guī)模數據上預訓練模型,然后再小規(guī)模的support set上做fine-tuning。方法簡單,準確率高。
-
看個例子,余弦相似度consine similarity,衡量兩個向量之間相似度,現在兩個向量長度都是1,即他們的二范數都為1。
-
把向量x和w的夾角記作θ,由于向量x和w長度都是1,cosθ就是x和w的內積,表示兩個向量的相似度。
-
可以理解,把向量x投影到w方向上,投影長度就是-1到+1之間
-
-
如果向量x和w的長度不是1,則需要做歸一化把他們程度變?yōu)?,然后求得的內積才是余弦相似度
-
微調主要用到Softmax Function
-
它是一個常用的激活函數,可以把一個k維向量映射成一個概率分布
-
輸入為Φ,它是任意的k維向量。把Φ的每一個元素做指數變換,得到k個大于0的數;然后對其作歸一化,讓得到的k個數相加等于1,把得到的k個數記為向量p
-
向量p就是softmax函數的輸出
-
性質
-
輸入Φ和輸出p都是k維向量
-
向量p的元素都是正數,而且相加等于1
-
所以p是個概率分布
-
-
softmax通常用于分類器的輸出層,如果有k個類別,那么softmax的輸出就是k個概率值,每個概率值表示對一個類別的confidence。
-
softmax會讓最大的值變大,其余的值變小。softmax比max函數要溫柔一些
-
-
Softmax分類器
-
是一個全連接層加一個Softmax函數
-
分類器的輸入是特征向量x,表示輸入的測試圖片的特征向量,把x乘到參數矩陣w上,再加上向量b,得到一個向量
-
對得到的向量做softmax變換,得到輸出向量p
-
假如類別數量為k,那么向量p就是k維的
-
矩陣W和b是這一層的參數,可以從訓練數據中學習。W有K行,k是類別數量,所以W每一行對應一個類別,d是每個類別的特征數量
-
使用預訓練好的神經網絡,在query和support set上做fine-tuning的過程
-
把query和support set中的圖片都映射成特征向量,這樣可以比較query和support set在特征空間上的相似度,比如可以計算兩兩之間的cosine similarity。最后選擇相似度最高的作為query的分類結果
-
預訓練
-
搭一個卷積神經網絡用來提取特征,有很多卷積層、Pooling層以及一個Flatten層,也可以有全連接層
-
神經網絡輸入是一張圖片x,輸出一個特征向量f(x)
-
可以用傳統(tǒng)的監(jiān)督學習,預訓練好后把全連接層都去掉;也可以用孿生網絡訓練
-
-
-
Few-Shot分類方法
-
3-way 2-shot,三類別,每類別兩樣本
-
拿預訓練的神經網絡提取特征,每張圖片變成一個特征向量,每個類別兩個特征向量
-
平均每個類別特征向量作平均,得到一個同樣大小的向量,也就是均值向量
-
有三個類別,一共得到三個均值向量
-
均值向量歸一化,得到三個向量μ1,μ2,μ3,它們的二范數都等于一,μ1,μ2,μ3就是對三個類別的表征
-
做分類的時候,要拿query的特征向量對μ1,μ2,μ3作對比
-
-
-
對query作分類
-
給一張query圖片,需要判斷是三個類別中的哪一個
-
拿預訓練的神經網絡f來提取特征,得到一個特征向量
-
對特征向量作歸一化,得到向量q,它的二范數等于1
-
與剛才從support set中提取的三個向量μ1,μ2,μ3,它們的二范數也是1,每個μ向量表征一個類別
-
可以把三個μ向量堆疊起來,作為矩陣M的三個行向量
-
-
-
做few-shot預測
-
把query的特征向量q乘到矩陣M上,再做Softmax變換,得到p = Softmax(Mq),p是個概率分布,這個例子里,p是三維向量,表示對三個類別的confidence
-
三個元素分別是q與μ1,μ2,μ3的內積
-
很顯然,在向量p中,第一個元素最大,分類結果是第一類
-
-
Fine-tuning可以大幅提高預測準確率
-
基本都是先做預訓練,后做Fine-Tuning
-
-
剛才我們用了固定的W和b,沒有學習這兩個參數
-
可以在Support Set上學習W和b,這叫做fine tuning
-
用Cross Entropy來衡量yj與pj的差別有多大,yj是真實標簽,pj是分類器做出的預測,損失函數就是Cross Entropy Loss
-
Support set中有幾個或者幾十個有標注的樣本,每個樣本都對應一個Cross Entropy Loss,把這些Cross entropy loss加起來,作為損失函數
-
也就是說我們用support set中所有的圖片和標簽來學習這個分類器
-
對CrossEntropyLoss做最小化Minimization,讓預測pj盡量接近真實標簽yj
-
Minimization是對分類器參數W和b求的,希望學習W和b;當然也可以讓梯度傳播到卷積神經網絡,更新神經網絡參數,讓提取的特征向量更有效
-
support通常很小幾十個到幾百個樣本,最好加個regularization來防止過擬合。有一篇文章建議用Entropy Regularization
-
-
-
有一篇ICLR2020的論文說 對于5-way 1-shot,做fine tuning可以提到2%~7%的準確率;對5-way 5-shot,提高1.5%~4%準確率
-
盡管support set很小,但用support set來訓練分類器有助于提高準確率,預訓練+fine tuning比只用預訓練好很多
-
-
W,b默認值
-
-
Entropy Regularization防止過擬合
-
希望Entropy Regularization越小越好
-
-
-