神经网络是一种强大的机器学习模型,能够模拟输入与输出之间的复杂关系。理论上,无论这种关系多么复杂,神经网络都能够近似地表示这种函数映射。大多数监督学习,如果不是全部的话,都是关于学习一个映射给定的X和Y的函数,并在之后使用这个函数来为新的X找到合适的Y。
那么,传统机器学习算法与神经网络之间的区别是什么呢?答案是所谓的“归纳偏好”。这个术语可能看起来是新的,但它实际上就是在将机器学习模型拟合到数据之前,对X和Y之间关系所做的假设。例如,如果认为X和Y之间的关系是线性的,可能会使用线性回归。线性回归的归纳偏好是X和Y之间的关系是线性的,因此它会拟合一条直线或超平面到数据上。
但是,当X和Y之间存在非线性和复杂的关系时,线性回归算法可能无法很好地预测Y。在这种情况下,可能需要一个曲线或多维曲线来近似这种关系。神经网络的主要优势在于它的归纳偏好非常弱,因此无论这种关系或函数多么复杂,网络都能够以某种方式近似它。
然而,根据函数的复杂性,可能需要手动设置每层神经元的数量和网络中的层数。这通常是通过试错和经验来完成的,因此这些参数被称为超参数。
神经网络只不过是复杂的曲线拟合机器。——Josh Starmer
在探讨为什么神经网络有效之前,先来看看神经网络做了什么。在理解神经网络的架构之前,需要先看看神经元做了什么。
每个输入到人工神经元的都有与之相关的权重。输入首先与它们各自的权重相乘,然后加上一个偏置。可以将这个称为加权和。然后加权和通过一个激活函数,这基本上是一个非常数函数。
因此,一个人工神经元可以被看作是一个简单的或多个线性回归模型,最后加上一个激活函数。话虽如此,让继续讨论神经网络的架构。
神经网络通常有多个层,每个层有多个神经元,其中所有来自一个层的神经元都连接到下一层的所有神经元,依此类推。
在一个层有m个神经元,前一个层有n个神经元的情况下,会有n*m+m(包括偏置)个连接或链接,每个链接都带有权重。这些权重最初是随机初始化的,但在训练过程中,它们会达到最优值,以减少选择的损失函数。将在即将到来的博客中详细讨论如何学习这些权重。
让考虑在图1.2中的神经网络,并展示前向传播是如何在这个网络中工作的,以便更好地理解。可以看到输入层有6个神经元,这意味着有6个输入。
注意:为了计算目的,没有包括偏置。但是,如果包括偏置,将有一个额外的输入I0,其值始终为1,并且在权重矩阵的开始处将有一个额外的行w01、w02……w04。
假设输入为I = [I1, I2, I3, I4, I5, I6]。可以看到第一个隐藏层有4个神经元。因此,输入层和第一个隐藏层之间将有6*4个连接(不包括偏置)。这些连接在下面的权重矩阵中用绿色表示,值w_ij代表输入层的第i个神经元和第一个隐藏层的第j个神经元之间的连接权重。如果将1*6的输入矩阵与6*4的权重矩阵相乘(矩阵乘法),将得到第一个隐藏层的输出,即1*4。这是有意义的,因为实际上第一个隐藏层有4个神经元。
这些4个输出在图2.1中用红色表示。一旦得到这些值,就将它们通过一个激活函数以引入非线性,然后这些值就成为了第一个隐藏层的确切输出。
现在,继续对第二个隐藏层执行相同的步骤,使用不同的权重矩阵。
i1、i2等不过是前一层的输出。使用相同的变量I以便于理解。类似于之前看到的,输入1*4矩阵将被乘以4*3的权重矩阵(因为第二个隐藏层有3个神经元),输出一个1*3矩阵。该矩阵中各个元素的激活将成为下一层的输入。
对最终层的权重矩阵形状做一个小猜测。
由于最终层只有1个神经元,前一层有3个输出,权重矩阵将是3*1的大小,这标志着在简单的前馈神经网络中前向传播的结束。
已经看到了网络中每个神经元做的事情与线性回归并没有太大的不同。此外,神经元在最后加上了一个激活函数,每个神经元都有一个不同的权重向量。但是,这种方法为什么有效呢?
已经看到了计算是如何进行的。但主要目标是通过这篇博客来阐明为什么这种方法有效。理论上,神经网络应该能够近似任何连续的函数,无论它多么复杂和非线性。将尽最大的努力来说服,也说服,有了正确的参数(权重和偏置),网络应该能够学习任何东西,就像上面看到的方法一样。
在进一步讨论之前,需要理解非线性的力量。当添加两个或更多的线性对象,如线、平面或超平面时,结果也是一个线性对象:线、平面或超平面。无论以什么比例添加这些线性对象,仍然会得到一个线性对象。
但是,对于非线性对象的加法来说,情况并非如此。当添加两个不同的曲线时,可能会得到一个更复杂的曲线。
这在下面的代码片段中显示。
// 假设有两个非线性函数 f(x) 和 g(x)
function f(x) {
return x * x; // 例如,一个二次函数
}
function g(x) {
return Math.sin(x); // 例如,一个正弦函数
}
// 可以将这两个函数以不同的比例相加以得到一个新的曲线
function combinedFunction(x) {
return 0.5 * f(x) + 0.5 * g(x);
}
通过调整这些偏置和权重,能够改变结果曲线或函数的形状。这就是为什么更复杂的问题需要更多的隐藏层和更多的隐藏神经元,而不太复杂的问题或关系可以用较少的层和神经元来近似。每个神经元都作为一个问题解决者。它们各自解决自己的小问题,结合起来,它们解决了一个更大的问题,通常是减少成本函数。这里使用的确切词汇是“分而治之”。
如果神经网络不使用激活函数,它只是一个大的线性单元,可以很容易被一个单一的线性回归模型所替代。
y = m * x + c;
z = k * y + t => k * (m * x + c) + t => (k * m) * x + (k * c + t);
在这里,Z也是线性依赖于x的,因为k*m可以被替换成另一个变量,k*c+t可以被替换成一个更多的变量。因此,如果没有激活函数,无论有多少层和多少神经元,所有这些都是多余的。
已经看到了神经网络如何计算它们的输出以及为什么这种方法有效。简而言之,神经网络之所以能够学习复杂关系的主要原因是因为在每一层都引入了非线性,并以不同的比例添加输出曲线,以获得所需的结果,这个结果也通过了激活函数,并且相同的过程被重复以进一步定制结果。网络中的所有权重和偏置都很重要,它们可以以某种方式进行调整以近似关系。尽管最初分配给每个神经元的权重是随机的,但它们将通过一个特殊的算法——反向传播来学习。