今天有一个环境没有部署成功心里还是很不开心的,不过想想还是坚持学习以及记录,毕竟坚持了这么久不好突然放弃,上次我们提到了使用tensorflow搭建一个简单的三层CNN网络并用来训练MNIST数据库,如果大家测试过的话可以发现训练精度能够在98%以上,当然咯,具体的精度与参数的设置和迭代次数是有关系的。相信通过上一讲大家对CNN印象很深刻,下面我们将要介绍的是CNN的数学原理,当然咯一涉及到数学的东西就比较多的公式,应该会比较无聊,不过顺着公式再看看我们以前写的代码会发现我们的代码很有意思。

1.张量

好了,首先我们看tensorflow我们发现tensor,这个单词就是张量的意思,而张量是什么意思呢,通俗的说张量就是矢量在高维的扩展,矢量表示的是一维数据,我们也可以称之为一阶张量,而矩阵表示二维数据,同样可以称为二阶张量,依此类推,$x \in R^{HWD}$ 可以表示为一个张量,为什么我们这里要引入张量的概念,主要还是为了方便我们进行数学表示,比如一张多波段的影像则可以表示为一个三阶张量。

2.求导的链式法则

这个是一个很基本的概念,本来不应该拿出来讲的,但是因为这个是我们能够进行梯度下降算法求解的基础,所以稍微提一提,假设$x\in R$ 为一个变量,它是一个随机一维张量$y\in R^H$的函数我们表示为:$x=f(y)$,则有:$\frac{\partial x}{\partial y}=\frac{\partial x}{\partial y_i}$ 通过链式法则我们可以求一个数量对于一个张量的导数,求复合函数的导数,这样为我们进行反向迭代求解奠定了基础。

3.随机梯度下降

这个很重要,这个是为什么我们的训练能够有效的主要原因,对于任何一种学习算法,我们都有一个大前提那就是误差最小,即使有阻尼函数,也不过是调整了误差的形式而已,本质上还是能够保证预测结果与样本真实结果的误差最小这一原理,为了满足这个条件,一般来说采用梯度调整的方法对参数进行调整使其满足在某一范围内的极小值,不考虑局部收敛,即假设能够收敛于全局的情况下我们假设导数为0的位置为极值点,对于简单的问题我们直接通过求导可以计算出其极值点的解析式从而得到其极值,而对于复杂问题,这样的方式就不太适用了。所以我们提到了梯度下降算法,参看下图:
enter image description here
假设我们的函数为$z=f(w^i)$ ,为什么要这么假设,因为我们的z可以认为是输入与输出的误差,而w是权重,则需要找到合适的w使得z的值极小,则我们有上图了,在$w^i$点,我们的导数表明了z的变化趋势,实际上如果是简单的函数形式,我们认为若导数大于0,则表示在极小值点的右边,而小于0则表示在极小值的左边,因此我们可以通过公式 $(w^i)^{t+1}=\alpha\frac{\partial w^i}{w^i}$ 进行迭代求解,其中 $\alpha$ 为步长的调整参数,当然这是最简单的梯度下降的方法,在数值分析中会有更多的梯度下降的迭代算法,处理各种情况,有兴趣可以更进一步的了解,我们在这里就只介绍其基本原理。

4.响应函数

没有错,就是大名鼎鼎的响应函数,我们在这里并不具体介绍每一种响应函数,只是简单的介绍一下响应函数的特点,响应函数的主要作用就是将有一个输入对应输出的单应射,为什么要用响应函数以及如何使用相应函数,我们简单的说明一下
1.非线性拟合,假设我们没有响应函数,则神经网咯实际上可以看作是简单的线性拟合的过程,通过n个n维线性方程组在超平面中去框出一个拟合范围进行判别,而有了一个非线性而且求导又很方便的非线性函数后我们进行非线性拟合能够更加方便;
2.消除观测误差,实际上不同的响应函数有不同的特点,以sigmoid函数为例,其为一个s型函数,而它的概率分布函数是一个很像一个高斯函数,这样我们在中间的值差异被拉大,而两端被缩小,实际上两端无用的数据被压缩了,而中间的正确数据的差异被放大。
今天杂七杂八的讲了一些CNN中比较重要的概念,由这些概念以及我们昨天的编码应该能够了解到CNN的过程了,今天主要是概念的讲解,中间稍微进行了一点简单的公式描述,不过并没有详细的推导过程,在下讲中我会尝试着推导一下CNN,也算是一个挑战吧。