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

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

1

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

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

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

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

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

核心思路

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

1.     局部特征

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

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

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

2.     全局特征

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

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

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

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

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

  2. RNN 屬于非參數(shù)算法,簡化了模型的學習過程。

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

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

  5. 深度學習算法已經(jīng)被過度使用。

特征工程

在這一步,Arthur 選擇了簡化處理,因為 RNN 本身在特征提取上已足夠強大,以下為模型提取的特征: 

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

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

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

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

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

  • lagged pageviews,隨后會解釋這一特征

特征預(yù)處理

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

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

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

這種采樣方法相當于一種有效的數(shù)據(jù)增強機制,在每一步訓練中,訓練程序都會隨機選擇時序的開始點,相當于生成了無限長的、幾乎不重復(fù)的訓練數(shù)據(jù)。

模型的核心

模型有兩個主要部分:encoder 和decoder

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

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

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

處理長時序

LSTM/GRU 擅長處理最多 100-300 個項目的短序列。雖然它也能在更長的序列上工作,但它會逐漸忘記以前的信息。本次比賽中的時間序列長達 700 天,所以 Arthur  使用了一些其他的方法來增強 GRU 的記憶力。

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

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

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

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

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

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

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

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

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

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

損失和正則化

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

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

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

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

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

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

訓練和驗證

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

劃分訓練集和驗證集的方法有兩種:

1.     Walk-forward split

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

2.     Side-by-side split

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

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

這兩種方法在模型中都有嘗試過。

Walk-forward 的結(jié)果更可觀,畢竟它比較符合比賽目標:用歷史值預(yù)測未來值。但這種切分方法有其弊端,因為它需要在時間序列末端使用完全只用作預(yù)測的數(shù)據(jù)點,這樣在時間序列上訓練的數(shù)據(jù)點和預(yù)測的數(shù)據(jù)點間隔較長,想要準確預(yù)測未來的數(shù)據(jù)就會變得困難。

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

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

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

減少模型方差

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

不同 seed 下訓練的模型性能也會不一樣,某些 seed 下的模型性能誤差很大。在訓練過程中,這種性能的波動是一直存在的,完全憑運氣贏得比賽是不行的,所以必須有一些措施來減少方差。

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

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

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

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

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

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

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

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

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

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

另外,Arthur 表示有一點沒有達到他的期待,超參數(shù)的搜索方法并沒有找出全局最優(yōu)值,因為目前最好的幾個模型雖然參數(shù)不同,性能都相差無幾。有可能 RNN 模型的可表達性太強,所以模型的表現(xiàn)更加依賴于數(shù)據(jù)的質(zhì)量、噪音數(shù)據(jù)所占的比例,而不是依賴于模型本身的架構(gòu)了。

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

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

相關(guān)文章:

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

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

分分鐘帶你殺入Kaggle Top 1%

干貨:圖像比賽的通用套路有哪些?Kaggle比賽金牌團隊為你解答

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

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

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