1. 如何處理不平衡數據(一)——欠采樣
一、重采樣
1、欠采樣
欠采樣就是一個隨機刪除一部分多數類(數量多的類型)數據的過程
# Shuffle the Dataset. 進行一個數據集打亂的操作
shuffled_df = credit_df.sample(frac=1,random_state=4)
# Put all the fraud class in a separate dataset. 欺詐類 就是數量少的類
fraud_df = shuffled_df.loc[shuffled_df['Class'] == 1]
#Randomly select 492 observations from the non-fraud (majority class) 選取過多的類進行一個抽取
non_fraud_df=shuffled_df.loc[shuffled_df['Class']== 0].sample(n=492,random_state=42)
# Concatenate both dataframes again 生成一個均衡類
normalized_df = pd.concat([fraud_df, non_fraud_df])
#plot the dataset after the undersampling 下面是畫圖操作
plt.figure(figsize=(8, 8))
sns.countplot('Class', data=normalized_df)
plt.title('Balanced Classes')
plt.show()
2. 如何處理數據不平衡問題
基於上一篇文章,面試被虐成渣,所以來整理和記錄下第一個問題,關於數據不平衡的問題。
以下內容參考:
https://www.cnblogs.com/charlotte77/p/10455900.html https://www.leiphone.com/news/201706/dTRE5ow9qBVLkZSY.html
數據不平衡也可稱作數據傾斜。在實際應用中,數據集的樣本特別是分類問題上,不同標簽的樣本比例很可能是不均衡的。因此,如果直接使用演算法訓練進行分類,訓練效果可能會很差。
解決實際應用中數據不平衡問題可以從三個方面入手,分別是對數據進行處理、選擇合適的評估方法和使用合適的演算法。
1)過采樣:
主動獲取更多的比例少的樣本數據。由於樣本比例不均衡,在條件允許的情況下可以嘗試獲取佔比少的類型的樣本數據。(PS:這就是為什麼我幾乎沒有遇到過數據不平衡的問題。每次測試使用的數據集都盡可能的完美均衡) 也可以通過使用 重復 、 自舉 或 合成 少數類過采樣等方法(SMOTE)來生成新的稀有樣品。
直接簡單復制重復的話,如果特徵少,會導致過擬合的問題。經過改進的過抽樣方法通過在少數類中加入隨機雜訊、干擾數據或通過一定規則產生新的合成樣本 (數據增強)。
2)欠采樣:
數據量足夠時,可以通過保留比例小的樣本數據和減少比例大的樣本數據來平衡數據集。缺點是會丟失多數類中的一些重要信息。
3)改變權重:
對不同樣本數量的類別賦予不同的權重(通常會設置為與樣本量成反比)
4)使用K-fold交叉驗證
值得注意的是,使用過采樣方法來解決不平衡問題時應適當地應用交叉驗證。這是因為過采樣會觀察到罕見的樣本,並根據分布函數應用自舉生成新的隨機數據,如果在過采樣之後應用交叉驗證,那麼我們所做的就是將我們的模型過擬合於一個特定的人工引導結果。這就是為什麼在過度采樣數據之前應該始終進行交叉驗證,就像實現特徵選擇一樣。只有重復采樣數據可以將隨機性引入到數據集中,以確保不會出現過擬合問題。
K-fold交叉驗證就是把原始數據隨機分成K個部分,在這K個部分中選擇一個作為測試數據,剩餘的K-1個作為訓練數據。交叉驗證的過程實際上是將實驗重復做K次,每次實驗都從K個部分中選擇一個不同的部分作為測試數據,剩餘的數據作為訓練數據進行實驗,最後把得到的K個實驗結果平均。
此外,還應注意訓練集和測試集的樣本的概率分布問題。若實際數據不平衡,將采樣平衡後的數據集作為訓練集訓練後,模型應用在測試集上效果仍會不好。因此,實際應用中盡可能 保持訓練和測試的樣本的概率分布是一致的。
1)謹慎選擇AUC作為評價指標:對於數據極端不平衡時,可以觀察觀察不同演算法在同一份數據下的訓練結果的precision和recall,這樣做有兩個好處,一是可以了解不同演算法對於數據的敏感程度,二是可以明確採取哪種評價指標更合適。針對機器學習中的數據不平衡問題,建議更多PR(Precision-Recall曲線),而非ROC曲線,具體原因畫圖即可得知,如果採用ROC曲線來作為評價指標,很容易因為AUC值高而忽略實際對少量樣本的效果其實並不理想的情況。
2)不要只看Accuracy:Accuracy可以說是最模糊的一個指標了,因為這個指標高可能壓根就不能代表業務的效果好,在實際生產中更關注precision/recall/mAP等具體的指標,具體側重那個指標,得結合實際情況看。
1)選擇對數據傾斜相對不敏感的演算法。如樹模型等。
2)集成學習。即多模型Bagging。首先從多數類中獨立隨機抽取出若乾子集,將每個子集與少數類數據聯合起來訓練生成多個基分類器,再加權組成新的分類器,如加法模型、Adaboost、隨機森林等。
3)轉化成異常檢測或者一分類問題。(具體內容後續有時間再跟進學習)
補充:什麼是數據增強(Data Augmentation)?
參考鏈接:https://www.jianshu.com/p/3e9f4812abbc
數據增強讓有限的數據產生更多的數據,增加訓練樣本的數量以及多樣性(雜訊數據), 提升模型魯棒性, 一般用於訓練集。神經網路需要大量的參數,許許多多的神經網路的參數都是數以百萬計,而使得這些參數可以正確工作則需要大量的數據進行訓練,但在很多實際的項目中,我們難以找到充足的數據來完成任務。隨機改變訓練樣本可以降低模型對某些屬性的依賴,從而提高模型的泛化能力。
數據增強方法:
例如,我們可以對圖像進行不同方式的裁剪,讓物體以不同的實例出現在圖像的不同位置,這同樣能夠降低模型對目標位置的敏感性。此外,調整亮度、對比度、飽和度和色調 等因素來降低模型對色彩的敏感度。再有,隨機裁剪、隨機反轉、隨機對比度增強、顏色變化等等。一般來講隨機反轉和一個小比例的random resize,再接隨機裁剪比較常用。NLP中將字和詞連接起來就形成了一個新樣本,也屬於數據增強。
數據增強的分類:
數據增強可以分為兩類,一類是離線增強,一類是在線增強。
· 離線增強 : 直接對數據集進行處理,數據的數目會變成增強因子乘以原數據集的數目,這種方法常常用於數據集很小的時候。
· 在線增強 : 這種增強的方法用於,獲得批量(batch)數據之後,然後對這個批量(batch)的數據進行增強,如旋轉、平移、翻折等相應的變化,由於有些數據集不能接受線性級別的增長,這種方法長用於大的數據集,很多機器學習框架已經支持了這種數據增強方式,並且可以使用 GPU 優化計算。
3. [翻譯]處理樣本不均衡的8個方法
本文主要翻譯自 8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset .
當某一類別的數據量遠大於另一類別的樣本數量時,我們就稱其樣本不均衡。數據類別樣本本不均衡是機器學習中非常常見的一個問題,最常見的例子可能莫過於異常檢測了。在異常檢測中絕大部分樣本都是正常類型的,只有極少部分屬於異常。
此外,當我們數據中某一類別(這里及後面都以二分類為例)的數據量比例大於90%時,我們模型的准確率可能很簡單的達到較好的准確率(90%以上),但是此時並不能說明我們的模型好,因為此時模型的預測結果可能只輸出一個類別,而即便如此,其准確率依然能達到90%以上。很明顯,這顯然不是我們想要的。
下面我們將討論8個用來解決數據不均衡的方法。
咋一聽可能會覺得這可能是廢話,但是事實上收集更多的數據這一方法常常被忽略。收集更多的數據不僅能有效解決過擬合問題,收集更多的少類別樣本更能夠解決數據不均衡的問題。所以,遇到樣本不均衡問題時,我們應該首先思考能否收集更多的數據。
如上面說到的,當類別樣本不均衡的時候,使用准確率作為評估標准往往很容易產生誤導。此時我們可以採用別的評估方法,如kappa系數,ROC曲線,混淆矩陣,Recall,Precision,F1 Score等,更多可參見 Classification Accuracy is Not Enough: More Performance Measures You Can Use .
通過重采樣,我們可以得到更多的數據樣本已得到一個平衡的數據集。常用的采樣方法有兩種:
這些方法都很簡單而且易於實現。通常可以將這兩種方法都進行嘗試,看哪種方法得到的結果更好來做決定採用哪種方法。更多的可以參考 Oversampling and undersampling in data analysis .
一些經驗:
一個簡單的合成樣本的方法是隨機的從數據量少的類別實例中隨機挑選屬性來生成樣本。
你可以在數據集中憑經驗對它們進行采樣,或者也可以使用像Naive Bayes這樣的方法,它可以在反向運行時獨立地對每個屬性進行采樣。你將擁有更多不同的數據,但可能無法保留屬性之間的非線性關系。
當然也可以使用系統演算法生成合成樣本。最流行的此類演算法稱為SMOTE (Synthetic Minority Over-sampling Technique). 正如它的名字一樣,SMOTE是一個over-sampling方法,他通過樣本數據較少類別的數據來合成新的數據而非簡單的復制數據。該演算法選擇兩個或更多個類似的實例(使用距離測量),並且對於差異內的相鄰實例一次隨機擾動實例一個屬性。更多的關於SMOTE演算法的內容,可以參考論文 SMOTE: Synthetic Minority Over-sampling Technique .
在Python中,在 UnbalancedDataset 包中實現了SMOTE演算法。
不同演算法可能適用於不同的問題,因此對於同一個問題可以嘗試使用不同的演算法試試。話雖如此,決策樹通常在不平衡的數據集上表現良好,用於創建樹的類變數的拆分規則可有效解決這個問題。
附加罰分模型使用相同的演算法但是提供了不同的視角。對於樣本數較少的類別,罰分模型添加額外的損失(加大損失),這使得模型更加重視少樣本類別的分類。
通常,類懲罰或權重的處理專用於學習演算法。存在懲罰版本的演算法,例如懲罰的SVM和懲罰的LDA。
當你的演算法無法使用重采樣來解決數據不平衡問題或結果很差時,使用罰分模型是非常有必要的。他提供了另一種處理數據不均衡的方法。然而,設置罰分矩陣很復雜,常常需要嘗試很多次才能找到最佳策略。
現在有很多關於樣本不均衡問題的研究,他們都有自己的演算法、評估方法、或者技術等。從不同的角度來思考數據不均衡問題可能帶給我們不一樣的結果。
兩個可能需要考慮的是異常檢測和變化檢測。
異常檢測是罕見事件的檢測,這可能是由於偶然事件或由系統調用序列指示的程序的惡意活動而指示的機器故障。與正常操作相比,這些事件很少見。這種思維轉變將次要類別視為異常類,這可能有助於考慮分離和分類樣本的新方法。
變化檢測類似於異常檢測,除了尋找異常之外,它正在尋找變化或差異。這可能是使用模式或銀行交易所觀察到的用戶行為的變化。
這兩種轉變都對分類問題採取了更為實際的立場,可能會為我們提供一些思考問題的新方法,也許還有一些嘗試的技巧。
更加深入的思考所遇到的問題然後將問題分成一個個更容易解決的小問題。可以參考「 In classification, how do you handle an unbalanced training set? 」和 「 Classification when 80% of my training set is of one class 「.
其實,樣本不均衡就是不同類別的數據不同使得模型學習時候偏向各個類別的權重不同,而我們要做的,其實就是如何均衡各個類別的權重,無論是上采樣,下采樣,抑或是更改loss,給數據量少的類別的loss給多權重,更直接的,在某些庫的分類器中我們可以看到給某些樣本直接賦予權重,這些雖然看起來不同,但是其實都是為了均衡權重這一目的而來的。
這些方法都不需要太多的數學理論知識,你所需要做的僅僅只是挑出一種方法,然後開始嘗試,直到找到最好的方法。
在看宗成慶老師的《統計自然語言處理》時,書中講到文本情感分類數據不平衡時談到了幾個已有的方法,感覺還不錯,因此摘過來。
該方法包括以下幾個步驟對不平衡數據的標注樣本進行訓練:
該方法借鑒中心向量充分利用『多類』裡面所有樣本的分類信息,可獲得比傳統采樣方法更好的結果。
該方法有如下兩個特點:
去掉其非監督標注部分,其實此方法就是在數據較多的類別中多次取樣然後與少數據的類別一起訓練多個分類器(每個分類器有一個類別的樣本不同,然後分類時各個分類器又使用不同的特徵),其思想與隨機森林較為相像。
4. 數據的演算法都有哪些……
A*搜尋演算法
俗稱A星演算法。這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的演算法。常用於游戲中的 NPC的移動計算,或線上游戲的 BOT的移動計算上。該演算法像 Dijkstra演算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜索。
Beam Search
束搜索(beam search)方法是解決優化問題的一種啟發式方法,它是在分枝定界方法基礎上發展起來的,它使用啟發式方法估計k個最好的路徑,僅從這k個路徑出發向下搜索,即每一層只有滿意的結點會被保留,其它的結點則被永久拋棄,從而比分枝定界法能大大節省運行時間。束搜索於20 世紀70年代中期首先被應用於 人工智慧領域,1976 年Lowerre在其稱為 HARPY的語音識別系統中第一次使用了束搜索方法。他的目標是並行地搜索幾個潛在的最優決策路徑以減少回溯,並快速地獲得一個解。
二分取中查找演算法
一種在有序數組中查找某一特定元素的搜索演算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。這種搜索演算法每一次比較都使搜索范圍縮小一半。
Branch and bound
分支定界演算法是一種在問題的解空間樹上搜索問題的解的方法。但與回溯演算法不同,分支定界演算法採用廣度優先或最小耗費優先的方法搜索解空間樹,並且,在分支定界演算法中,每一個活結點只有一次機會成為擴展結點。
數據壓縮
數據壓縮是通過減少計算機中所存儲數據或者通信傳播中數據的冗餘度,達到增大數據密度,最終使數據的存儲空間減少的技術。數據壓縮在文件存儲和分布式系統領域有著十分廣泛的應用。數據壓縮也代表著尺寸媒介容量的增大和網路帶寬的擴展。
Diffie–Hellman密鑰協商
Diffie–Hellman key exchange,簡稱「D–H」,是一種安全協議。它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在後續的通訊中作為對稱密鑰來加密通訊內容。
Dijkstra』s 演算法
迪科斯徹演算法(Dijkstra)是由荷蘭計算機科學家艾茲格·迪科斯徹發明的。演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題。舉例來說,如果圖中的頂點表示城市,而邊上的權重表示著城市間開車行經的距離,迪科斯徹演算法可以用來找到兩個城市之間的最短路徑。
動態規劃
動態規劃是一種在 數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。 動態規劃的思想是多種演算法的基礎,被廣泛應用於計算機科學和工程領域。比較著名的應用實例有:求解最短路徑問題,背包問題,項目管理,網路流優化等。這里也有一篇文章說得比較詳細。
歐幾里得演算法
在 數學中,輾轉相除法,又稱 歐幾里得演算法,是求 最大公約數的演算法。輾轉相除法首次出現於 歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至 東漢出現的《九章算術》。
快速傅里葉變換(FFT)
快速傅里葉變換(Fast Fourier Transform,FFT),是離散傅里葉變換的快速演算法,也可用於計算離散傅里葉變換的逆變換。快速傅里葉變換有廣泛的應用,如數字信號處理、計算大整數乘法、求解偏微分方程等等。
哈希函數
HashFunction是一種從任何一種數據中創建小的數字「指紋」的方法。該 函數將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用來代表一個短的隨機字母和數字組成的字元串。好的散列 函數在輸入域中很少出現散列沖突。在散列表和數據處理中,不抑制沖突來區別數據,會使得資料庫記錄更難找到。
堆排序
Heapsort是指利用堆積樹(堆)這種 數據結構所設計的一種排序演算法。堆積樹是一個近似完全二叉樹的結構,並同時滿足堆積屬性:即子結點的鍵值或索引總是小於(或者大於)它的父結點。
歸並排序
Merge sort是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。
RANSAC 演算法
RANSAC 是」RANdom SAmpleConsensus」的縮寫。該演算法是用於從一組觀測數據中估計 數學模型參數的迭代方法,由Fischler and Bolles在1981提出,它是一種非確定性演算法,因為它只能以一定的概率得到合理的結果,隨著迭代次數的增加,這種概率是增加的。該演算法的基本假設是觀測數據集中存在」inliers」(那些對模型參數估計起到支持作用的點)和」outliers」(不符合模型的點),並且這組觀測數據受到雜訊影響。RANSAC 假設給定一組」inliers」數據就能夠得到最優的符合這組點的模型。
RSA加密演演算法
這是一個公鑰加密演算法,也是世界上第一個適合用來做簽名的演算法。今天的RSA已經 專利失效,其被廣泛地用於 電子商務加密,大家都相信,只要密鑰足夠長,這個演算法就會是安全的。
並查集Union-find
並查集是一種樹型的 數據結構,用於處理一些不相交集合(Disjoint Sets)的合並及查詢問題。常常在使用中以森林來表示。
Viterbi algorithm
尋找最可能的隱藏狀態序列
等等這些,演算法很多。
5. 數據處理方法有哪些
數據處理方法有:
1、標准化:標准化是數據預處理的一種,目的的去除量綱或方差對分析結果的影響。作用:消除樣本量綱的影響;消除樣本方差的影響。主要用於數據預處理。
2、匯總:匯總是一個經常用於減小數據集大小的任務。匯總是一個經常用於減小數據集大小的任務。執行匯總之前,應該花一些時間來清理數據,尤其要關注缺失值。
3、追加:追加節點將結構類似的表,選取一個主表,將另外的表追加在主表後面(相當於增加行記錄)。注意:要追加文件,欄位測量級別必須相似。例如,名義欄位無法附加測量級別為連續的欄位,即欄位類型的相同。
4、導出:用戶可以修改數據值並從現有數據中派生出新欄位。可以根據一個或多個現有欄位按6種方式創建出一個或者多個相同的新欄位。
5、分區:分區節點用於生成分區欄位,將數據分割為單獨的子集或樣本,以供模型構建的訓練、測試和驗證階段使用。通過用某個樣本生成模型並用另一個樣本對模型進行測試,可以預判此模型對類似於當前數據的大型數據集的擬合優劣。
6. 目標檢測中的樣本不平衡處理方法——OHEM, Focal Loss, GHM, PISA
GitHub
CSDN
目前。計算機視覺中的性能最好的目標檢測方法主要分為兩種: one-stage 和two-stage 方法。two-stage方法分為兩步,第一步為候選區域生成階段(Proposal stage),通過如Selective Search、EdgeBoxes等方法可以生成數量相對較小候選目標檢測框;第二步為分類與回歸階段,對第一階段生成的 Candiate Proposal 進行分類和位置回歸。one-stage 代表性的方法是R-CNN系列,如 R-CNN, Fast R-CNN, Faster R-CNN。 而one-stage 方法直接對圖像的大量 Candiate Proposals 進行分類與回歸。
這兩類方法中均存在類別不平衡問題,two-stage 方法通過第一步已經將當量的候選區域降低到一個數量較小的范圍,同時又在第二步通過一些啟發式原則,將正負樣本的比例降低到一定程度。而 one-stage 優於沒有這降低候選框的步驟,因此,候選區域的數量大大超過 two-stage 方法,因此,在精度上,two-stage 仍然優於 one-stage 方法,但是在速度和模型復雜度上, one-stage 占優勢。
類別不平衡會使檢測器評估 的候選位置,但是通常只有少量的位置存在目標,這回導致兩個問題:
因此,解決樣本不平衡問題是提高目標檢測精度的一個關鍵技術之一。
論文題目: Training Region-based Object Detectors with Online Hard Example Mining
OHEM 是通過改進 Hard Example Mining 方法,使其適應online learning演算法特別是基於SGD的神經網路方法。Hard Example Mining 通過交替地用當前樣本集訓練模型,然後將模型固定,選擇 False Positive 樣本來重新組建用於下一次模型訓練的樣本集。但是因為訓練神經網路本事就是一個耗時的操作,這樣在訓練中固定模型,這樣會急劇降低模型的訓練進程。
Hard Examples Mining通常有兩種方法:
OHEM演算法的大致流程是: 首先計算出每個ROI的loss, 然後按loss從高到低來排列每個 ROI, 然後為每張圖片選擇 個損失最高的 ROI 作為Hard Examples,其中 B 表示總的 ROI 數量, 表示batch-size 的大小,在 Fast R-CNN 中, N=2, B=128時,效果很好。
但是如果直接按照 loss 對所有的 ROI 進行選擇,會有一個缺點,由於 ROI 很多,這樣 很多 ROI 的位置就會相關並重疊,如果和某個高 Loss 的 ROI 重合度很高的其它 ROI很多, 這樣, 這些 ROI 的 Loss 通常也會很多,這樣這些樣本都會被選擇,但是它們可以近似認為時同一個,這樣就會給其它較低 Loss 的 ROI 更少的選擇餘地,這樣就會存在冗餘。為了消除這種冗餘,作者提出先使用 NMS (non-maximum suppression) 刪除部分重合度很高的 ROI, 在使用上述方法進行 選擇 Hard Example。
實現技巧:
論文,作者將該方法是現在 Fsat R-CNN 目標檢測方法中。最簡單做法是更改損失函數層,損失函數層首先計算所有 ROI 的 loss, 然後根據 loss 對 ROI 進行排序,並選擇 hard RoIs, 讓 那些 non-RoIs的損失變為0. 這種方法雖然很簡單,但是非常不高效,因為還需要為所有的 RoIs 分配進行反向傳播時需要的內存空間。
為了克服這個缺點,作者對下面的 Figure 1 進行改進, 如下面的 Figure 2.該改進時使用兩份同樣的 RoI network。 其中一個是只讀的(readonly), 即只進行前向計算,不進行反向傳播優化,所以只需要為前向傳播分配內存,它的參數實時保持和另一個 RoI network(regular RoI network)保持一樣。在每次迭代時,首先使用 readonly RoI network 對每個 ROI 計算起 loss,然後用上面描述的選擇 hard RoIs 的方法選擇 hard RoIs. 然後利用 regular RoI network來對選擇的 hard RoIs 進行前向和後向計算來優化網路。
論文題目 Focal Loss for Dense Object Detection
在改論文中,作者認為樣本類別的不平衡可以歸結為難易樣本的不平衡,從而更改交叉熵損失函數,重新對樣本賦予不同的權值,之前的模型這些樣本都是同等重要的,從而使模型訓練更加關注 hard examples。
首先引入交叉熵的公式:
其中, ,表示真實類別, 表示我們預測的概率,為了方便,我們定義:
因此, ,該方法在 較大時,該loss是一個較小的量級, 如下圖的連線所示所示,因為存在大量的易分類樣本,相加後會淹沒正樣本的loss。
一個常見的解決類別不平衡的方式是引入一個加權因子 來表示正樣本的權重, 表示負樣本的權重。我們按照定義 的方法重新定義 為 , 定義如下:
雖然可以平衡 positive和negative的重要性,但是對 easy/hard 樣本還是無法區分, Focal loss 通過更 Cross loss來達到區分easy/hard的目的:
上圖展示了不同 取值對應的 loss,通過分析上述公式,我們發現,當 非常小時,即樣本被分類錯誤,此時 接近1, loss幾乎不受影響,當 接近於1時,即樣本被分類正確,此時 接近0,此時降低了該樣本的權重,比如,取 , 當時 時,該樣本的 loss 會降低100倍,
在實際應用中,作者使用了該 Focal loss的變體,即加入了 平衡因子:
作者提出,對於二分類,一般模型的模型初始化會同概率的對待正負樣本,由於類別不平衡,負樣本的 loss 會佔主導,作者提出在訓練初始階段對正樣本的概率估計「prior」的概念,用 表示, 通過設置它來達到正樣本的輸出概率低的效果,比如為0.01,從而使模型更加關注正樣本。實際操作中,出了最後一個用於分類的卷積層,其餘卷積層的參數初始化為bias ,而最後一層 , 實驗中設置為 0.01.
兩個實現細節
論文題目: Gradient Harmonized Single-stage Detector
改論文提出 Focal Loss 存在兩個缺點:
該論文有一句概括該篇論文的核心思想的一句話: 類別的不平衡可以歸結為難易樣本的不平衡,難易樣本的不平衡可以歸結為梯度的不平衡原話如下:
如下圖所示:
左邊是樣本數量關於梯度的分布,中間表示各個修正後的函數的梯度(使用了log scale)對原始梯度的,右邊表示所有樣本集的梯度貢獻的分布。
定義 是模型未經過 sigmoid 之前的輸出, 則 ,得出該損失函數對 的梯度為:
定義梯度的模長(norm) 為:
訓練樣本的梯度密度(Gradient Density)定義如下:
其中, 是第 k 個樣本的gradient norm,
這個公式可以理解為,以梯度 為中心,寬度為 的區域內的樣本密度。
梯度密度協調參數:
分母是對梯度位於 范圍的部分樣本進行歸一化,如果所有樣本的梯度時均分分布,那麼對於任意 都有 .(這里不是很理解為什麼N,可以理解它們相等)
通過將梯度密度協調參數將 GHM 嵌入到損失函數中,則 GHM-C Loss 為:
計算公式11時,求和有一個N,再求 時會遍歷所有的樣本,因此該公式的時間復雜度為 .如果並行的化,每個計算單元也有N的計算量。對gradient norm進行排序的最好的演算法復雜度為 ,然後用一個隊列去掃描樣本得到梯度密度的時間復雜度為 n 。基於排序的方法即使並行也不能較快的計算,因為N往往是 甚至 ,仍然是非常耗時的.
作者提出的近似求解的方法如下:
根據上述定義,得出近似梯度密度函數為:
利用上面的公式,由於我們可以事先求好 , 在求和時只需查找 即可,因此時間復雜度為 .
因為loss的計算是基於梯度密度函數,而梯度密度函數根據一個batch中的數據得到,一個batch的統計結果是有雜訊的。與batch normalization相同,作者用Exponential moving average來解決這個問題,也就是
將模型魚的的偏移量定義為 , 將真實的偏移量定義為 ,回歸loss採用 Smooth L1 loss:
其中
則 關於 的梯度為:
從公式可以看出,當樣本操作 時, 所有樣本都有相同的梯度 1, 這就使依賴梯度范數來區分不同樣本是不可能的, 一種簡單的替代方法時直接使用 作為衡量標准,但是該值理論上無限大,導致 無法實現,
為了將 GHM 應用到回歸損失上,作者修改了原始的 損失函數:
該函數和 具有類似的屬性,當d的絕對值很小時,近似 L2 loss, 當d的絕對值比較大時, 近似 L1 loss, 關於d的梯度為:
這樣就將梯度值限制在
定義 , 則 GHM-R Loss 為:
論文題目: Prime Sample Attention in Object Detection
PISA 方法和 Focal loss 和 GHM 有著不同, Focal loss 和 GHM 是利用 loss 來度量樣本的難以程度,而本篇論文作者從 mAP 出法來度量樣本的難易程度。
作者提出提出改論文的方法考慮了兩個方面:
Prime Samples 是指那些對檢測性能有著巨大影響的樣本。作者研究表明樣本的重要程度依賴於它和ground truth 的 IoU值,因此作者提出了一種 IOU-HLR 排序。
在目標檢測中時如何定義正樣本(True Positive)的呢?
剩餘的標注為負樣本。
mAP 的原理揭露了對目標檢測器更重要的 兩個准則 :
基於上述分析,作者提出了一種稱為 IoU-HLR 的排序方法,它既反映了局部的IoU關系(每個ground truth目標周圍),也反映了全局的IoU關系(覆蓋整個圖像或小批圖像)。值得注意的是,不同於回歸前的邊界框坐標,IoU-HLR是根據樣本的最終定位位置來計算的,因為mAP是根據回歸後的樣本位置來計算的。
該排序方法的大致流程如下圖所示,其原理如下:
IoU-HLR遵循上述兩個准則。首先,它通過局部排序(即上面的步驟2)將每個單獨的 GT 的 對應的樣本中 IoU 較高的樣本放在前面,其次通過重采樣和排序(步驟3, 4)將不同 GT 的 對應的樣本中, 將 IoU 較高的放在了前面。
作者提出Prime Sample Attention,一種簡單且有效的采樣策略,該采樣策略將更多的注意力集中到 Prime examples 上, PISA 由兩部分組成: Importance- based Sample Reweighting(ISR)和Classification Aware Regression Loss(為CARL).
PISA 的訓練過程是基於 prime samples 而不是同等對待所有樣本。
作者提出一種基於 soft sampling 的方法: Importance-based Sample Reweighting (ISR), 他給不同樣本根據重要性賦予不同的權重。首先它將Iou-HLR排序轉化為線性映射的真實值。 IoU-HLR在每個類中分別進行計算。對於類 , 假設總共有 個樣本, 通過 IoU-HLR 表示為 . 其中 ,使用一個線性轉換函數將 轉換為 , 表示第 類中的第 個樣本的重要程度:
採用指數函數的形式來京一部將樣本重要性 轉換為 loss 的權值 , 表示對重要樣本給予多大的優先權的程度因子, 決定最小樣本權值的偏差(感覺就是一個決定最小的權值大小的一個變數)。
根據上面得到的權重值,重寫交叉熵:
其中 n 和 m 分別表示真樣本和負樣本的數量, 和 分別表示預測分數和分類目標,需要注意的是,如果只是簡單的添加 loss 權值將會改變 loss 的值,並改變正負樣本的比例,因此為了保持正樣本的總的 loss 值不變, 作者將 歸一化為
(這里不是很理解,歡迎大家解惑)
5.3.1 已經介紹如何染個分類器知道 prime samples, 那麼如何讓回歸其也知道 prime sample,作者提出了 Classification-Aware Regression Loss(CARL) 來聯合優化分類器和回歸其兩個分支。CARL可以提升主要樣本的分數,同時抑制其他樣本的分數。回歸質量決定了樣本的重要性,我們期望分類器對重要樣本輸出更高的分數。兩個分支的優化應該是相互關聯的,而不是相互獨立的。
作者的方法是讓回歸器知道分類器的分數,這樣梯度就可以從回歸器傳播到分期其分支。公式如下:
表示相應類別的預測分數, 表示輸出的回歸偏移量。利用一個指數函數將 轉化為 ,隨後根據所有樣本的平均值對它進行縮放。為了保持損失規模不變,對具有分類感知的 進行歸一化。 是常用的smooth L1 loss。
關於 的梯度與原回歸損失 成正比。 p_i mathcal{L}(d_i, hat d_i) mathcal{L}(d_i, hat d_i)$ 反映了樣本i的定位質量,因此可以認為是一個IoU的估計,進一步可以看作是一個IoU-HLR的估計。可以近似認為,排序靠前的樣本有較低的回歸損失,於是分類得分的梯度較小。對於CARL來說,分類分支受到回歸損失的監督。 不重要樣本的得分被極大的抑制掉,而對重要樣本的關注得到加強。
待續。。。
上面的方法大致可以分為兩種:
Focal Loss認為正負樣本的不平衡,本質上是因為難易樣本的不平衡,於是通過修改交叉熵,使得訓練過程更加關注那些困難樣本,而GHM在Focal Loss的基礎上繼續研究,發現難易樣本的不平衡本質上是因為梯度范數分布的不平衡,和Focal Loss的最大區別是GHM認為最困難的那些樣本應當認為是異常樣本,讓檢測器強行去擬合異常樣本對訓練過程是沒有幫助的。PISA則是跳出了Focal Loss的思路,認為采樣策略應當從mAP這個指標出發,通過IoU Hierarchical Local Rank (IoU-HLR),對樣本進行排序並權值重標定,從而使得recall和precision都能夠提升。
7. 5種數據科學家必知的采樣演算法
原文鏈接:The 5 Sampling Algorithms every Data Scientist need to know
假設有1000名學生,其中300名是男生,700名是女生。如果從中抽取出100名,可以對1000名隨機采樣,也可以從男生中選30名,女生中選70名,這就是分層采樣。
假設有一個未知長度的流數據,只能遍歷一遍,如何從中等概率地選出n個元素
基本想法是維護一個n長的列表,在遍歷流數據的過程中,以一定的概率將流數據中當前遍歷到的元素添加到列表中,或者替換列表中已有的元素。
那麼,問題就是,這個「一定的概率」需要是多少,才能保證每個選中的元素都是等概率的。
我們把問題簡化一下,假設有一個長度為3的流數據,我們從中選擇2個,那麼每個元素被選中的概率都是2/3。採用如下的步驟:
第3個元素替換1的概率是1/3,替換2的概率也是1/3,這樣,每個元素被選中的概率都是2/3。
在處理高度不平衡的數據集的時候,經常會用戶重采樣方法,重采樣有降采樣和過采樣兩種。降采樣是從樣本多的類別中刪除樣本,過采樣是向樣本少的類別中添加樣本。
imbalanced-learn(imblearn)是一個處理非平衡數據集的Python包。
Tomek Links 是一組從屬於不同類別的相鄰樣本對。我們可以將這些相鄰的樣本對都刪除,來為分類器提供一個更清晰的分類邊界。
SMOTE (Synthetic Minority Oversampling Technique) 對樣本少的類別合成樣本,這些合成的樣本位於已有樣本的臨近位置上。
在 imblearn 包中還有其他的演算法,比如: