模型的燃料,数据采样的秘密
在實踐中,采樣是非常重要的,本質上它是利用少量的樣本來近似總體的分布,從特定的分布中抽取相應樣本的過程。
同時,不僅是推薦、搜索、廣告實際中需要,任何機器學習模型,這都是一個不得不去重視的知識點。
高斯分布(正態分布)的采樣方法有逆變換法、拒絕采樣法等。
- 構造馬爾科夫鏈,使其分布即為帶采樣目標的分布。其中構造馬爾科夫鏈是該采樣法的核心,根據構造方法的不同,對應不同的采樣方法;
- 從任一初始狀態,沿著馬爾科夫鏈進行狀態轉移;
- 得到收斂于目標分布的狀態轉移序列的一系列樣本;
根據有向圖的順序,對節點進行采樣,包括最簡單的祖先采樣、參考重要性的似然加權采樣和采用Metropolis Hastings方法的采樣等。
1.1 數據收集機制理解
關于我們的數據收集形式對我們進行后續數據的使用和預處理起到非常關鍵的作用,我承認這塊我做得不是很好,導致在實驗的過程中無腦的把數據直接丟入模型,看上去模型的效果變差了,帶來了非常多錯誤的結論。從而使得后期又不得不重復進行實驗。
注:公司的數據一般非常大,做大模型的話,在機器資源不夠的情況下,跑一輪得到的結果是極其浪費時間的,關于這塊,個人最大的建議就是在直接將數據丟到模型之前,至少檢查以下幾點東西。
- 重復數據觀測:查看相同的id是否存在較為嚴重的重復,即出現了較多的重復數據,這些重復的數據會使得模型訓練變差,從而帶來幻覺,這些數據是沒有意義的,但其實把重復的數據刪去之后可能結論就完全相反了;
- 收集的數據丟失率檢測:好的meta數據是建模有效的前提之一,如果數據收集的策略有問題,最差的情況是數據收集出錯了,那就沒必要建模了;不過最常見的討論的問題還是丟失率的問題,就是理想情況下可以收集到100條數據,實際只能收集到60條,這種情況的話也沒什么好說的,最簡單的就是詢問工程端能否提升數據的收集率,這是最簡單的,數據多了準了,模型自然也會有提升的;
- 標簽是如何來的:在電商中,用戶點擊完商品并不會立即就購買,所以購買的信息要和前面用戶的用戶點擊記錄相關聯,這種關聯機制也很重要,了解這些對數據預處理能帶來非常大的參考。
- 其它的很多很多坑。
1.2 數據字段理解
這邊不想吐槽太多,目測很多公司很多業務都是類似的,尤其是當業務發展多年的情況下,會遺留下一大堆數據表,這些表有非常多的字段,但是表的負責人已經離職了,很多數據字段也都沒有寫備注,但是這張表又和后面的很多關鍵表相關聯,這是非常頭疼的事情。
為什么說字段的理解非常重要呢?舉個例子來說,商品ID(ItemID),比如iphone12的ID,
- 情況1:在不同的國家,iphone12都是使用同一個ItemID來表示的;
- 情況2:在不同的國家,iphone12都是使用不同的ItemID來表示的;
這樣兩種不同的數據字段攜帶的信息量是完全不一樣的,
- 對于情況1,iphone12是只能反映在全局情況下的情況;
- 但是對于情況2,iphone12卻反映的是在國家細粒度下的情況;
我們知道,不同國家的iphone12的銷量可能是完全不一樣的,在貧窮的國家可能銷量就低;在富有的國家則銷量很高,所以說數據字段的理解是至關重要的,相同的字段在不同設計情況下統計的特征可能完全是兩碼事。
數據清洗:我們的數據中,存在非常多的臟數據,這些數據的處理可以幫助我們更好地提效,使得模型訓練得到的結果更為良性;這一塊沒有做太多的工作,可能反欺詐等團隊做的工作會多一些,典型的就是:
- 刷單的數據;
- 刷好評的數據等等;
- 爬蟲的信息過濾等;
- 其它;
對這些數據的清洗可以更為真實的反映用戶的習慣。
數據采樣:因為大模型這塊數據量非常大,很多時候數據經過各種merge操作之后,都可以達到上PB級別,所以模型的訓練經常需要有合理的采樣策略;而目前最為常見的采樣策略是基于隨機的,基于啟發式的(也就是大家經常會使用的基于規則的),也有一些基于最新的一些論文的方式:
3.1 負樣本隨機采樣
這個基本所有的公司和數據競賽中在樣本規模達到一定比例的時候都會有碰到,將全部的負樣本全部丟入到模型中進行訓練,會浪費非常多的資源,而且常常因為類別不平衡等原因經常獲得的效果往往還不如經過隨機采樣來的效果好。在我們的實驗中,我們發現:
- 負樣本的采樣比例影響還是較大的,隨機采樣10%的負樣本和隨機采樣20%的負樣本得到的效果可能會相差一個點,而且較為穩定;
- 如果有特征工程的融入,在做負樣本采樣的時候我們需要先做特征,然后再對負樣本進行隨機采樣,否則效果會很差;
注意,這邊僅僅是對負樣本進行隨機采樣,正樣本的量非常少,一般都是全部保留的。
3.2 基于某些規則的啟發式采樣
在電商等應用中,很多用戶對于position位置可能比較敏感,而這些position也具有非常大的參考價值,很多用戶可能就只瀏覽了前面部分的商品,后面的曝光商品根本就沒有看,尤其是末尾的商品,但是這些信息我們又沒法捕捉,這塊很多時候需要和工程討論數據埋點的問題;而我們經常會使用下面的策略去進行嘗試,幾個典型的例子:
- 基于曝光位置的規則:在曝光頁面,用戶只點擊了搜索之后的第二個曝光商品,對于后面的商品基本都是沒有處理的;這些商品用戶有沒有細細瀏覽都得打個問號?所以在很多的博客中,有些公司會嘗試將曝光位置大于最后一個點擊商品的位置的商品去掉,在采樣的過程中不再使用這些商品,而我們在實驗過程中發現模型效果略有損失;后來我們將曝光位置大于最后一個點擊商品的位置+某個閾值的商品去掉,在實驗中可以看到細微的效果提升;
- 基于瀏覽/滑動時長的規則:用戶在瀏覽的過程中,由于疲勞或者不感興趣或者其它原因在某些頁面會快速滑動瀏覽頁,我們就可以基于端上收集的用戶的滑動停留時長等信息對負樣本進行過濾,認為這些樣本用戶是沒有仔細觀察的;
- 誤點擊樣本過濾:上面的兩種貪心式規則都是基于負樣本進行采樣的,當然在大家所熟知的問題中還存在一些噪音正樣本,例如誤點擊的樣本,這些樣本普遍是較難判斷的,而對于模型訓練帶來的影響也較難判斷。一般我們可以通過刪除那些點擊進入之后直接就跳出的用戶(即在詳情頁停留時間極短的樣本的數據),而實踐中,我們發現對這些樣本進行過濾,效果并沒有太大的變化,可能不同的場景會有些許差別。
上面的這三種策略基本都是可以嘗試的,但是別指望可以帶來巨大的提升,不過微弱的提升還是可以期待一下的。除此之外,我看到還有非常多其它值得嘗試的,此處僅列舉在下方,并沒有什么具體的結論。(下面這兩個來源于引文[31])
- 基于用戶的活躍度分布采樣,用戶的活躍度一般都是一個長尾分布,越活躍的用戶對應的人數越少,但是其所占的行為越多。這種情況下,如果不考慮用戶活躍度去篩選正負樣本,難免活躍用戶所占的權重就會增大,此時有效的解決辦法是針對每個用戶提取相同的正負樣本。
- 針對同一個內容在不同時間對同一個用戶曝光多次的情況,這時候訓練集中可能會出現同一用戶對同一內容點擊與不點擊并存的情況,如果多次曝光的間隔非常短,考慮只使用其中的一次曝光數據。
- 其它....
3.3 基于最新技術的方案
好像也有聽說最新的論文有使用一些最新的技術,來自動選擇好的負樣本,這塊沒有繼續研究下去了。
煉丹知識點 往期回顧
煉丹知識點:模型評估里的陷阱
煉丹知識點:那些決定模型上限的操作
總結
以上是生活随笔為你收集整理的模型的燃料,数据采样的秘密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Transformers中的位置编码到底
- 下一篇: 如何评估序列推荐模型?