《深度学习》ch6. 深度前馈网络 记(上)

《深度学习》系列笔记的前言

从这篇博客开始,我将对Goodfellow等人编著的《深度学习》一书做一些笔记。对于每一章,按照现在的构想,笔记大概会分成三个部分

  • “记”的功能是提取书中的一些关键知识点。由于每一章的学习按照计划都是在对应的Hinton视频课程之后学习,而Hinton一般会讲一些比较基本且重要的知识点,因此再看书的时候感觉没有必要做太多重复劳动。从另一个角度,这本书字字珠玑,如果想记得巨细靡遗,那么跟抄书没什么区别,也没有这个必要。因此,“记”可以看作是给Hinton课程的一个补漏,也算是一个总结
  • “注”的功能是对书中一些没有展开的结论的注解。有些阐述,由于我个人水平有限,理解起来比较困难,或者觉得不够直观,我会试着去深挖一下原因以及背后的道理,可以看做是自己对自己的答疑吧
  • “补”的功能是对书中提到的一些知识点的补充。“注”与“补”的界限可能会比较模糊,从直观上来看,前者我倾向于是重原理和推导,后者更倾向于重概念。一些重要方法可能书里没有讲得特别详细,需要看论文,论文里提到而书里没有涵盖到的重要知识,可能也会体现在“补”中

需要说明的是,由于是个人笔记,因此对什么东西关键、什么东西不理解、什么东西需要补充说明,这些标准可能没有定数,与个人的感觉有关。如有遗漏,或者是啰嗦的,还望海涵。不过一般来讲,由于我一直在做工程师,理论能力有限,因此太理论的知识点,估计不会涵盖,例如6.4.1中的一些内容

想法通常都是完美的,但是实践起来总是有各种各样的困难,希望我能尽力完成吧


本部分是对《深度学习》一书6.1-6.4节内容的概要。尽管我购买了此书的印刷版,但是出于对版权的考虑,摘抄部分基本来自于本书在github上公开的电子版本。希望对深度学习有兴趣的同侪都能够购买印刷版以支持作者

实例:学习异或函数XOR

对于 \[ \boldsymbol{X} = \left[\begin{matrix}0 & 0 \\ 0 & 1 \\ 1 & 0 \\ 1 & 1\end{matrix}\right], \boldsymbol{y} = \left[\begin{matrix}0 \\ 1 \\ 1\\ 0\end{matrix}\right] \] 这样的数据,由于其是线性不可分的,因此不能使用线性模型分隔开。要想将其完美地分开,需要通过一些非线性变化将其映射到一个空间\(\mathcal{Z}\)里,使样本经过映射以后在新的空间线性可分。神经网络能做到这一点的原因就是在隐藏层的隐藏单元使用了非线性变换(称为激活函数)。书中使用的是整流线性单元(ReLU),变换以后的数据变得线性可分

基于梯度的学习

由于神经网络中的隐藏层基本都使用了非线性变换,因此大多数代价函数都非凸,要优化也只能使用迭代的,基于梯度的优化。代价函数通常使用训练数据和模型预测之间的交叉熵(cross entropy),而输出层的形式决定了交叉熵函数的形式。通常情况下,输出层有如下几种(假设前面已经使用若干隐藏层提供了一组隐藏特征\(\boldsymbol{h}\),输出层是要对这些特征做一些额外变换来完成任务)

  • 用于高斯输出分布的线性单元,即对隐藏特征不做非线性变换,直接产生\(\hat{\boldsymbol{y}} = \boldsymbol{W}^\mathsf{T}\boldsymbol{h}+\boldsymbol{b}\)。其用来产生条件高斯分布的均值:\(p(\boldsymbol{y}|\boldsymbol{x}) = \mathcal{N}(\boldsymbol{y}; \hat{\boldsymbol{y}}, \boldsymbol{I})\)

  • 用于伯努利输出分布的sigmoid单元,即对隐藏特征先用线性层求\(z = \boldsymbol{w}^\mathsf{T}\boldsymbol{h} + b\),然后对这个值做一个sigmoid变换\(\sigma(z)\)将其映射到\([0, 1]\)区间,转化成一个概率值

  • 用于多元伯努利输出分布的softmax单元,可以看作是伯努利输出分布 x sigmoid单元在多分类问题上的推广。此时输出标签空间是一个离散的,多类别的集合。假如一共有\(K\)个类别,则标签空间\(\mathcal{Y} = \{0, 1,2,\ldots, K-1\}\)。对隐藏特征做线性变换\(\boldsymbol{z} = \boldsymbol{W}^\mathsf{T}\boldsymbol{h} + \boldsymbol{b}\)后,softmax函数\({\rm softmax}(\boldsymbol{z})\)得到一个向量,这个向量的每个维度可以看做是输入样本属于对应类别标签的概率,因此有\(\forall i \in \{0, 1, \ldots, K-1\}, z_i \in [0, 1] \land \sum_{i}z_i = 1\)。softmax函数的具体形式为 \[ {\rm softmax}(\boldsymbol{z})_i = \frac{\exp(z_i)}{\sum_j \exp(z_j)} \]

  • 其它输出类型,例如混合密度网络(mixture density network)

隐藏单元

选择隐藏单元实际上就是要选择一个合适的激活函数。常见的有如下几种隐藏单元:

  • 整流线性单元(ReLU):\(g(z) = \max\{0, z\}\)。优点是易于优化,二阶导数几乎处处为0,处于激活状态时一阶导数处处为1,也就是其相比于引入二阶效应的激活函数,梯度方向对学习更有用。如果使用ReLU,第一步做线性变换\(\boldsymbol{W}^\mathsf{T}\boldsymbol{x} + \boldsymbol{b}\)时的\(\boldsymbol{b}\)一般设置成一个小的正值。缺陷是不能通过基于梯度的方法学习那些使单元激活为0的样本
  • sigmoid函数或双曲正切函数\(\tanh\)。两者之间有一个联系:\(\tanh(z) = 2\sigma(2z) - 1\)。两者都比较容易饱和,仅当\(z\)接近0时才对输入强烈敏感,因此使基于梯度的学习变得非常困难,不适合做前馈网络中的隐藏单元。如果必须要使用这两种中的一个,那么\(\tanh\)通常表现更好,因为在0附近其类似于单位函数。即,如果网络的激活能一直很小,训练\(\hat{y} = \boldsymbol{w}^\mathsf{T}\tanh(\boldsymbol{U}^\mathsf{T}\tanh(\boldsymbol{V}^\mathsf{T}\boldsymbol{x}))\)类似于训练一个线性模型\(\hat{y} = \boldsymbol{w}^\mathsf{T}\boldsymbol{U}^\mathsf{T}\boldsymbol{V}^\mathsf{T}\boldsymbol{x}\)。RNN和一些自编码器有一些额外的要求,因此不能使用分段激活函数,此时这种类sigmoid单元更合适

其它隐藏单元不太常用。也许有的隐藏单元效果更好,但是还没被发现

架构设计

神经网络的架构是指其整体结构:具有多少单元,如何连接,以及深度(有多少个隐藏层)和宽度(每个隐藏层有多少个隐藏单元)。大多数前馈神经网络都是链式结构

万能近似定理(universal approximation theorem)近似可以理解为,如果至少有一个隐藏层使用了前面所说的激活函数,且输出层使用线性变换,那么在隐藏单元足够的情况下,其可以逼近任意函数。但是实际使用时,使用单个隐藏层可能会导致不能正确学习和泛化,因此需要更深的模型

其它架构,包括RNN和CNN等,将在之后的章节介绍

坚持原创技术分享,您的支持将鼓励我继续创作!