在学习深度学习的过程中,我对整个深度学习的过程的理解非常的混乱,所以我查阅了许多的资料,给自己划分了一个自己认为还好的思路(以上仅为个人理解,如有偏差,请多多指正.)
说起深度学习,就离不开神经网络.神经网络的知识与线性代数息息相关,我们来看下面那个图:
上面这个图有输入层、隐藏层、输出层。
输入层,就是输入消息用的,假如一张图片为32x32x3的图片,我们要通过一系列的操作,将他变成1x3072,然后放入输入层。
在输入层与隐藏层中间,有个W1参数矩阵,输入层与W1矩阵相乘,就可以得到隐藏层的输入参数了。
隐藏层,与输入层其实原理一样,都是接收前面的参数,然后根据W(参数)矩阵来确定中间的输入值。但是我们仔细想,如果一直都是线性运算,这样子的网络没什么用,因为一系列线性方程的运算最终都可以用一个线性方程表示。如果一直用线性的方式,就是网络深度加到几千层,效果也不大。所以在隐藏层中,里面有着名称叫做激活层的层。
所谓的激活层,就是为矩阵运算的结果添加非线性的要素,激活函数一般有3个阶跃函数,Sigmoid和ReLU。下面是这三个函数的图像。
令人吃惊的是,ReLU是用的最多的,这个函数的意思是当输入小于0时,输出0;输入大于0时,输出的输入。
需要注意的是,每个隐藏层计算(矩阵线性运算)之后,都需要加一层激活层,要不然该层线性计算是没有意义的。
到此,神经网络通过一系列的操作得到了结果值,如果这个神经网络是用来“使用”的,那求到这个结果值就已经结束了。但是如果这个神经网络用来“训练”那还不够。
输出层上的正则化:
在输出的结果中,如果得到类似(3,1,0.1,0.5)的结果,虽然我们可以找到里面的最大值3,但是不够直观,如果有一种方法,得到的结果为概率,如(90%,5%,2%,3%)这样的结果,那就好了。
所以,我们有个用来正则化的函数:
我们对这个公式进行拆分:
首先:Sigmoid函数
这个公式就是用来归一化的, 该函数的图像如下图:
这个就可以将得到的值压缩在0~1之间。
为什么又公式下面的累加呢?
因为在得到的结果集中,预测的各个结果差别并不大,所以我们需要使用exp函数将其结果放大,然后再放入Sigmoid函数中映射到0~1之间。
所以才有上面的计算公式。
在得到中Sigmoid函数的值后,虽然每个数都是在0~1之间,但是各个数加到一起不等于1,所以我们还用一个巧妙的方法求对数的负数。
可以想象一些log的图像,概率越接近100%,该计算结果值越接近于0,说明结果越准确,该输出叫做“交叉熵损失(Cross Entropy Error)”。
到这里,一个神经网络就已经解释完毕了,一个完整的神经网络如下图。
这个也叫做神经网络的正向传播,是在深度学习中,都要做的事情。