丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能 正文
發(fā)私信給這只萌萌
發(fā)送

1

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

本文作者: 這只萌萌 編輯:楊曉凡 2017-12-13 11:20
導(dǎo)語(yǔ):來(lái)自莫斯科的 Arthur Suilin 在比賽中奪冠并在 github 上分享了他的模型

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

雷鋒網(wǎng) AI 科技評(píng)論按:最近在 Kaggle 上有一場(chǎng)關(guān)于網(wǎng)絡(luò)流量預(yù)測(cè)的比賽落下帷幕,作為領(lǐng)域里最具挑戰(zhàn)性的問(wèn)題之一,這場(chǎng)比賽得到了廣泛關(guān)注。比賽的目標(biāo)是預(yù)測(cè) 14 萬(wàn)多篇維基百科的未來(lái)網(wǎng)絡(luò)流量,分兩個(gè)階段進(jìn)行,首先是訓(xùn)練階段,此階段的結(jié)果是基于歷史數(shù)據(jù)的驗(yàn)證集結(jié)果,接下來(lái)的階段則是真正的預(yù)測(cè)階段,對(duì)未來(lái)網(wǎng)絡(luò)流量的預(yù)測(cè)。

來(lái)自莫斯科的 Arthur Suilin 在這場(chǎng)比賽中奪冠,他在 github 上分享了自己的模型,雷鋒網(wǎng) AI 科技評(píng)論把 Arthur Suilin 的經(jīng)驗(yàn)分享編譯如下。

核心思路

簡(jiǎn)單來(lái)說(shuō),Arthur Suilin 采用了 seq2seq 模型,使用一些調(diào)優(yōu)方法在數(shù)據(jù)體現(xiàn)年份和四季帶來(lái)的波動(dòng)。模型的主要依靠的信息源有兩類:局部特征和全局特征。

1.     局部特征

自回歸模型 —— 當(dāng)發(fā)現(xiàn)一種趨勢(shì)出現(xiàn)時(shí),期望它能持續(xù)出現(xiàn)

滑動(dòng)平均模型  —— 當(dāng)發(fā)現(xiàn)流量高峰出現(xiàn)時(shí),隨后會(huì)出現(xiàn)持續(xù)性地衰退

季節(jié)性模型 —— 當(dāng)發(fā)現(xiàn)某些假日的流量高時(shí),期望以后的假日的流量都會(huì)高

2.     全局特征

注意看下面的自相關(guān)圖,會(huì)發(fā)現(xiàn)按年、按月都有很強(qiáng)的自相關(guān)性。

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

一個(gè)好的模型應(yīng)該完美結(jié)合全局特征和局部特征。

 Arthur 解釋了他為什么采用 RNN seq2seq 模型來(lái)預(yù)測(cè)網(wǎng)絡(luò)流量:

  1. ARIMA 模型已經(jīng)發(fā)展成熟,而 RNN 是在 ARIMA 模型基礎(chǔ)上延深的算法,更為靈活、可表達(dá)性強(qiáng)。

  2. RNN 屬于非參數(shù)算法,簡(jiǎn)化了模型的學(xué)習(xí)過(guò)程。

  3. RNN 模型能輕易識(shí)別一些異常特征(數(shù)字類的或分類的,時(shí)間相關(guān)的或序列相關(guān)的)。

  4. Seq2seq 算法擅長(zhǎng)處理時(shí)序問(wèn)題:基于過(guò)去值和過(guò)去值的預(yù)測(cè)值來(lái)預(yù)測(cè)未來(lái)值。使用過(guò)去值的預(yù)測(cè)值能使模型更加穩(wěn)定,這也是 Seq2seq 模型較為謹(jǐn)慎的地方。訓(xùn)練過(guò)程中每一步的錯(cuò)誤都會(huì)累積,當(dāng)某一步出現(xiàn)了極端錯(cuò)誤,可能就會(huì)毀壞其后面所有時(shí)步的預(yù)測(cè)質(zhì)量。

  5. 深度學(xué)習(xí)算法已經(jīng)被過(guò)度使用。

特征工程

