Deep Learning
定义
深度学习(Deep Learing)由一组算法和技术构成,这些算法和技术试图发现数据的重要特征并对其高级抽象建模。深度学习的主要目标是通过对数据的自动学习来避免手动描述数据结构(如手写特征)。深度指的是通常具有两个或多个隐藏层的任何神经网络即(DNN)。
大多数深度学习模型都基于人工神经网络(ANN),尽管它们也可以包含命题公式或在深度生成模型中分层组织的潜在变量,例如Deep Belief Networks和Deep Boltzmann Machines中的节点。
人工神经网络是一种基于大脑神经结构的计算非线性模型,能够学习执行诸如分类,预测,决策和可视化之类的任务。一个人工神经网络由人工神经元组成,并组织为三个相互关联的层:输入,隐藏和输出,如图中的(b)所示。
输入层包含将信息发送到隐藏层的输入神经元。隐藏层将数据发送到输出层。每个神经元都有加权的输入(突触),一个激活函数和一个输出。突触是可调整的参数,可将神经网络转换为参数化系统。节点的激活函数定义给定输入的该节点的输出。特别是,激活函数将根据所选的激活功能将输入值映射到目标范围。例如,logistic activation function
会将实数域中的所有输入映射到0到1的范围内。
在训练阶段,人工神经网络使用反向传播作为有效的学习算法来快速计算权重的梯度下降。反向传播是自动微分的一种特殊情况。在学习的上下文(context)中,反向传播是梯度下降优化算法中常用的通过计算损失函数的梯度来调整神经元权值的方法。这种技术有时也称为误差(errors/loss
)后向传播,因为损失(loss)是在输出端计算出来的,并通过网络层反向传播回来。
典型DNN模型
DNN被定义为具有多个隐藏层的ANN。有两种典型的DNN模型,即前馈神经网络(FNN)和递归神经网络(RNN)。
FNN
在FNN中,信息仅在一个方向上移动,即从输入节点经过隐藏节点再到输出节点,并且网络中没有循环或循环,如图1所示。在FNN中,卷积神经网络(CNN)是最著名的模型,具有广泛的应用,尤其是在图像和语音识别中。CNN包含一个或多个集合或完全连接的卷积层,并使用了上面讨论的多层感知器的变体。通常,CNN具有两个主要组件,即特征提取和分类,如图2所示。特征提取组件被放置在隐藏层,目的是执行一系列卷积和池操作,并且在此期间检测特征。然后,分类组件放置在全连接层,将为我们需要预测的对象(例如图像)分配一个概率。
RNN
与FNN不同,RNN是递归人工神经网络的一种变体,其中神经元之间的连接构成有向循环。这意味着输出不仅取决于其直接输入,还取决于上一步的神经元状态。
循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。
当current step
与previous step
有某种关系时,通过序列形式的输入,我们能够得到如下形式的RNN。
这使得RNN非常适合具有时间成分的应用场景,例如时间序列数据和自然语言处理。但是,所有RNN在递归层中都有反馈回路。这使RNN可以随着时间的推移在内存中维护信息。
然而,训练标准RNN很难解决需要学习长期时间依赖性的问题。原因是损失函数的梯度随时间呈指数衰减,这就是所谓的消失梯度问题。因此,RNN中经常使用 长短时记忆(LSTM) 来解决此问题。
LSTM被设计为对时间序列建模,并且它们的长期依赖性比常规RNN更准确。特别的是,LSTM通过合并内存单元(Memory)提供了一种解决方案,允许网络学习何时忘记以前的隐藏状态,以及何时更新给定新信息的隐藏状态。通常,LSTM单元以具有三个或四个“门”(gate)的“块”(block)实现,例如,
- input gate(输入门)
- forget gate(忘记门)
- output gate(输出门)
- input modulation(输入调制门)
图4展示了LSTM控制逻辑功能的信息流图:
与RNN不同,LSTM内存单元由三个组件组成
- 上个内存单元 c t c_t ct (the previous memory cell)
- 当前输入 x t x_t xt
- 上个的隐藏状态 h t − 1 h_{t-1} ht−1
在这里,输入门和忘记门将用于选择性地忘记其先前的内存(memory)或考虑其当前输入。同样,输出门将学习有多少内存单位(memory cell)要转移到隐藏状态。这些额外的模块使LSTM能够学习RNN无法完成的极其复杂的长期时间动态。
LSTM结构
首先使用LSTM的当前输入 x t x^t xt和上一个状态传递下来的 h t − 1 h^{t-1} ht−1 拼接训练得到四个状态。
其中, z f , z i , z o z^f,z^i,z^o zf,zi,zo是由拼接向量乘以权重矩阵之后,再通过一个 s i g m o i d sigmoid sigmoid激活函数转换成0到1之间的数值,来作为一种门控状态。而 z z z则是将结果通过一个 t a n h tanh tanh激活函数转换成-1到1之间的值(这里使用 t a n h tanh tanh是因为这里是将其做为输入数据,而不是门控信号)。
这四个状态在LSTM内部的使用
⊙ \odot ⊙是Hadamard Product,也就是操作矩阵中对应的元素相乘,因此要求两个相乘矩阵是同型的。 ⊕ \oplus ⊕则代表进行矩阵加法。
LSTM内部主要有三个阶段:
(1) 忘记阶段。这个阶段主要是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。
具体来说是通过计算得到的 z f z^f zf f表示forget)来作为忘记门控,来控制上一个状态的 c t − 1 c^{t-1} ct−1 哪些需要留哪些需要忘。
(2) 选择记忆阶段。这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入 x t x^t xt 进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。当前的输入内容由前面计算得到的 z z z表示。而选择的门控信号则是由 z i z^i zi(i代表information)来进行控制。
将上面两步得到的结果相加,即可得到传输给下一个状态的 c t c^t ct 。也就是上图中的第一个公式。
(3) 输出阶段。这个阶段将决定哪些将会被当成当前状态的输出。主要是通过 c o c^o co 来进行控制的。并且还对上一阶段得到的 c o c^o c