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

床上不敗發表於2017-12-12

點選有驚喜


一、 LSTM網路原理


1.1 要點介紹

  • LSTM網路用來處理帶“序列”(sequence)性質的資料。比如時間序列的資料,像每天的股價走勢情況,機械振動訊號的時域波形,以及類似於自然語言這種本身帶有順序性質的由有序單片語合的資料。 
  • LSTM本身不是一個獨立存在的網路結構,只是整個神經網路的一部分,即由LSTM結構取代原始網路中的隱層單元部分。 
  • LSTM網路具有“記憶性”。其原因在於不同“時間點”之間的網路存在連線,而不是單個時間點處的網路存在前饋或者反饋。如下圖2中的LSTM單元(隱層單元)所示。圖3是不同時刻情況下的網路展開圖。圖中虛線連線代表時刻,“本身的網路”結構連線用實線表示。 

a0284214d814d64ddf6a20c48ab873d043c439f3

1.2 LSTM單元結構圖 

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

039281d69ad4595eb104fc0a14a8a6947941fd88

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

  • 輸入節點input node:接受上一時刻隱層單元的輸出及當前時刻是樣本輸入; 
  • 輸入門input gate:可以看到輸入門會和輸入節點的值相乘,組成LSTM中internal state單元值的一部分,當門的輸出為1時,輸入節點的啟用值全部流向internal state,當門的輸出為0時,輸入節點的值對internal state沒有影響。 
  • 內部狀態internal state。 
  • 遺忘門forget gate:用於重新整理internal state的狀態,控制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,主要用來描述歌曲所屬的藝人,及歌曲的相關資訊,如發行時間,初始熱度,語言等。 

637c25a050ad89376e953633b11b175c889792d2

樣例: 

7dc6a39717ffa8da05ce55d5bc24a42f9127f804
樣例: 

5b5e0af9a2687f6dd4015b00a59d38c316d63d2f

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

75f87ff0c44dcf9f5ada8f2294bef0492ae9d772
2.2 初賽所用模型思路 


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

  • 輸入層:3個神經元,分別代表播放量,播放均值,播放方差; 
  • 第一隱層:LSTM結構單元,帶有35個LSTM單元; 
  • 第二隱層:LSTM結構單元,帶有10個LSTM單元; 
  • 輸出層:3個神經元,代表和輸入層相同的含義。 

點選有驚喜


相關文章