时隔这么久,又回到了深度学习,其实这一段时间一直有在学习,不过都不系统,想要根据自己的数据训练出一个学习库针对需要的应用进行学习,但是实际上数据获取了,但是数据格式的转换把我难住了,如何进行数据格式的转换,使得转换后的数据格式满足tensorflow/Models的输入需要是要面临的巨大问题,另外数据的标注也是一个不得不面对的问题,由于需要的数据量比较大,则对数据进行标注也是一个很耗费时间的工作,所以就先放一放了,计划是采用Fast-RCNN进行目标的检测,实际上结合了RNN和CNN的深度网络能够 比较高校和准确的在影像上识别出目标,而且需要的训练样本相对较少,在应用中具有很大的优势,但是这次我们从基础开始,讲一讲传说中的RNN。
经过以上一段时间的学习相信大家对CNN都有所了解,主要分为:
$$[输入]\to[卷积,池化,映射]^n \to [全连接]^n\to[输出]$$
简单的来说包含输入层,中间的卷积层池化层,全连接层以及输出层这几个部分,其中卷积池化层可以多次进行,全连接层实际上也是一个神经网络,由此构建了一个深度CNN网络,在CNN中有一个重要的概念就是权值共享,通过权值共享缩小了参数规模,使得学习规模变小,从而使得深度学习成为可能。
这一次我们所提的RNN(循环神经网络)和CNN在理念上存在着一些相似性,具体的东西在下面会交代,实际上RNN主要用于解决输入数据存在着序列相关的问题,在CNN的过程中每次输入都是独立的,因此每一层只与其上一层和下一层有关而在RNN中每一层不仅与上一层和下一层有关,另外还与本层的上一次输入有关,由此使得RNN能够对序列数据进行处理,使得RNN在NLP上具有重要的应用。
RNN模型图:
RNN模型
通过以上模型可以看出整个RNN的运行过程,左侧为pack的模型,右侧为unpack的模型,上图的模型中$x_i$为输入数据$A$为隐含层的网络单元结构,$h_i$为输出数据,我们看到每一个隐含层的网络单元结构不仅要与输入和输出相连还要与它本身相连,由此构成了一个循环神经网络。
实际上在应用过程中,简单的RNN由于其结构比较简单,在进行循环的过程中通过上一次的输入调整$A$然而实际上在网络深度较大的情况下,早期的数据已经无法对$A$产生影响,或者说影响已经被抹去了,因此传统简单的RNN神经元只有短时记忆而不具备长期记忆功能,对于深度较大的应用来说有着明显的缺陷,因此需要对神经元的结构进行调整,由此产生了LSTM结构:
简单神经元与LSTM对比
从以上对比可以看出LSTM在神经元的循环过程中有着更复杂的结构,另外由于LSTM能够克服传统RNN无法处理的短时记忆的问题,因此在网络中同时包含了短期记忆和长期记忆的两种情况,下面我们仔细谈谈LSTM的神经元结构:
LSTM步骤详细分析
OK,这样的话我们先分析上面四幅图中的图a,图a指示的是从上次和输入获取的信息中无用的部分,就是需要放弃的部分,计算方法为:
$$f_t=\sigma(W_f\cdot[h_m,x_t]+b_f)(1)$$
在记忆过程中并不是所有的信息都是有意义的,放弃那些没有意义的输入对于进行长期的记忆具有重要的作用,图b表示获取需要存储的信息,这一里包含了两个部分:

  1. Sigmoid层,这一部分指示的是从以前获取的信息哪些需要更新
  2. Tanh层,这一部分直接获取输入数据,并将有用的信息添加到神经元中

公式表示为:
$$
i_t=\sigma(W_i\cdot[h_m,x_t]+b_i) (2)\\
\tilde{C_t}=tanh(W_C\cdot[h_m,x_t]+b_C) (3)
$$
实际上这一部分主要的功能就是进行学习,一方面对以前的层次数据进行筛选,选取有用信息进行学习,另一方面对现有数据进行学习获取当前输入数据的信息,通过上面两步实际上我们做了两件事,第一对原始的输入神经元,让它忘记一些无用信息,另外新增一些有用信息,而这整个过程都在图c中表现出来,实际上以上两个步骤的数学表达十分简单:
$$C_t=f_t\times C_m+i_t\times\tilde{C}_t(4)$$
实际上看起来是不是也有点像 $y=Wx+b$ 的模型,没有错,实际上就是采用同样的模型对输入的神经元进行处理。最后第四步就是输出过程,在这一步中决定了输出数据的形式,根据式(4)以及我们一贯的神经网络模型可知,一般情况下我们都会对模型进行非线性映射,在这里我们同样进行如下处理:
$$
o_t=\sigma(W_o\cdot[h_m+b_o]) (5)\\
h_t=o_t\times tanh(C_t)(6)
$$
式(5)想必都很好理解,现在比较难以理解的是式(6),给出的解释是通过式(6)的操作可以只输出我们决定需要输出的部分,但是我并没有理解这么做的意义。这一个部分还是存在一定的疑问。好了以上四个步骤差不多就是LSTM的整个过程了,没有介绍高深的公式,简单的介绍了一下普通的LSTM的步骤,实际上不同的算法有着不同的trick,在这里也不进行深究了。至于反向求解的过程在前面已经讲的比较多了,总的来说就是采用梯度下降法逐步求解,根据输入数据不断调整权重$W$和$b$使得求解总误差最小,由此得到最佳的拟合效果,实际上由于采用非线性映射,切根据导数的连续性,问题的求解都可以简化为约束极值的问题,也就是这个式子 $min(||y-Wx-b||)sub. L2(W)$ 简单的说就是一个约束极值的问题,具体求解属于数学问题,会慢慢介绍。p.s. $m=t-1$