使用ML和DNN建模的技巧是什么

這篇文章給大家介紹使用ML和DNN建模的技巧是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)西充,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

數(shù)據(jù)預(yù)處理(Data Preparation)

處理原始數(shù)據(jù)(Process Your Own Data)

因?yàn)橄M(fèi)者可能不知道開(kāi)展數(shù)據(jù)處理和特征工程,所以數(shù)據(jù)分析師需要在模型內(nèi)進(jìn)行數(shù)據(jù)預(yù)處理。

  • 以文本分類問(wèn)題為例,使用BERT進(jìn)行分類。數(shù)據(jù)分析師不能要求客戶進(jìn)行標(biāo)記處理和特征整理。

  • 以回歸問(wèn)題為例,時(shí)間是特征之一。在初始模型中,數(shù)據(jù)分析師只能使用星期幾(如星期四)作為特征。經(jīng)過(guò)幾次迭代之后,星期幾不再是一個(gè)好的特征因素,數(shù)據(jù)分析師只想使用日期(如31號(hào))作為特征。而客戶可能只提供了星期幾的信息,而沒(méi)有具體日期的信息,因此需要進(jìn)行數(shù)據(jù)預(yù)處理。

  • 以語(yǔ)音識(shí)別為例,消費(fèi)者只能向數(shù)據(jù)分析師發(fā)送音頻,而不能發(fā)送諸如Mel Cepstral Coefficient(MFCC)等經(jīng)典特征數(shù)據(jù)。

因此,建議在代碼中嵌入數(shù)據(jù)預(yù)處理,而不是要求客戶機(jī)進(jìn)行預(yù)處理。

使用張量(Use Tensor)

張量是一個(gè)N維數(shù)組,用于多維計(jì)算。它比使用Python字典或數(shù)組要快,深度學(xué)習(xí)框架(例如PyTorch或TensorFlow)的對(duì)象數(shù)據(jù)格式是tensor。

數(shù)據(jù)擴(kuò)充(Data Augmentation)

缺少標(biāo)記數(shù)據(jù)是從業(yè)者通常面臨的挑戰(zhàn)之一。遷移學(xué)習(xí)是克服這一問(wèn)題的途徑之一,計(jì)算機(jī)視覺(jué)從業(yè)者可以考慮使用ResNet,自然語(yǔ)言處理從業(yè)者可以考慮BERT。另一方面,可以生成合成數(shù)據(jù)以增加標(biāo)記數(shù)據(jù)。albumentations和imgaug可以生成圖像數(shù)據(jù),而nlpaug可以生成文本數(shù)據(jù)。

如果你了解你的數(shù)據(jù),你應(yīng)該量身設(shè)計(jì)數(shù)據(jù)擴(kuò)充方法。請(qǐng)記住,數(shù)據(jù)科學(xué)的黃金法則是garbage in garbage out。

數(shù)據(jù)采樣(Sampling Same Data)

大多數(shù)情況下,我們希望隨機(jī)抽取數(shù)據(jù),以保持樣本數(shù)據(jù)在訓(xùn)練集、測(cè)試集和驗(yàn)證集之間的概率分布是一致的。同時(shí),也希望保持這種“隨機(jī)”行為,使得我們可以在不同的時(shí)刻獲得相同的訓(xùn)練集、測(cè)試集和驗(yàn)證集。

  • 如果數(shù)據(jù)帶有日期屬性,則可以按日期拆分?jǐn)?shù)據(jù)。

  • 否則,可以更改隨機(jī)種子,使其具有一致的隨機(jī)行為。

 import torch
 import numpy as np
 import random
 seed = 1234
 random.seed(seed)
 np.random.seed(seed)
 torch.manual_seed(seed)
 torch.cuda.manual_seed(seed)

模型訓(xùn)練(Model Training)

存儲(chǔ)中間狀態(tài)(Saving Intermediate Checkpoint)

