1、 概述
神经网络算法参考人的神经元原理(轴突、树突、神经核),在很多神经元基础上构建神经网络模型,每个神经元可看作一个个学习单元。这些神经元采纳一定的特征作为输入,根据自身的模型得到输出。
2、特点、优点
对于传统机器学习算法,比如:logical regression在处理特征值过多的问题时,会显得力不从心,这时就可以使用神经网络。再比如:对于普通特征难以满足预测的需要,需要通过复杂的组合得到一系列更为强大的新特征,从而完成回归或分类问题。
在不产生梯度爆炸或梯度消失的前提下,构建深层次神经网络,在很多问题上会有更好的学习效果。他的模型也更灵活,通过一些变形和优化改造,可以衍生出我们熟知的一些深度学习算法,RNN、CNN等。
3、模型
X =[x0, x1, x2, x3]T a(2)=[a0(2),a1(2), a2(2), a3(2)]TΘ(1)=[…]3*4
a(2)= g(Θ(1)X)
hΘ(x)=g(Θ(2)a(2))
对于多层隐藏层,通用的:
a(j+1)= g(Θ(j)n*ma(j))
n=a(j+1)的行数,m是a(j)的列数+1(因为每层作为输入时,会加一个常量作为biasunit,偏差单元)。
4、常见激活函数/激励函数
(
1
)
Sigmoid.
Sigmoid
非线性激活函数的形式是
。
sigmoid
函数输入一个实值的数,然后将其压缩到
0~1
的范围内。特别地,大的负数被映射成
0
,大的正数被映射成
1
。
sigmoid function
在历史上流行过一段时间因为它能够很好的表达
“
激活
”
的意思,未激活就是
0
,完全饱和的激活则是
1
。而
sigmoid
主要是因为它有两个缺点
:
一是梯度饱和,看图可知,两边数值的梯度都为
0
;;二是结果的平均值不为
0
,这是我们不希望的,因为这会导致后层的神经元的输入是非
0
均值的信号,这会对梯度产生影响。
(2)Tanh. Tanh和Sigmoid是有异曲同工之妙的,它的图形如下图所示,不同的是它把实值得输入压缩到-1~1的范围,因此它基本是0均值的,也就解决了上述Sigmoid缺点中的第二个,所以实际中tanh会比sigmoid更常用。但是它还是存在梯度饱和的问题。Tanh是sigmoid的变形:
(3)ReLU. 近年来,ReLU 变的越来越受欢迎。它的数学表达式是:f(x)=max(0,x)。很显然,从上图左可以看出,输入信号
<0时,输出为0,>0时,输出等于输入。
(4)LeakyReLU. LeakyReLUs 就是用来解决ReLU坏死的问题的。和ReLU不同,当x<0时,它的值不再是0,而是一个较小斜率(如0.01等)的函数。
(5)Maxout. Maxout的形式是f(x)=max(w_1^Tx+b_1,w_2^Tx+b_2),它最早出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10,CIFAR-100, SVHN这4个数据上都取得了start-of-art的识别率。可以看出ReLU 和 Leaky ReLU 都是Maxout的一个变形,所以Maxout 具有 ReLU 的优点(如:计算简单,不会saturation),同时又没有 ReLU 的一些缺点(如:容易饱和)。不过呢Maxout相当于把每个神经元的参数都double了,造成参数增多。
Maxout的拟合能力非常强,它可以拟合任意的的凸函数。
How to choose aactivation function? 怎么选择激活函数呢?
我觉得这种问题不可能有定论的吧,只能说是个人建议。
如果你使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让你的网络出现很多坏死的 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者Maxout.
友情提醒:最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
还有,通常来说,很少会把各种激活函数串起来在一个网络中使用的。
举例:keras中的预定义激活函数:
其中,softmax多适用于多分类问题。
5、代价函数
即目标函数,以预测值与实际值差距最小化为目标的一个函数,也叫损耗函数。它的作用是通过以模型函数的参数值自变量,对其进行最优化求解,得到模型函数的参数值。
举例1:
Keras中常用的目标函数有:
举例1:
吴恩达课程中,以sigmoid函数为激励函数,也就是最后预测结果的形式类似逻辑回归的结构,只不过对于多类别预测值,多输出值的情况,有所不同。
逻辑回归的平方差均值-目标函数:
对于多类别分类的神经网络(sigmoid函数为激励函数)的目标函数就应是:
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出K个预测,基本上我们可以利用循环,对每一行特征都预测K个不同结果,然后在利用循环在K个预测中选择可能性最高的一个,将其与y中的实际数据进行比较。最后一项仍是防止过拟合的正则化项。
6、求解模型参数的方法
一般都是把问题看作凸优化问题,用运筹学中常用的求解凸优化问题的一些算法,进行求解。
对于神经网络,常用的就是反向传播算法。BackPropagation Algorithm。
对于这个算法的理解,时有时无,有时感觉懂了一些,有时又发现不太能理解。
流程大概就是:
首先确定参数的初始化值,然后:
1、 正向求解每组输入的输出值,于是,就有了代价函数的值,接下来需要算出各个参数的梯度,从而能够让参数沿梯度下降。
2、 第二步是根据实际值求出预测的误差值。接下来反向求出每层单元的误差值。
3、 就可以求出每个参数的梯度值。
最后不断重复前面的1-3步,用随机梯度下降算法更新权重。
7、目前具备该算法的常用模块
(1)、tensorflow可以搭建神经网络,灵活,自己选择层数、每层的单元数、激活函数、代价函数、优化器等等。
(2)、sci kit-learn里有NN的模型。
(3)、其他深度学习库,我猜应该都有,亚马逊的MXnet,还有图像处理常用的caffe。
8 神经网络与深度学习网络的关系
首先,一般情况下,神经网络或者BP网络指的是一个隐藏层的神经网络,那么两层以上的隐藏层都可以称之为深度神经网络。在这个视角上看,多层BP神经网络与深度学习网络是没有什么区别的。
如果需要细化和区分区别,那么,深度神经网络可以,理解为对传统多层BP网络进行了结构、方法等方面的优化。
"深度学习"是为了让层数较多的多层神经网络可以训练,能够work而演化出来的一系列的 新的结构和新的方法。
新的网络结构中最著名的就是CNN,它解决了传统较深的网络参数太多,很难训练的问题,使用了“局部感受”和“权植共享”的概念,大大减少了网络参数的数量。关键是这种结构确实很符合视觉类任务在人脑上的工作原理。
新的结构还包括了:LSTM,ResNet等。LSTM解决时间序列类型的模型的训练效果问题,以及传统RNN容易梯度弥散的问题。
新的方法就多了:新的激活函数:ReLU,新的权重初始化方法(逐层初始化,XAVIER等),新的损失函数,新的防止过拟合方法(Dropout, BN等)。
这些方面主要都是为了解决传统的多层神经网络的一些不足:梯度消失,过拟合等。