神经网络的简单偏好(1)

简介: 神经网络的简单偏好
【新智元导读】上海交通大学副教授对深度学习的一些思考。


我是2017年11月开始接触深度学习,至今刚好五年。2019年10月入职上海交大,至今三年,刚好第一阶段考核。2022年8月19号,我在第一届中国机器学习与科学应用大会做大会报告,总结这五年的研究以及展望未来的方向。本文是该报告里关于理论方面的研究总结(做了一点扩展)。报告视频链接可以见(亦可点击阅读原文查看):https://www.bilibili.com/video/BV1eB4y1z7tL/

我理解的深度学习


我原本是研究计算神经科学的,研究的内容,宏观来讲是从数学的角度理解大脑工作的原理,具体来说,我的研究是处理高维的神经元网络产生的脉冲数据,尝试去理解这些信号是如何处理输入的信号。但大脑过于复杂,维度也过于高,我们普通大脑有一千亿左右个神经元,每个神经元还和成千上万个其它神经元有信号传递,我对处理这类数据并没有太多信心,那阶段也刚好读到一篇文章,大意是把现阶段计算神经科学的研究方法用来研究计算机的芯片,结论是这些方法并不能帮助我们理解芯片的工作原理。另一个让我觉得非常难受的地方是我们不仅对大脑了解很少,还非常难以获得大脑的数据。

于是,我们当时思考,能否寻找一个简单的网络模型,能够实现复杂的功能,同时我们对它的理解也很少的例子,我们通过研究它来启发我们对大脑的研究。当时是2017年底,深度学习已经非常流行,特别是我的同学已经接触深度学习一段时间,所以我们迅速了解到深度学习。其结构和训练看起来足够简单,但能力不凡,而且与其相关的理论正处在萌芽阶段。

因此,我进入深度学习的第一个想法是把它当作研究大脑的简单模型。显然,在这种「类脑研究」的定位下,我们关心的是深度学习的基础研究。这里,我想区分深度学习的「理论」和「基础研究」。我认为「理论」给人一种全是公式和证明的感觉。而「基础研究」的范围听起来会更广阔一些,它不仅可以包括「理论」,还可以是一些重要的现象,直观的解释,定律,经验原则等等。这种区分只是一种感性的区分,实际上,我们在谈论它们的时候,并不真正做这么细致的区分。尽管是以深度学习为模型,来研究大脑为何会有如此复杂的学习能力,但大脑和深度学习还是有明显的差异。而我从知识储备、能力和时间上来看,都很难同时在这两个目前看起来距离仍然很大的领域同时深入。

于是我选择全面转向深度学习,研究的问题是,深度学习作为一个算法,它有什么样的特征。「没有免费的午餐」的定理告诉我们,当考虑所有可能的数据集的平均性能时,所有算法都是等价的,也就是没有哪一种算法是万能的。我们需要厘清深度学习这类算法适用于什么数据,以及不适用于什么数据。

事实上,深度学习理论并不是处于萌芽阶段,从上世纪中叶,它刚开始发展的时候,相关的理论就已经开始了,也有过一些重要的结果,但整体上来说,它仍然处于初级阶段。对我而言,这更是一个非常困难的问题。

于是,我转而把深度学习当作一种「玩具」,通过调整各类超参数和不同的任务,观察它会产生哪些「自然现象」。设定的目标也不再高大上,而是有趣即可,发现有趣的现象,然后解释它,也许还可以用它来指导实际应用。在上面这些认识下,我们从深度神经网络训练中的一些有趣的现象开始。于我个人,我是从头开始学习写python和tensorflow,更具体是,从网上找了几份代码,边抄边理解。

神经网络真的很复杂吗?

在传统的学习理论中,模型的参数量是指示模型复杂程度很重要的一个指标。当模型的复杂度增加时,模型拟合训练数据的能力会增强,但也会带来在测试集上过拟合的问题。冯·诺依曼曾经说过一句著名的话,给我四个参数,我能拟合一头大象,五个参数可以让大象的鼻子动起来。

