1)人工神经网络的结构我们在这里介绍一个最简单的神经网络。这个简单的神经网络有三层结构:输入层,隐藏层,输出层。如下图所示(图片来自谷歌)顾名思义:在输入层,我们对神经网络输入变量;在隐藏层和输出层,我们进行计算并输出。在神经网络的隐藏层上,存在着依靠Activation function来进行运算的“神经元”。这些具体计算流程我们稍后一起讲。假设我们有一个由M个输入变量构成的向量,神经网络有N个的神经元,只有一个最终的输出变量。那么在输入层进入隐藏层的时候,神经网络是进行下述计算的其中,矩阵W是连接输入层与隐藏层的桥梁,叫做weight。然后,每个神经元上都有一个常数变量b0,我们叫作bias。N个神经元有N的bias,所以这些bias构成了一个常数向量b0。在隐藏层的神经元接收到了向量z之后,神经元会进行Activation function的计算在这里,就是所谓的Activation function,常用的选择有sigmoid function,tanh等等。这是几种常见Activation function的选择列表(来自于Wikipedia)在完成了神经元上的计算后,计算继续向输出层移动。从隐藏层到输出层,我们也有一个weight向量,在这里我们计作。然后,在完成下述计算后,数值会移动到输出层在输出层,类似于在隐藏层,我们还要添加一个bias b1,这个bias的维度和输出的维度是一致的。总结来说,假如我们有M个输入变量组成的向量X,N个神经元,L个输出变量组成的向量Y。则神经网络的计算公式就是其中在这里,W,b0,theta,b1都是神经网络自身的变量。而所谓的神经网络训练,也就是让这些变量与training data“拟合”。2)人工神经网络的训练最常用的神经网络训练方式是反向传播算法(backpropagation)。反向传播算法有两个要素,简单来说就是:正向计算得到误差函数,反向求导梯度下降。以上述神经网络为例,假设我们有K组训练用的输入与输出数据,我们来推导一下训练的算法。首先,我们的训练其实就是使得定义的误差函数最小化,那么什么是误差函数?常用的误差函数有很多,我们以平方和为例其中,函数代表着人工神经网络这个函数。这样,我们首先要做的就是初始化神经网络的一些自身变量,然后将初始化的变量代入神经网络,加上所有的训练数据,得到初始的误差函数值如下第二步,我们就是要update神经网络的自身变量,使得神经网络的误差函数在更新之后的自身变量下缩小。而我们使用的主要方法,和牛顿法求零点一样,是梯度下降。所以,我们需要求出误差函数关于神经网络自身变量(W、b0、theta、b1)的偏导数。其中,空心圆代表矩阵点乘。在得到了偏导数之后,我们利用下式来更新我们的变量其中,r被称作learning rate,代表了神经网络的学习速度与质量。关于r的选取,是一个要权衡利弊的问题:r太小,梯度下降太慢,训练时间很长;r太大,可能无法训练成功。在这里,反向传播算法更新神经网络的方式就是梯度下降,原理与牛顿法、最小二乘法是一致的。就这样,我们不断的重复上述步骤,直到误差函数缩小到一个可接受范围,则我们就完成了神经网络对训练数据的学习。3)Universal approximation theorem乍得一看,神经网络对一个未知函数的估计是很暴力的。但其实它背后是有理论支撑的,那就是这一个定理。这个定理的大白话描述(不是严谨的)就是,如果你的activation function是单调增、有上下界、非常数且连续,那么给定一个任意的连续函数,总是存在一个有限的N,使得含有N个神经元的单隐藏层神经网络可以无限逼近这个连续函数。这个定理的证明用到了Hahn-Banach theorem、Riesz representation theorem和Fourier analysis,有兴趣的朋友可以去自己查看一下。但是,在选取N上,如果你的N选择过多,你的问题就会有两种:1,训练速度缓慢;2,overfiting,增加预测值的误差。而如果选择过少的N,你的主要问题就是,难以训练成功。因此,在N的选择上,要注意使用cross-validation来做test,以避免overfiting的问题。