网络实用技术基础模拟测试2_【深度学习基础】2. 有监督的神经网络

2e517a0143c0d6529f64aadfd2a19350.png

如今深度学习如火如荼,各种工具和平台都已经非常完善。各大训练平台比如 TensorFlow 让我们可以更多的聚焦在网络定义部分,而不需要纠结求导和 Layer 的内部组成。本系列我们来回顾一下深度学习的各个基础环节,包括线性回归,BP 算法的推导,卷积核和 Pooling,循环神经网络,LSTM 的  Memory Block 组成等,全文五篇,前三篇是斯坦福深度学习 wiki 整理,第四第五两篇是 Alex Graves 的论文读书笔记,图片来自网络和论文,有版权问题请联系我们。

多层神经网络

之前我们讨论的线性回归和逻辑回归都是对 72afda5117504e3e58bc97722f25ef2e.png进行线性关系建模的,如果我们希望对其进行非线性关系建模,神经网络是一个方法,而且它可以对比较复杂的非线性关系进行建模。

我们先来看神经网络最基本的单元“神经单元”的定义:

a0826c08a32f4f75533304d0b8ddee9e.png

上面的例子中,有一个激活函数116d009ad8e0fa0cdb9e1231f39ae932.png,我们一般选择一个 sigmod 函数作为f的实现,比如 logistic 函数:9acf004711210c8e66f3258b25c2b3ad.png,当然我们也可以使用tanh函数,或者 Rectifier 激活函数(使用 Rectifier 作为激活函数的 Unit 叫做 Rectified Linear Units, ReLu ):440c12e586d4afc09fcccaa662450aab.png,或者其他一些 Rectifier 的变种。三种函数的输入对比如下图所示:

91ebca5248c07f2473cb89e0fd4cbec9.png

tanh(z) 可以看做是 sigmoid 的拉伸版本,他的值域是 (-1,1),而 logistic 是 (0,1) 。ReLU 则是当 Z 大于 0 时斜率为 1 的线性函数,小于 0 时始终输出 0 。

三种不同的激活函数在进行梯度求导的时候也是各不相同。Logistic 梯度是dd4e197606ffb02044b1a68497ef34e2.png,tanh函数的梯度是 2ae969b5a06f10ffa8937906d9433c22.png 

Rectifier的梯度在 Z 大于 0 的时候是 1 ,其他为 0 。

理论上 Rectifier 在 0 点是不可导的,但是由于我们训练神经网络的时候用很大量的数据,梯度更新的时候是所有 instance 的梯度求和,一处 z=0 不至于影响整个梯度下降的过程,所以我们把 z=0 时的梯度也定义为 0 。

另外一个需要注意的是,我们把 bias(也叫截距)这一项单独写出来了,定义为公式中的 b ,而不是同一使用87860c1a082bb8944a052a30dea9701c.png来定义。

神经网络模型

我们把很多的神经元串联起来,下一层的输入是上一层的输出,从而组成一个小型的网络,比如下图:

cbc8aadf3adb0fe738b8276ca41b2cf2.png

最左边一层我们叫输入层(input layer),最右边一层叫做输出层(output layer),中间部分都叫做隐藏层(hidden layer)。定义一些变量:

39c7a35620d63d416ff01eca2a41c43d.png是神经网络的层数,比如这里是3

f4846d590e6dd6e795d80407f30a46e8.png是第 l 层网络,比如是f4846d590e6dd6e795d80407f30a46e8.png输入层,

8fea2b1be55d2e33fc8732be69bf4cf9.png是输出层c70223d668293858d285dec44313fc64.png是神经网络的参数,0d02061301d437077d7b2849adb715a9.png表示连接第l层的节点 j 与连接第 l+1 层的节点 i 之间的边的权重(注意下标和节点对应关系,因为 W 与 x 相乘时是转置过的)。

e32eb586c4aa2c88ad69a0cb35d63182.png是连接到l+1层第i个节点的 bias

c2ee151741902cb41c01975953f0b5f2.png是第l层网络的节点个数(不包含 bias 节点)

b8905bee41dd64034ec89dd983095d4c.png是第l层第i个节点的输出值(activation),对于l=1的输入层85a6c9a2ca6c42bae0ff951de14b431e.png

cbd4d93fc80273599e8f36b819222e9b.png