只是在訓(xùn)練完成后保存模型,通常具有以下幾個(gè)缺點(diǎn):

  • 由于模型的復(fù)雜性、計(jì)算資源和訓(xùn)練數(shù)據(jù)的大小,整個(gè)模型訓(xùn)練過(guò)程可能需要幾天或幾周的時(shí)間。如果沒(méi)有中間狀態(tài)被存儲(chǔ),這將是非常危險(xiǎn)的,因?yàn)闄C(jī)器可能會(huì)被意外關(guān)閉。

  • 一般來(lái)說(shuō),較長(zhǎng)訓(xùn)練能夠獲得更好的結(jié)果(例如,損失更少)。然而,可能會(huì)發(fā)生過(guò)度擬合。在大多數(shù)情況下,最后一個(gè)模型狀態(tài)并不能提供最佳結(jié)果。我們大部分時(shí)間都需要使用中間狀態(tài)的模型來(lái)進(jìn)行生產(chǎn)。

  • 使用檢查-停止機(jī)制能夠節(jié)省資金。注意到一個(gè)模型在幾個(gè)周期內(nèi)并沒(méi)有改進(jìn),我們可以早點(diǎn)停止它以節(jié)省時(shí)間和資源。

理想情況下,我們可以連續(xù)性存儲(chǔ)模型(例如,在每個(gè)epoch之后保存模型),但它需要大量的存儲(chǔ)。事實(shí)上,我們建議只保留最好的模型(或最好的三個(gè)模型)和最后一個(gè)模型。

虛擬周期(Virtual Epoch)

Epoch是模型訓(xùn)練中一個(gè)非常常見(jiàn)的參數(shù)。如果初始化不正確,可能會(huì)影響模型性能。

例如,如果我們有100萬(wàn)條記錄,我們?cè)O(shè)置了5個(gè)epoch,那么總共有500萬(wàn)條的訓(xùn)練數(shù)據(jù)。三周后,我們又得到了50萬(wàn)條記錄。如果我們使用相同的epoch進(jìn)行模型訓(xùn)練,總訓(xùn)練數(shù)據(jù)將達(dá)到750萬(wàn)。問(wèn)題是:

  • 難以確定模型性能的改進(jìn)是由于特定數(shù)據(jù)的數(shù)量增加還是總體數(shù)據(jù)的數(shù)量增加。

  • 新的50萬(wàn)條數(shù)據(jù)使訓(xùn)練時(shí)間延長(zhǎng)1小時(shí)甚至幾天。它增加了機(jī)器故障的風(fēng)險(xiǎn)。

建議用虛擬epoch代替原始靜態(tài)epoch。虛擬epoch可以根據(jù)訓(xùn)練數(shù)據(jù)的大小、期望epoch、批大小來(lái)計(jì)算得到。

通常的靜態(tài)epoch如下:

 #original
 num_data = 1000 * 1000
 batch_size = 100
 num_step = 14 * 1000 * 1000
 num_checkpoint = 20
 steps_per_epoch = num_step//num_checkpoint
 #TensorFlow/ Keras
 model.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch,
   batch_size=batch_size
 )

而虛擬epoch如下:

 num_data = 1000 * 1000
 num_total_data = 14 * 1000 * 1000
 batch_size = 100
 num_checkpoint = 20
 steps_per_epoch = num_total_data // (batch_size*num_checkpoint)
 #TensorFlow/ Keras
 model.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch,
   batch_size=batch_size
 )

簡(jiǎn)化原則(Simple is Beauty)

從業(yè)者通常打算使用最先進(jìn)的模型來(lái)構(gòu)建初始模型。事實(shí)上,我們建議建立一個(gè)足夠簡(jiǎn)單的模型作為基線模型。原因是:

  • 我們總是需要一個(gè)基線模型來(lái)證明所提出的模型是正確的。

  • 基線模型不需要在性能方面非常好,但它必須是可解釋的。業(yè)務(wù)用戶總是想知道預(yù)測(cè)結(jié)果的原因。

  • 易于實(shí)施是非常重要的??蛻舨荒艿纫荒瓴拍艿玫揭粋€(gè)足夠好的模型。我們需要建立一套模型,以便從投資者那里獲得動(dòng)力,在初始模型的基礎(chǔ)上建立你的精彩模型。

