天天看點

教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)

1.1 要點介紹

LSTM網絡用來處理帶“序列”(sequence)性質的資料。比如時間序列的資料,像每天的股價走勢情況,機械振動信号的時域波形,以及類似于自然語言這種本身帶有順序性質的由有序單詞組合的資料。 

LSTM本身不是一個獨立存在的網絡結構,隻是整個神經網絡的一部分,即由LSTM結構取代原始網絡中的隐層單元部分。 

LSTM網絡具有“記憶性”。其原因在于不同“時間點”之間的網絡存在連接配接,而不是單個時間點處的網絡存在前饋或者回報。如下圖2中的LSTM單元(隐層單元)所示。圖3是不同時刻情況下的網絡展開圖。圖中虛線連接配接代表時刻,“本身的網絡”結構連接配接用實線表示。 

教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)

1.2 LSTM單元結構圖 

圖4,5是現在比較常用的LSTM單元結構示意圖: 

教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)

其主要結構成分包含如下: 

輸入節點<b>input node:</b>接受上一時刻隐層單元的輸出及目前時刻是樣本輸入; 

輸入門<b>input gate:</b>可以看到輸入門會和輸入節點的值相乘,組成LSTM中internal state單元值的一部分,當門的輸出為1時,輸入節點的激活值全部流向internal state,當門的輸出為0時,輸入節點的值對internal state沒有影響。 

内部狀态internal state。 

遺忘門forget gate<b>:用于重新整理internal state的狀态,</b>控制internal state的上一狀态對目前狀态的影響。 

各節點及門與隐藏單元輸出的關系參見圖4,圖5所示。

背景回複關鍵詞“音樂”,下載下傳完整代碼及資料集

運作環境:windows下的spyder 

語言:python 2.7,以及Keras深度學習庫。

由于看這個賽題前,沒有一點Python基礎,是以也是邊想思路邊學Python,對Python中的資料結構不怎麼了解,是以代碼寫得有點爛。但整個代碼是可以運作無誤的。這也是初賽時代碼的最終版本。

2.1 示例介紹 

主要以今年參加的“2016年阿裡流行音樂趨勢預測”為例。 

時間過得很快,今天已是第二賽季的最後一天了,我從5.18開始接觸賽題,到6.14上午10點第一賽季截止,這一期間,由于是線下賽,可以用到各種模型,而自已又是做深度學習(deep learning)方向的研究,是以選擇了基于LSTM的循環神經網絡模型,結果也很幸運,進入到了第二賽季。開始接觸深度學習也有大半年了,能夠将自已所學用到這次真正的實際生活應用中,結果也還可以,自已感覺很欣慰。突然意識到,自已學習生涯這麼多年,我想“學有所成,學有所用”該是我今後努力的方向和動力了吧。 

下面我簡單的介紹一下賽題: 

官方給的“輸入”,共兩張表:

一張是使用者行為表(時間跨度20150301-20150830)mars_tianchi_user_actions,主要描述使用者對歌曲的收藏,下載下傳,播放等行為;

一張是歌曲資訊表mars_tianchi_songs,主要用來描述歌曲所屬的藝人,及歌曲的相關資訊,如發行時間,初始熱度,語言等。 

教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)

樣例: 

教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)
教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)

官方要求“輸出”:預測随後2個月(20150901-20151030)每個歌手每天的播放量。輸出格式: 

教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)

2.2 初賽所用模型思路 

由于是對歌手的播放量進行預測,是以直接對每個歌手的“播放量”這一對象進行統計,檢視在20150301-20151030這8個月内歌手的播放量變化趨勢,并以每天的播放量,連續3天的播放均值,連續3天的播放方差,作為一個時間點的樣本,“滑動”建構神經網絡的訓練集。網絡的構成如下: 

輸入層:3個神經元,分别代表播放量,播放均值,播放方差; 

第一隐層:LSTM結構單元,帶有35個LSTM單元; 

第二隐層:LSTM結構單元,帶有10個LSTM單元; 

輸出層:3個神經元,代表和輸入層相同的含義。<b> </b>

目标函數:重構誤差。 

下圖是某些歌手的播放統計曲線: 

教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)

2.2 預測結果 

藍色代表歌手真實的播放曲線,綠色代表預測曲線: 

教你用深度學習LSTM網絡預測流行音樂趨勢(附代碼)

原文釋出時間為:2017-12-11

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“x”微信公衆号