对于输入层,我们也统一到了b8905bee41dd64034ec89dd983095d4c.png这个参数上,如果引入一个新的定义 z ,上式可以简化为:

f25061acf1ef35e2cd5c190689374852.png

我们把这个 l -> l+1 逐层计算输出的过程叫做前馈(forward propagation)。通过 blas 等向量和矩阵运算库,我们可以很方便的把前馈过程表达为向量矩阵的线性代数运算,从而提高计算速度。

神经网络可以定义很多中间层,从而使得网络很 deep(这也是 DNN 的来源),同时输出层还可以定义多个输出节点来预测多个值,比如下面的网络示意图:

5764f6b4ef2436f970e97f1c557c8465.png

上面这个网络中,f735eb8f9053d1d1865c4225362a85ab.png。这种网络可以专门用来对多分类问题进行建模。

可以看到,如果不存在输入层,直接输入对输出,如果输出层节点为 1,且激活函数为 logistic ,其实就是逻辑回归。如果输出层节点多于 1 ,且激活函数为 softmax ,就是 softmax regression 。

BP算法 backpropagation Algorithm

我们使用最小均方误差来定义代价函数,对于单条记录有:

9fa92aca84e9f069f2926c7f079ce893.png

对于所有的m条训练数据合并计算代价函数,可以得到如下的代价函数:

6758d3a070c5912137b905f7fc116631.png

其中第一部分定义的是误差平方和的平均值,第二项是正则化因子,也叫权值衰减 (weight decay),专门用来惩罚数值太大的权值,防止训练过程中发生过拟合。正则化因子f5658c3a1f8849c3a928a0cf86bec25b.png控制前后两项的相对权重。

上面的损失函数既可以用于分类问题,也可以用于回归问题。分类问题的时候认为 y=0 或者 1 ,回归问题的时候需要先把 y 值归一化到 [0,1] 然后进行训练。

现在目标转化为求一组08a18cca6f94851ed8cbe476935dd777.png值使得 085f157ab08623ce0b3dde41ae66292f.png 的值最小化。虽然 085f157ab08623ce0b3dde41ae66292f.png 是一个非凸函数,使用梯度下降的最优化求解可能会收敛到局部最优,而非全局最优,但是实际应用中,我们这么做并没用太大的问题。

需要注意的是,08a18cca6f94851ed8cbe476935dd777.png 一定要使用随机值来进行初始化,而不能统一设置为 0 或者其他的一模一样的数,因为这样的话会使得隐藏层每个节点的连接参数都是一样的,这样计算出来后隐藏层节点的结果也都是一样的,然后逐层向前计算,最后的结果就是 x 原封不动的传输到了最后一层。这会让训练程序直接停止,因为无法计算梯度。这个随机初始化的过程,目的就是消除对称性。

根据之前使用梯度下降法更新参数的经验,我们知道现在我们需要用 085f157ab08623ce0b3dde41ae66292f.png 对08a18cca6f94851ed8cbe476935dd777.png分别求偏导,用于更新08a18cca6f94851ed8cbe476935dd777.png参数。按照严格的数学求解应该是这样的:

49c727d9fe6d83c6d0b4856308c82e0c.png

为了能更方便的求解,我们都使用 BP 算法。关于 BP 算法先说一个不太好理解的版本:首先对每一个训练样例 (x, y) 先进行前向计算得到最后一层的激活输出 (activations) ,然后对隐藏层的每一层 l 的每个节点 i ,依次计算一个误差项db7a9657ac2a291ccf0433416f3c609e.png,用于评估最后一层的输出误差中有多少是这个节点产生的。再说一个我自己理解的版本:如果网络并没有隐藏层,输入直接对接到输出,那么就是普通的逻辑回归或者 softmax 回归的求偏导更新过程;现在网络有很多隐藏层,前向计算过程中,是输入一层层传递过来的,而传递过程中与连接权重矩阵相乘的过程,本质上是一次次的空间变换(矩阵乘法就是两侧空间的 transfer 过程,可降维,可升维,可旋转缩放,可非线性变换等等各种),那么现在最后一层的误差来了,我们应该干什么呢?应该通过矩阵的另外一端把误差重新进行空间变换映射回去,并层层传递到第一个隐藏层。后面我们对照公式再具体讲一下。

