深夜撸TensorFlow,一个大专生的AI初体验

函数起名大师
2025-12-26 15:48
阅读 361

上周五晚上11点,办公室只剩我一个人。空调嗡嗡作响,咖啡已经凉透,但手里的代码还没跑通。这已经是连续第三天在折腾TensorFlow 2.0了——不是因为热爱,而是被产品经理“温柔”地塞了个需求:“能不能加个智能推荐?用户点击率太低了。”

我是去年刚入职的大专应届生,学的是计算机应用技术,靠自学前端混进了这家公司。两年下来,从写页面切图到搞Node.js后端,再到最近被迫接触AI,感觉自己快成全栈缝合怪了。不过说实话,深夜写代码效率是真的高,没人打扰,连测试都下班了(逃过一劫)。

这次要搞的推荐功能,领导说“简单搞个模型就行”,结果我翻了半天文档才发现,根本没那么简单。于是咬牙啃起了TensorFlow 2.0。今天这篇就记录下我的入门踩坑路,给和我一样半路出家、学历不高但想搞AI的兄弟们一点参考。


为什么选 TensorFlow 2.0?

其实一开始我想试试 PyTorch,社区活跃、教程多,但咱公司老系统全是 Python + TF 1.x 的遗产代码。领导一句话:“别折腾新东西,用现有的。” 好吧,那就 TF 2.0 吧——至少它比 1.x 友好多了,不用再手动管理 Session 和 Graph 了,终于能像写普通 Python 一样训练模型了。

TF 2.0 最大的变化就是 Eager Execution(即时执行) 默认开启。这意味着你写的每一行代码都会立刻执行,而不是先构建计算图再运行。对新手来说,调试简直爽飞。比如:

import tensorflow as tf

a = tf.constant([1, 2, 3])
b = tf.constant([4, 5, 6])
c = a + b
print(c)  # 直接输出结果,不用 sess.run()

这种体验,让我这个前端出身的人瞬间有了亲切感——不就是像写 JavaScript 一样吗?虽然一个是 Python 一个是 JS,但那种“写完就跑”的即时反馈,真的让人上头。

说到 JavaScript,其实现在 TF.js 也挺火的,可以直接在浏览器里跑模型。我们前端组去年还试过用它做人脸检测,但性能一般,复杂模型还是得靠后端。不过如果你是纯前端想玩 AI,TF.js 是个不错的入口。只是……别指望用它搞区块链+AI的组合拳,那玩意儿目前更多是 PPT 项目(别问我是怎么知道的,问就是被拉去参加过某“AI+区块链赋能实体经济”内部分享会,听得我直打哈欠)。


核心概念:张量、模型、损失函数

刚接触 TF,最容易懵的就是一堆术语:张量(Tensor)、层(Layer)、优化器(Optimizer)……其实拆开看也没那么玄乎。

  • 张量:就是多维数组。标量是0维,向量是1维,矩阵是2维,更高维就是张量。比如一张 28x28 的灰度图,就是一个 (28, 28) 的张量。
  • 模型:就是一堆层的组合。你可以用 tf.keras.Sequential 像搭积木一样堆起来。
  • 损失函数 & 优化器:告诉模型“你错在哪”和“怎么改”。比如分类问题常用交叉熵损失(CrossEntropy),优化器常用 Adam。

举个栗子,我们有个电商点击日志数据集,字段包括:用户ID、商品ID、是否点击(0/1)。目标是预测用户会不会点击某个商品。这其实是个典型的二分类问题

我一开始直接上手写了模型:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu', input_shape=(2,)),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

但跑了几次发现准确率卡在 0.6 左右。后来才意识到:输入特征太少了! 就两个 ID 字段,模型根本学不到啥。这时候就得回到算法本质——特征工程比模型结构更重要。


特征工程:从 ID 到 Embedding

用户ID和商品ID都是离散值,直接喂进 Dense 层效果很差。正确的做法是用 Embedding 层 把它们映射成稠密向量。比如:

