神经网络
对一个神经元建模
对于一个神经元而言,图中是输入,是输入对应的权重(反映了输入刺激的强度),胞体求得输入的加权和,并加上一个偏置,再对其作用函数,得到输出。
对于一个神经元的输出,给定一个合适的损失函数,这个神经元就可以作为一个线性分类器。同样,一个神经元也可以用来实现二分类。
Binary Softmax classifier
单个神经元的输出可以转换成概率:
其中,是**函数。
此时,另一类别的概率为
计算出两个类别的概率,就能计算交叉熵损失(cross-entropy loss),进而优化它,使这个神经元成为一个二分Softmax分类器。
Binary Support Vector Machine
同样,将max-margin hinge loss作用在神经元的输出上,也能将其训练成Binary SVM。
**函数
**函数相当于神经元对输入信息的处理。
神经网络可以实现很复杂的功能,非线性的**函数可以近似
几乎所有的复杂功能。但是并非神经网络层数越多,能实现的功能越复杂。如果神经元的**函数是线性函数,那么对于任意一一个多层的神经网络,都有一个与之等价的单层神经网络。
输入层、输出层、隐层(隐层是位于输入层和输出层之间的一层)
常用的**函数
-
Sigmoid :
- 值域:
- 历史上很常用,“**率”恰到好处(符合人类的感觉阈限特性)
-
问题:
- 梯度下降过快
- 关于不对称
-
exp()计算代价昂贵
-
Tanh:
- 值域:
- 关于对称
- 问题:饱和时,梯度会消失
-
ReLU(Rectified Linear Unit):
- 大于的区域不会饱和
- 计算简单
- 收敛速度快,约为Sigmoid和Tanh的6倍
- 比Sigmoid更接近生物学的**特点
- 问题:不以零为中心
-
Leaky ReLU:
-
Parametric Rectifier (PReLU) :
- 拥有ReLU的全部优点
- 不会饱和
-
Exponential Linear Units(ELU) :
- 拥有ReLU的全部优点
- 对噪声有鲁棒性
-
Maxout:
- 不完全是线性的
- ReLU和Leaky ReLU的综合
- 不会饱和,梯度不会消失
- 问题:变量数增多
**函数的选择
- 倾向于选择能更快收敛的**函数
- 分类时,倾向于使用Sigmoid函数和Tanh函数。但如果梯度消失了,则会避免使用这两个**函数。
- ReLU函数一般用在隐层里,但是要小心它的学习率(learning rates)。
- 如果网络中有些神经元死了(即梯度消失了),则可以试试Leaky ReLU、Maxout或者ELU。
- 一般首选ReLU,如果效果不好,再尝试别的**函数。
全连接前向网络
全连接:相邻层之间,每个神经元都和相邻层的每一个神经元相连接。
前向网络:上一层的输出作为下一层的输入,层层传递下去,且这样的网络没有反馈。
这样的网络实质上定义了一个函数,给定输入,得到输出。即,给定一个网络结构,实际上就定义了一组函数。函数具体的参数由网络的参数决定,网络的参数则是通过学习、训练得到的。
网络的计算可以用矩阵表示。对于上图的那个神经网络,其输入输出的关系为:,具体表示为,其中为第层的权重,为第层的偏置。这样的过程可以通过并行计算技术来加速矩阵的计算。
对于分类问题而言,隐层完成特征提取和分类,输出层一般选用Softmax,直接给出分类的结果。
对于神经网络而言,层数超过三层就算是深度神经网络。层与层之间是流水线的形式,即上一层的输入作为下一层的输出。每一层的抽象级别不同,越靠近输入越具体,越靠近输出越抽象。每一层的参数通过联合训练得到。
如何训练一个多层的神经网络
神经网络训练的目的是调整各层的参数(如),使得神经网络计算出来的结果和真实情况尽可能的接近。训练过程主要包括:信息的正向传播和误差的反向传播。(误差由loss函数提供)
基于链式法则的反向传播,用以更新:
其中,是误差。Upstream gradient为:
Local gradient为:
神经网络的表达能力
Universality Theorem:如果一个NN包含一个隐层,那它能近似任意一个连续函数。
为了防止过拟合,可以选择一个强大的NN,在带上适当的正则化。
假设有两个神经网络,一个层数少,每层神经元数量多;另一个层数多,每层神经元数量少。这两个网络的参数数量相同,但解决不同问题的时候性能不同。因此如何设计一个网络,需要多少层、每层多少神经元值得思考。