CHAPTER 18 / 37
神经网络训练:如何用TensorFlow实现?
神经网络训练的本质,其实就是让模型在大量数据中不断试错、不断修正参数,最终逐渐学会隐藏在数据背后的规律。
在前面的几篇文章中,我们已经理解了三件事情:
-
神经网络的结构是什么
-
神经网络如何进行预测(Forward Propagation)
-
如何用TensorFlow构建一个神经网络模型
但还有一个关键问题没有回答:神经网络是如何“学会”的? 换句话说:模型的参数到底是怎么从数据中训练出来的?
这一篇,我们就来理解神经网络训练(Training)的全过程。
从一个产品问题开始
假设你在做一个知识付费产品,希望预测:用户是否会在未来7天内流失?
你可能有这些数据:
最近7天登录次数、最近阅读时长、是否完成课程、是否参与社区讨论每一个用户数据可以表示为:
X = [登录次数, 阅读时长, 完成课程比例, 社区互动]同时我们还有真实结果:Y = 0 或 1
1 :用户流失
0:用户未流失我们的目标就是:训练一个神经网络,让它学会预测用户流失概率。
TensorFlow神经网络训练的三步
如果你把 TensorFlow 的代码拆开看,会发现训练过程其实只有三个步骤:
1、定义模型结构
2、定义损失函数
3、用数据训练模型
这三件事其实和我们之前学过的逻辑回归完全一样。
第一步:定义神经网络结构
在TensorFlow中,我们通常会写这样的代码:
model = Sequential([
Dense(16, activation='sigmoid'),
Dense(8, activation='sigmoid'),
Dense(1, activation='sigmoid')
])这段代码的意思其实很简单:
输入数据
↓
隐藏层1(16个神经元)
↓
隐藏层2(8个神经元)
↓
输出层(1个神经元)这一步其实只是告诉TensorFlow:神经网络应该长什么样,还没有开始学习。
第二步:定义模型“错误程度”
模型训练的核心问题其实是:我们怎么知道模型预测得好不好?这就需要损失函数(Loss Function)。
对于分类问题,最常见的损失函数是:Binary Crossentropy。
在TensorFlow中写法是:
model.compile(
loss="binary_crossentropy",
optimizer="adam"
)Binary Crossentropy(二元交叉熵)是一种常用于二分类问题的损失函数,用来衡量模型预测概率与真实标签之间的差距。比如:
预测概率:0.9
真实标签:1
表示误差很小
预测概率:0.1
真实标签
表示误差很大第三步:真正开始训练模型
最后一步就是让模型不断优化参数,TensorFlow中只需要一行代码:
model.fit(X, Y, epochs=50)意思是:
用数据 X,Y 训练神经网络
重复 50 次每一次训练,模型都会
做一次预测
计算误差
调整参数这个过程就是梯度下降(Gradient Descent)。
训练过程到底发生了什么?
如果我们把训练过程展开,每一轮训练都在做:
输入数据
↓
神经网络预测
↓
计算误差
↓
调整参数这个循环不断重复。
随着训练次数增加,预测误差越来越小,模型就逐渐学会了数据中的规律。
Backpropagation:训练的核心算法
神经网络训练最关键的算法叫:反向传播(Backpropagation)。
简单理解就是:误差从输出层一层一层往回传,然后更新每一层的参数。
如果没有这个算法,神经网络几乎不可能训练成功。
好消息是,TensorFlow已经帮我们自动实现了这一切。
为什么使用TensorFlow?
在深度学习早期,很多研究人员都是自己写神经网络代码。
但今天几乎所有工程团队都会使用TensorFlow或者PyTorch。原因很简单,这些框架已经帮你处理了:
自动求导
GPU计算
数值稳定性
大规模训练就像今天没人会自己写排序算法一样。
虽然TensorFlow帮我们隐藏了很多细节,但理解原理仍然非常重要。
因为现实中经常会遇到如模型训练不收敛、预测结果异常、训练速度太慢等情况。如果只会调用API,很难定位问题。
理解训练流程,可以帮助你更好地设计模型和调试系统。
神经网络训练的本质
如果用一句话总结,神经网络训练其实就是一个不断减少预测误差的过程。
整个过程只有三个核心要素:
模型结构
损失函数
优化算法TensorFlow只是把这些复杂步骤自动化了。
从更长远的角度看,机器学习真正改变的,并不是某一种算法,而是我们解决问题的方式。过去我们需要为系统写清楚每一条规则,而现在,我们开始让系统从数据中自己学会规则。
这种从“规则驱动”到“数据驱动”的转变,也许才是人工智能时代最重要的变化。
附录:本文涉及的专有名词中英文对照(标红为最核心)