9步教你用NumPy从头开始构建神经网络!

    xiaoxiao2022-07-03  116

    https://www.toutiao.com/a6693296472533762574/

     

     

    动机

    如果你是一个了解神经网络如何工作的初级数据科学家,或者只是对深度学习有所了解的机器学习爱好者,那么这篇文章是你不能错过的。以下是如何使用NumPy从头开始构建神经网络的9个步骤,从数据预处理到反向传播必须要做的事情。

    对机器学习、人工神经网络、Python语法和编程逻辑的基本理解是首选(但不是必需的,因为您可以随时学习)。

    代码可在Github上获得。ML-in-NumPy/neural-net.ipynb at master · edenau/ML-in-NumPy · GitHub

    1.初始化

    第一步,导入NumPy。

     

    2.数据生成

    深度学习需要数据。尽管网上有许多干净的数据集,但为了简单起见,我们将生成自己的数据集——对于输入a和b,我们有输出a + b、a-b和| a-b |,生成10,000个基准点。

    X_num_row, X_num_col = [2, 10000] # Row is no. of feature, col is no. of datum points X_raw = np.random.rand(X_num_row,X_num_col) * 100 y_raw = np.concatenate(([(X_raw[0,:] + X_raw[1,:])], [(X_raw[0,:] - X_raw[1,:])], np.abs([(X_raw[0,:] - X_raw[1,:])]))) # for input a and b, output is a+b; a-b and |a-b| y_num_row, y_num_col = y_raw.shape

     

    3.Train-test分裂

    我们的数据集分为训练集(70%)和测试集(30%)。仅利用训练集来调整神经网络。测试集仅在训练完成时用于性能评估。

    train_ratio=0.7 num_train_datum = int(train_ratio*X_num_col) X_raw_train = X_raw[:,0:num_train_datum] X_raw_test = X_raw[:,num_train_datum:] y_raw_train = y_raw[:,0:num_train_datum] y_raw_test = y_raw[:,num_train_datum:]

    4.数据标准化

    训练集中的数据是标准化的,因此每个标准化特征的分布是零均值和单位方差。然后可以将由上述过程产生的定标器应用于测试集。

     

    这些线条可能看起来很吓人,但它们都是重复的。

    因此,缩放器不包含来自我们的测试装置的任何信息。我们不希望神经网络在网络调整之前获得有关测试集的任何信息。

    我们现在已经完成了数据预处理的4个步骤。

    5.神经网络构建

     

    我们使用Python中的类对象进行客观化。每个层(输入层除外)都有权重矩阵W、偏置矢量b和一个激活函数。每个图层都附加到名为neural_net的列表中。然后,该列表将表示您的完全连接的神经网络。

     

    最后,我们使用以下公式并通过计数对超参数的数量进行全面检查。可用的基准数量应该超过超参数的数量,否则它肯定会过度拟合。

    N ^ l是第l层的超参数个数,L是层数(不包括输入层)

    6.前向传播

    在给定一组权重和偏差的情况下,我们定义了前向传播的函数。层之间的连接以矩阵形式定义为:

    σ是element-wise激活函数,上标T表示矩阵的转置

     

    激活函数是逐个定义的。 ReLU实现为→max(a,0),而sigmoid函数应返回→1 /(1 + e ^( - a)),其实现留给读者作为练习。

     

    7.反向传播

    这是我们许多人根本不理解的最棘手的部分。一旦我们定义了用于评估性能的损失度量标准,我们就想知道当我们扰乱每个权重或偏差时损失度量是如何变化的。

    我们想知道每个权重和偏差对损失度量的敏感程度。

    这由分数导数∂e/∂W(在代码中表示为dW)和∂e/∂b(在代码中表示为db)表示,并且可以分析计算。

    ⊙表示元素乘法

     

     

    这些反向传播方程假设只有一个基准y被比较。梯度更新过程中,因为每次迭代的性能仅受一个基准点的影响。可以使用多个基准来减少噪声,其中∂W(y_1,y_2,...)将是∂W(y_1),∂W(y_2),...的平均值,∂b也是如此。这些方程中没有显示这一点,但是在下面的代码中实现了这一点。

     

    8.迭代优化

    我们现在拥有用了训练神经网络的每个构建块。

    一旦我们知道权重和偏差的敏感性,我们尝试使用以下更新规则通过梯度下降迭代地最小化(因此减号)损失度量:

    ∂W=∂W - learning_rate *∂W ∂b=∂b - learning_rate *∂b

     

    训练损失应该随着迭代而下降

    9.测试

    如果测试损失不高于训练损失,该模型可以很好地推广。我们还制作了一些测试用例,以了解模型的执行情况。

     

    这就是你如何使用NumPy从头开始构建神经网络的9个步骤。你们中的一些人可能已经使用一些高级框架(如TensorFlow,PyTorch或Keras)构建了神经网络。然而,仅使用低级库构建神经网络使我们能够真正理解这个神秘背后的数学。

    我的实现绝不是构建和训练神经网络最有效的方法,还有很大的改进空间。

    最新回复(0)