使用Tensorflow實現的基於LSTM的預測例項

赤燕發表於2018-02-02

引言

  • 演算法在工程中的應用越來越廣泛,tensorflow在工業界大放異彩。筆者的專案也使用了LSTM演算法的預測能力,大大降低了運用的成本,提高了運營效率。
  • 為了體驗tensorflow的開發模式,筆者使用tensorflow實現了一個基於LSTM演算法的預測例項,與大家分享。

LSTM的前世今生

  • 在LSTM之前,我們先介紹另一個如雷貫耳的名詞RNN(Recurrent Neural Networks),中文名是遞迴神經網路。LSTM是對RNN隱含層的改進。RNN最主要的用途是處理序列資料,且該序列的當前輸出與前面的輸出也有關。比如,要分析一段文字的含義時,當前詞彙與上一個詞彙是有關係的,並不是孤立存在的,上文對當前的輸出產生了影響。因此RNN在NLP(Natural Language Processing)中獲得非常成功的應用。
  • LSTM因為《Long short-term memory》這篇論文為世人所熟知,LSTM的出現是為了解決RNN無法有效處理長期記憶(Long Term Dependencies)的問題。
  • 標準RNN在進行長期記憶計算會產生‘梯度消失或者梯度膨脹問題’(原作者描述為“vanishing or exploding gradients”),即RNN的梯度資料會在若干次遞迴計算後,由於反向多次求導的遞迴過程中產生的計算誤差的疊加,導致梯度消失或者梯度膨脹。粗略的說,‘梯度消失’的表現為很多個小於1的項連乘就很快的逼近零。
  • LSTM是如何做到避免梯度消失,簡單的說,LSTM在神經元的狀態轉移時,不對狀態值新增scale引數或矩陣變換。同時,引入‘門函式’,如輸入門,輸出門,遺忘門,控制輸入資訊、狀態轉移,以及輸出資訊的有選擇性地表達。

tensorflow

  • tensorflow是google釋出的一個使用資料流圖進行數值計算的開源軟體庫,計算的物件稱為張量,即多維陣列。已經發布了可用於生產環境的1.0版本, 被工業界廣泛用於機器學習和深度學習的研究和演算法應用開發。
  • 官方主頁:https://www.tensorflow.org/

預測場景

  • LSTM非常適用於基於時序資料的預測,比如預測未來的股票行情,預測未來某個時間段的交通情況,預測未來的房價等。
  • 本文使用房價資料作為訓練樣本,因為人在對房價進行預測時,基本上都會參考近期房價和歷史趨勢,對未來的價格作出一個預判。也就是說,歷史上的房價資料,是會對未來的房價產生重大影響的,即當前輸出受歷史輸出的影響,則房價的預測符合LSTM的應用優勢。

定義LSTM模型

  • 本文使用單層的LSTM模型對資料進行預測,更為複雜的多層LSTM模型也是基於單層LSTM模型進行擴充套件。定義一個基本的LSTM模型,需要定義如下幾個部分:
    1. 定義時間步, 定義每個輸入資料與前多少個有序的輸入的資料有關聯
    2. 定義隱層神經元的數量
    3. 定義每批訓練樣本數
    4. 定義輸入層維度、權重、偏置
    5. 定義輸出層維度、權重、偏置
    6. 定義學習率,學習率越小,越容易陷入區域性最優結果,學習率越大,相鄰兩次訓練結果間的抖動越大
    7. 定義損失函式
    8. 定義訓練次數
    9. 構建訓練資料集
    10. 構建測試資料集

獲取資料集

  • 在預測房價之前,需要先獲取房價的資料,本文的資料來源為某房地產中介平臺的交易資料。
  • 如何使用python編寫一個爬蟲精確爬取資料,詳見另一篇文章:
    Python爬蟲實戰, 這也是為什麼使用房價作為例項場景的原因,因為這個資料已經被爬取過了。

基於Tensorflow的LSTM實現

演算法效果

房價預測曲線.png

  • 縱座標數值的單位為 萬RMB

結束語

  • 本文實現的demo離實際的工程應用還有差距,僅供體驗和參考
  • 演算法的應用在某些場景中能夠帶來令人驚喜的效果,但在一個新的場景或者應用領域中,演算法的效果具有很大的不確定性。
  • 演算法的基礎理論晦澀難懂,二次開發和準確應用的門欄都相對較高,在工程應用過程中,不免會碰到演算法持續改進了幾個月,卻在複雜的業務場景中表現不佳,無法真正上線應用的情況。
  • 由於演算法的不確定性,在進行嚴格排期的工程實施中,要準確回答‘使用演算法解決xxx問題,需要幾個人日’的問題,的確是個頗為困難的事。
  • 希望越來越多成功的演算法應用,能夠不斷改善人們的體驗,解放人們的想象力,創造更加美好的生活。


相關文章