機(jī)器學(xué)習(xí)模型在同一數(shù)據(jù)集上訓(xùn)練產(chǎn)生不同結(jié)果的3個(gè)原因
如果你正在學(xué)習(xí)機(jī)器學(xué)習(xí)模型(不論什么任務(wù)),在本地機(jī)器上研究開(kāi)發(fā)之后,能夠在測(cè)試集上運(yùn)行。卻發(fā)現(xiàn)模型在通過(guò)構(gòu)建管道部署時(shí)一直失敗,但是該模型是在本地開(kāi)發(fā)時(shí)使用的相同測(cè)試集上測(cè)試好的。
本文將解釋這種奇怪現(xiàn)象產(chǎn)生的原因,并提出如何檢測(cè)真實(shí)模型回歸的建議。
本文案例使用代碼鏈接:
https://github.com/hsm207/why_models_fail
從本地開(kāi)發(fā)階段開(kāi)始看
假設(shè)我們正在構(gòu)建一個(gè)模型來(lái)對(duì)MNIST數(shù)據(jù)集進(jìn)行分類(lèi)。目標(biāo)是構(gòu)建一個(gè)在測(cè)試集上準(zhǔn)確率至少為95%的分類(lèi)器。
幾次嘗試,終于實(shí)現(xiàn)了這一目標(biāo):

但是,再次運(yùn)行訓(xùn)練和評(píng)估邏輯會(huì)產(chǎn)生不同的結(jié)果:

運(yùn)行相同的模型訓(xùn)練和測(cè)試代碼會(huì)產(chǎn)生不同的結(jié)果
結(jié)果略有不同,我們的目的就是想知道變化的原因。按道理來(lái)說(shuō),完全相同的代碼運(yùn)行多次應(yīng)該會(huì)產(chǎn)生相同的結(jié)果。
回顧發(fā)現(xiàn)在訓(xùn)練時(shí)開(kāi)啟了數(shù)據(jù)洗牌(data shuffling),這是構(gòu)建機(jī)器學(xué)習(xí)模型時(shí)的常見(jiàn)做法。也許如果你在訓(xùn)練中禁用隨機(jī)洗牌(random shuffling),那么在不同的訓(xùn)練中結(jié)果將會(huì)保持不變?
構(gòu)建機(jī)器學(xué)習(xí)模型時(shí)的常見(jiàn)做法相關(guān)解釋:
https://datascience.stackexchange.com/questions/24511/why-should-the-data-be-shuffled-for-machine-learning-tasks
這是在訓(xùn)練期間禁用隨機(jī)洗牌后第一次運(yùn)行的結(jié)果:

訓(xùn)練期間關(guān)閉數(shù)據(jù)shuffle后的首次運(yùn)行
這是第二次運(yùn)行的結(jié)果:

訓(xùn)練期間關(guān)閉數(shù)據(jù) shuffle 后的第二次運(yùn)行
結(jié)果還是不一樣!但至少現(xiàn)在差距變小了……
然后想起模型在訓(xùn)練開(kāi)始時(shí)隨機(jī)初始化它的參數(shù)!所以斷定,修復(fù)隨機(jī)種子肯定會(huì)解決這個(gè)問(wèn)題。
修復(fù)隨機(jī)種子知識(shí)點(diǎn):
https://github.com/tensorflow/tensorflow/blob/c256c071bb26e1e13b4666d1b3e229e110bc914a/tensorflow/python/framework/random_seed.py#L215-L216
將隨機(jī)種子設(shè)置為1時(shí),會(huì)發(fā)生以下情況:

在訓(xùn)練期間修復(fù)隨機(jī)種子并禁用數(shù)據(jù)洗牌后的首次運(yùn)行
第二次運(yùn)行:

在訓(xùn)練期間修復(fù)隨機(jī)種子并禁用數(shù)據(jù)洗牌后的第二次運(yùn)行
Ok現(xiàn)在結(jié)果是相同的,繼續(xù)構(gòu)建一個(gè)管道來(lái)訓(xùn)練模型并將其部署到生產(chǎn)中。
管道模型
從構(gòu)建管道中讀取日志:

