今天試驗 TensorFlow 2.x , Keras 的 SimpleRNN 和 LSTM,發現同樣的輸入、同樣的超引數設定、同樣的引數規模,LSTM 的訓練時長竟然遠少於 SimpleRNN。

模型定義:

訓練引數都這樣傳入:

我們知道,LSTM 是修正了的 SimpleRNN(我隨意想出來的詞,“修正”),或者說,是在 SimpleRNN 基礎之上又添加了別的措施使模型能考慮到超長序列的標記之間的依賴。 緩解了梯度消失和梯度爆炸的問題。

所以,LSTM 比 SimpleRNN 是多了很多引數矩陣的,且每一步也多了一些計算。而訓練過程既有前向,又有反向,不管哪個過程,理論上 LSTM都是比SimpleRNN要花更多時間的,那麼為什麼我在使用 TensorFlow with Keras 時會出現相反的情況呢?

訓練情況(第一個 epoch):

SimpleRNN 的

LSTM的

原因,就在於:版本。

按住 Ctrl,點選兩個類名 SimpleRNN 和 LSTM,進入定義的模組,會發現 from tensorflow.keras.layers import SimpleRNN 的 SimpleRNN定義所在的模組分別是這樣的

懂了,SimpleRNN 是 TensorFlow 1.xx 的東西,而這個 LSTM 是 TensorFlow 2.xx 的東西,肯定內部做了優化,反正二者一開始就不是一個起跑線上的東西。雖然我們寫程式碼表面上都是from tensorflow.kears.layers 裡 import 的,但是這種模組匯入真的不能證明他們是放在同一個模組裡定義的,因為匯入是可以導來導去的,有的一個 import 就找到了它的定義,有的需要經過好幾次 import 的傳遞,就像是個鏈,從我們的原始檔一直到達最終定義的模組,這個 LSTM 隱藏的就很深(或者封裝的很好(皮))。

要找到 這個 SimpleRNN 的 counterpart,就須使用 tensorflow.compat.v1.keras.layers.LSTM,找到它,發現

這就與上述 SimpleRNN 所在同一個模組了。

試驗訓練一下。

果然,比 SimpleRNN 慢得多,合理了。舒服了。

-------------------------------------------

我發現我真的好無聊,整天搞這些沒用的。

抓主要矛盾,抓主要矛盾,主要矛盾!!!

下次一定 :)