以下是一些建議的不同領(lǐng)域的基線模型:

  • 語(yǔ)音識(shí)別:可以使用經(jīng)典特征,如mel frequency cepstral coefficient(MFCC)或 mel spectrogram features,而不是訓(xùn)練模型來(lái)獲得向量表征(如增加嵌入層)。將這些特征傳遞給一個(gè)長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)或卷積神經(jīng)網(wǎng)絡(luò)(CNN)和一個(gè)完全連接的層進(jìn)行分類或預(yù)測(cè)。

  • 計(jì)算機(jī)視覺(jué):TODO。

  • 自然語(yǔ)言處理:使用bag-of-words 或 classic word embeddings嵌入LSTM是一個(gè)很好的出發(fā)點(diǎn),然后再轉(zhuǎn)向其它模型,如BERT或XLNet。

調(diào)試(Debugging)

簡(jiǎn)化問(wèn)題(Simplifying Problem)

有時(shí),分類問(wèn)題包括100萬(wàn)個(gè)數(shù)據(jù)和1000個(gè)類別。當(dāng)模型性能低于理想值時(shí),很難調(diào)試模型。糟糕的性能可能是由模型復(fù)雜性、數(shù)據(jù)質(zhì)量或bug造成的。因此,建議簡(jiǎn)化問(wèn)題,這樣我們就可以保證它是無(wú)缺陷的。我們可以利用過(guò)度擬合問(wèn)題來(lái)實(shí)現(xiàn)這一目標(biāo)。

一開(kāi)始,不需要對(duì)1000個(gè)類別進(jìn)行分類,可以先對(duì)10個(gè)類別進(jìn)行抽樣,每個(gè)類別有100個(gè)數(shù)據(jù),并訓(xùn)練模型。通過(guò)使用相同的訓(xùn)練數(shù)據(jù)集(或子集)作為評(píng)估數(shù)據(jù)集,能夠過(guò)度擬合模型并獲得良好的結(jié)果(例如,80甚至90+的精確度)。在這一基礎(chǔ)上進(jìn)行模型開(kāi)發(fā)能夠減少bug的出現(xiàn)。

使用評(píng)估模式(Using Eval Mode for Training)

如果評(píng)估模式的精度在前幾個(gè)epoch中沒(méi)有變化,通??赡苁峭浽谠u(píng)估后重置為“訓(xùn)練”模式。

在Pytorch中,需要在訓(xùn)練和評(píng)估階段轉(zhuǎn)換訓(xùn)練模式以及評(píng)估模式。如果啟用訓(xùn)練模式,批標(biāo)準(zhǔn)化、dropout或其他參數(shù)將受到影響。有時(shí),數(shù)據(jù)分析師可能會(huì)在評(píng)估模式后忘記啟用訓(xùn)練模式。

 model = MyModel() # Default mode is training mode
 for e in range(epoch):
   # mode.train() # forget to enable train mode
   logits = model(x_train)
   loss = loss_func(logits, y_train)
   model.zero_grad()
   loss.backward()
   optimizer.step()
 mode.eval() # enable eval mode
   with torch.no_grad():
     eval_preds = model(x_val)

數(shù)據(jù)轉(zhuǎn)換(Data Shifting)

當(dāng)訓(xùn)練數(shù)據(jù)集與評(píng)估/測(cè)試數(shù)據(jù)集存在顯著差異時(shí),需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換。在計(jì)算機(jī)視覺(jué)任務(wù)中,可能大部分訓(xùn)練數(shù)據(jù)是白天的圖片,而測(cè)試數(shù)據(jù)是夜間的圖片。

如果發(fā)現(xiàn)訓(xùn)練損失/準(zhǔn)確度和測(cè)試損失/準(zhǔn)確度之間存在很大差異,可以從兩個(gè)數(shù)據(jù)集中隨機(jī)抽取一些樣本進(jìn)行檢查。為了解決這個(gè)問(wèn)題,可以考慮如下方法:

  • 確保在訓(xùn)練、測(cè)試和預(yù)測(cè)數(shù)據(jù)集之間保持相似的數(shù)據(jù)分布。

  • 如果可能,添加更多的訓(xùn)練數(shù)據(jù)。

  • 通過(guò)利用相關(guān)庫(kù)添加合成數(shù)據(jù)??紤]使用nlpaug(用于自然語(yǔ)言處理和聲學(xué)任務(wù))和imgaug(用于計(jì)算機(jī)視覺(jué)任務(wù))。