來(lái)自構(gòu)建管道的訓(xùn)練和測(cè)試日志
隨機(jī)種子已固定為1,并且已禁用訓(xùn)練數(shù)據(jù)混洗,就像在本地機(jī)器上所做的一樣。但為什么結(jié)果不一樣呢?
管道模型和本地模型之間的差異真的很小,也許這可能是硬件浮點(diǎn)算法實(shí)現(xiàn)中的錯(cuò)誤。
好消息是這個(gè)“錯(cuò)誤”已經(jīng)在互聯(lián)網(wǎng)上被討論了很多。壞消息是它不是一個(gè)錯(cuò)誤。簡(jiǎn)而言之,機(jī)器之間的差異源于浮點(diǎn)規(guī)范的定義方式以及硬件供應(yīng)商如何實(shí)現(xiàn)它們。除了忍了這個(gè)差異沒(méi)有別的辦法。
舉個(gè)例子
使用MNIST數(shù)據(jù)集,它有 60,000 個(gè)訓(xùn)練示例和 10,000 個(gè)測(cè)試示例??紤]到問(wèn)題的復(fù)雜性,這足以確保機(jī)器學(xué)習(xí)模型在每次運(yùn)行時(shí)都能訓(xùn)練到收斂。
但實(shí)際上我們不太可能從如此大的數(shù)據(jù)集開(kāi)始。
我們要提前考慮數(shù)據(jù)集大小對(duì)同一臺(tái)機(jī)器上運(yùn)行的變化的影響。
現(xiàn)在我們只有1,000個(gè)訓(xùn)練樣例和500個(gè)測(cè)試樣例,則變化如下:

假設(shè)有1000個(gè)訓(xùn)練示例,測(cè)試準(zhǔn)確度的變化
在只有1000個(gè)訓(xùn)練示例的情況下,我們預(yù)計(jì)模型的表現(xiàn)相對(duì)于在整個(gè)訓(xùn)練集中進(jìn)行訓(xùn)練時(shí)較差。圖8證實(shí)了這一點(diǎn)(在整個(gè)測(cè)試集上測(cè)試時(shí)的中位數(shù)測(cè)試準(zhǔn)確度介于86.5%和87.0%之間,而在完整訓(xùn)練集上訓(xùn)練時(shí)的中位數(shù)為 97%)。
圖 8 還顯示,與在完整測(cè)試集上進(jìn)行評(píng)估相比,僅在 500 個(gè)測(cè)試示例上進(jìn)行評(píng)估時(shí),測(cè)試準(zhǔn)確性的變化要高得多。
有了正確的數(shù)據(jù)集,固定的隨機(jī)種子,沒(méi)有數(shù)據(jù)洗牌,你最終可以在你的500個(gè)樣本測(cè)試集上得到89%的測(cè)試精度,這并不是模型的真實(shí)性能的真實(shí)反映。因此,不應(yīng)該關(guān)閉來(lái)自隨機(jī)種子和數(shù)據(jù)洗牌的隨機(jī)性,以便我們可以估計(jì)模型性能的不確定性。
但是如何確保模型的后續(xù)工作(例如添加新特征、超參數(shù)調(diào)整)不會(huì)意外引入回歸?
如何檢查模型回歸
前面的部分已經(jīng)表明,在小數(shù)據(jù)集上訓(xùn)練和測(cè)試的模型的評(píng)估指標(biāo)可能會(huì)有很多變化。因此,如果您的模型具有 90% 的準(zhǔn)確率,那么下一次運(yùn)行可能會(huì)偶然返回 88% 的準(zhǔn)確率,這使得設(shè)置檢測(cè)回歸的最小閾值變得困難。
人們可能很想尋找一種隨機(jī)種子,這將使本地模型和管道模型的結(jié)果差異盡可能小,但我認(rèn)為這不是對(duì)時(shí)間的最佳利用。
相反,我建議在管道中運(yùn)行幾次訓(xùn)練和測(cè)試作業(yè),并計(jì)算運(yùn)行中評(píng)估指標(biāo)的均值和標(biāo)準(zhǔn)差。這些數(shù)字在機(jī)器上是穩(wěn)定的,因此可以用來(lái)可靠地確定是否引入了回歸。
結(jié)論
這篇文章描述了機(jī)器學(xué)習(xí)模型每次在同一數(shù)據(jù)集上訓(xùn)練會(huì)產(chǎn)生不同結(jié)果的 3 個(gè)原因,即:
輸入:訓(xùn)練數(shù)據(jù)批處理并輸入模型的方式很重要
模型架構(gòu):隨機(jī)權(quán)重初始化、隨機(jī)采樣和 dropout 等技術(shù)將通過(guò)設(shè)計(jì)將隨機(jī)性引入模型的輸出中
硬件:不同的硬件可以不同地實(shí)現(xiàn)浮點(diǎn)運(yùn)算
本文還建議使用在一系列訓(xùn)練和測(cè)試運(yùn)行上計(jì)算出的評(píng)估指標(biāo)的均值和標(biāo)準(zhǔn)差作為檢測(cè)模型回歸的方法。
文章來(lái)源:
https://pub.towardsai.net/why-your-build-pipelines-always-fail-your-machine-learning-model-a09484d551f6
免責(zé)聲明:所載內(nèi)容來(lái)源互聯(lián)網(wǎng),僅供參考。轉(zhuǎn)載稿件版權(quán)歸原作者和機(jī)構(gòu)所有,如有侵權(quán),請(qǐng)聯(lián)系我們刪除。
關(guān)注公眾號(hào)更多人工智能干貨等你來(lái)!
如有問(wèn)題,溫柔的說(shuō),別直接噴/(ㄒoㄒ)/~~
