深度学习笔记(1)——神经网络(neural network)

原创 2017年02月20日 22:03:55

神经网络是机器学习中的一种经典模型,也是现在深度学习的前身和基础,因此如果要想掌握深度学习,必须通透地了解神经网络。关于神经网络需要做到以下几点:了解神经网络的线性结构,了解非线性激活函数,掌握参数训练的反向传播算法(BP, backpropagation),了解多层神经网路的梯度弥散问题。

神经元和感知机

神经网络是由一个个基本的神经元组合而成的,而这些神经元模拟人脑中神经细胞,拥有若干个输入和输出(对应树突和轴突),通常在学术界我们将其称为感知机。下面是神经元的图片
这里写图片描述

对于一个神经元细胞,拥有接受信号的树突和输出信号的轴突,根据这种模式,学者设计一个输入输出模式的单元,并命名为感知机:
这里写图片描述
输入表示为X=[x1,x2,x3,...,xi]T,对于输入xi有一个权重系数wi,表示为W=[w1,w2,w3,...,wi],另外加一个常数偏置b,为了实现二分类,最后的输出写作:

y=sign(wixi+b)=sign(WX+b)

其中sign表示符号函数,这是一个很典型的线性分类方式。如上图的右侧,假如在二维平面,存在一条直线y=WX+b,那么这条直线就可以把空间分为两部分,分别对应WX+b>0WX+b<0两部分。而对于高维空间,这条直线就变成了一个超平面,将空间同样分为大于0和小于0两部分。但是仍然只能实现线性分类,为了实现非线性分类,学者在感知机后面加入一个非线性单元——激活函数。在神经网络刚出来的时候,常用的激活函数有sigmoid函数和tanh,它们的公式为:
fsigmoid(z)=11+ez

ftanh(z)=ezezez+ez

他们的曲线表示为
这里写图片描述
左边为sigmoid函数,值域范围为[0,1],右边为tanh函数,值域范围[-1,1],通过多个这样的非线性感知机,那么理论上我们最终可以逼近任意一个超曲面,如果这个非线性的激活函数我们只能得到一个由若干个超平面组合而成多边形超平面。那么为什么选择这些激活函数了,我们不妨以sigmoid函数为例,求一下sigmoid的导数:
fsigmoid(z)=11+ez1(1+ez)2=fsigmoid(z)[1fsigmoid(z)]

所以sigmoid函数的导数可以用自身来表示,有兴趣的读者不妨自己推导tanh的导数,是否也满足这一个规律。这一点对于编程实现非常重要,可以得到导数的解析解而不是数值解,因为神经网络的训练都是基于梯度(导数)实现的。

多层前馈神经网络

之前我们已经介绍了单个神经元(感知机),我们仿照人脑神经系统,把这些神经元给全连接起来,便可以得到一个多层感知机 (Multi-layer Perceptron, MLP),也叫做多层神经网络。在多层神经网络中,第一层叫做输入层(input layer),最后一层叫做输出层(output layer),中间的都叫做隐层(hidden layer),下面是一个单隐层神经网络的教材例子
这里写图片描述
从输入到输出的过程是把数值从低层传向高层,这个过程叫做前馈传播。两层神经元之间都有一条线连接,这条线代表着这两个神经元之间的权重系数。w(1)ij表示输入层第i个神经元到隐层第j个神经元的权重系数,b(1)代表输入层到隐层的偏置,w(2)ij表示隐层第i个神经元到输出层第j个神经元的权重系数,b(2)代表隐层到输出层的偏置,上图的输出层只有一个神经元。其中w(1)ij的所有集用w1表示,是个二维矩阵,同理w(2)ij的所有集用w2,最终待训练的参数集(W,b)=(w(1),b(1),w(2),b(2)),隐层的神经元先接受来自输入层的数值:

z(2)i=w(1)ijxj+b(1)

然后经过激活函数f()得到该神经元的隐含值:
a(2)i=f(z(2)i)=f(w(1)ijxj+b(1))

