本文为 AI 研习社编译的技术博客,原标题 :
Shallow Neural Networks
作者 | Rochak Agrawal
翻译 | hxyzzz0 编辑 | 邓普斯•杰弗、王立鱼
原文链接:
https://towardsdatascience.com/shallow-neural-networks-23594aa97a5
每当我们听到神经网络的大名时,就会认为它里面有许许多多的隐藏层,但其实还有一种只有少量隐藏层的神经网络,浅神经网络只包含一到两层隐藏层。对浅神经网络的研究可以加强我们对深度神经网络内部运行机制的理解。本文将介绍什么是浅神经网络以及它的数学原理。下图所示是一个只包含一个隐藏层、一个输入层和一个输出层的浅神经网络。
隐藏层由许多神经元组成,每一个都会执行上述两步运算。在上图的浅层神经网络中,隐藏层的四个神经元进行如下计算:
在上面的方程中:
下标i表示第i层,下标j表示该层的第j个神经元。
X是包含3个特征的输入向量。
W[i]j是第i层第j个神经元的权值。
b[i]j 是第i层第j个神经元的偏置。
Z[i]j 是第i层第j个神经元的中间输出。
A[i]j 第i层第j个神经元的最终输出。
Sigma 是sigmoid激活函数。它的数学定义是:
显而易见,上述四个方程比较冗长,因此我们把它们进行向量化:
第一个方程用一个矩阵乘法计算所有的中间输出Z。
第二个方程用一个矩阵运算计算所有的激活函数输出A。
第一个方程计算第一个隐藏层的中间输出Z[1]。
第二个方程计算第一个隐藏层的最终输出A[1]。
第三个方程计算输出层的中间输出Z[2]。
第四个方程计算输出层的最终输出A[2],也就是整个神经网络的最终输出。
我们知道,一个神经网络根本上来说就是一组数学方程和权重的集合。为了提高神经网络的鲁棒性,从而在各种不同的场景下都能得到很好的效果,我们使用了激活函数。这些激活函数为神经网络引入了非线性特性。接下来在浅层神经网络的基础上理解激活函数的重要性。
如果没有激活函数,我们的浅层神经网络可以被表示成:
将方程一中的Z[1]代入方程2得到如下方程:
显而易见,输出将是一个新权重矩阵W、输入X和新偏置矩阵b线性组合,意味着隐藏层中的神经元及其权重都失去了意义。因此,我们需要用激活函数为网络引入非线性特性。
激活函数有许多种,包括Sigmoid、Tanh、ReLU等等,并且可以在每层使用不同的激活函数。你可以在下面这篇文章中得到关于激活函数的更多信息。
(https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6)
神经网络的权重矩阵通常是随机初始化的。那么为什么不能将它初始化为0或者其它什么值呢?接下来通过我们的浅层神经网络来理解这个问题。
让我们用0或者其它值来初始化第一层的权重矩阵W1,和第二层的权重矩阵W2。现在,如果权重矩阵保持不变,那么隐藏层中神经元的激活函数也相同,激活函数的导数也相同。因此,该隐藏层中的各个神经元的权值将被修改为类似的值,从而某一隐藏层无需再包含多于一个神经元。然而这并非我们想要的。相反,我们希望隐藏层中的每一个神经元都独一无二,拥有不同的权重并且作为一个独立的方程来运算。因此,我们需要随机初始化权值。
最好的初始化方法是Xavier初始化。它的数学定义是:
方程表明,第l层的权重矩阵W的值由正态分布生成,其中均值μ= 0、方差sigma² 是第l-1层神经元数量的倒数。所有层的偏置b均初始化为0.
神经网络的权重是随机初始化的。为了用神经网络进行正确预测,我们需要更新这些权值,用于更新权值的方法称之为梯度下降。以下通过计算图来进行理解。
上图中,前向传播(黑线所示)用于根据给定输入X计算输出。反向传播(红线所示)对计算图中每一步的输入计算其导数,从而更新权重矩阵W[1]、W[2]和偏置b[1]、b[2]。损失函数L定义如下:
根据上式所示损失函数L,隐藏层和输出层采用sigmoid激活函数,利用导数的链式法则可以计算出:
上面的方程可能看起来有点迷惑,但是它们在梯度下降中应用非常好。在计算dZ[1]的方程中,*表示点积,σ’ 表示sigma的导数。
“我强烈建议懂微积分的读者亲自计算一下上述方程,从而对于梯度下降的运行方式有一个更好的理解。”
在本文中,我们学习了浅层神经网络的数学原理。尽管我已经尽可能详细的解释了其中的所有内容,如果你感觉欠缺某些知识,请查看我之前的帖子,或者在下面的评论区中提问。雷锋网雷锋网雷锋网
Coursera — Deep Learning Course 1
DeepLearning Notes — Initialization
想要继续查看该篇文章相关链接和参考文献?
点击【浅层神经网络】即可访问:
Github项目推荐:推荐系统数据集汇总