在這一步,Arthur 選擇了簡(jiǎn)化處理,因?yàn)?RNN 本身在特征提取上已足夠強(qiáng)大,以下為模型提取的特征: 

  • pageviews,由于這次比賽是基于網(wǎng)頁(yè)的流量預(yù)測(cè),在此使用了頁(yè)面點(diǎn)擊率(hits),原值通過(guò)lop1p() 轉(zhuǎn)換。

  • agent,county,site – 這些特征都是從頁(yè)面 url 和 one-hot 編碼中提取的。

  • day of week – 用于學(xué)習(xí)按周的季節(jié)性

  • year-to-year autocorrelation, quarter-to-quarter autocorrelation,用于學(xué)習(xí)按年和按季的季節(jié)性長(zhǎng)度

  • page popularity,高流量和低流量頁(yè)面有不同的流量變化模式,這一特征用于學(xué)習(xí)流量規(guī)模,流量規(guī)模信息在 pageviews 特征中丟失了,因?yàn)?pageviews 序列正則化成均值為零、單位方差。

  • lagged pageviews,隨后會(huì)解釋這一特征

特征預(yù)處理

所有特征(包括 one-hot 編碼的特征) 都正則化成均值為零、單位方差的數(shù)據(jù),每一個(gè) pageviews 序列都是單獨(dú)正則化的。

與時(shí)間無(wú)關(guān)的特征(autocorrelations,country 等)都被“拉伸”到與時(shí)間序列相同的長(zhǎng)度,也就是說(shuō)每天都會(huì)同樣地重復(fù)。

模型從原始時(shí)間序列上隨機(jī)抽取固定長(zhǎng)度的樣本進(jìn)行訓(xùn)練。例如,如果原始時(shí)間序列的長(zhǎng)度為 600 天,那么把訓(xùn)練樣本的長(zhǎng)度設(shè)為200天,就可以有400種不同的起始點(diǎn)。

這種采樣方法相當(dāng)于一種有效的數(shù)據(jù)增強(qiáng)機(jī)制,在每一步訓(xùn)練中,訓(xùn)練程序都會(huì)隨機(jī)選擇時(shí)序的開始點(diǎn),相當(dāng)于生成了無(wú)限長(zhǎng)的、幾乎不重復(fù)的訓(xùn)練數(shù)據(jù)。

模型的核心

模型有兩個(gè)主要部分:encoder 和decoder

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

在這里,encoder 是一個(gè) cuDNN GRU。 cuDNN 比傳統(tǒng)的 Tensorflow RNNCell 要快 5 到 10 倍,但 cuDNN 不容易上手,而且相關(guān)文檔也不全面。

decoder 是 一個(gè) TF GRUBlockCell,包含在 tf.while_loop() 函數(shù)里。循環(huán)函數(shù)里的代碼獲取過(guò)去步的預(yù)測(cè)值,并將其作為當(dāng)前步的輸入。

處理長(zhǎng)時(shí)序

LSTM/GRU 擅長(zhǎng)處理最多 100-300 個(gè)項(xiàng)目的短序列。雖然它也能在更長(zhǎng)的序列上工作,但它會(huì)逐漸忘記以前的信息。本次比賽中的時(shí)間序列長(zhǎng)達(dá) 700 天,所以 Arthur  使用了一些其他的方法來(lái)增強(qiáng) GRU 的記憶力。

作者選擇的第一種方法是注意力機(jī)制 ( attention )。 Attention 可以記住“久遠(yuǎn)”的信息,針對(duì)這次比賽的任務(wù),最簡(jiǎn)單有效的 attention 方法是固定權(quán)重的滑動(dòng)窗口 attention(fixed-weight sliding-window attention)。對(duì)于季節(jié)性長(zhǎng)的時(shí)間序列, 有兩個(gè)數(shù)據(jù)點(diǎn)是非常重要的:year ago、 quarter ago。

作者從 current_day - 365 和 current_day - 90 時(shí)間點(diǎn)取 encoder 的輸出, 經(jīng)過(guò)一層 FC 層來(lái)降維,然后將結(jié)果傳送到 decoder 作為輸入。這種簡(jiǎn)單的方法能極大地降低預(yù)測(cè)錯(cuò)誤。

接下來(lái)為了減少噪音數(shù)據(jù)和不均勻間隔(閏年、月份長(zhǎng)度不同等)的影響,模型使用這些重要數(shù)據(jù)點(diǎn)和其鄰近幾個(gè)數(shù)據(jù)點(diǎn)的平均值作為這些數(shù)據(jù)點(diǎn)的值。

