机器学习中常见的逻辑回归和线性回归,都是线性的,它们简单高效。 但也有明细缺陷,表达能力弱,无法描述非线性问题。为了扩展它们的表达能力, 通常可以通过非线性地改变输入φ(x),比如:添加核函数。 设计选择φ(x)的方法:
使用一个通用的 φ,例如无限维的 φ。 总是有足够的能力 来拟合训练集,但是对于测试集的泛化往往不佳。
手动地设计 φ。在深度学习出现以前,这一直是主流的方法, 通常是根据各个领域的问题,设计不同的φ
深度学习的策略是去学习 φ。此时,我们定义函数族 φ(x; θ), 并且使用优化算法来寻找 θ。这种方法可以同时获得上面两张方法的好处。
实例:学习 XOR(异或)
线性模型是无法拟合XOR函数的,但是可以通过多层非线性模型来拟合。实例中使用ReLU激活函数来实现非线性变换。基于梯度的学习
神经网络的非线性导致大多数损失函都变得非凸。但是,用于非凸损失函数的随机梯度下降不保证收敛性,并且对参数的初始值很敏感。因而对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的。偏置则可以初始化为零或者小的正值。
2.1 代价函数
大多数现代的神经网络使用最大似然来训练。这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵等价。这个代价函数表示为:
对输出分布的最大似然估计和对线性模型均方误差的最小化是等价的
代价函数的梯度必须足够的大和具有足够的预测性。饱和(变得非常平)的函数破坏了这一目标,因为它们把梯度变得非常小。这在很多情况下都会发生,因为用于产生隐藏单元或者输出单元的输出的激活函数会饱和。很多输出单元都会包含一个指数函数,这在它的变量取绝对值非常大的负值时会造成饱和。负对数似然代价函数中的对数函数消除某些输 出单元中的指数效果。
学习条件统计量
使用最小化均方误差代价函数(L2)将得到一个函数, 它可以用来对每个 x 的值预测出 y 的均值
使用L1的代价函数将得到一个函数可以对每个 x 预测 y 取值的中位数
2.2 输出单元
2.2.1 用于高斯输出分布的线性单元
给定特征 h,线性输出单元层产生一个向量 yˆ = W⊤h + b,线性输出层经常被用来产生条件高斯分布的均值
2.2.2 用于 Bernoulli 输出分布的 sigmoid 单元:
σ(x) = 1/(1+ e ^-x)
当我们使用其他的损失函数,例如均方误差之类的,损失函数会在 σ(z) 饱和时饱和。sigmoid 激活函数在 z 取非常小的负值时会饱和到 0,当 z 取非常大的正值时 会饱和到 1。这种情况一旦发生,梯度会变得非常小以至于不能用来学习,无论此模型给出的是正确还是错误的答案。因此,最大似然几乎总是训练 sigmoid 输出单元的优选方法。
2.2.3 用于 Multinoulli 输出分布的 softmax 单元
负对数似然代价函数总是强烈地惩罚最活跃的不正确预测。如果正确答案已经具有了 softmax 的最大输入,那么 −zi 项和 log ∑ exp(zj ) ≈ maxj zj = zi j项将大致抵消。这个样本对于整体训练代价贡献很小,这个代价主要由其他未被正确分类的样本产生。
- 隐藏单元
大多数的隐藏单元都可以描述为接受输入向量 x,计算仿射变 换 z = W⊤x + b,然后使用一个逐元素的非线性函数 g(z)。大多数隐藏单元的区别 仅仅在于激活函数 g(z) 的形式。
激活函数:
整流线性单元激活函数: g(z) = max{0, z},优点:计算简单,梯度不消失,缺点:在 z = 0 处不可微, 不能通过基于梯度的方法学习那些使它们激活为零的样本。
绝对值整流(absolute value rectification): g(z) = |z|
渗漏整流线性单元:g(z, α)= max(0, z) + αmin(0, z), a是个很小的数,如:0.01
参数化整流线性单元(parametric ReLU)或者 PReLU: g(z, α)= max(0, z) + αmin(0, z),将 α 作为学习的参数。
maxout 单元(maxout unit)
sigmod: σ(x) : x很大或很小的时候梯度饱和, 取值范围不是0对称。
双曲正切函数:g(z)=tanh(z)=2σ(2x)-1 , 取值范围0对称
- 架构设计
在这些链式架构中,主要的架构考虑是选择网络的深度和每一层的宽度。即使只有一个隐藏层的网络也足够适应训练集。更深层的网络通常能够 对每一层使用更少的单元数和更少的参数,并且经常容易泛化到测试集,但是通常也更难以优化。
万能近似定理(universal approximation theorem):一个前馈神经网络如果具有线性输出层和至少一层具有任何一种 “挤压” 性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的 Borel 可测函数。在 Rn 的有界闭集上的任意连续函数是 Borel 可测的, 因此可以用神经网络来近似。
总之,具有单层的前馈网络足以表示任何函数,但是网络层可能大得不可实现, 并且可能无法正确地学习和泛化。在很多情况下,使用更深的模型能够减少表示期 望函数所需的单元的数量,并且可以减少泛化误差。
- 反向传播和其他的微分算法
反向传播(back propagation)算法,经常简称为backprop,允许来自代价函数的信息通过网络向后流动, 以便计算梯度。
The chain rule of derivatives tells us how two small effects (that of a small change of x on y, and that of y on z) are composed. A small change Δx in x gets transformed first into a small change Δy in y by getting multiplied by ∂y/∂x (that is, the definition of partial derivative). Similarly, the change Δy creates a change Δz in z. Substituting one equation into the other gives the chain rule of derivatives — how Δx gets turned into Δz through multiplication by the product of ∂y/∂x and ∂z/∂x. It also works when x, y and z are vectors (and the derivatives are Jacobian matrices).
c: The equations used for computing the forward pass in a neural net with two hidden layers and one output layer, each constituting a module through which one can backpropagate gradients. At each layer, we first compute the total input z to each unit, which is a weighted sum of the outputs of the units in the layer below. Then a non-linear function f(.) is applied to z to get the output of the unit. For simplicity, we have omitted bias terms. The non-linear functions used in neural networks include the rectified linear unit (ReLU) f(z) = max(0,z), commonly used in recent years, as well as the more conventional sigmoids, such as the hyberbolic tangent, f(z) = (exp(z) − exp(−z))/(exp(z) + exp(−z)) and logistic function logistic, f(z) = 1/(1 + exp(−z)).
d: The equations used for computing the backward pass. At each hidden layer we compute the error derivative with respect to the output of each unit, which is a weighted sum of the error derivatives with respect to the total inputs to the units in the layer above. We then convert the error derivative with respect to the output into the error derivative with respect to the input by multiplying it by the gradient of f(z). At the output layer, the error derivative with respect to the output of a unit is computed by differentiating the cost function. This gives yl − tl if the cost function for unit l is 0.5(yl − tl) , where tl is the target value. Once the ∂E/∂zk is known, the error-derivative for the weight wjk on the connection from unit j in the layer below is just yj ∂E/∂zk