因此,传统建模相关的研究人员在使用神经网络时,经常会计算模型参数量,以及为了避免过拟合,刻意用参数少的网络。然而,今天神经网络能够大获成功,一个重要的原因正是使用了超大规模的网络。网络的参数数量往往远大于样本的数量,但却不像传统学习理论所预言的那样过拟合。这便是这些年受到极大关注的泛化迷团。实际上,在1995年,Leo Breiman在一篇文章中就已经指出了这个问题。在神经网络非常流行和重要的今天,这个迷团愈加重要。我们可以问:带有大量参数的神经网络真的很复杂吗?答案是肯定的!上世纪八十年代末的理论工作证明当两层神经网络(激活函数非多项式函数)足够宽时,它可以以任意精度逼近任意连续函数,这也就是著名的「万有逼近」定理。实际上,我们应该问一个更加有意义的问题:在实际训练中,神经网络真的很复杂吗?逼近论证明的解在实际训练中几乎不可能遇到。实际的训练,需要设定初始值、优化算法、网络结构等超参数。对我们实际要有指导作用,我们就不能脱离这些因素来考虑泛化的问题,因为泛化本身就是依赖实际数据的问题。

两种简单偏好的现象在学习与训练神经网络的过程中,我们很容易发现,神经网络的训练有一定的规律。在我们的研究中,有两种现象很有趣,在研究和解释它们的过程中,我们发现它们同样是很有意义的。我先简单介绍,然后再详细分别介绍。第一,我们发现神经网络在拟合数据的过程中经常会先学习低频,而后慢慢学习高频。我们把这个现象命名为频率原则(Frequency Principle, F-Principle)[1, 2],也有其它工作把它称为Spectral bias。第二,我们发现在训练过程,有很多神经元的输入权重(向量)的方向会保持一致。我们称之为凝聚现象。这些输入权重一样的神经元对输入的处理是一样的,那它们就可以简化成一个神经元,也就是一个大网络可以简化成小网络[3, 4]。这两种现象都体现神经网络在训练过程中有一种隐式的简单偏好,低频偏好或者有效小网络偏好。低频偏好是非常普遍的,但小网络偏好是要在非线性的训练过程中才会出现的特征。

频率原则

我早期在汇报频率原则相关的工作的时候,做计算数学的老师同学非常有兴趣,因为在传统的迭代格式中,例如Jacobi迭代,低频是收敛得非常慢的。多重网格方法非常有效地解决了这个问题。我们在实验中,也验证了神经网络和Jacobi迭代在解PDE时完全不一样的频率收敛顺序(如下图)[2, 5]。

频率原则有多广泛呢?频率原则最开始是在一维函数的拟合中发现的。我在调参的过程中发现神经网络似乎总是先抓住目标函数的轮廓信息,然后再是细节。频率是一种非常适合用来刻画轮廓和细节的量。于是,我们在频率空间看神经网络的学习过程,发现非常明显地从低频到高频的顺序。

实域空间拟合(红色为目标函数,蓝色为DNN)

频域空间拟合(红色为目标函数,蓝色为DNN)


对于两维的函数,以图像为例,用神经网络学习从两维位置到灰度值的映射。神经网络在训练过程会慢慢记住更多细节。

对于更高维的例子,傅里叶变换是困难的,这也是不容易在高维的图像分类任务中发现频率原则的一个原因。我们的贡献还有一点就是用一个例子论证针对简单的低维问题的研究可以启发深度学习的基础研究。高维问题的频率需要多说两句。本质上,高频指的是输出对输入的变化非常敏感。比如在图片分类任务中,当一张图片被修改一点点,输出就发生变化。显然,这说的正是对抗样本。

关于高维中验证频率原则,我们采用了降维和滤波的办法。一系列的实验都验证了频率原则是一个广泛存在的现象。为什么会有频率原则呢?事实上,在自然界中大部分信号都有一个特征,强度随频率增加而衰减。一般我们见到的函数在频率空间也都有衰减的特征,特别是函数越光滑,衰减越快,连常见的ReLU函数在频率空间也是关于频率二次方衰减。在梯度下降的计算中,很容易得到低频信号对梯度的贡献要大于高频,所以梯度下降自然就以消除低频误差为主要目标[2]。

