GaiaEx AcademyGaiaEx Academy
用于模型监控的 TensorFlow、Keras 与 TensorBoard
开发者AI 与机器学习12 min read

用于模型监控的 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),又需要它运行在用于研究的本地工作站上,这种多用途特性就显得格外重要。

TensorFlow 机器学习生命周期(简化版) 数据 Keras 训练 TB 日志 服务 / 边缘 只要标准化产物(SavedModel),同一张计算图就能同时供给研究 notebook 和生产环境。 tf.data 管道让 GPU 持续有数据可吃;TF Serving 在不停机的情况下切换模型版本
原型、训练、观察、部署——一套技术栈,多种运行时。

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 用于表格类特征,LSTMGRU 用于时间序列,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 成为整个机器学习生态系统事实标准的原因之一。

TensorBoard 面板(概念示意) Scalars 训练损失 vs 验证损失 Histograms 权重 / 激活值 HParams 对比各次运行 过拟合在 P&L 回测里暴露之前,就先以曲线发散的形式显现出来了。
Scalars 捕捉拟合质量;histograms 捕捉出问题的层;HParams 对比各个实验。

用于生产的 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 作为后端。最好的框架,就是你的团队熟悉、并能用它交付生产代码的那个。选一个,把它吃透,去解决真正的问题——预测市场——而不是纠结于工具之争。