损失函数和代价函数

我们使用交叉熵损失(Cross Entropy Loss)函数作为逻辑回归算法的损失函数,其公式如下

image

其中, image为 Sigmoid 函数,通过计算给出的输入和自身权重乘积(以及加上偏置),经过Sigmoid函数的处理,最后计算出一个处于(0,1)之间的概率,这个概率表示预测为真的概率。Sigmoid函数公式如下:

image

其中 imageimage等价,都是计算 image,只不过前者为矩阵写法,表示一个一维矩阵image的转置(transpose)乘以另外一个一维矩阵image,而后者是常见的求和公式。使用矩阵写法不仅在书写上更方便,也更符合我们需要在NumPy中需要写的代码。

一个小细节:为什么机器学习中总是习惯性的写成image,而不是image?因为在机器学习中,我们习惯性的将imageimage视作形状为 image的列向量(column vector) ,于是image实际上是一个形状image,求转置后,成为一个形状为image的矩阵,然后乘以另一个形状为 image的矩阵。如果你足够了解矩阵乘法,那么你就会知道前者的计算结果是一个形状为image的矩阵;而后者的计算结果是一个image的矩阵。在这里我们只想要得到一个标量,而不需要一个矩阵。

交叉熵损失函数如果写成一行公式,则可以表示为(以下这个公式和上面的损失函数是完全等价的):

image

而整个数据集的代价函数,加上L2正则化项,则可以表示为:

image

计算梯度

由于逻辑回归的损失函数是一个非常复杂的复合函数,我们使用链式法则对这个函数求导,以计算得到梯度。首先我们求在代价函数在image方向上的梯度:

image

我们把image单独拎出来计算,并且用image代替image(仅仅是为了书写简单)。根据链式法则我们有:

image

通常这里的image函数的底可以是任意实数,但是为了我们计算简便,我们使用自然常数image作为底:

image

接着我们求image,我们设image,根据链式法则我们有:

image

关于 Sigmoid 函数求导,其过程如下:

image

image

于是我们有:

image

结果非常的amazing啊,交叉熵损失函数CEL的求导结果竟然和我们在线性回归中使用的损失函数MSE的求导结果一模一样。我们将这个求导结果带入代价函数,得到代价函数在image方向上的梯度:

image

我们接着计算这个损失函数在 image方向上的偏导,求导过程几乎和上面展示的一样,唯一的不同是 imageimage(假设 image):

image

于是我们更新梯度的公式为:

image

多项式逻辑回归

逻辑回归只能处理二分类问题,如果想要预测有多个标签的结果,单个逻辑回归模型就无能为力了。处理多标签分类问题时,最直观、最容易想到的办法是先将其中几个聚集为一类,分类,然后再在每个子类内继续分类。例如我们现在需要分类的结果有 [0, 1, 2, 3] 四类,那么我们可以先将0和1分为一类,3和4分为另一类,这样问题就简化成了多个二分类问题:

在处理多分类的问题的时候,我们首先需要将预测标签编码成 one-hot 编码。例如在上例中,我们想要预测的结果有四类[0, 1, 2, 3],但是我们实际的标签——假设这条数据的类别是2——则是[0, 0, 1, 0],分别对应这[0, 1, 2, 3]。或者假设我们要预测的标签为 [红色, 绿色, 蓝色],而这单条样本的标签为绿色,则我们需要将image编码成 [0,1,0] (注意,我们所有的标签都需要遵循一样的次序)。

这里我们需要连续训练三个逻辑回归模型,如果需要分的类别越多,则需要训练的模型也越多。有更简单的方法吗?有的!在面对多分类问题时,我们可以使用多项式逻辑回归(Polynomial Logistic Regression)。多项式逻辑回归的核心是 Softmax 函数,我们用 Softmax 函数取代而二项式逻辑回归中的 Sigmoid 函数:

image

这里的image表示每个类别的输入和其权重的乘积再加上偏置,即image。假设我们有三个类别需要分类,分别是 [0, 1, 2] 三个类别:

  1. 我们首先初始化三组权重,分别是 imageimageimageimageimageimage
  2. 接着我们计算权重和输入的乘积 imageimageimage;
  3. 最后我们通过 Softmax函数,计算出每个分类的概率imageimageimage。这样我们就能得到三个概率,分别对应着预测为0、1、2三类的概率,并且image

我们使用softmax函数主要是为了将预测的结果归一化为三个加起来等于1的概率,那为什么使用以 image为底的 Softmax 函数,而不是直接使用image呢?后者不也可以将多个输出归一到和为1的多个概率吗?使用以 image 为底的指数函数的目的主要有两个:一个是可以保证结果中不会出现负数,二个是可以利用指数爆炸的性质,放大多个预测结果之间的差异,使其更贴合我们期望的“其中一个类别的预测结果趋近于1,而其他几个类别的预测结果接近于0”的预测结果。至于为什么底是image?当然是为了我们后面计算梯度的时候求导方便啦!

这个时候我们得到了三个概率,那我们该怎么计算梯度,更新我们模型的权重参数呢?在多分类问题中,我们沿用逻辑回归中的损失函数 image。假设数据的真实标签是0,那么我们期望我们的模型的输出为 [1, 0, 0](分别对应imageimageimage),但是我们模型实际输出为[0.34, 0.33, 0.33],那么我们的模型这一轮训练的损失为image。后面两项为0,这意味着在多项式分类中,我们只关心标签为真的项的损失。

计算多项式逻辑回归的梯度

跟之前求导梯度不一样的是,我们现在一共有image组权重,并且每组权重内有image个权重以及一个偏置image。(假设我们预测的结果一共有image类,并且每条数据的维度为image维)。

image

跟之前不同的是,之前的权重只有一个维度,而这里的权重成为了一个二维的矩阵,我们接下来要分别求出这个矩阵中每一个参数的梯度。在计算Softmax函数梯度之前,我们要根据标签image的值分成两种情况,分别分成image 的时候和 image的时候。因为当image的时候,Softmax函数的分子内包含我们要求的参数的偏导;而image 的时候,Softmax函数的分子内不包含我们要求的参数的梯度,因此我们可以将分子上的式子视作一个常数。

由于我们需要根据标签的值分成多种情况求导,当预测标签的值不一样的时候,我们计算各个参数的梯度的方式也不一样。所以和之前不一样的是,我们需要先计算单个样本上的梯度,再将所有梯度总和起来,最后将总和起来的梯度更新到权重上去——而不是将所有样本总和在一起批量求得梯度。

我们先求当image的时候,imageimage的梯度(这里image表示image的第几组权重,而image表示image的每组权重中的第几个权重):

image

同理可得:

image

我们再求当 image的时候,imageimage的梯度:

image

同理可得:

image

imageimage代表了数据实际的标签,是一个[0,0,…,1,…,0,0] 的数组,所以所有 image加起来等于一。
关于Softmax函数求导,其求导过程如下,当 image的时候:

image

image的时候:

image

其中 image

image可以写成 image的形式,当 image的时候,image;而当image的时候,image。于是梯度计算又回到了我们熟悉的形式:

image

image