对于一般的网络,我们有定性的理论证明[6],而对于线性NTK区域的网络,我们有严格的线性频率原则模型揭示频率衰减的机制[7, 8, 9]。有了这个理解,我们也可以构造一些例子来加速高频的收敛,比如在损失函数中增加输出关于输入的导数项,因为求导在频率空间看,相当于在强度上乘以了一个其对应的频率,可以缓解高频的困难。这在求解PDE中很常见。

了解频率原则对我们理解神经网络有什么帮助吗?我们举两个例子。第一个是理解提前停止这个技巧。实际的训练中,一般都能发现泛化最好的点并不是训练误差最低的,通常需要在训练误差还没降得很低的时候,提前停止训练。实际数据大部分都是低频占优,而且基本都有噪音。噪音对低频的影响相对比较小,而对高频影响相对比较大,而神经网络在学习过程先学习低频,所以通过提前停止可以避免学习到过多被污染的高频而带来更好的泛化性能。

另一个例子是,我们发现图像分类问题中,从图像到类别的映射通常也是低频占优,所以可以理解其良好的泛化。但对于定义在d维空间中的奇偶函数,其每一维的值只能取1或者-1。显然任何一维被扰动后,输出都会发生大的变化。这个函数可以被证明是高频占优的,而实际训练中,神经网络在这个问题中完全没有预测能力。我们还利用频率原则解释了为什么在实验中会观察到深度可以加快训练,核心的原因是越深的网络把目标函数变成一个越低频的函数,使学习变得容易 [10]。

除了理解,频率原则能对我们实际设计和使用神经网络产生什么指导吗?频率原则揭示了神经网络中存在高频灾难,这也引起了很多研究人员的注意,包括求解PDE、生成图像、拟合函数等。高频灾难带来的训练和泛化困难很难通过简单的调参来缓解。我们组提出了多尺度神经网络的方法来加速高频的收敛[11]。基本的想法是把目标函数在径向进行不同尺度的拉伸,尝试将不同频率的成分都拉伸成一致的低频,达到一致的快速收敛。实现也是非常之容易,仅需在第一隐藏层的神经元的输入乘以一些固定的系数即可。我们的一些工作发现调整激活函数对网络的性能影响很大[12],用正弦余弦函数做第一个隐藏层的基可以有比较好的效果[13]。这个算法被华为的MindSpore所采用。径向拉伸的想法在很多其它的算法中也被采用,包括在图片渲染中非常出名的NerF(神经辐射场)。

多尺度网络结构

频率原则还有很多未解的问题需要被探索。在非梯度下降训练的过程,比如粒子群算法怎么证明频率下降[14]?如何在理论上论证多尺度神经网络对高频的加速效果?是否有更稳定更快的高频加速算法?小波可以更细致的描述不同局部的频率特征,能否用小波更细节地理解神经网络的训练行为?数据量、网络深度、损失函数怎么影响频率原则?频率原则可以指导算法设计的理论,为训练规律提供一种「宏观」描述。对于「微观」机制,我们需要进一步研究。

同样是低频到高频的学习过程,参数的演化可以非常不一样,比如一个函数可以用一个神经元表示,也可以用10个神经元(每个神经元的输出权重为原输出权重的1/10)一起表示,从输入输出函数的频率来看,这两种表示完全没有差别,那神经网络会选择哪一种表示,以及这些表示有什么差别?下面我们就要更细致地看参数演化中的现象。

参数凝聚现象

为了介绍参数凝聚现象我们有必要介绍一下两层神经元网络的表达

W是输入权重,它以内积的方式提取输入在权重所在的方向上的成分,可以理解为一种特征提取的方式,加上偏置项,然后再经过非线性函数(也称为激活函数),完成单个神经元的计算,然后再把所有神经元的输出加权求和。为了方便,我们记

对于ReLU激活函数,我们可以通过考虑输入权重的角度和神经元的幅度来理解每个神经元的特征:,其中

考虑用上面的两层神经网络来拟合四个一维的数据点。结合输入权重和偏置项,我们所关心的方向就是两维的方向,因此可以用角度来表示其方向。下图展示了,不同初始化下,神经网络的拟合结果(第一行),以及在训练前(青色)和训练后(红色)特征分布的图(第二行)

