深度神经网络具有非常好的表达能力——对潜在映射关系的拟合能力。
神经元

其实为了让计算机模拟生物神经元活动而对其进行数学建模的研究早在1943年就存在了:
https://jontalle.web.engr.illinois.edu/uploads/498-NS.19/McCulloch-Pitts-1943-neural-networks.pdf

1.神经元的活动被描述为“all- or - none” 的过程
- 在任何时候,必须有一定固定数量的突触在一段时间内被激活,才能最终激活一个神经元,这个数量与神经元以前的活动和位置无关。
- 神经系统内唯一明显的延迟是突触延迟。
- 任何抑制性突触的活动完全阻止了当时神经元的激活。
- 神经元结构不随时间而变化。(这一点已经过时了)
结合我们现在的人工神经网络来说就是,权重是神经元之间连接的一个固有属性,和输入是没有关系的(虽然会产生反馈),另外第四点也呼应了为什么单侧抑制的激活函数ReLU是现在最常用的激活函数。
Specification of the nervous net provides the law of necessary connection whereby one can compute from the description of any state that of the succeeding state, but the inclusion of disjunctive relations prevents complete determination of the one before. The regenerative activity of constituent circales renders reference indefinite as to time past. Thus our knowledge of the world, including ourselves, is incomplete as to space and indefinite as to time. This igonorance, implicit in all our brains, is the counterpart of the abstraction which renders our knowledge useful. THe role of brains in determining the epistemic relations of our theries to our observations and of these to the facts is all too clear, for it is apparent that every idea and every sensation is realized by activity within that net, and by no such activity are the actual afferents fully determined.
原论文中这样一段话和大家分享一下:神经网络的模型提供了一个必要连接的法则,据此人们可以从任何状态的描述中计算出后继状态,但由于包含了不连贯的关系,因此无法完全确定前一个状态。组成环的再生活动使过去的时间变得不确定。因此,我们对世界的认识,包括对我们自己的认识,在空间上是不完整的,在时间上是不确定的。正是这种在我们所有人大脑中隐含的ignorance忽略行为,是使我们的知识变得有用的抽象性的对应物。 大脑在决定我们的理论与我们的观察以及这些观察与事实之间的认识论关系方面所起的作用是非常明确的,因为很明显,每一个想法和每一个感觉都是通过该网内的活动来实现的,而实际的传入物并不是由这种活动完全决定的。
多层感知机
1958年Rosenblatt,F.提出了Perceptron感知机对多维数据进行二分类,使用梯度下降法从训练样本中自动学习更新权值。 可是多层感知机只能处理线性问题,在实际中的应用是非常有限的。
1965年多层感知机被提出,使用阶跃函数非线性激活,但是阶跃函数不能使用反向传播训练,而且二元结果应用场景有限。
1986年Geoffrey Hinton发表了 Learning Internal Representation by Error Propagation, 通过反向传播对神经网络进行训练,引入非线性激活函数(sigmoid)帮助表达非线性映射关系,这就已经形成深度神经网络模型的雏形了。
正向传播,反向传播

这里忽略了偏置的影响,只考虑权重。先看左边的正向传播,四层(不算输入层是三层)的单元个数画出来的分别为 i =3, j =4, k=3, l=2。 Z表示加权的结果,f(.)表示对Z进行激活,虽然看上去有点眼花,但是实际上是个非常简单的重复相乘相加再通过一个激活函数的过程。如果我们已经有一些输入输出的样本,那么对模型中根据正确答案对所有权重w进行调整,神经网络就能慢慢逼近我们理想中的输入输出关系了。
调整的依据是损失函数关于它的偏导数,通过反向传播计算偏导数的原理就是简单的链式求导法则:对于两个同是关于的函数
和
:
。右图E代表的是模型的实际输出和理想输出之间的一个损失函数,通过积分可以知道这里的损失函数是
, 两个隐藏层以及最后输出层种的偏导都已经展示出来了。
最后的偏导结果一部分是由权重的初始值决定的,另一部分是由激活函数决定的。反向传播越多层,梯度消失和爆炸的问题就越容易出现。激活函数方面,现在大部分情况都会选择正向梯度为1的ReLu函数,连乘再多也还是1,所以不存在梯度消失或者爆炸了。
权重的初始化也是非常重要的:适合ReLU激活函数的初始化方法参考kaiming初始化。
https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79
另外一方面,这里考虑的是单条线路的情况,如果考虑所有连接其实也就是进行一个累加,但是需要注意的是如果每层权重值相等,那么反向传播过程种的偏导数也相等,这个时候使用多个单元的意义就消失了,因为它们相当于只有一个有效单元。
批量归一化
the distribution of each layer’s inputs changes during training, as the parameters of the previous layers change.This slows down the training by requiring lower learningrates and careful parameter initialization, and makes it notoriously hard to train models with saturating nonlinearities. We refer to this phenomenon as internal covariate shift, and address the problem by normalizing layer inputs
除了从权重的初始值下手,对每一层的输入进行批量归一化(Batch Normalization)也能帮助解决梯度消失/爆炸的问题,而且还能加速收敛。
神经网络训练的过程当中,中间层输入的分布是变化的,BN的作者称这种现象为 internal covariate shift。这会增加神经网络收敛的难度,因为每次训练需要学习的输入输出关系一直在变化,而BN通过对输入进行归一处理,减小了这种变化,同时也省去了引入偏置参数的需要。

通用近似定理
为什么一个隐含层的多层感知机可以逼近任何函数, 也就是说原函数为 , 我们可以找到一个输入输出映射
满足
,
代表了一个理想的精度。
互动电子书推荐:http://neuralnetworksanddeeplearning.com/chap4.html
动画展示了隐藏层单元如何对输入x进行分解,引入更多的单元就能更精确地逼近任意一个函数。