attn_365 = 0.25 * day_364 + 0.5 * day_365 + 0.25 * day_366

0.25, 0.5, 0.25 都是在一維的卷積內(nèi)核上(長(zhǎng)度為3),想要讀出過(guò)去的重要數(shù)據(jù)點(diǎn),則需要應(yīng)用更大的內(nèi)核。

最終形成的 attention 機(jī)制有些奇怪,如同提取了每一個(gè)時(shí)間序列的“指紋”(由小型卷積層形成),這些“指紋”決定了哪一個(gè)數(shù)據(jù)點(diǎn)會(huì)被選入更大的卷積內(nèi)核并生成權(quán)重。這個(gè)大的卷積內(nèi)核會(huì)應(yīng)用到 decoder 的輸出,為每一個(gè)待預(yù)測(cè)的天生成 attention 特征。這個(gè)模型可以在源碼中找到。

注:模型沒(méi)有使用傳統(tǒng)的 attention 機(jī)制(Bahdanau or Luong attention),因?yàn)閭鹘y(tǒng) attention 在每一步都需要從頭計(jì)算,并且用上所有歷史數(shù)據(jù)點(diǎn)。這對(duì)于這次比賽的數(shù)據(jù) —— 長(zhǎng)達(dá) 2 年的時(shí)間序列來(lái)說(shuō)不太適用,會(huì)耗費(fèi)很長(zhǎng)時(shí)間。所以模型采用了另一種 attention 方法,對(duì)所有的數(shù)據(jù)點(diǎn)應(yīng)用同一層卷積層,在預(yù)測(cè)時(shí)使用相同的 attention 權(quán)重,這樣的模型計(jì)算起來(lái)更快。

attention 機(jī)制太過(guò)復(fù)雜,Arthur 表示也嘗試過(guò)完全移除 attention,只留下過(guò)去的重要數(shù)據(jù)點(diǎn),如年,半年,季前等數(shù)據(jù)點(diǎn),把這些數(shù)據(jù)點(diǎn)作為新增的特征輸入到 encoder 和 decoder 里。這種方法效果顯著,甚至略為超過(guò)了目前使用 attention 的預(yù)測(cè)質(zhì)量。Arthur 公布的最好成績(jī)模型,只使用了滯后數(shù)據(jù)點(diǎn)作為特征,而沒(méi)有使用 attention 。

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

滯后的數(shù)據(jù)點(diǎn)還有一些好處: 模型可以使用更短的 encoder,不用擔(dān)心在訓(xùn)練過(guò)程會(huì)丟失過(guò)去的信息。因?yàn)檫@些信息已經(jīng)完全包含在特征里了。即使是需要 60 - 90 天時(shí)間序列的 encoder 還是表現(xiàn)的不錯(cuò) , 而之前的模型需要 300 - 400 天的時(shí)間序列。encoder 更短意味著訓(xùn)練更快,更少的信息丟失。

損失和正則化

本次比賽用 SMAPE 來(lái)評(píng)估結(jié)果,在模型中,由于零值點(diǎn)的鄰近數(shù)據(jù)點(diǎn)不穩(wěn)定,SMAPE 無(wú)法直接使用。

Arthur 使用了平滑過(guò)的可微 SMAPE 變量,在真實(shí)的數(shù)據(jù)上表現(xiàn)良好:

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

其他可選的方案: MAE ,使用 MAE 得到的結(jié)果每一處都很平滑,非常接近 SMAPE 的訓(xùn)練目標(biāo)。

最后的預(yù)測(cè)結(jié)果四舍五入為最接近的整數(shù)值,所有負(fù)值記為 0。

訓(xùn)練和驗(yàn)證

模型使用了 COCOB 優(yōu)化器結(jié)合梯度裁剪,這個(gè)優(yōu)化器方法可參見論文《Training Deep Networks without Learning Rates Through Coin Betting》。COCOB 嘗試在每一步預(yù)測(cè)最優(yōu)學(xué)習(xí)率,所以在訓(xùn)練過(guò)程中不需要調(diào)節(jié)學(xué)習(xí)率。它比傳統(tǒng)基于動(dòng)量的優(yōu)化器要收斂的快很多,尤其在第一個(gè) epoch,這節(jié)省了很多時(shí)間。

劃分訓(xùn)練集和驗(yàn)證集的方法有兩種:

