如图,这是一个经典的二层神经网络模型(Two-Layer Neural Network)。一般输入层和输出层神经元的个数是固定的,咱们须要选择和调整隐藏层的层数和每一层神经元的个数等。
python
注:咱们能够利用矩阵乘法来迅速计算神经网络的输出,后面不会说起。能够参考Python神经网络编程(拉希德著)这本书,写的很是简洁。git
全部数据样本是线性可分的,即知足一个形如 \(w_0+w_1x_1+w_2x_2\)的线性方程的划分
github
咱们引入经典的逻辑运算来推理线性分类问题的局限。面试
如图所示,分别为线性模型来表示 AND,OR 逻辑,那么XOR要怎么表示呢?编程
由图可知:咱们能够利用线性模型拟合出一个直线来表示 AND、OR、NOR 的逻辑运算,可是没有办法用一条直线表示 xor 异或逻辑,这就是一个经典的非线性问题!数组
注:黑色点是positive(1)的点,白色点是negative(0)的点网络
从逻辑运算的视角来看:函数
逻辑 | 1 1 | 0 1 | 1 0 | 0 0 |
---|---|---|---|---|
AND | 1 AND 1 = 1 | 0 AND 1 = 0 | 1 AND 0 = 0 | 0 AND 0 = 0 |
OR | 1 OR 1 = 1 | 0 OR 1 = 1 | 1 OR 0 = 1 | 0 OR 0 = 0 |
NOR | 1 NOR 1 = 0 | 0 NOR 1 = 0 | 1 NOR 0 = 0 | 0 XOR 0 = 1 |
XOR | 1 XOR 1 = 0 | 0 XOR 1 = 1 | 1 XOR 0 = 1 | 0 XOR 0 = 0 |
咱们能够利用以下图所示的一个神经元的感知机来表示一个逻辑 and/or/nor,即每个神经元能够拟合出一条直线:
学习
这里涉及感知机(perceptron)的基本思想:多个神经元拟合多条直线,将这些直线组合在一块儿来划分一个非线性的边界。
咱们来看上面的XOR逻辑,做为一个简单的例子,发现优化
能够表示为
根据上述公式和图,咱们能够画出以下的多层感知机,来实现非线性划分数据表示XOR逻辑关系。
引入非线性的特征来处理非线性问题。
例如:输入节点有表示平方的节点等。
引入非线性的激活函数来处理非线性问题。
激活函数(activation function)又叫转移函数(transfer function),用来增长神经网络模型的非线性。
下图是只有一个神经元的示意图:g函数是非线性的激活函数。由图中能够看出,当神经元计算出线性方程的结果s以后,传入激活函数g中进行处理,最终获得神经元的输出g(s),从而实现非线性。
S型激活函数又叫挤压函数,能够把任意的大小的x挤压到(0,1)之间的y, 在x增大或者减少的过程当中会逐渐出现饱和(无限趋近于0或者1)。
在二分类问题中,能够以0.5为阈值,小于0.5为一个类别,大于0.5为另外一个类别。
缺点:
双曲正切函数,与sigmoid函数类似,也会出现梯度饱和,可是tanh的值域为(-1,1)。
线性整流函数(Rectified Linear Unit,ReLU),又称修正线性单元。当x<0时,y为0;当x>0时,y=x。没有饱和现象,y能够取到无穷大。
优势:
缺点:
指数线性单元(Exponential Linear Unit)也是ReLU激活函数的变体。
优势:
缺点:
带泄露修正线性单元(Leaky ReLU)函数是ReLU激活函数的变体。当x<0时,y=0.1x;当x>0时,y=x。
优势:
链式求导是反向传播利用的主要数学技巧,所以先来看链式求导。
咱们假设
即
利用链式求导法则能够有效的求出偏导数。注:应用在神经网络中损失函数必须是可微的(differentiable),例如 Sigmod 或者 Tanh 等
反向传播(back propagation, 简称backprop)。是梯度降低法在深度网络上的具体实现方式。在传统的前馈神经网络中,信息经过网络向前流动,输入x提供初始值,而后传播到每一层的隐藏单元,最终产生输出y。这个流程被称为前向传播(forward propagation)。而反向传播容许来自代价函数的信息经过网络向后流动,以便计算梯度、调整参数。
如图,这是一个前向传播网络的示意图:
其中 E 表示计算出的偏差,这个例子中利用的是最小均方偏差。
咱们为了减少偏差,使模型的输出接近咱们想要的值,就要利用反向传播的办法来调整模型中的参数。将偏差信号沿着原来的路线返回,即要从输出到输入作偏导,修改神经元的权值和偏置值,使偏差 E 最小。
根据上述的方程,咱们能够来更新权重,\(w = w - η \frac{∂E}{∂w}\), 其中 \(η\) 是学习率
注:这个地方可能用计算图理解比较清晰。你们能够去查一些相关资料。
损失函数(Loss Function)又称偏差函数(Error Function)和代价函数(Cost Function)
在神经网络中,咱们的目标是找到一组权重,使偏差最小化,即到达图中的 Global Minimum 点
处理回归问题经常使用的损失函数
均方偏差(Mean Square Error, MSE)是真实值与预测值的差值的平方而后求和平均。
其中,\(z_i\) 是实际输出值,\(t_i\) 是目标输出值。前面加 \(\frac{1}{2}\) 的缘由是为了求导时候消去导数上移下来的数字2.
存在的问题:对于均方偏差函数,在处理分类问题的时候不太合适。当 MSE 配合 Sigmoid 函数使用时,MSE 在求导过程当中要用到 Sigmoid 函数的导数\(z'(s)\),会由于梯度消失而致使模型权重学习的很慢。如图
而交叉熵损失函数能够很好的避免这个问题。
处理分类问题经常使用的损失函数
交叉熵损失函数(Cross Entropy, CE)或称交叉熵偏差(Cross Entropy Error, CEE)
在01二分类问题中,公式形式为