學習 Tensorflow 的困境與解藥

hh54188發表於2024-04-01

我構建的預測模型

在過去的一段時間裡我抓去了小宇宙內上萬條播客節目的首日播放量的資料,並利用這些資料構建了一個用於預測播客節目播放量的模型。包含以下六個輸入引數:

  • 節目釋出於一週中的哪一天
  • 節目釋出於一天中的哪個時段
  • 節目所屬播客的訂閱數
  • 節目所屬播客的聽眾女性佔比
  • 節目所屬播客的聽眾佔比最高的城市

下圖左側是利用 Tensorflow Visor 渲染的引數與播放量的散點關係圖,右側是將訓練過程視覺化之後的效果。

你可以在這裡找到原始資料與模型有關程式碼。當然因為只是作為學習和娛樂之用,我不保證資料的絕對有效和採集方式的絕對科學。

在繼續閱讀下面的文字之前,你需要閱讀上述連結中的原始碼,程式碼非常簡單不過百行左右。

困境

在 100 行的程式碼中只有不到一半程式碼切實與編譯、訓練模型有關,剩下的則是關於資料轉換、視覺化等等。

如果你之前沒有 Tensorflow 的有關經驗,會發現程式碼可以被看懂卻無法理解:我知道它在建立物件,我知道它在執行非同步操作,但什麼是 meanSquaredError?什麼是 tensor?什麼是 dense?

這是 Tensorflow 帶來的最直接的反直覺體驗:在傳統的程式設計領域,程式語言或者框架帶來差異微乎其微,但是在這裡卻讓人步履維艱——原因在於:1)過往的的程式設計經驗無法遷移至此,因為它無關響應,無關跨功能需求;2)在傳統的開發工作中程式碼是貫穿所有的主心骨,而在 Tensorflow 前程式碼已然淪落為配角,前期知識的積累才彌足珍貴。理解二者尤為重要,因為它意味著過往你學習一門技術的方法在此不再有效。

例如本文所抓取的資料都由一個部署在 K8S 上的 NodeJS 應用程式完成。在此之前我從未使用過 K8S。但這並未給我帶來太大困惱,使用 Google 搜尋 “k8s tutorial” 或者 “k8s nodejs” 就可以找到足夠多的入門教程讓我跌跌撞撞的將一個 NodeJS 在 K8S 上執行起來(但我依然推薦系統性的學習,這裡推薦非同步社群引進的圖書《Kubernetes修煉手冊》。英文原版在亞馬遜上名列 Cloud Computing 類目排名第一, 我是在閱讀完畢一半的英文版之後才發現的有中文版。)。

但這一套方法在 Tensorflow 面前失靈了,你所能檢索到的大部分教程都存在小節開頭所提及的同樣問題。我甚至得出了一類規律:如果教程裡不包含丁點圖片,那它根本就不適用於非機器學習專業的程式設計人員入門。

解藥

讀到這裡你大概明白了,機器學習本質上是一門垂直的科學,但和程式設計存在交集這件事讓我們有了“相聲不就是說話嘛,所以我有嘴我也行”的錯覺

所以在瞭解機器學習領域基本知識,而不是單刀直入程式設計才是學習 Tensorflow 的首要任務。

學習什麼(What)

如果我們都同意上述結論的話,那我的下一個問題是:瞭解到多少程度才算夠?因為此時我想提醒你小心落入第二個圈套,掉進“兔子洞”中。

你可以在 YouTube 上搜尋到各式各樣的機器學習入門:YouTube 上最廣為人知的機器學習課程非史丹佛 Stanford CS229: Machine Learning Cours 系列莫屬,這個由前百度公司首席科學家吳恩達親自授課的系列課程單集播放量均在百萬級別以上;如果你只是想從最基本最經典的 Linear Regression 問題開始,可以選擇觀看 StateQuest 的系列影片

但我都不推薦它們,因為它們偏側理論,與程式碼無關,要知道在這條學習路徑上遇到的每個知識點都可以向專業方向延申的很遠,例如在 Tensorflow 的 API 文件中不少的方法說明都保留了對有關論文的引用,但我相信在座各位學習 Tensorflow 的初衷並非是想成為職業的資料科學家,所以恰當的把握理論與實踐的邊界感頗為重要。

如何學習(How)