user_input = tf.keras.Input(shape=(1,), name='user_id')
item_input = tf.keras.Input(shape=(1,), name='item_id')

user_embedding = tf.keras.layers.Embedding(input_dim=10000, output_dim=32)(user_input)
item_embedding = tf.keras.layers.Embedding(input_dim=5000, output_dim=32)(item_input)

# 合并特征
merged = tf.keras.layers.concatenate([user_embedding, item_embedding])
flattened = tf.keras.layers.Flatten()(merged)

dense = tf.keras.layers.Dense(64, activation='relu')(flattened)
output = tf.keras.layers.Dense(1, activation='sigmoid')(dense)

model = tf.keras.Model(inputs=[user_input, item_input], outputs=output)

这里 input_dim 是 ID 的最大值+1,output_dim 是嵌入维度(可以调参)。这样模型就能学到“用户A喜欢科技类商品”、“商品B常被年轻人点击”这类隐含信息。

调完之后,准确率一下飙到 0.85!那一刻我真的想发朋友圈炫耀,但想到明天还要改 bug,默默关掉了编辑框。


训练与调优:别信默认参数

很多人以为 model.fit() 一行搞定,其实坑多得很。比如:

  • 学习率太大:loss 震荡不收敛
  • batch_size 太小:训练慢,梯度噪声大
  • 没做数据归一化:某些特征主导训练

我们用的数据集有 100 万条记录,我一开始 batch_size 设成 32,训了半小时才跑完一个 epoch。后来改成 1024,速度提升 5 倍,效果几乎没变。

另外,早停(Early Stopping) 很重要。不然容易过拟合。比如:

callbacks = [
    tf.keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)
]

model.fit(x_train, y_train,
          validation_data=(x_val, y_val),
          epochs=50,
          batch_size=1024,
          callbacks=callbacks)

patience=3 表示验证集 loss 连续 3 轮不下降就停止,还能自动回滚到最佳权重。这招救了我好几次——有次半夜跑模型,第二天一看 overfitting 严重,差点被测试怼死。


算法选择:别盲目追 SOTA

网上总吹什么 Transformer、BERT,但对我们这种小场景,一个简单的 MLP 或 Wide & Deep 模型就够了。我对比过几种算法在点击预测上的表现:

模型类型 准确率 训练时间(分钟) 部署复杂度
逻辑回归 0.72 2
MLP (3层) 0.85 15
Wide & Deep 0.87 25
DeepFM 0.88 40

最后选了 MLP,因为够用、快、好维护。毕竟我们不是 Google,不需要为 1% 的提升增加十倍运维成本。这点我们组长说得特别实在:“线上稳定比 paper accuracy 重要一百倍。”


关于 JavaScript 和区块链的“强行联动”

我知道标题里提到了这两个词,但实话实说——在 TensorFlow 2.0 的实际业务中,它们基本没戏。

  • JavaScript:除非你用 TF.js 做前端推理,否则后端训练全靠 Python。我们倒是想过把模型转成 ONNX 再用 Node.js 调,但性能不如直接 Flask API。
  • 区块链:我真见过有人提议“把模型训练记录上链,保证可追溯”。结果被架构师一句“你算过 gas fee 吗?”直接劝退。目前 AI + 区块链 99% 是炒作,剩下 1% 是学术玩具。

所以别被 hype 带偏,解决问题才是王道


写在最后

从一个连“张量”是啥都不知道的大专生,到现在能独立搞个小模型上线,中间踩的坑只有自己知道。有时候凌晨三点看着 loss 曲线终于下降,那种成就感,比打十把王者都爽。

如果你和我一样,学历普通、基础一般,但愿意熬夜、肯查文档、敢试错——AI 没那么遥不可及。TensorFlow 2.0 的设计哲学就是“让机器学习更简单”,而我们要做的,就是别被术语吓倒,动手跑起来。

对了,上周那个推荐功能已经上线了,点击率提升了 12%。产品经理请我喝了杯瑞幸,说“下次还有这种需求还找你”。我表面微笑,内心 OS:求你了,让我回去写 React 吧……

(完)

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