损失函数
模型的训练过程也就是最小化损失函数的过程。 在多类别的对数回归模型中,通常采用负对数似然函数作为模型的参数。这相当于在以 θ 为参数的模型中,最大化训练数据的似然。如果我们定义似然和损失函数如下:
0-1损失
在本指南中介绍的方法也常常用于一般的分类问题中。训练一个分类器的目的是最小化预测函数在测试实例上面的错误。这种错误最简单的表示方法是0-1损失。如果预测函数定义为 f:RD−>0,...,L ,那么损失函数可以表示为:
这里, D 可以是训练过程中的训练数据,或者和训练数据没有任何交集,以避免验证或测试过程中的偏差。 指标函数 I 定义为:
在本指南中,预测函数定于为:
在python中,结合Theano,该函数的实现如下:
# zero_one_loss is a Theano variable representing a symbolic # expression of the zero one loss ; to get the actual value this # symbolic expression has to be compiled into a Theano function (see # the Theano tutorial for more details) zero_one_loss = T.sum(T.neq(T.argmax(p_y_given_x), y))
负对数似然损失
因为0-1损失函数是不可微的,在一个含有几千甚至几万个参数的复杂问题中,模型的求解变得非常困难。因此我们最大化分类器的对数似然函数:
正确类别的似然,并不和正确预测的数目完全一致,但是,从随机初始化的分类器的角度看,他们是非常类似的。但是请记住,似然函数和0-1损失函数是不同的,你应该看到他们的在验证数据上面的正相关性,但是有时候又是负相关。(这段是不是很明白)
既然我们可以最小化损失函数,那么学习的过程,也就是最小化负的对数似然函数的过程:
NLL函数其实是0-1损失函数的一种可以微分的替代,这样我们就可以用它在训练集合的梯度来训练分类器。相应的代码如下:
# NLL is a symbolic variable ; to get the actual value of NLL, this symbolic # expression has to be compiled into a Theano function (see the Theano # tutorial for more details) NLL = -T.sum(T.log(p_y_given_x)[T.arange(y.shape[0]), y]) # note on syntax: T.arange(y.shape[0]) is a vector of integers [0,1,2,...,len(y)]. # Indexing a matrix M by the two vectors [0,1,...,K], [a,b,...,k] returns the # elements M[0,a], M[1,b], ..., M[K,k] as a vector. Here, we use this # syntax to retrieve the log-probability of the correct labels, y.
当在深度学习中采用minibatch的时候,SGD稍微有一点变化。在minibatch SGD中,我们每次用多个训练数据来估计梯度。这种技术减少了估计的梯度方差,也充分的利用了现在计算机体系结构中的内存的层次化组织技术。
L1/L2规则化这种简单的方法并不一定意味着模型的泛化。在实际应用过程中,人们发现在神经网络中应用这种技术有助于泛化,特别是小数据集上面。下面的代码演示了如何应用这种技术。
提前结束训练是另一种处理训练过度的办法,它的解决思路是监测模型在验证数据上的表现。验证数据在训练过程中,可以用来做测试数据。如果模型的性能在验证数据中改进很小,真是变差,那么就应该放弃进一步的优化。