Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

深度學習的RNN/LSTM循環神經網路 (使用node.js的neataptic套件實作)

6,147 views

Published on

十分鐘系列

Published in: Education
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Hi there! Essay Help For Students | Discount 10% for your first order! - Check our website! https://vk.cc/80SakO
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

深度學習的RNN/LSTM循環神經網路 (使用node.js的neataptic套件實作)

  1. 1. 深度學習的 RNN/LSTM 循環神經網路 ( 使用 node.js 的 neataptic 套件實作 ) 陳鍾誠 2017 年 7 月 6 日 程式人《十分鐘系列》程式人《十分鐘系列》 本文衍生自維基百科
  2. 2. 前天、我們講解了反傳遞演算法
  3. 3. 那篇十分鐘系列 ● 是根據 Andrej Karpathy 的 Hacker's guide to Neural Networks 這篇文章所改寫的!
  4. 4. 就是這篇 http://karpathy.github.io/neuralnets/
  5. 5. 但是 ● 那篇是講解《基礎的神經網路》 的運作與訓練方法!
  6. 6. 而我真正的目標 ● 是要用深度學習的循環神經網 路,來實作機器翻譯系統。
  7. 7. Andrej Karpathy ● 不愧是深度學習技術專家 ● 他的另一篇文章 The Unreasonable Effectiveness of Recurrent Neural Networks ● 就是在介紹《循環神經網路》!
  8. 8. 今天 ● 我們就來介紹這篇文章!
  9. 9. 問題是 ● 到底甚麼是《循環神經網路》呢?
  10. 10. 這個問題 ●先讓我們反過來問?
  11. 11. 甚麼是《非循環神經網路》呢?
  12. 12. 下圖就是個非循環神經網路 ● 很清楚的 這個網路裡 沒有循環!
  13. 13. 那麼、什麼是循環神經網路呢?
  14. 14. 顧名思義 ●就是有循環的神經網路!
  15. 15. 像這樣
  16. 16. 比較一下
  17. 17. 其實只要拉幾條倒鉤的線 神經網路就會產生循環
  18. 18. 但是 ●為何需要有循環呢?
  19. 19. 有循環的網路有何好處呢?
  20. 20. 如果您曾經學過數位電路 ● 應該會記得《組合邏輯電路》 和《循序邏輯電路》
  21. 21. 其中的組合邏輯電路 ● 像是 AND, OR, NOT, XOR, MUX 多工器 , DMUX 解多工器 ,HalfAdder 半加器 , FullAdder 全加器, 16 位元加法器等等。 ● 都是沒有循環的電路!
  22. 22. 這類電路 ●只要輸入相同 ●輸出一定是相同的!
  23. 23. 因為電路裏 ●不會偷偷的暫存一些東西 ●沒有任何記憶元件!
  24. 24. 所以執行結果 ● 不會有記憶所造成的效應 ● 於是相同的輸入,就會有相同的 輸出!
  25. 25. 但是有一類數位電路 ●稱為循序邏輯電路 ●這種電路就有循環!
  26. 26. 像是正反器就是典型有循環的電路
  27. 27. 這些循環 ● 可以用來把訊號鎖死在電路裏,造成記憶效應!
  28. 28. 因此 ● 電路的輸出除了受輸入影響之外, 還會受目前的 ( 記憶 ) 狀態所影響
  29. 29. 暫存器就是用很多正反器做出來的!
  30. 30. 記憶體也是類似
  31. 31. 而循環神經網路的好處 ● 就是可以記憶一些歷史訊息 ● 並透過歷史訊息預測未來!
  32. 32. 非循環神經網路 ●輸出完全由輸入決定 ●可以寫成 y=f(x) ●或者寫成 st =f(θ)
  33. 33. 但是循環神經網路 ●數學式通常寫為 –st =f(st-1 , θ) ●而不是 st =f(θ)
  34. 34. st =f(st-1 ,θ) 中的 st ●就代表了 t 時刻的記憶狀態
  35. 35. 透過這種記憶狀態 st 歷史資訊就能影響後續的決策
  36. 36. 如果加入外部輸入 x ● 循環神經網路的函數就會改寫如下
  37. 37. 我們可以用 h 取代 s 代表非外部輸入的隱含狀態
  38. 38. 根據 t 畫成展開圖就變這樣 黑色框框代表延遲一單位時間 網路歷史展開後的結果 http://www.deeplearningbook.org/
  39. 39. 循環神經網路有很多類
  40. 40. 其中有一類展開圖長這樣 這種 Encoder/Decoder ( 編碼 / 解碼 ) 網路 在機器翻譯的領域非常重要! 也是我目前所學習的重點。
  41. 41. 但是簡易的循環神經網路 ●通常有個缺點 ●就是沒有長期記憶!
  42. 42. 為了保住長期記憶 ● 有人發明了 LSTM 長短期記憶網路 (Long-Short Term Memory) ● 以便讓夠強的資訊可以進入長期記憶 不夠強的資訊可以被遺忘!
  43. 43. LSTM 長短期記憶網路長這樣
  44. 44. 其數學式如下 http://www.deeplearningbook.org/
  45. 45. 現在 ● 讓我們先忘了那些惱人的數學式
  46. 46. 把 RNN 循環網路實作為程式 對應到上圖的 U對應到上圖的 W對應到上圖的 V
  47. 47. 然後 ● 你還可以疊合兩層以上的 RNN
  48. 48. 接著讓我們想想
  49. 49. 這樣的網路到底有甚麼用?
  50. 50. 其實 ●我也想不出來!
  51. 51. 還是看個實例好了
  52. 52. RNN 可以用來記住序列 ● 例如當我們想記住 hello 這個詞 ● 但是我們每個時間點只會看到一個字母!
  53. 53. 於是我們的網路展開圖看來像這樣 子目標: 輸入 h 時 => 輸出 e 再輸入 e 時 => 輸出 l 再輸入 l 時 => 輸出 l 再輸入 l 時 => 輸出 o 目標:記住 hello 這個單字並且能重新產生 hello!
  54. 54. RNN 網路展開後 ●通常可以讓我們看得更清楚
  55. 55. 但是、這個網路是還沒訓練完畢的 輸入 e 時輸出 o 應該要輸出 l 才對 h e l o
  56. 56. 所以循環神經網路 ● 和非循環神經網路一樣 ● 需要反向傳遞的學習演算法 ● 該演算法稱為 BPTT (Backpropagation through time)
  57. 57. 以下是 BPTT 的前向傳遞算法 https://read01.com/AxA7R3.html
  58. 58. 然後是 BPTT 的反向傳遞算法 https://read01.com/AxA7R3.html
  59. 59. 如果不要看數學就會變這樣
  60. 60. 背後的數學 ●仍然是微積分 ●還有根據鏈鎖規則的拆解!
  61. 61. Karpathy 用 Python 寫了一個 簡易的 RNN 程式,只有 112 行 https://gist.github.com/karpathy/d4dee566867f8291f086
  62. 62. 您可以仔細研究看看
  63. 63. 現在 ● 再度讓我們拋開那些數學式 ● 然後在甩掉那些程式碼!
  64. 64. 純粹用使用者的角度 ● 來看看 RNN 與 LSTM 這些循環神經 網路,到底能做些甚麼事?
  65. 65. Karpathy 拿這些程式來做了一堆測試 http://karpathy.github.io/2015/05/21/rnn-effectiveness/
  66. 66. 首先是把莎士比亞拿來學
  67. 67. 結果電腦會自動寫小說了
  68. 68. 然後把維基百科原始檔拿來訓練
  69. 69. 結果電腦也會寫維基文章了
  70. 70. 有時竟然還寫出了 XML 應該是因為維基百科裏有些 XML 語法的文件吧!
  71. 71. 然後把 Algebraic Geometry 這本 latex 電子書拿來練
  72. 72. 結果電腦寫出來的 latex ● 還可以正常的編譯成書!
  73. 73. 這是電腦產生的一段 latex 原始碼
  74. 74. 然後 karpathy 把 linux 原始碼拿來訓練
  75. 75. 訓練完後程式就會寫 C 語言了 只是這個 C 語言 應該是無法通過編譯 就算通過了編譯 應該執行下去也會 GG 的吧!
  76. 76. 我覺得電腦寫的 C 語言 比我寫的漂亮很多 看起來就很高級阿! 拿來交作業搞不好 也可以呼嚨過的!
  77. 77. 然後 karpathy 寫了程式把 神經網路的內部節點視覺化
  78. 78. 結果看到這個 綠色部分是辨識區:這個節點似乎是在辨識超連結!
  79. 79. 這個 似乎是辨識 [[….]] 的節點!
  80. 80. 這個 似乎是辨識 [[….]] 《尾端》的節點!
  81. 81. 還有這個 似乎是專門辨識 www 後面兩個 w 的節點!
  82. 82. 有些神經網路節點 ● 專門抓行尾
  83. 83. 也有些節點專門抓 "..." 引用區
  84. 84. 還有些專門抓 ●if 裡面的運算式
  85. 85. 另一些專門抓註解
  86. 86. 但是也有些 我們看不出到底在抓甚麼!
  87. 87. 透過 karpathy 這篇文章的介紹 ● The Unreasonable Effectiveness of Recurrent Neural Networks http://karpathy.github.io/2015/05/21/rnn-effectiveness/
  88. 88. 相信 ● 您應該會對 RNN 循環神經網路 留下深刻的印象!
  89. 89. 看到這裡 ● 相信身為程式人的你 一定會感覺到手癢了!
  90. 90. 就讓我們 ● 真正來寫程式感受一下,到底 RNN/LSTM 這類的循環神經網路是甚 麼東西好了!
  91. 91. 我們可以用 node.js ●然後安裝 neataptic.js 這個 循環神經網路的套件!
  92. 92. 然後 寫個 小型 程式 https://github.com/ccckmit/ai6/blob/master/book/nn/neataptic/lstmE
  93. 93. 您可以從下列網址直接剪貼 https://github.com/ccckmit/ai6/blob/master/book/nn/neataptic/lstmEx.js
  94. 94. 或者直接用我寫好的 ai6 專案 $ git clone https://github.com/ccckmit/ai6.git $ cd ai6 $ npm install $ cd book/nn/neataptic
  95. 95. 這個程式會想辦法預測 ●000100010001 … 這樣的規則序列!
  96. 96. 執行結果如下 您可以看到 訓練完的程式 總是領先預測 下一個出現的 位元
  97. 97. 除了學習 01 序列以外 ● 也可以用 LSTM 來學習字串序列!
  98. 98. 像是這個範例 https://github.com/ccckmit/ai6/blob/master/book/nn/neataptic/lstmCbyc.js 就會學習並預測 am i concious? or am I not? 這個字串序列
  99. 99. 但是這樣並不能顯示 ● LSTM 這類循環神經網路的威力
  100. 100. 於是我寫了一組通用的 ●字串學習預測程式! 主模組: https://github.com/ccckmit/ai6/blob/master/book/nn/neataptic/lstm.js 訓練程式: https://github.com/ccckmit/ai6/blob/master/book/nn/neataptic/lstmTrain.js 預測程式: https://github.com/ccckmit/ai6/blob/master/book/nn/neataptic/lstmPredict.js
  101. 101. 我們可以把一個文字檔當作輸入 ● 程式就能學會該檔案的寫作風格!
  102. 102. 像是學習簡單的狗世界英文語句
  103. 103. 或者是狗世界的《中文語句》
  104. 104. 又或者是數學運算式的學習
  105. 105. LSTM 神經網路 ● 都可以在一兩分鐘內就透過 很小的檔案學習完成 ● 並且依樣畫葫蘆的產生很不錯的文章!
  106. 106. 現在 ● 您應該可以理解甚麼是 RNN/LSTM 神經網路了!
  107. 107. 透過我們的 node.js 程式 ●您可以親自玩玩看! https://github.com/ccckmit/ai6/tree/master/book/nn/neataptic
  108. 108. 透過實際的體驗 ●您應該會更深入的瞭解深度 學習的 RNN/LSTM 網路才對!
  109. 109. 這就是我們今天的
  110. 110. 十分鐘系列
  111. 111. 希望您會喜歡!
  112. 112. 我們下回見!
  113. 113. Bye Bye!

×