不同初始化的拟合结果

显然,随初始化尺度变小(从左到右,初始化尺度不断变小),神经网络的拟合结果差异很大,在特征分布上,当尺度很大(这里使用NTK的初始化),神经网络特征几乎不变,和random feature这类线性模型差不多,而随初始化变小,训练过程出现明显的特征变化的过程。最有意思的是,这些特征的方向聚集在两个主要的方向。我们把这种现象称为参数凝聚。大量的实际问题告诉我们神经网络比线性的方法要好很多,那非线性过程所呈现的参数凝聚有什么好处吗?如下图展示的一个极端凝聚的例子,对于一个随机初始化的网络,经过短暂的训练后,每个隐藏层神经元的输入权重是完全一致的,因此这个网络可以等效成仅有一个隐藏层神经元的小网络。一般情况下,神经元会凝聚到多个方向。

凝聚现象的例子

回顾在我们前面最开始提到的泛化迷团,以及我们最开始提出的问题「在实际训练中,神经网络真的很复杂吗?」,在参数凝聚的情况下,对于一个表面看起来很多参数的网络,我们自然要问:神经网络实际的有效参数有多少?比如我们前面看到的两层神经网络凝聚在两个方向的例子,实际上,这个网络的有效神经元只有两个。因此凝聚可以根据实际数据拟合的需求来有效地控制模型的复杂度。


相关文章
|
机器学习/深度学习 人工智能 算法
神经网络的简单偏好(2)
神经网络的简单偏好
152 0
神经网络的简单偏好(2)
|
6月前
|
机器学习/深度学习 自然语言处理 数据可视化
数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化
数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】26.卷积神经网络之AlexNet模型介绍及其Pytorch实现【含完整代码】
【从零开始学习深度学习】26.卷积神经网络之AlexNet模型介绍及其Pytorch实现【含完整代码】
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
|
3月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch代码实现神经网络
这段代码示例展示了如何在PyTorch中构建一个基础的卷积神经网络(CNN)。该网络包括两个卷积层,分别用于提取图像特征,每个卷积层后跟一个池化层以降低空间维度;之后是三个全连接层,用于分类输出。此结构适用于图像识别任务,并可根据具体应用调整参数与层数。
|
3月前
|
机器学习/深度学习 数据可视化 Python
如何可视化神经网络的神经元节点之间的连接?附有Python预处理代码
该博客展示了如何通过Python预处理神经网络权重矩阵并将其导出为表格,然后使用Chiplot网站来可视化神经网络的神经元节点之间的连接。
57 0
如何可视化神经网络的神经元节点之间的连接?附有Python预处理代码
|
3月前
|
机器学习/深度学习 Linux TensorFlow
【Tensorflow+keras】用代码给神经网络结构绘图
文章提供了使用TensorFlow和Keras来绘制神经网络结构图的方法,并给出了具体的代码示例。
56 0
|
3月前
|
机器学习/深度学习 自然语言处理 TensorFlow
|
4月前
|
机器学习/深度学习 编解码 数据可视化
图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比
目前我们看到有很多使用KAN替代MLP的实验,但是目前来说对于图神经网络来说还没有类似的实验,今天我们就来使用KAN创建一个图神经网络Graph Kolmogorov Arnold(GKAN),来测试下KAN是否可以在图神经网络方面有所作为。
189 0
|
6月前
|
机器学习/深度学习 自然语言处理 搜索推荐
【传知代码】图神经网络长对话理解-论文复现
在ACL2023会议上发表的论文《使用带有辅助跨模态交互的关系时态图神经网络进行对话理解》提出了一种新方法,名为correct,用于多模态情感识别。correct框架通过全局和局部上下文信息捕捉对话情感,同时有效处理跨模态交互和时间依赖。模型利用图神经网络结构,通过构建图来表示对话中的交互和时间关系,提高了情感预测的准确性。在IEMOCAP和CMU-MOSEI数据集上的实验结果证明了correct的有效性。源码和更多细节可在文章链接提供的附件中获取。
【传知代码】图神经网络长对话理解-论文复现

热门文章

最新文章