欠擬合問(wèn)題(Addressing Underfitting)

欠擬合是指訓(xùn)練誤差大于期望誤差。換言之,模型無(wú)法達(dá)到預(yù)期的性能。造成大誤差的因素很多。要解決這個(gè)問(wèn)題,可以從一個(gè)更簡(jiǎn)單的模型或者方法開(kāi)始,看看它是否可以解決。

  1. 執(zhí)行錯(cuò)誤分析。通過(guò)LIME、SHAP或Anchor來(lái)解釋你的模型,這樣你就可以感覺(jué)到問(wèn)題所在。

  2. 初始模型可能過(guò)于簡(jiǎn)單。增加模型的復(fù)雜性,例如增加長(zhǎng)短期記憶(LSTM)層、卷積神經(jīng)網(wǎng)絡(luò)(CNN)層或完全連接(FC)層。

  3. 通過(guò)減少正則化層,稍微過(guò)擬合模型。Dropout和降低權(quán)重則可以防止過(guò)擬合。然后可以嘗試移除這些正則化層,看看是否可以解決問(wèn)題。

  4. 采用最先進(jìn)的模型架構(gòu)。考慮在自然語(yǔ)言處理(NLP)中使用轉(zhuǎn)換器(如BERT或XLNet)。

  5. 引入合成數(shù)據(jù)。生成更多數(shù)據(jù)有助于提高模型性能,而無(wú)需任何人工操作。理論上,生成的數(shù)據(jù)應(yīng)該共享同一個(gè)標(biāo)簽。它允許模型“看到”更多不同的數(shù)據(jù),并最終提高魯棒性。可以利用nlpaug和imgaug來(lái)執(zhí)行數(shù)據(jù)擴(kuò)充。

  6. 分配更好的超參數(shù)和優(yōu)化器??梢钥紤]執(zhí)行超參數(shù)調(diào)整,而不是使用默認(rèn)/常規(guī)學(xué)習(xí)速率、epoch、batch size??紤]使用波束搜索、網(wǎng)格搜索或隨機(jī)搜索來(lái)識(shí)別更好的超參數(shù)和優(yōu)化器。這種方法相對(duì)簡(jiǎn)單,只需改變超參數(shù),但可能需要較長(zhǎng)的時(shí)間。

  7. 重新查看數(shù)據(jù)并引入額外的特征。

過(guò)擬合問(wèn)題(Addressing Overfitting)

除了欠擬合,你還可能面臨著過(guò)擬合的問(wèn)題。過(guò)度擬合意味著你的模型太適合你的訓(xùn)練集,而對(duì)其他數(shù)據(jù)沒(méi)有足夠的適用性。換句話說(shuō),訓(xùn)練集準(zhǔn)確性比驗(yàn)證集準(zhǔn)確性要好。考慮以下解決方法:

  1. 執(zhí)行錯(cuò)誤分析。通過(guò)LIME、SHAP或Anchor來(lái)解釋你的模型,這樣你就可能發(fā)現(xiàn)問(wèn)題所在。

  2. 增加更多的訓(xùn)練數(shù)據(jù)。

  3. 引入正則化層。Dropout(正則化層)和批處理標(biāo)準(zhǔn)化(normalization layer)通過(guò)刪除一些輸入和平滑輸入來(lái)幫助減少過(guò)度擬合。

  4. 引入合成數(shù)據(jù)。生成更多數(shù)據(jù)有助于提高模型性能,而無(wú)需任何人工操作。

  5. 分配更好的超參數(shù)和優(yōu)化器。

  6. 移除部分特征。

  7. 模型可能太過(guò)于復(fù)雜。可以減少模型復(fù)雜度。

生產(chǎn)(Production)

元數(shù)據(jù)聯(lián)系(Meta Data Association)

