1. 程式人生 > 實用技巧 >032-機器學習背後的思維-針對入門小白的概念演算法及工具的樸素思考

032-機器學習背後的思維-針對入門小白的概念演算法及工具的樸素思考

11.3 程式設計思路的轉換

在學校裡的教授的如C、Python、Java等程式語言, 採用的指令式程式設計的思路。 你需要下達一個指令,讓計算機做一個動作, 希望得到是一個程式中業務邏輯變數的 狀態轉換。 其背後的理論基礎是形式語言與自動機理論, 程式抽象為一個有窮自動 機。

而在TensorFlow中的程式設計思路會略有不同,初學時應該引起注意。 其與符號式編 程類似,其通過數學模型對數理邏輯進行抽象,計算單元是函式, 而不是指令。

上面這段話,可能有些抽象,我們通過兩段程式程式碼來說明一下。 這兩段程式程式碼都是要找出斐波拉契數列的第n 個值。 斐波拉契數列:1,1,2,3,5,8,13,21,44,··· 。 從 數學知識的角度,我們知道, 這個數列除了前兩個數為整數 1 ,從第 3 值開始, 都是 數列中前兩個值相加的結果。 用數學表示式表示其通項公式為a n = a n−1 + a n−2 。 如果 用宣告式程式設計的語言來寫這個函式如下:

在這裡插入圖片描述
如果用指令式程式設計的程式碼是這樣的:
在這裡插入圖片描述
很明顯, 宣告式程式設計更加傾向於數學定義本身。 從程式程式碼上看, 寫法更加簡 潔, 但也更加抽象。 而指令式程式設計的寫法, 更注重指令和操作的細節, 更加具體 化。 在後面,我們將會看到, 如果遵循宣告式程式設計思想, 可將具體的操作細節隱藏 起來, 會大大簡化程式設計師的程式設計負擔, 減少出錯。 通常來說,這兩種程式設計思路都是 〸分優秀,不分伯仲的。 區別在於對於普通程式的業務邏輯最好選擇指令式程式設計; 對 於數理邏輯等抽象邏輯最好使用宣告式程式設計。

如果到這兒,你還不太明白,我再舉個例子來區別它們。 一個宣告式程式設計的設計 講究是按部就班, 按照數理邏輯進行就不會出錯,不大關心異常處理邏輯。 而你如 果參加過真實上線的程式編寫就會知道, 指令式程式設計下的程式程式碼中有大量的程式碼是 在處理業務異常的情況。 也就是說,數理邏輯中的數學公式已經被數學家嚴格證明過 了, 不大可能會有異常。 而我們通常程式設計的邏輯屬於業務邏輯,會因為業務過程中各 類隨機因素的出現, 讓程式設計師必須花費大量精力編寫程式碼,來處理這些業務的異常。

另外,需要強調一點,Python 語言與 TensorFlow 的 Python API 是不同的, TensorFlow 的 Python API是宣告式程式設計思路; 而 Python 語言是命令式的程式設計。 在用 TensorFlow API實際程式設計時,不建議使用 IF-ELSE 等邏輯語句, 不要使用業務邏輯。

最後一點是, Python 語言僅僅是 TensorFlow 一種前端介面語言而已, 本質與 TensorFLow 的核心沒有什麼關係。 這有點象網路程式設計的 Client-Server 前後端分離結 構。 舉個例子,前端網頁程式設計用 JavaScript,用 Html CSS 定義資料收集展示, 資料收 集好之後,用JSON格式打包後,傳到後端 Server進一步處理。 Server上的程式語言就 多了去, 如 C, Java,Python 等等。 類似的,前端Client 負責定義計算流圖 graph 結構,準備資料, 後端的 Server 收到 Client 傳過來的 graph 結構以及訓練資料, 決定在 什麼裝置上以何種方式執行圖中的各種計算任務。

這幾點初學者會時常忘記,誤以為在前端寫的 Python 程式碼, 自然可以傳到後端 執行。這個理解是不正確的。 再次提醒大家,特別要注意。