同理,输出层神经元的输出也可以得到:
hW,b(x)=a(3)1=f(w(2)1ja(2)j+b(2))

单隐层单输出的神经网络拓展到更一般的形式,输入层和输出层也可以当做第一层和最后一层来看待,和上面类似,我们有权重系数w(l)ij,其中l代表第ll+1层,i代表第l+1的第i个神经元,j代表第l的第j个神经元,另外b(l)表示第ll+1层的偏置。最后前馈传播的公式可以表示为:
a(l+1)i=f(z(l+1)i)=f(w(l)ija(l)j+b(l))

利用这个传播公式,我们就可以从输入x得到输出的值了,那么接下来的问题就是如何去训练得到最优的参数集(W,b)

反向传播算法(back propagation, BP)

前面我们已经介绍了神经网络的正向传播,现在我们给神经网络输入一个x,便可以得到一个预测值hw,b(x),但是我们现在面对的问题便是要如何训练参数集(W,b),解决这个问题的方法就是反向传播算法,简写为BP算法。BP算法是一种基于梯度下降的优化方法,基本原理有点向下山,我们的目标是找到目标函数的最小值。目标函数的分布曲面就好像一个山脉,我们想要去山脉的最低点,最简单的做法就是沿着下山的方向不停走,梯度下降法就是基于这种原理,函数的梯度方向的反方向就是下山最快的方向,所以只要求出函数的梯度,我们就可以渐渐向函数的最小值逼近。为了训练神经网络,首先我们要定义一个损失函数

J(W,b,x,y)=12||yhw,b(x)||2=12||ya(l+1)||2=12||yf(z(l+1)i)||2

其中
f(z(l+1)i)=f(w(l)ija(l)j+b(l))

这里我们把神经网络的输出层看作网络的第l+1层,y是输入样本x的真实标签,f()是激活函数。之后我们便可以损失函数J求第l层到输出层的参数集(W(l),b(l))的梯度

Jw(l)ij=Jz(l+1)iz(l+1)iw(l)ij=δ(l+1)z(l+1)iw(l)ij=δ(l+1)w(l)ija(l)j+b(l)w(l)ij=δ(l+1)a(l)j

同理
Jb(l)=Jz(l+1)iz(l+1)ib(l)=δ(l+1)z(l+1)ib(l)=δ(l+1)iw(l)ija(l)j+b(l)b(l)=δ(l+1)i

其中
δ(l+1)i=Jz(l+1)i=12||yf(z(l+1)i)||2z(l+1)i=(yf(z(l+1)i))f(z(l+1)i)

