简介
本篇简单讲解简单的神经网络训练。通过回顾逻辑回归模型训练,了解神经网络训练的相关内容。比如训练步骤、损失函数、优化算法以及深度学习库的使用,了解训练过程中的相关概念。
例子
手写数字识别(判断是 0 还是 1)。这是常见的二分类问题。构建一个包含输入层、两个隐藏层(分别有 25 个和 15 个单元)以及一个输出层的神经网络,搭建模型,损失函数确定,再到参数优化。
原理
1. 逻辑回归模型原理
- 模型构建与输出计算:
逻辑回归模型需明确输入特征与输出的关系,其输出由权重
和偏置
决定,通过
函数对
进行运算得到,即输出为
,确定了输入到输出的映射规则。
- 损失函数与成本函数:
损失函数衡量单个训练样本的预测误差,对于逻辑回归,单个样本损失为
,其中为真实标签,
为预测输出。成本函数则是对所有训练样本损失函数的平均值,是关于
和
的函数,用于从整体训练集角度评估模型性能。
- 模型训练优化:
采用梯度下降算法,通过不断更新参数和
(
),
,(alpha为学习率,
和
为成本函数
关于
和
的偏导数),逐步减小成本函数,使模型拟合训练数据。
2. 神经网络训练原理
- 模型结构与输出计算:
类似逻辑回归确定输入输出关系,神经网络通过定义网络结构(如各层单元数量),明确输入如何经各层处理得到输出。例如,输入数据依次经过包含特定数量单元的隐藏层,最终到达输出层,各层的权重和偏置参数决定数据处理方式,确定了复杂的输入到输出映射。
- 损失函数与成本函数确定:
对于二分类神经网络,常用二元交叉熵损失函数,形式与逻辑回归类似,为,其中
是真实标签,
是神经网络输出。对所有训练样本的损失求平均得到成本函数。若为回归问题,则可选用均方误差等不同损失函数。
- 模型训练优化:
利用反向传播算法计算成本函数关于参数的偏导数,进而使用梯度下降等算法更新参数。在实际应用中,如使用框架,通过调用
函数,框架自动执行反向传播和参数更新过程,以最小化成本函数,优化神经网络性能。
实践建议
1. 理解为先:
尽管深度学习库功能强大且方便使用,但深入理解神经网络训练原理是关键。当训练过程出现问题(如模型不收敛、准确率低等),扎实的原理知识有助于快速定位和解决问题。
2. 合理选择损失函数:
根据问题类型(分类或回归)合理选择损失函数。对于分类问题,要依据类别数量和数据特点确定合适的损失函数,如二分类常用二元交叉熵损失函数;回归问题则多考虑均方误差等损失函数,以确保模型能准确衡量预测与真实值的差异。
3. 借助成熟库提升效率:
鉴于深度学习库已成熟,实际开发中应充分利用如TensorFlow、PyTorch等库。它们提供了高效且经过优化的实现,能大幅减少开发时间和工作量。例如,在使用TensorFlow训练神经网络时,可通过简单调用函数完成复杂的模型训练过程。
4. 尝试不同网络设置:
在掌握基本神经网络训练方法后,可尝试调整网络设置,如改变隐藏层单元数量、更换激活函数等,以探索提升模型性能的可能性,根据实际任务需求优化模型。
示例代码
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical
# 加载 MNIST 数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 数据预处理
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
# 将标签进行 one - hot 编码
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
# 构建模型
model = Sequential([
Dense(25, activation='relu', input_shape=(28 * 28,)),
Dense(15, activation='relu'),
Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(train_images, train_labels, epochs=5, batch_size=128)
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")
笔者注
本篇笔记没有什么特别的地方,只是简单回顾了解一下与训练相关的底层知识,后面几篇会更详细的拆解。
深度学习工作本身会比较枯燥,代码写下去后剩下的是显卡在烧。学习AI的话,API本身没什么可说的,工作流反而比API重要的多,而底层的数学才是AI更有意思的地方。