手写字体识别预测及可视化示例
3D可视化网址:https://www.cs.ryerson.ca/~aharley/vis/conv/
可以切换其它预训练模型
比如下面的AlexNet
这个网址也可以玩一玩:https://poloclub.github.io/cnn-explainer/
我们可以将神经元拼接起来,两层神经元,即输入层+输出层(M-P神经元),构成感知机。 而多层功能神经元相连构成神经网络,输入层与输出层之间的所有层神经元,称为隐藏层:
如上图所示,输入层和输出层只有一个,中间的隐藏层可以有很多层(输出层也可以多个,例如经典的GoogleNet)
类似于神经元,神经元会对化学物质的刺激进行,当达到一定程度的时候,神经元才会兴奋,并向其他神经元发送信息。神经网络中的激活函数就是用来判断我们所计算的信息是否达到了往后面传输的条件。
1. sigmoid 函数
公式: a = 1 1 + e − z 公式 :a=\frac{1}{1+e^{-z}} 公式:a=1+e−z1
sigmod由于需要进行指数运算(这个对于计算机来说是比较慢,相比relu),再加上函数输出不是以0为中心的(这样会使权重更新效率降低),当输入稍微远离了坐标原点,函数的梯度就变得很小了(几乎为零)。在神经网络反向传播的过程中不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散。这些不足,所以现在使用到sigmod基本很少了,基本上只有在做二元分类(0,1)时的输出层才会使用。
2. tanh 函数
a = e z − e − z e z + e − z a=\frac{e^z-e^{-z}}{e^z+e^{-z}} a=ez+e−zez−e−z
与sigmoid函数类似,当输入稍微远离了坐标原点,梯度还是会很小,但是好在tanh是以0为中心点,如果使用tanh作为激活函数,还能起到归一化(均值为0)的效果。
一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数,但是随着Relu的出现所有的隐藏层基本上都使用relu来作为激活函数了。
3.ReLU 函数
a = m a x ( 0 , z ) 导数大于 0 时 1 ,小于 0 时 0 。 a=max(0,z) 导数大于0时1,小于0时0。 a=max(0,z)导数大于0时1,小于0时0。
当输入是负数的时候,ReLU是完全不被激活的,这就表明一旦输入到了负数,ReLU就会死掉。但是到了反向传播过程中,输入负数,梯度就会完全到0,这个和sigmod函数、tanh函数有一样的问题。 但是实际的运用中,该缺陷的影响不是很大。ReLU 函数的改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)可自行了解。
在神经网络的计算过程中,每层都相当于矩阵相乘,无论神经网络有多少层输出都是输入的线性组合,就算我们有几千层的计算,无非还是个矩阵相乘,和一层矩阵相乘所获得的信息差距不大,所以需要激活函数来引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中,增加了神经网络模型泛化的特性。
吴恩达老师的深度学习教程应该讲的比较清楚了,不清可以看看,这里详细介绍一下。
图片来自:https://zhuanlan.zhihu.com/p/71892752/
对于一个神经网络来说,把输入特征 a [ 0 ] a^{[0]} a[0]这个输入值就是我们的输入 x x x,放入第一层并计算第一层的激活函数,用 a [ 1 ] a^{[1]} a[1]表示,本层中训练的结果用 W [ 1 ] W^{[1]} W[1]和 b [ l ] b^{[l]} b[l]来表示,这两个值与计算的结果 z [ 1 ] z^{[1]} z[1]值都需要进行缓存,而计算的结果还需要通过激活函数生成激活后的 a [ 1 ] a^{[1]} a[1],即第一层的输出值,这个值会作为第二层的输入传到第二层,第二层里,需要用到 W [ 2 ] W^{[2]} W[2]和 b [ 2 ] b^{[2]} b[2],计算结果为 z [ 2 ] z^{[2]} z[2],第二层的激活函数 a [ 2 ] a^{[2]} a[2]。 后面几层以此类推,直到最后算出了 a [ L ] a^{[L]} a[L],第 L L L层的最终输出值 y ^ \hat{y} y^,即我们网络的预测值。正向传播其实就是我们的输入 x x x通过一系列的网络计算,得到 y ^ \hat{y} y^的过程。
在这个过程里我们缓存的值,会在后面的反向传播中用到。
对反向传播的步骤而言,就是对正向传播的一系列的反向迭代,通过反向计算梯度,来优化我们需要训练的 W W W和 b b b。 把 δ a [ l ] {\delta}a^{[l]} δa[l]值进行求导得到 δ a [ l − 1 ] {\delta}a^{[l-1]} δa[l−1],以此类推,直到我们得到 δ a [ 2 ] {\delta}a^{[2]} δa[2]和 δ a [ 1 ] {\delta}a^{[1]} δa[1]。反向传播步骤中也会输出 δ W [ l ] {\delta}W^{[l]} δW[l]和 δ b [ l ] {\delta}b^{[l]} δb[l]。这一步我们已经得到了权重的变化量,下面我们要通过学习率$\alpha 来对训练的 来对训练的 来对训练的W 和 和 和b$进行更新,
W = W − α δ W W=W-\alpha{\delta}W W=W−αδW
b = b − α δ b b=b-\alpha{\delta}b b=b−αδb
这样反向传播就就算是完成了,反向传播就是通过链式求导来计算各未知数的梯度,从而得到更新后的未知数的值,这个过程使得模型训练开始随机设定的模型参数不断接近模型最优参数,这也就是梯度下降的过程。
参考资料:https://handbook.pytorch.wiki/chapter2/2.3-deep-learning-neural-network-introduction.html
欢迎关注公众号【智能建造小硕】(分享计算机编程、人工智能、智能建造、日常学习和科研经验等,欢迎大家关注交流。)