在模型推出后,需要檢查一些例外數(shù)據(jù)。一種方法是生成ID并將添加到數(shù)據(jù)庫(kù)中。然而,它伴隨著幾個(gè)問(wèn)題,也增加了故障排除的難度。以下是一些缺點(diǎn):

  • 影響系統(tǒng)的靈活性。從體系結(jié)構(gòu)設(shè)計(jì)的角度來(lái)看,解耦是構(gòu)建高柔性系統(tǒng)的途徑之一。如果我們生成ID并將帶有此ID的預(yù)測(cè)結(jié)果傳遞給客戶,那么客戶需要在其數(shù)據(jù)庫(kù)中持久使用它。如果我們更改了格式或數(shù)據(jù)類型,需要通知所有使用者更新他們的數(shù)據(jù)庫(kù)。

  • 我們可能需要根據(jù)使用者的關(guān)鍵數(shù)據(jù)收集更多的元數(shù)據(jù)。額外的關(guān)鍵數(shù)據(jù)增加了連接的復(fù)雜性和存儲(chǔ)消耗。

為了克服這個(gè)問(wèn)題,預(yù)測(cè)結(jié)果應(yīng)該直接與使用者的關(guān)鍵數(shù)據(jù)相關(guān)聯(lián)。

轉(zhuǎn)換為推理模型(Switch to Inference Mode)

使用Pytorch時(shí),在將模型部署到生產(chǎn)環(huán)境中時(shí),需要注意幾個(gè)設(shè)置。前面提到了Pytorch中的eval,它使這些層(如Dropout、BatchNorm)在推理模式下工作,例如在推理階段內(nèi)不應(yīng)用任何Dropout操作。它不僅能加快你的進(jìn)程,而且能把所有的信息輸入神經(jīng)網(wǎng)絡(luò)。

 mode.eval() # enable eval mode
 with torch.no_grad():
   eval_preds = model(x_val)

計(jì)算成本(Scalling Cost)

當(dāng)嘗試擴(kuò)展API以處理更大的數(shù)據(jù)量時(shí),有時(shí)可能會(huì)考慮使用GPU。的確,GPU虛擬機(jī)比CPU貴得多。然而,GPU帶來(lái)了一些優(yōu)勢(shì),例如計(jì)算時(shí)間更少,并且需要較少的VM來(lái)維持相同的服務(wù)級(jí)別。數(shù)據(jù)分析師應(yīng)該試著評(píng)估一下GPU是否能節(jié)省一些錢。

無(wú)狀態(tài)化(Stateless)

試著使你的API無(wú)狀態(tài)化,這樣你的API服務(wù)可以很容易地調(diào)整。無(wú)狀態(tài)意味著不在API服務(wù)器(內(nèi)存或本地存儲(chǔ))中保存任何中間結(jié)果。只需保持API服務(wù)器的簡(jiǎn)單性,并將結(jié)果返回給客戶端,而無(wú)需在內(nèi)存或本地存儲(chǔ)中存儲(chǔ)任何內(nèi)容。

批處理(Batch Process)

預(yù)測(cè)一組數(shù)據(jù)通常比逐個(gè)預(yù)測(cè)更快。大多數(shù)現(xiàn)代機(jī)器學(xué)習(xí)或深度學(xué)習(xí)框架優(yōu)化了預(yù)測(cè)性能(在速度方面)。你可能會(huì)注意到,切換到批處理模式預(yù)測(cè)對(duì)于效率有很大的改進(jìn)。

使用C++

雖然Python是機(jī)器學(xué)習(xí)領(lǐng)域中的主流語(yǔ)言,但與其他編程語(yǔ)言(如C++)相比,Python可能太慢了。如果希望低延遲的計(jì)算推理時(shí)間,可以考慮使用TorchScript。一般的方案是,你仍然可以在Python中訓(xùn)練你的模型,但是通過(guò)使用它生成C++兼容的模型。

關(guān)于使用ML和DNN建模的技巧是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

網(wǎng)頁(yè)名稱:使用ML和DNN建模的技巧是什么
網(wǎng)頁(yè)網(wǎng)址:http://bm7419.com/article32/pscjsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、外貿(mào)建站、建站公司網(wǎng)站制作、全網(wǎng)營(yíng)銷推廣、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司