有人说:”有人说,文学的永恒主题是生与死。”
深度学习的永恒主题是什么?
感知机(Perceptron)
感知机是神经网络的基本组成构件,也可以说最小的神经网络就是一个感知机,一般的感知机由两层神经元构成,一层输入层,一层输出层。
两层神经元这时候最简单的一种情况就是两个输入,一个输出。此时如图所示,参数一共有三个,两个输入的权重w1 w2,以及连接神经元的阈值θ,此时通过调整这三个参数,我们可以很方便地实现一些简单的逻辑,比如与或非,我们以与为例:
“与运算”的逻辑是只有当x1 = x2 = 1时,输出结果才为1,其他情况下则为0。此时我们可以设w1 = w2 = 1,θ = 2,即 y = F ( 1 * x1 + 2 * x2 - 2)此时即可以满足”与运算”所要求的条件,只有当 x1 = x2 = 1时,y的值才为1。
以上的过程中通过调整感知机的参数,我们完成了我们的任务目标。简单的捋一下整个过程:
任务目标:实现”与功能”,使得神经网络完成在给定输入的情况下,得到相应的输出。
完成方法:调整神经网络中的权重和阈值这些参数,达到我们的目的。
而在现实的机器学习的过程中, 一个神经网络系统会有很多很多的参数,像上面那样由我们人工的设置和调整是不可能的。所以对于不同的任务目标,我们需要构建更为高效的神经网络结构,并实现更为高效的自动调参的算法,以使得我们的神经网络系统能够更好的完成我们被要求的任务。
以上就是神经网络研究的研究内容。
隐含层(hidden layer)
如果前面工作的 任务目标 换成了实现异或功能,很明显两层简单结构的感知机已经无法完成任务了,所以我们可以在输入输出层之间加一层隐含层,此时网络结构和参数权重可以采用下图策略,这就是简单的多层功能神经元。
梯度下降(gradient descent)以及反向传播(error BackPropagation)
回顾一下我们前面提到的任务目标,要知道,对于现实生活中的实际任务,即神经网络的应用场景中,几乎没有那种我们可以做到100%完美解决的任务(上帝不会让你那么简单就猜透他)。所以我们的任务目标可以转化为,对于目标任务,使用特定的网络结构,不断地调整神经网络的参数,使得神经网络输出结果与实际结果之间的误差最小。误差越小,意味着我们离完美解决任务目标就更进了一步。(默认大家都懂训练集和测试集的概念了)
那具体用什么方法来不断调整网络参数,以达到误差最小呢?我们用反向传播和梯度下降的方法。简单来说就是,利用输出层(最后一层)的输出结果和实际结果之间的差异,反向影响前面的各层的参数,并利用梯度下降的方法,根据结果差异对每层的参数进行不断地调整,以使得调整后的网络,能够降低输出结果与实际结果之间的误差。
反向传播的英文error BackPropagation,error意味着输出结果与实际结果之间的差异,BackPropagation的意思就是根据最上层的结果对下层的参数进行调整,所以反向传播应该很容易理解。而梯度下降的过程,也就是调整的这个过程呢,我们举一下西瓜书中的例子:
如图所示,我们定义了一个由d个输入的输入层,q个的单元的隐含层,l个输出的输出层组成的神经网络,先来明确任务目标,对一个训练集,让我们的网络与输出的结果之间的误差达到最小值,即让输入数据的均方误差达到最小:
而给我们调整的参数有以下部分:输出层l个阈值,输出层与隐层之间l * q个权重,隐层q个阈值,隐层和输入层之间的q * d个权重。权重调整都遵从梯度下降算法,都是以下形式:
V’ <– V + deltaV
接下来就是看一下如何求每个参数的delta。
以隐层第h个单元到输出层第j个单元之间的权重的调整值的计算为例,均差对权重求导如下:
此时根据传递性,权重是首先影响到输出层的输入βj,然后又影响到输出层的输出yj,最后才影响到均方误差,所以上面式子可以拆成这样:
其中,由于输出层的输入βj是隐层输出bn * Whj:
而对于输出值 yj 与输入值 βj 之间的关系,神经元中需要归一化函数将输入值映射到0-1之间,传统方法用跃迁函数,很明显在0不可导,所以我们用神一般的sigmoid函数:
这个函数有个很好的性质就是它的导数特别好求:
f’(x) = f(x)(1 - f(x))
所以根据以上几个公式,可以得到:
此时结合5.10 5.8 5.7三个公式,可以得到:
然后其他三类参数也可以类似得到:
然后所有的参数的修正差值就求出来啦!
总结一下整个反向传播和梯度下降的过程:
Reference
周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.
http://blog.csdn.net/zzukun/article/details/49556715