引言
进一步了解神经网络的工作原理,如标题所示,这是一篇涉及大量数学的文章。
图1 训练集的可视化
作为一个解决数据集的二进制分类问题,如上图1所示。 为了解决这个问题,使用图2所示的结构的神经网络。-五个全连接层,不同数量的单元。 隐藏层使用ReLU作为激活函数,使用Sigmoid作为输出层。
图2 神经网络架构
keras方案
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(4, input_dim=2,activation='relu'))
model.add(Dense(6, activation='relu'))
model.add(Dense(6, activation='relu'))
model.add(Dense(4, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=50, verbose=0)
需几次导入和几行代码就足以创建和训练一个模型,该模型能够以几乎100%的准确度对测试集中的条目进行分类。 任务归结为根据所选架构提供超参数(层数,层中神经元数,激活函数)。 这是创建的可视化效果。
图3 二分类可视化
什么是神经网络
首先回答这个关键问题:什么是神经网络? 这是一种构建计算机程序的生物学方法,该程序能够学习并独立地查找数据中的连接。 如图2所示,网络是分层排列的“神经元”的集合,它们以允许通信的方式连接在一起。
单神经元
每个神经元接收一组x值(从1到n)作为输入,并计算预测的y值。 向量x实际上包含训练集中m个示例之一中的特征值。 每个单元都有自己的一组参数,通常称为w(权重向量)和b(偏差),它们在学习过程中会发生变化。 在每次迭代中,神经元都基于其当前权重向量w计算向量x值的加权平均值,并增加偏差。 最后计算的结果通过非线性激活函数g传递。 以下部分中提到一些流行的激活功函数。
图3 单神经元
单层
现在考虑如何对整个神经网络层进行计算。 对整个层进行矢量化处理,以将这些计算合并为矩阵方程式。 为了统一表示法,为所选层[1]编写方程式。 下标i标记了该层中神经元的索引。
图4 单层
重要提示:为单个单元编写方程式时,使用x和y-hat,分别是特征的列向量和预测值。 切换到图的通用符号时,使用向量a-表示相应层的激活。 因此,x向量是第0层-输入层的激活。 该层中的每个神经元根据以下公式执行类似的计算:
为了简明,写一下第二层的公式:
每一层必须执行许多相似的操作。 为此目的使用for循环不是很有效,为了加快计算速度,使用向量化。 首先通过将权重w的水平向量堆叠(换位),构建矩阵W。类似地,在层中将每个神经元的偏差堆叠在一起,从而创建垂直向量b。 现在建立一个矩阵方程式,该方程式能够立即对层的所有神经元进行计算。 写下矩阵和向量的尺寸。
跨多个示例进行矢量化
下一步将是跨多个示例进行矢量化。 假设数据集包含m个条目,每个条目具有nx个功能。 首先将每一层的垂直向量x,a和z放在一起,分别创建X,A和Z矩阵。 然后考虑到新创建的矩阵,重新编写先前布置的方程式。
什么是激活函数为什么需要它
激活函数是神经网络的关键元素之一。 没有它们,神经网络将成为线性函数的组合,因此它本身就是线性函数。 模型的扩展性有限,不超过逻辑回归。 非线性元素在学习过程中允许更大的灵活性和复杂函数的创建。 激活函数还对学习速度产生重大影响,这是选择它们的主要标准之一。 图6显示了一些常用的激活函数。 当处理二值分类并且希望模型返回的值在0到1的范围内时,仍会使用Sigmoid,尤其是在输出层中。
图6 常用激活函数及其导数可视化
损失函数
有关学习过程的基本信息来源是损失函数的值。损失函数旨在显示与“理想”解决方案的距离。 在案例中使用了二值交叉熵,但是根据问题的不同,可以应用不同的函数。 使用的函数由以下公式描述,其值在学习过程中的变化如图7所示。它显示了每次迭代损失函数的值如何减小而精度提高。
图7 损失函数的变化
神经网络如何学习
学习过程是关于更改W和b参数的值,以便使损失函数最小化。为了实现这个目标,寻求微积分的帮助,并使用梯度下降法来找到函数最小值。在每次迭代中,针对神经网络的每个参数计算损失函数偏导数的值。由于这一点,我们知道如何操纵变量以便在图形中向下移动。准备一个小型可视化文件。您可以看到在每个连续的周期都朝着最小的方向前进。在我们的神经网络中,它以相同的方式工作-每次迭代计算出的梯度显示了移动方向。主要区别在于,在示例性神经网络中,还有许多参数需要操纵。如何计算这种复杂的导数?
图8 梯度下降可视化
反向传播
反向传播是一种算法,可以计算出非常复杂的梯度。 根据以下公式调整神经网络的参数。
在上面的等式中,α表示学习率-一种超参数,您可以使用它来控制执行的调整值。 选择学习率至关重要-将学习率设置得太低,我们的神经网络学习速度将非常慢,将学习率设置得太高,无法达到最低要求。 dW和db是使用链式规则(损失函数相对于W和b的偏导数)计算的。 dW和db的大小分别与W和b的大小相同。 图9.显示了神经网络中的操作顺序。 看到了正向和反向传播如何协同工作以优化损耗函数。
图9 前向与反向传播
结论
在使用神经网络时,了解此过程的基础知识可能会很有帮助。 建议尝试仅使用Numpy自己编写这样一个小型神经网络,而无需使用高级框架。