1.     Walk-forward split

這種方法事實(shí)上不是真的在劃分?jǐn)?shù)據(jù),數(shù)據(jù)集的全集同時(shí)作為訓(xùn)練集和驗(yàn)證集,但驗(yàn)證集用了不同的時(shí)間表。相比訓(xùn)練集的時(shí)間表,驗(yàn)證集的時(shí)間表被調(diào)前了一個(gè)預(yù)測(cè)間隔期。

2.     Side-by-side split

這是一種主流的劃分方式,將數(shù)據(jù)集切分為獨(dú)立的不同子集,一部分完全用于訓(xùn)練,另一部分完全用于驗(yàn)證。

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

這兩種方法在模型中都有嘗試過(guò)。

Walk-forward 的結(jié)果更可觀,畢竟它比較符合比賽目標(biāo):用歷史值預(yù)測(cè)未來(lái)值。但這種切分方法有其弊端,因?yàn)樗枰跁r(shí)間序列末端使用完全只用作預(yù)測(cè)的數(shù)據(jù)點(diǎn),這樣在時(shí)間序列上訓(xùn)練的數(shù)據(jù)點(diǎn)和預(yù)測(cè)的數(shù)據(jù)點(diǎn)間隔較長(zhǎng),想要準(zhǔn)確預(yù)測(cè)未來(lái)的數(shù)據(jù)就會(huì)變得困難。

舉個(gè)例子,假如我們有 300 天的歷史數(shù)據(jù),想要預(yù)測(cè)接下來(lái)的 100 天。如果我們選擇 Walk-forward 劃分方法,我們會(huì)使用第前 100 天作為訓(xùn)練數(shù)據(jù),接下來(lái) 100 天作為訓(xùn)練過(guò)程中的預(yù)測(cè)數(shù)據(jù)(運(yùn)行 decoder,計(jì)算損失),接下來(lái) 100 天的數(shù)據(jù)用作驗(yàn)證集,最后 100 天用作預(yù)測(cè)未來(lái)的值。所以我們實(shí)際上用了 1/3 的數(shù)據(jù)點(diǎn)在訓(xùn)練,在最后一次訓(xùn)練數(shù)據(jù)點(diǎn)和第一次預(yù)測(cè)數(shù)據(jù)點(diǎn)之間有 200 天的間隔。這個(gè)間隔太大了,所以一旦我們離開訓(xùn)練的場(chǎng)景,預(yù)測(cè)質(zhì)量會(huì)成指數(shù)型下降。 如果只有 100 天的間隔,預(yù)測(cè)質(zhì)量會(huì)有顯著提升。

Side-by-side split 在末端序列上不會(huì)單獨(dú)耗用數(shù)據(jù)點(diǎn)作為預(yù)測(cè)的數(shù)據(jù)集,這一點(diǎn)很好,但模型在驗(yàn)證集上的性能就會(huì)和訓(xùn)練集的性能有很強(qiáng)的關(guān)聯(lián)性,卻與未來(lái)要預(yù)測(cè)的真實(shí)數(shù)據(jù)沒(méi)有任何相關(guān)性,換一句話說(shuō),這樣劃分?jǐn)?shù)據(jù)沒(méi)有實(shí)質(zhì)性作用,只是重復(fù)了在訓(xùn)練集上觀察到的模型損失。

簡(jiǎn)而言之,使用 walk-forward split 劃分的驗(yàn)證集只是用來(lái)調(diào)優(yōu)參數(shù),最后的預(yù)測(cè)模型必然是在與訓(xùn)練集和驗(yàn)證集完全無(wú)相關(guān)的數(shù)據(jù)下運(yùn)行的。

減少模型方差

由于噪音數(shù)據(jù)的存在,模型不可避免有很大的方差。事實(shí)上RNN能在這些噪音數(shù)據(jù)中完成學(xué)習(xí)過(guò)程已經(jīng)很不錯(cuò)了。

不同 seed 下訓(xùn)練的模型性能也會(huì)不一樣,某些 seed 下的模型性能誤差很大。在訓(xùn)練過(guò)程中,這種性能的波動(dòng)是一直存在的,完全憑運(yùn)氣贏得比賽是不行的,所以必須有一些措施來(lái)減少方差。

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