对于输出层的 fc45e4ee5b1300df38cd0bf63d893a1a.png可以通过计算输出与真实值之间的最小二乘的导数来得到,而对于隐藏层,我们可以认为db7a9657ac2a291ccf0433416f3c609e.png是所有使用 b8905bee41dd64034ec89dd983095d4c.png作为输入的下一层的节点的误差项进行加权求和(反向的矩阵空间变换)的结果。

BP 算法描述如下:

1.      先使用前向计算,一直计算得到输出层的结果;

2.      对于输出层的每个节点 i ,计算 fc45e4ee5b1300df38cd0bf63d893a1a.png

57358acfd2bd40d9bc102b89d4a7832b.png

3.      对所有的隐藏层,l= nl-1, nl-2, …, 3, 2,给每个节点 i 计算db7a9657ac2a291ccf0433416f3c609e.png:

ae38436b2c6d9345db8e55ae3e473d7b.png

4.      使用 db7a9657ac2a291ccf0433416f3c609e.png计算偏导项:

aca6257a8e0747153f9d6f97e42937e2.png

注意以上的乘 a6451b4442d7f22e3062af04e2a9ff0a.png操作都是按位操作的,而且 W 和f946eac2d3d905aff6ab968ca8c23c55.png我们同样可以使用矩阵和向量运算来加速。假设 edc89fe0883108b2e337bc35768b204a.png是 sigmoid 函数,根据前面的推导我们可以直接得到b45bd1b6027a1238112f5805f00642f8.png,这样可以直接代入上面的公式中使用。

使用 mini-batch 来进行数据的批量计算,我们可以把上面过程使用矩阵形式来表达,梯度下降的算法过程如下:

1.         对于所有层 l ,设置梯度9b2e7b93a5e68177db96d9dd603bae0e.png00c11957f55ab17d2af11a31d1310b49.png

注意:1faaeadebac86c0680928d88fabb57a0.png是矩阵,0d321d49cf26142af78595b210f5507e.png是向量,他们是用来存储梯度值的。与用来存储权重的 W 和 b 维度是一样的。

2.         对于所有训练样例 i=1,2,…,m

a.       使用 BP 算法计算梯度

 064cb2a3dc3674271f5a3c2c67d1bfe0.png7412bdbb32cf91ddffb085dd537a1357.png

注意:这里的 c8b8750b99737a90d6b4324d522980c0.png也是矩阵方式的表达,比如输出层0904cc31cdf3d5899498ec1c0cc4b252.png,隐藏层 8cf9e31fecb70635d3c23ef7ea1bd670.png。这里的 530de8a1dbdc1bf58c8ae409d38777ec.png 就是把下一层误差反向映射回来的过程,那为什么还有 4064e6c84865be308fbe19b324a30b79.png这一部分呢?因为我们要计算的实际上参数的梯度下降方向。

b.      更新W和b的梯度

8a5438fdfe17e1997297716bbbb6eea5.png

3.         更新参数 W 和 b :

ccea8a0d3ccae0cd93658e32c711c621.png

如此一直迭代训练,便可以不断减小代价函数 085f157ab08623ce0b3dde41ae66292f.png ,直到模型收敛或者达到一定的训练迭代次数。

softmax regression输出层

使用 softmax regression 作为输出层时,代价函数求导得到的误差项表表达应该如下式,后面的误差传递过程保持不变:

ba6c04f3eee8b0b75f3c6cc7b5b0e0c6.png

常见的激活函数求导

通过上面的内容,我们知道多层神经网络的 BP 算法求解,大体的公式都是固定的模式化的,有一个可变的地方就是激活函数求导 81000abc5894024beaeae83257a1d8a4.png。一般常见的三种激活函数:  logistic ,  tanh ,  Rectifier ,我们可以简单的把它们记录下来以便直接使用。

注意:以下部分都用29c0f2eb224983901f68edb434be680b.png进行了简化,实际上应该是对 W 求偏导,需要多补充一部分函数内求导的部分。

Rectifier:706702bd18fb0bb091dbf8e4c046ae4a.pngfor z<=0;  for z>0

logistic:45d13443d4623a9a45abb320947a080a.png      

tanh:fc7a7e7c54077fb8516ab4142676dc50.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值