过去一年,我们目睹了深度学习的爆炸性增长。像GPT-4这样的大型语言模型和DALL·E这样的生成模型正在主导互联网上的讨论。对深度学习的热情推动了像Nvidia的DGX GH200这样的超级计算机的发展。这是一台计算能力强大的机器,拥有令人惊叹的1 exaflops性能,专为神经网络计算量身定制。每当讨论深度学习时,它必然与深度神经网络密不可分,反之亦然。深度神经网络是能够表示输入和输出之间极其广泛的关系的方程。通常,这些关系非常复杂、非线性且难以可视化,那么深度神经网络是如何舒适地表示它们的呢?
为了理解深度神经网络是如何逼近如此复杂的函数的,我们首先要来研究基本的浅层神经网络,并分析它是如何建模这些关系的。总的来说,神经网络是函数f(x,ϕ),它将多变量输入x映射到多变量输出y,其中ϕ是函数f的一组参数。例如,如果f(x,ϕ) = ax +b,那么ϕ就是集合{a, b}。通常,浅层神经网络由称为神经元的基本计算单元组成。这些神经元充当线性估计器,每个估计不同的线性函数。
一般来说,如上图所示的一个简单的浅层神经网络,具有一个输入x和一个输出y,带有D个神经元,可以表示为:
其中ϕ₀和ϕᵢ分别是隐藏单元i对应的偏置和输出权重。每个hᵢ对应于由隐藏单元i逼近的线性函数。每个隐藏单元计算如下:
正如我们之前所说的,θ₀是偏置,θᵢ是与隐藏单元i对应的输入权重。这里a[.]是激活函数。到目前为止,我们只是用神经网络估计了一个线性函数,但其实应该估计的函数是非线性的。激活函数是引入这种非线性的元素。具体来说,它生成了被称为分段线性函数的东西,用作处理非线性函数的近似。
让我们进行一个简单的实验,看看这个激活函数是如何引入非线性的。为了这个实验,我们取三个简单的线性函数:
现在让我们组合y₁,y₂和y₃,使用上述方程,并可视化结果。
我们可以看到结果是一个线性函数,现在让我们将y1,y2和y3通过激活函数,并可视化结果。
我们可以看到函数不再是线性的,而是分段线性的。这些分段线性函数是非线性函数的良好近似。当线性区域的数量开始增加时,线性区域的大小开始缩小,产生了非线性函数的印象,尽管基本函数是分段线性的。还有一些真正的非线性激活函数,例如sigmoid函数,可以产生非线性的估计结果,如下所示。
虽然我们可以通过sigmoid激活函数来估计非线性函数,但当涉及到大多数现代神经网络时,ReLu或其变种之一是最常见的选择。ReLu成为激活函数的首选有多种原因,其中最有影响力的因素是与Sigmoid或Tanh相比,ReLu及其导数Heaviside函数在计算时非常简单。使用ReLu可以大大减少计算时间,而不会影响性能。
现在让我们使用ReLu激活训练一个浅层神经网络来估计sin(x),通过逐渐增加隐藏单元数量并可视化估计函数,直到估计结果令人满意。然后,我们将此估计函数与使用sigmoid和tanh激活函数估计的函数进行比较,以查看性能是否有任何妥协。
从以上图表中可以看出,通过ReLu的分段估计非线性函数(如sin(x))得到了很好的近似。值得注意的是,随着隐藏单元数量的增加,分段线性部分越来越接近非线性区域。事实上,使用D个隐藏单元,可以创建多达D+1个线性区域。在训练过程中,模型学习了这D+1个线性段的斜率(用θ₁表示)和偏移量(用θ₀表示),增强了这种方法的整体效果。
现在,让我们将其与使用Sigmoid和Tanh函数进行估计的结果进行比较。
从以上图表中,我们可以观察到,虽然这些估计是非线性的,但它们与使用ReLu函数进行估计的结果不太好。解释这一现象的一种方式是,当我们使用ReLu激活训练具有D个隐藏单元的浅层神经网络时,实际上得到了D+1个独立的线性区域,这些线性区域具有灵活性,可以根据需要进行定位和定向,以适应底层数据分布。让我们通过一个极其简单的现实世界类比来理解这一点,看下面的图例
假设我们必须使用不可弯曲的火柴棍创建一个圆。如图所示,随着火柴棍数量的增加,所得到的形状逐渐趋向于圆。每根火柴棍可以被看作神经网络中每个隐藏单元所估计的线性区域。当我们将这些火柴棍组装在一起时,集体结果代表了神经网络所实现的最终估计,就是这么简单。
本博客从Simon J.D. Prince的书《深度学习理解》(udlbook.github.io/udlbook/)中获得了重要的灵感。我计划通过增加另外两个部分来进一步深入探讨这个主题。我使用的生成图表的代码可以在下方找到。如果您觉得这篇博客有启发性,我将非常感谢您给它一个喜欢。
深度学习理解/掌握深度学习以Pi近似非线性的艺术…
通过在GitHub上创建一个账号来为Raagulbharatwaj/深度学习理解的开发做贡献。
github.com