最近在折騰 Tensorflow 的同時我還在折騰 NextJS 和 K8S,對比之下我發現影片教程,或者說至少視覺化這件事對學習 Tensorflow 尤為重要。

這個道理再簡單不過了:只有透過圖我才能告訴你什麼是 hidden layer、只有透過圖我才能幫你回顧起矩陣之間的計算是如何運作的。

一個實際例子是早在一年之前我就購買了圖書《JavaScript深度學習》,當它談到其中的 back propagation 時把我勸退了。直到一年之後當我再透過 The Coding Train 的 Neural Networks 教程學習到 back propagation 時才發現它如此的簡單。

下圖是我的學習筆記,不難看出其中的圖解佔據了大多數內容:

向誰學習(Who)

毋庸置疑專業的科班學習一定是最好的方式。這不是什麼臆想,而是缺少系統性的規劃下我走了很多的彎路,要不然我怎麼知道對理論的學習要適可而止,以及建議優先選擇影片教程。

如果你和我一樣有前端開發背景,那我推薦 The Code Train 的三個系列教程,剛好可以覆蓋不同階段的學習需求。

  • 入門:Beginner's Guide to Machine Learning in JavaScript with ml5.js。用最淺顯易懂的程式碼去享受享受機器學習來帶的樂趣。這裡你無需提前瞭解任何機器學習的基礎知識
  • 進階:TensorFlow.js - Intelligence and Learning。在這裡你會學習到一些 Tensorflow 概念和 Neural Network 的入門,並嘗試用 Tensorflow 解決一些基礎問題
  • 深入:Neural Networks - The Nature of Code。這裡才是硬核的開始,你將重新拾起高等資料的矩陣運算,不利用任何現用類庫,從0開始搭建一個 Neural Network

同時我還推薦 DigitalSreeni 的影片,它不適用於入門,但是可用作參考。他會對一些訓練模型中的常見問題和概念做出講解和進行解答

如果你想尋找一些有關機器學習相似主題的影片教程,比如專門針對 Python 語言,又或者針對 PyTorch 的,我有以下建議:

  • 不用考慮累計總時長1小時(其實我想說五小時)以下的影片教程。也許十分鐘學會 React 可以,但這次不行。
  • 不考慮官方教程——大部分的官方教程像是為了存在而存在,官方不會過多的投入就好像他們知道第三方能做的更好似的,但什麼都不做似乎又說不過去。雖然 Tensorflow 官方製作了一系列教程,比如 Building recommendation systems with TensorFlow,我也相信影片中的講師是高手中的高手,但他的念稿般的表達能力讓我感覺到索然無味,和上面 The Code Train 相比立見高下
  • 不考慮中文教程:無論從實效性還是從表達能力上看英文教程都更勝一籌,本質上是因為英文使用者的基數足夠多,機率上來說貢獻者和出現精品的機率也更大。放心,技術文字比四六級閱讀理解簡單得多

未曾改變與已經改變的

正式的文章直至上一小節就已經結束了,最後有感而發聊聊“技術學習”這件事。

我不敢說“終身學習”是這個時代強加給每個人的必修課,但至少是對我們這個職業的“詛咒”。從 Vanilla JavaScript 到 BackboneJS,再到 React 和 TypeScript,沒有人會好心好意的告訴你一個時代已經結束,請準備好迎接下一個時代的來臨;也沒有公司會無償提供培訓來幫助你適應新技術的更迭。“開著飛機換引擎”對於處於這個行業的人來說可能會是持續相當長時間生存狀態。這與技術無關,當有一天你轉型成為技術管理者或者決策者,關於團隊,策略以及交付等等又會成為你清單上的新主題,我想起了貝爺的梗圖:Improvise,adapt,overcome

Copilot 的出現並沒有解除我們的詛咒,如果你讀過我的前一篇文章《Copilot 程式設計指南》就會知道, AI 可以很好的將我們從瑣碎的工作中解脫出來,但是無法代替我們繪製藍圖

幸運的是深度學習依然有效,幸運的是網際網路社群中依然有無數人在進行無私的分享。十多年前我透過部落格園的專題頁面0開始學習 jQuery,只不過如今物件換成了 Tensorflow 渠道變成了 YouTube。

親自試錯(trail and error)永遠是解決此類問題的最好方式,我一向反對乾癟的技術培訓,因為你無法透過讀書去學會游泳。想學?build something, build something real.

相關文章