大家可能都聽說過 “亞特伍德定律” 這個笑話,大意是說任何能夠由 JavaScript 所編寫的内容最終都會由 JavaScript 進行編寫。現在 Javascript 要侵入機器學習了嘛?一些工程師已經開始用 Javascript 編寫機器學習的代碼了。

目前最火的基于 Javascript 的機器學習類庫莫過于 ConvNetJs。ConvNetJs 用 Javascript 實作了常用的深度學習算法,可以用于分類、回歸和強化學習等。ConvNetJs 在 GitHub 上有超過 4000 顆星,800 多次 Fork。想想著名的深度學習架構 Theano 不到 3500 顆星,你就可以想象這個項目的紅火程度了。如果你想在 Node.js 項目中使用 ConvNetJs,可以直接使用指令 npm install convnetjs 安裝 ConvNetJs 子產品。ConvNetJs 有很多很酷的可視化示範。
用 Javascript 的程式訓練模型實在是太慢了。更實際的做法是用其他學習程式訓練模型,然後 Javascript 程式使用訓練好的模型做一些應用。MXNetJS便是這個思路。MXNetJS 是 dmlc/MXNet 的 Javascript 包。dmlc/MXNet 是陳天奇等大神開發的深度學習架構。MXNetJS 能夠使用任何由 MXNet 訓練好的模型 (需要先用 tools/model2json.py 将模型轉化為 JSON 格式)。
做過自然語言處理的同學,應該都知道 Python NLTK 包。nlp_compromise相當于 Javascript 版的 NLTK。和 NLTK 一樣,nlp_compromise 直接使用開發者訓練好的模型,使用者就可以不用自己訓練模型了。
除了上述類庫,有名的機器學習類庫還包括,神經網絡類庫 (Brain.js)、支援向量機類庫 (svmjs)、随機樹類庫 (Forest.js)、 數值計算類庫 (Numeric.js) 和線性代數類庫 (sylvester) 等。
基于 Javascript 的機器學習最大的問題是性能。我們知道大規模機器學習訓練需要的計算資源是非常恐怖的。雖然 Javascript 的新一代 V8 引擎大幅度提高了速度,但距離滿足機器學習訓練還有一定的距離。現在人們為了提高機器學習性能幹的事:GPU、多線程和分布式計算,Javascript 沒搞定任何一個。即使對于預測,Javascript 的性能也還是太低。由于性能的限制,目前基于 Javascript 的機器學習隻是一個非常有趣玩具。我沒有聽到,誰家在實際應用中使用了基于 Javascript 的機器學習。
随着技術進步,性能問題是有可能被解決的。我們用來發射憤怒的小鳥去砸豬的手機計算能力,已經超越了 NASA 1969 年擁有的計算能力的總和。NASA 用那些計算能力完成了世界奇觀阿波羅計劃。如果性能問題得到解決,Javascript 能夠實作一個在任何地方和任何裝置都可運作的應用。這是十分有吸引力。熟悉 Javascript 的前端工程師也使用機器學習了,這将大大地擴充機器學習的應用範圍。
在36Kr實習的時候,我就想寫 Javascript 和機器學習的稿子。但一直沒有去梳理 Javascript 實作機器學習是怎麼解決性能問題,就擱置了。最近看到微網誌上的 @愛可可-愛生活 介紹了幾個國外基于 Javascript 的機器學習項目,才重新想起來寫。我認真梳理了下,沒有找到性能問題的解決方案,囧。那隻能寄希望于遙遠的未來了:)。
最近寫文章越來越标題黨了。這樣很好:)。