前馈网络
定义
神经网络:$<V,E,\sigma,w>, E\subseteq V\times V,w:V\times V\to R, \sigma:V\times R\to R $,
输出函数$f(v)$递归定义为$$\begin{aligned}f(v)&=x(v)&,if\,\nexists u,<v,u>\in E\\ f(v)&=\sigma(v,y(v)), y(v)=\sum_{\forall u<v,u>\in E} w(v,u)f(u)&,if\,\exists u,<v,u>\in E\end{aligned}$$
主要用途在于拟合给定数据集{<X,Z>}。其拟合能力有理论保障:
- 万能近似定理(universal approximation theorem)
- 一个前馈神经网络如果具有线性输出层和至少一层具有任何一种‘‘挤压’’性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数。
- Montufar etal.(2014)的主要定理指出,具有d个输入、深度为l、每个隐藏层具有n个单元的深度整流网络可以描述的线性区域的数量是$O(\binom{n}{d}d^{l-1}n^d)$
训练算法
通常使用梯度下降(反向传播算法)来最小化代价函数$l$,即函数近似误差。
反向传播$\delta(v)$递归定义为$$\begin{aligned}\delta(v)&=\frac{\partial l(z,f)}{\partial f}&,if\,\nexists u,<u,v>\in E\\ \delta(v)&=\sum_{\forall u<u,v>\in E}\delta(u)\frac{\partial \sigma(u,y)}{\partial y}w(u,v)\,&,if\,\exists u,<u,v>\in E\end{aligned}$$
参数$w(u,v)$导数为$$\frac{\partial l}{\partial w(u,v)}=\delta(u)\frac{\partial \sigma(u,y)}{\partial y}f(v) $$
单元函数选择
非线性导致大多数代价函数都变得非凸。用于非凸代价函数的随机梯度下降没有收敛性保证,并且对参数的初始值很敏感。
- 代价函数$l$
- 函数的梯度必须足够大、具有足够的预测性,例如满足ML。
- 通常有$MSE(f,z)=E[(f-z)^2]$和交叉熵$H(p,q)=E_{X\sim p}[\log q(x)]$
- 输出单元
- 用于高斯分布的线性单元,输出其均值,ML等价于最小化MSE
- 用于Bernoulli分布的$sigmoid(x)=({1+exp(-x)})^{-1}$,此时对数ML可以避免饱和。
- 用于Multinoulli分布的$softmax(x_j)=\frac{exp(x_j)}{\sum_iexp(x_i)}$
- 用于高斯混合模型的距离判断单元
- 隐藏单元
- $ReLU(x)=max(x,0)$,$softplus(x)=log(1+exp(x))$等。
- 径向基、双曲正切函数、Sigmoid容易饱和
- 技术进步
- 使用交叉熵损失函数,大大提高了具有sigmoid和softmax输出的模型的性能;当使用MSE时,会产生非常小的梯度。
- 出现了组合层:$f_i(X)=\sum_j g_{ij}(W_{ij}X)$来优化学习。
- 使用分段线性隐藏单元来替代sigmoid隐藏单元,提高性能。
- 从生物学考虑整流线性单元的导出。半整流非线性旨在描述生物神经元的这些性质
- 对于某些输入,生物神经元是完全不活跃的。
- 对于某些输入,生物神经元的输出和它的输入成比例。
- 大多数时间,生物神经元是在它们不活跃的状态下进行操作,即它们应该具有稀疏激活(sparse activation)。
正则化
- 对学习算法的修改——旨在减少泛化误差而不是训练误差
- 参数的正则化惩罚:以偏差的增加来换取方差的减少。
- L2正则化:与输出目标的协方差较小的特征的权重将会收缩。
- L1正则化:产生更稀疏(sparse)的解。
- 许多正则化策略可以被解释为 MAP 贝叶斯推断
- 提前终止
- 解决训练误差降低时,泛化误差的上升问题,利用验证集来检测这一点
- 强化数据集:为输入、输出注入噪声;多尺度缩放数据
- dropout
- 在训练中随机屏蔽隐藏单元,可理解为乘性的噪声,防止对少数权重的过渡依赖。
- 在测试中,为权重乘以dropout概率,可理解为自动的Bagging集成策略
- 批标准化:自适应的重新参数化,降低非相邻层的高阶影响。$given\;Y_{old}=XW$
- $$Y_{new}=\gamma Y'+\beta, Y'=\frac{(Y-\mu)}{\sigma}, \mu=\frac{1}{m}\sum_iY_i,\sigma^2=\delta+\frac{1}{m}\sum_i(Y_i-\mu)^2$$
模型训练
问题:病态、局部极小点、鞍点、悬崖、长期依赖、局部与全局结构的弱对应
选择一族容易优化的模型
- 层之间的线性变换
- 几乎处处可导的激活函数,其在大部分定义域都有明显的梯度
- 采用代理损失函数:优化终止时,导数仍然较大。
优化算法:
- 梯度下降SGD:随机小批量更新,易于并行处理,具有一些正则化效果
- 动量法:每步更新是上一步的更新与当前梯度的组合
- 优化轨迹:坐标轮转、轨迹平滑
自适应学习率:
- AdaGrad:每个学习率反比于其梯度历史向量的2范数。
- RMSProp:每个学习率反比于其梯度历史向量的(加权)2范数。
- Adam:每个学习率反比于其梯度历史向量的偏一阶矩、偏二阶矩的经验函数。
优化策略
- 延拓算法:构造一系列逐渐逼近的代价函数
- 预训练:构造一系列模型来迁移权重
开发方法
- 确定目标:根据问题,确定误差度量,并指定目标值。
- 精度是正确率p,而召回率则是真实事件被检测到的比率r。
- 尽快建立一个端到端的的工作流程,包括估计合适的性能度量。
- 模型结构和训练算法
- 搭建系统,并确定性能瓶颈。
- 检查哪个部分的性能差于预期,以及是否是因为过拟合、欠拟合,或者数据或软件缺陷造成的。
- 可视化,单元测试,检测数值梯度等等
- 根据具体观察反复地进行增量式的改动,如收集新数据、调整超参数或改进算法。
超参数 | 提高性能 | 原因 | 注意事项 |
隐藏单元数量 | 增加 | 增加隐藏单元数量会增加模型的表示能力。 | 复杂度增加 |
学习率 | 最优 | 提高学习速度 | |
卷积核宽度 | 增加 | 增加模型的参数数量。 | |
隐式零填充 | 增加 | 保持尺寸 | |
权重衰减系数 | 降低 | 提高模型参数 | |
Dropout 比率 | 降低 | 提高精度 |
参考文献
- Deep learning, www.deeplearning.net