首页 > 编程知识 正文

深度神经网络学习算法,深度学习

时间:2023-05-06 10:43:05 阅读:183823 作者:920

引言

神经网络是深度学习的基石,说起来的渊源应该是1986年RumelhartMcCelland提出的BP(Back Propagation)算法。一般书上要讲解这一部分知识通常会从模型结构、算法原理等等开始,这样虽然会很专业严谨,然而对初学者不甚友好,不利于快速消化吸收。而本系列文章则以初学者的角度来边思考,边“形容”出深度学习深层次的原理,并在此基础上配以公式和图片,以满足处于不同学习阶段的学习者理解深度学习。

猜数字

在开始讲深度学习理论之前,我们先来回想一个小时候都玩过的游戏(首先声明一下我是90后,00后作为电子时代的孩子有没有玩过我就不知道了)——猜数字,也就是两个人坐在一起,其中一个人A在心里默想一个数字x,然后让另一个人B猜,当B说出一个数字后,A只能回答真实数字比猜测值大、小或是相等,然后B再根据A的回答相应调整猜测值,直到两者相等为止。

我们放慢这一过程(就像下图一样)——当B说出一个数字后,猜测值 xg x g 随着数据流到了A,随之A在心里面将真实值 xr x r 和猜测值 xg x g 做了比较,即 Δ=xr−xg Δ = x r − x g ,然后将 Δ Δ 的正负情况告诉 B,B 则提出一个新的值 xg+Δg x g + Δ g ( Δg Δ g 是一个与 Δ Δ 正负一致,然而绝对值不尽相同的数) 给A进行判断。

举这样一个例子并非天马行空,而是因为这是一个绝好的抽象出 BP神经网络 原理的例子,即使事实上最简单的BP网络结构也会像下图一样复杂许多,但如果概括到输入层、隐藏层、输出层的层面上,其最重要的特征——传播性质也与猜数字有异曲同工之妙,下一节就从更加严谨、更具数学美感的角度来讲解。

两个函数、双向传播 (1)正向传播、反向传播

首先我们从双向传播开始。相信只要对深度学习有一定了解的人(当然没有也不要紧)都应该知道双向传播指的是正向传播和反向传播。其中,正向传播是输入通过隐藏层中的权值、偏置、激活函数等一层层向前推进,继而得出输出的过程,对应到上节的猜数字游戏就是 B 猜测一个数字,并告诉 A 的过程;反向传播是比较输出值与期望值(抑或称为真实值),得到一个差值,再根据这个差值算出梯度,并将梯度按照输入数据流入的反方向倒推回去,继而达到改变每层权值与偏置的目的,也就是上节猜数字故事中提到的 A 将 Δ Δ 的正负情况告诉 B 的过程。

依据上图,我们可以通过数学推导来详细解释这一过程( x1 x 1 、 x2 x 2 是输入映射, b1 b 1 是偏置, F F 是输出映射):

正向传播:

反向传播:

反向传播计算梯度在 w11 w 11 和 w12 w 12 的作用。因为最后的输出映射与 w11 w 11 和 w12 w 12 无直接关系,故而用求导链式法则来推导:

如果此时学习率为 η η ,则更新后的 w11 w 11 和 w12 w 12 为:

细心的人可能发现公式中出现了 loss ,这就是我们下一节要谈到的损失函数。

(2)损失函数

损失函数是表征模型输出值和期望值相近程度的函数,通常称为 loss函数,也有叫 error函数,一般有下面几种形式( y^ y ^ 代表期望值, y y 代表模型输出值):

0-1损失(Zero-one Loss)

0-1损失是一种较为简单的损失函数,如果预测值与目标值不相等,那么为1,否则为0,即:

感知损失(Perceptron Loss)

0-1损失太过严格,如果正式值为1,预测值为0.99,那么该预测大概率是正确的,但0-1损失认为是不对的,因此0-1损失只适合理想的情况。感知损失是对0-1损失的一种改进:

Hinge损失(Hinge Loss)

Hinge Loss为svm算法的损失函数,用来解决最大化几何间隔的问题,对于二分类问题 yi∈[−1,1]'>yi∈[−1,1]yi∈[−1,1] ,定义为:

对数损失函数(Log Loss)

对数损失是使用对数的损失函数的一个总称,在使用似然函数最大化时,其形式是进行连乘,但是为了便于处理,一般会套上 log l o g ,这样便可以将连乘转化为求和,由于 log l o g 函数是单调递增函数,因此不会改变优化结果。逻辑回归算法中的交叉熵损失函数就是一种对数损失函数,为二分类问题 yi∈[−1,1] y i ∈ [ − 1 , 1 ] ,交叉熵损失函数定义为:

均方误差(Square Loss)

绝对值误差(Absolute Loss)

指数误差(Exponential Loss)

指数误差,常用于boosting算法中,如adaboost,定义为:

其中均方误差在深度学习中应用最广泛,常常作为模型最后好坏的标准。但需要注意的是loss函数的值并不一定是越小越好,关于这一点我们以后慢慢道来。

(2)激活函数

关于激活函数(activation function),首先要搞清楚的问题是,激活函数是什么,有什么用?不用激活函数可不可以?答案是不可以。激活函数在上一节的介绍中即是 f1 f 1 和 f2 f 2 函数, 其主要作用是提供网络的非线性建模能力。如果没有激活函数,那么该网络仅能够表达线性映射,此时即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的。因此也可以认为,只有加入了激活函数之后,深度神经网络才具备了分层的非线性映射学习能力,就像下图一样。

那么激活函数应该具有什么样的性质呢?

可微性: 当优化方法是基于梯度的时候,这个性质是必须的。

单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
输出值的范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate。

就现有情况而言,激活函数有这几种选择:Sigmoid函数、Tanh函数、Relu函数、Leaky ReLU函数、Maxout函数等等,它们各自特性、侧重点以及应用场景均不尽相同,关于它们的区别,我们之后再细细讨论。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。