深度学习中的神经网络基础

神经网络是机器学习的一个分支,它通过人工神经网络从数据中提取更高层次的特征。这种网络受到人体神经系统工作的启发,由多个层组成,每层包含多个单元,主要分为三个部分:输入层、隐藏层(可能有一个或多个)和输出层。当一个层中的每个单元都与下一层的每个单元相连时,这种网络被称为密集连接的神经网络。

神经网络的概念起源于感知机模型,该模型包括输入层、每个单元对应的权重、求和函数以及非线性函数,最终产生预测输出。在感知机中,每个输入都乘以其相应的权重,求和后传递给非线性函数,得到一个介于0和1之间的结果。常用的非线性函数有三种:sigmoid函数、双曲正切函数和修正线性单元(ReLU)。ReLU是实践中常用的非线性函数,因为线性函数无论数据量有多大,都只能产生线性决策,而非线性函数可以近似复杂函数,提供更好的预测。

当多个感知机以多种组合连接时,就形成了全连接神经网络。在神经网络中,有一些参数,当调整这些参数时可以获得更好的结果,这些参数被称为超参数。损失函数和优化器是神经网络中的主要超参数。模型的效率取决于损失的最小化。主要使用两种度量来衡量模型的损失:平均绝对误差(MAE)和均方误差(MSE)。

平均绝对误差是通过实际输出和预测输出之间的绝对差值之和与输入值总数的比率来计算的,通常用于回归模型中,并且可以忽略异常值。均方误差是通过预测输出和实际输出之间的平方差之和与输入值总数的比率来计算的,当较大的误差比较小的误差更重要时使用。还有一种损失函数叫做Huber,它是MAE和MSE的结合,广泛用于稳健回归问题,并且对异常值的敏感性低于MSE。

如果损失被最小化到最低,那么模型就足够完美,可以说神经网络已经准备好使用了。损失是网络权重的函数,即L(f(X(i); W), Y(i))。为了理解损失函数,让回顾一下高数中的梯度概念。梯度是用于多变量函数的偏导数向量,而斜率(一个标量量)的概念用于单变量函数。梯度给出了一个向量,指示达到函数最大全局值的方向。一般来说,如果站在输入空间f的一个点(X0, Y0, Z0,…),向量Del F(X0, Y0, Z0,…)告诉应该朝哪个方向走以最快地最大化函数的值。

回到损失优化过程。当将梯度应用于损失函数时,它会带到达损失最大化的值。为了避免这种情况,将朝梯度的相反方向走,找到损失函数的局部最小值。这个过程发生多次迭代,以找到模型的最佳可能权重。一旦到达局部最小值,将取对应的权重,给出最低的值。在机器学习深度学习中,将‘epochs’设置为一个有限的值,这意味着通过在每次迭代中更新权重来训练模型,以最小化损失。现在来看下面的例子。

例如,有一个多变量损失函数J(W0, W1),以权重W0和W1作为输入。现在让为损失优化制定一个算法,以上图作为参考。算法步骤如下:首先随机选择两个点W0, W1;然后循环直到找到可能的最低损失;计算函数J(W0, W1)的梯度,这个梯度指示最大化损失的方向。因此,将朝完全相反的方向走以获得最小损失;更新权重(包括学习率和反向传播的过程);返回权重。这就是如何在每次迭代中更新权重以使模型的损失最小化的过程,这个过程被称为梯度下降。一个流行的算法叫做随机梯度下降(SGD),在实践中主要用于回归模型,与上述过程非常相似,但在SGD中,在计算损失函数的梯度时,选择一个子集B(整个数据集的一个子集)作为批次来计算梯度并相应地更新。小批量可以加快训练速度,并且可以在GPU上并行计算,从而显著提高速度。Adam是另一个在实践中使用的损失优化器。

检查神经网络训练得如何的最后步骤是通过称为“拟合”的方法。模型拟合有三种可能的情况(欠拟合、理想拟合和过拟合)。当模型不能完全学习数据时,称为欠拟合,换句话说,当模型无法有效识别输入和输出值之间的关系时,就会发生欠拟合。当模型完美地学习数据时,称为理想拟合。当模型训练了太多复杂参数并且不具有良好的泛化能力时,称为过拟合,换句话说,当模型过拟合时,数据被过于紧密地匹配。为了调整这个问题,提出了一种称为正则化的技术,它限制了优化问题,以阻止复杂模型。这有助于提高模型对未见数据的泛化能力。有两种技术可以实现:Dropout和早停。在Dropout技术中,训练期间层中的单元被随机设置为零激活。这意味着禁用单元,使模型寻找不同的模式。在早停技术中,训练在模型有机会过拟合之前就停止了。查看下面的图像以获得更好的理解。在下面的图表中,训练在测试误差值上升的点停止。

让开始编码!导入必要的库。在建模神经网络的三个重要步骤中:创建模型——定义深度学习模型的输入和输出层以及隐藏层;编译模型——定义损失函数(模型的错误程度),优化器(如何改进学习模式),评估指标(解释模型的性能);拟合模型——让模型尝试找到x和y(特征和标签)之间的模式。让编写与图8中神经网络架构相匹配的代码。

# 设置随机种子 tf.random.set_seed(42) # 1. 创建模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(6, input_shape = (4, ), activation = 'relu'),# 隐藏层 tf.keras.layers.Dense(6, activation = 'relu'),# 隐藏层 tf.keras.layers.Dense(2, activation = 'relu')])# 输出层 # 2. 编译模型 model.compile(loss = tf.keras.losses.mae, optimizer = tf.keras.optimizers.SGD(), metrics = ["mae"]) # 3. 拟合模型 model.fit(x_train, y_train, epochs=100, verbose=0)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485