
用於模型監控的 TensorFlow、Keras 與 TensorBoard
Google 的機器學習框架及其強大的視覺化儀表盤
TensorFlow 生態系統:不只是一個框架
TensorFlow 由 Google Brain 開發,於 2015 年釋出,它不只是一個深度學習庫,而是一整套用於在任意規模下構建、訓練、部署和監控機器學習模型的生態系統。雖然 PyTorch 在研究領域占主導地位,但 TensorFlow 仍是生產環境的中堅力量,被部署在 Google、Airbnb、Twitter 以及成千上萬家其他公司的系統中,每天處理數十億次預測。
這套生態系統覆蓋了完整的機器學習生命週期:
- Keras — 用於構建和訓練模型的高階 API,現已完全整合進 TensorFlow,即
tf.keras - TensorBoard — 用於監控訓練、對比實驗和除錯模型的視覺化工具包
- tf.data — 用於向模型喂入大型資料集的高效能資料管道
- TensorFlow Serving — 生產級模型服務,支援版本管理、批處理和硬體加速
- TensorFlow Lite — 針對移動端和邊緣裝置最佳化的執行時
- TensorFlow.js — 直接在瀏覽器中執行模型
這種廣度正是 TensorFlow 最大的優勢。你可以在 Jupyter notebook 裡用 Keras 快速搭建一個模型原型,在 GPU 叢集上訓練它,用 TensorBoard 監控訓練,用 TF Serving 把它部署在 API 後面提供服務,再把壓縮後的版本部署到樹莓派上——所有這些都在同一個框架內完成。對於金融應用而言,你可能既需要模型執行在雲端交易引擎中(連線到 GaiaEx 的 API),又需要它執行在用於研究的本地工作站上,這種多用途特性就顯得格外重要。
Keras:用於構建模型的 Sequential 與 Functional API
Keras 的設計遵循一條核心原則:降低構建神經網路的認知負擔。它透過兩套構建模型的 API 實現這一點,每套都適用於不同的複雜度層級。
Sequential API 是最簡單的一種——把各層線性地堆疊起來:
import tensorflow as tf
from tensorflow import keras
model = keras.Sequential([
keras.layers.Dense(128, activation="relu", input_shape=(20,)),
keras.layers.Dropout(0.3),
keras.layers.Dense(64, activation="relu"),
keras.layers.Dropout(0.2),
keras.layers.Dense(1, activation="sigmoid"),
])
對於具有多個輸入、多個輸出、共享層或跳躍連線的模型,Functional API 讓你在整張計算圖層面擁有完全的控制權:
price_input = keras.Input(shape=(60, 5), name="price_sequence")
meta_input = keras.Input(shape=(10,), name="metadata")
x = keras.layers.LSTM(64, return_sequences=True)(price_input)
x = keras.layers.LSTM(32)(x)
combined = keras.layers.concatenate([x, meta_input])
combined = keras.layers.Dense(64, activation="relu")(combined)
output = keras.layers.Dense(1, activation="sigmoid")(combined)
model = keras.Model(inputs=[price_input, meta_input],
outputs=output)
這個模型接收兩個輸入——一段由堆疊 LSTM 處理的 60 步價格序列,以及一個由靜態特徵組成的後設資料向量——把它們合併後,輸出一個方向性預測。這種架構在金融機器學習中很常見,因為你往往想把時序模式(近期價格走勢)與上下文資訊(波動率狀態、資金費率、星期幾)融合在一起。
金融應用中的關鍵層型別:Dense 用於表格類特徵,LSTM 和 GRU 用於時間序列,Conv1D 用於學習區域性時序模式,MultiHeadAttention 用於 transformer 風格的序列建模。
編譯模型與回撥:讓訓練更聰明
構建完成後,Keras 模型必須用三個元件進行編譯:一個最佳化器、一個損失函式和一組評估指標。
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=1e-3),
loss="binary_crossentropy",
metrics=["accuracy", keras.metrics.AUC(name="auc")],
)
history = model.fit(
X_train, y_train,
epochs=100,
batch_size=64,
validation_data=(X_val, y_val),
callbacks=[...],
)
回撥(Callbacks)是在訓練期間特定時點執行的鉤子——在每個 epoch、每個 batch 之後,或在滿足某些條件時觸發。它們把原本需要人工監控的訓練管理工作自動化了:
- EarlyStopping — 當驗證損失連續
patience個 epoch 不再改善時,停止訓練。可防止過擬合,避免浪費算力。設定restore_best_weights=True可自動恢復到最佳檢查點。 - ModelCheckpoint — 每當驗證效能提升時儲存模型。再也不會因為訓練崩潰或後期 epoch 的過擬合而丟失你最好的模型。
- ReduceLROnPlateau — 當驗證損失進入平臺期時降低學習率。這往往能挖掘出固定學習率所錯過的額外效能——模型在初期邁大步,之後用更小的步幅做精細調整。
callbacks = [
keras.callbacks.EarlyStopping(
monitor="val_loss", patience=15,
restore_best_weights=True),
keras.callbacks.ModelCheckpoint(
"best_model.keras", monitor="val_auc",
mode="max", save_best_only=True),
keras.callbacks.ReduceLROnPlateau(
monitor="val_loss", factor=0.5,
patience=5, min_lr=1e-6),
keras.callbacks.TensorBoard(log_dir="./logs"),
]
務必把 EarlyStopping 和 ModelCheckpoint 配合使用。把金融模型訓練太多個 epoch,幾乎必然導致過擬合——模型會開始記住訓練資料裡的噪聲。這兩個回撥能確保你在正確的時機停下,並保留正確的權重。
TensorBoard:視覺化訓練與除錯模型
TensorBoard 是 TensorFlow 的視覺化工具包,也是任何機器學習從業者工作流中最有價值的工具之一——無論你用的是 TensorFlow、PyTorch 還是 JAX。它把原始的訓練日誌轉化為互動式儀表盤,揭示你的模型內部正在發生什麼。
把 TensorBoard 指向你的日誌目錄即可啟動:
# 終端
tensorboard --logdir=./logs --port=6006
# 或在 Jupyter notebook 中
%load_ext tensorboard
%tensorboard --logdir ./logs
金融模型開發中的關鍵視覺化:
Scalars(標量) — 隨時間繪製的訓練損失曲線和驗證損失曲線。兩者之間的差距能揭示過擬合:訓練損失持續下降而驗證損失卻上升,意味著你的模型正在記憶噪聲。健康的訓練表現為兩條曲線一起下降,驗證曲線略高於訓練曲線。
Histograms(直方圖) — 各層、各 epoch 上權重、偏置和啟用值的分佈。要留意權重分佈坍縮至零(梯度消失)、爆炸到極大值(訓練不穩定),或啟用值飽和在 0 或 1(神經元死亡)。這些問題在損失曲線裡看不出來,但在直方圖裡一目瞭然。
Embeddings(嵌入) — 用 t-SNE 或 PCA 把高維表示投影到二維或三維空間。視覺化地檢視你的模型是否在其內部表示中學會了區分不同的市場狀態、資產類別或波動率狀態。
HParams(超引數) — 跨實驗對比超引數掃描結果。用不同的學習率、架構和 dropout 值執行同一個模型,然後找出哪些組合產生了最佳的驗證指標。這種系統化的對比,把隨意的試錯替換成了基於證據的模型選擇。
TensorBoard 也能透過 torch.utils.tensorboard.SummaryWriter 類與 PyTorch 配合使用——這些視覺化工具與框架無關,這也是 TensorBoard 成為整個機器學習生態系統事實標準的原因之一。
用於生產的 tf.data 管道與 TensorFlow Serving
當你的資料集大到無法裝進記憶體時——在處理來自 GaiaEx 這類交易所的逐筆(tick 級)資料時,這是很常見的情況——tf.data 提供了一條高效、並行化的資料管道,讓你的 GPU 持續有資料可吃,而無需一次性載入所有資料。
dataset = tf.data.Dataset.from_tensor_slices((features, labels))
dataset = (dataset
.window(60, shift=1, drop_remainder=True)
.flat_map(lambda w: w.batch(60))
.batch(64)
.prefetch(tf.data.AUTOTUNE)
)
prefetch(AUTOTUNE) 這個呼叫至關重要——它讓資料載入與模型計算得以重疊進行,這樣 GPU 就不會閒著等下一個 batch。對於需要複雜特徵工程的金融資料集,你可以鏈式串聯多個並行執行的 .map() 變換,實時計算各種指標和歸一化,而不必預先計算好再存起來。
TensorFlow Serving 是一套生產級系統,用於把模型部署在高效能的 gRPC 或 REST API 之後。它負責模型版本管理(在保留舊模型作為後備的同時提供新模型服務)、請求批處理(把多個推理請求合併以提升 GPU 效率)以及硬體加速——這些對延遲和可靠性都至關重要的交易系統而言缺一不可。
# 匯出一個 SavedModel
model.save("models/price_predictor/1")
# 用 Docker 提供服務
# docker run -p 8501:8501 \
# --mount type=bind,source=$(pwd)/models,target=/models \
# -e MODEL_NAME=price_predictor \
# tensorflow/serving
一個典型的生產架構:你的交易機器人連線到 GaiaEx 的 WebSocket 行情流,實時計算特徵,把推理請求傳送給 TF Serving,並在個位數毫秒內收到預測結果。當你在新資料上重新訓練後,把更新後的模型作為版本 2 部署——TF Serving 會零停機地把它切換上線。
TensorFlow Lite、邊緣部署,以及 TF 與 PyTorch 之爭
TensorFlow Lite 會壓縮模型,以便部署到移動裝置、嵌入式系統和邊緣硬體上。透過量化(把 32 位浮點權重轉換為 8 位整數)、剪枝(移除接近零的權重)和架構最佳化等技術,TF Lite 能在保留模型大部分精度的同時,把模型縮小 4 倍甚至更多。這使得直接在算力受限的裝置上執行推理成為可能——對於那些需要獨立於雲端基礎設施執行的邊緣交易節點或監控儀表盤很有用。
# 把 Keras 模型轉換為 TF Lite
converter = tf.lite.TFLiteConverter.from_saved_model("models/v1")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with open("model.tflite", "wb") as f:
f.write(tflite_model)
TensorFlow 還是 PyTorch——金融應用該選哪個?
- 對於研究和原型開發:選 PyTorch。它的動態計算圖、Pythonic 的 API 以及在學術研究中的主導地位,意味著更多論文附帶 PyTorch 程式碼、更多教程使用 PyTorch,除錯起來也更直觀。
- 對於大規模生產部署:TensorFlow 仍佔優勢。TF Serving、TF Lite 和 TensorFlow.js 提供了久經考驗的部署路徑,而 PyTorch 的 TorchServe 和 ONNX Runtime 還在向這個成熟度靠攏。
- 具體到金融機器學習:從 PyTorch 入手做模型開發和實驗。如果你的生產需求要求 TF Serving 的成熟度或 TF Lite 的邊緣部署能力,再把你最好的模型轉換過去。許多團隊用 PyTorch 做研究、用 TensorFlow 做部署,並透過 ONNX(開放神經網路交換)格式在兩者之間架橋。
說句實話:兩個框架正在趨同。TensorFlow 採納了即時執行(eager execution);PyTorch 加入了 torch.compile 來做圖層面的最佳化。Keras 本身現在也支援 PyTorch、JAX 和 TensorFlow 作為後端。最好的框架,就是你的團隊熟悉、並能用它交付生產程式碼的那個。選一個,把它吃透,去解決真正的問題——預測市場——而不是糾結於工具之爭。