1.     我們不清楚模型訓(xùn)練到哪一步是最適合用于預(yù)測(cè)未來(lái)值的(畢竟基于當(dāng)前數(shù)據(jù)的驗(yàn)證集和未來(lái)數(shù)據(jù)的關(guān)聯(lián)性很弱),所以不能過(guò)早停止訓(xùn)練。但是防止模型過(guò)擬合的一個(gè)大概范圍可以推測(cè),Arthur 把這個(gè)范圍邊界設(shè)為 10500..11500, 這樣節(jié)省了 10 個(gè) checkpoints。

2.     Arthur 在不同的 seed 上訓(xùn)練 了3 種模型,每一個(gè)模型都減少了 checkpoint ,最后總共有 30 個(gè) checkpoints 。

3.     提供模型性能、減少方差的典型方法是 SGD averaging(ASGD),這種方法非常簡(jiǎn)單,在 Tensorlow 上用起來(lái)也很順手。ASGD 要求在訓(xùn)練過(guò)程中網(wǎng)絡(luò)權(quán)重使用滑動(dòng)平均值。

以上三種方法結(jié)合起來(lái)效果很好,模型的 SMAPE 誤差幾乎快趕上排行榜上基于歷史數(shù)據(jù)的驗(yàn)證集下的 SMAPE 誤差值了。

理論上,使用前兩種方法作為集合的學(xué)習(xí)過(guò)程就可以了,第三種方法的使用主要是為了減少誤差。

超參數(shù)調(diào)優(yōu)

很多超參數(shù)的值會(huì)影響模型性能,例如網(wǎng)絡(luò)層的個(gè)數(shù)和深度,激勵(lì)函數(shù),dropout 系數(shù),因此超參數(shù)需要調(diào)優(yōu)。手動(dòng)調(diào)參既無(wú)趣又耗時(shí),我們當(dāng)然希望模型能自動(dòng)調(diào)優(yōu),所以模型中使用了 SMAC3 來(lái)自動(dòng)調(diào)優(yōu),SMAC3 是一種參數(shù)調(diào)優(yōu)的搜索算法,它有以下幾點(diǎn)優(yōu)點(diǎn):

  • 支持條件參數(shù) (舉一個(gè)例子,同時(shí)調(diào)節(jié)網(wǎng)絡(luò)層個(gè)數(shù)和每層的 dropout 個(gè)數(shù),當(dāng)只有 n_layers >1 時(shí),第二層的 drupout 才能被調(diào)節(jié),我們說(shuō)這里存在條件參數(shù))

  • 顯示處理誤差 。SMAC 在不同 seed 上為每個(gè)模型都訓(xùn)練了幾個(gè)實(shí)例,只有這些實(shí)例在同一個(gè) seed 上訓(xùn)練時(shí)才會(huì)相互對(duì)比。一個(gè)模型如果比其他所有同等 seed 上的模型性能都好的話,證明這個(gè)模型是成功的。

另外,Arthur 表示有一點(diǎn)沒(méi)有達(dá)到他的期待,超參數(shù)的搜索方法并沒(méi)有找出全局最優(yōu)值,因?yàn)槟壳白詈玫膸讉€(gè)模型雖然參數(shù)不同,性能都相差無(wú)幾。有可能 RNN 模型的可表達(dá)性太強(qiáng),所以模型的表現(xiàn)更加依賴于數(shù)據(jù)的質(zhì)量、噪音數(shù)據(jù)所占的比例,而不是依賴于模型本身的架構(gòu)了。

如果感興趣的話,在 hparams.py 中可以找到最優(yōu)的參數(shù)設(shè)置。

Via: https://github.com/Arturus/ ,雷鋒網(wǎng) AI 科技評(píng)論編譯

相關(guān)文章:

Kaggle機(jī)器學(xué)習(xí)大調(diào)查:中國(guó)從業(yè)者平均25歲,博士工資最高,最常使用Python

Kaggle亞馬遜比賽冠軍專訪:利用標(biāo)簽相關(guān)性來(lái)處理分類問(wèn)題

分分鐘帶你殺入Kaggle Top 1%

干貨:圖像比賽的通用套路有哪些?Kaggle比賽金牌團(tuán)隊(duì)為你解答

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

Kaggle比賽冠軍經(jīng)驗(yàn)分享:如何用 RNN 預(yù)測(cè)維基百科網(wǎng)絡(luò)流量

分享:
相關(guān)文章
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)