前面已经介绍,如果f()是sigmoid函数的话,那么
f(z(l+1)i)=f(z(l+1)i[1f(z(l+1)i]

至此损失函数J关于w(l)ijb(l)的梯度解析解全部可以求出来,并且不需要“求导”,这主要得益于激活函数导数可以用自身表达的这种性质,可以发现即使到了深度学习的各种激活函数,其导数可以简单的计算这种特性依然保留。根据导数的链式法则,我们可以得到递推公式
Jw(l1)ij=Jz(l+1)iz(l+1)iz(l)kz(l)kw(l1)kj=δ(l+1)iz(l+1)iz(l)kz(l)kw(l1)kj=δ(l+1)iw(l)ija(l)j+b(l)z(l)kz(l)kw(l1)kj=δ(l+1)iw(l)ikf(z(l)k)+b(l)z(l)kz(l)kw(l1)kj=(w(l)ikδ(l+1)i)f(z(l)k)z(l)kw(l1)kj=(w(l)ikδ(l+1)i)f(z(l)k)a(l1)j=δ(l1)ia(l1)j

用这个公式一路递推过去便可以求得每一层的梯度,之后利用更新公式便可以不停地更新参数
w(l)ij=w(l)ijαJw(l)ij

b(l)=w(l)ijαJb(l)

其中α表示学习率,属于人工设定的参数,来控制学习的步长(一次下山的幅度)。在现在流行的bp算法中,已经有很多自适应学习率的算法产生。

实际程序

如今神经网络的程序API已经非常多了,python、matlab和C等主流语言都有许多库包,用户只要设定神经网络的层数、每层网络的神经元数、激活函数、优化函数、学习率等参数便可以很方便地使用,下面给出一个基于深度学习框架keras的程序

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('sigmoid'))
model.add(Dense(10))
model.add(Activation('softmax'))

上面便是一个两层神经网络的例子,Dense层即神经网络层,只要指定数据输入的维度和神经元个数即可,第一层输入784,输出32,说明第一层为784个神经元,第二层为32个神经元,同理第三层输出层为10个神经元,激活函数分别为sigmoid何softmax函数(输入层是不需要激活函数的)。具体细节可以去查阅keras官方文档。

版权声明:本文为博主原创文章,未经博主允许不得转载。

深度学习笔记(2)——卷积神经网络(Convolutional Neural Network)

卷积神经网络(Convolutional Neural Network, CNN)是深度学习转折的标志性成果,在深度学习的早期,以Hinton等为代表的学者们研究主要集中在RBM(限制波尔兹曼机),A...
  • qq_21190081
  • qq_21190081
  • 2017年04月05日 14:00
  • 2184

神经网络(Neural Network)概述

1.神经网络概况 1943年,心理学家W. Mcculloch和数理逻辑学家W. Pitts根据生物神经元功能和结构,提出M-P神经元模型。 1957年,Rosenblatt提出感知机MLP模型。...
  • ws_20100
  • ws_20100
  • 2015年10月06日 08:43
  • 3581

系统学习深度学习(五) --递归神经网络原理,实现及应用

递归神经网络(RNN),是两种人工神经网络的总称,一种是时间递归神经网络(recurrent neural network),另一种是结构递归神经网络(recursive neural network...
  • App_12062011
  • App_12062011
  • 2017年01月13日 10:47
  • 5368

Neural Network Toolbox使用笔记1:数据拟合

Neural Network Toolbox为各种复杂的非线性系统的建模提供多种函数和应用程序。该工具箱提供各种监督学习模型:前向反馈,径向基核函数和动态网络等模型。同时也提供自组织图和竞争层结构(c...
  • ljp1919
  • ljp1919
  • 2015年01月10日 19:56
  • 10154

一步一步分析讲解深度神经网络基础-Convolutional Neural Network

Convolutional Neural Network 参考http://cs231n.github.io/convolutional-networks/history Convolution...
  • jk981811667
  • jk981811667
  • 2017年12月25日 14:31
  • 241

神经网络算法Neural Network介绍

神经网络算法Neural Network介绍 1. 背景:      1.1 以人脑中的神经网络为启发,历史上出现过很多不同版本      1.2 最著名的算法是1980年的 backpropaga...
  • A784586
  • A784586
  • 2017年04月25日 20:04
  • 402

一步一步分析讲解神经网络基础-Feedforward Neural Network

A feedforward neural network is an artificial neural network wherein connections between the units d...
  • jk981811667
  • jk981811667
  • 2017年12月25日 13:39
  • 226

神经网络 neural network

神经网络之BP算法,梯度检验,参数随机初始化 neural network(BackPropagation algorithm,gradient checking,random initializat...
  • u012328159
  • u012328159
  • 2016年04月17日 11:02
  • 9741

【深度神经网络压缩】Deep Compression (ICLR2016 Best Paper)

做过深度学习的应该都知道,NN大法确实效果很赞,在各个领域轻松碾压传统算法,不过真正用到实际项目中却会有很大的问题: 1. 计算量非常巨大;2. 模型特别吃内存;怎么办?使用网络压缩技术咯!《Deep...
  • cyh24
  • cyh24
  • 2016年06月19日 01:51
  • 16941

「深度神经网络」(deep neural network)具体是怎样工作的?

「深度神经网络」(deep neural network)具体是怎样工作的?
  • yangdashi888
  • yangdashi888
  • 2017年05月02日 17:23
  • 569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习笔记(1)——神经网络(neural network)
举报原因:
原因补充:

(最多只允许输入30个字)