小鱼儿clouding的博客

从数学推导看机器学习的激活函数与损失函数

关于回归任务和分类任务在不同函数上的选择

引言

本文尝试从数学的角度,分析线性回归、二分类、多分类机器学习任务下,选择不同损失函数和激活函数的原因。

负对数似然

假设有一个参数为 θ\theta 的模型。对于一组观测数据 Y={y1,y2,...,yn}Y = \{y_1, y_2, ..., y_n\},似然函数 L(θ)L(\theta) 表示的是在参数为 θ\theta 的情况下,这组数据发生的概率。

根据独立同分布假设,总概率等于单样本概率的连乘:

L(θ)=P(y1,...,yn∣θ)=∏i=1nP(yi∣θ)L(\theta) = P(y_1, ..., y_n | \theta) = \prod_{i=1}^n P(y_i | \theta)

似然越大,说明模型参数 θ\theta 越契合真实数据,所以机器学习初步的任务是最大化似然。

概率 P(yi∣θ)P(y_i \mid \theta) 通常是很小的数(比如 0.10.1)。如果有过多的样本连乘,可能会导致数值下溢。同时,求和导数的求取难度远小于求乘积的导数。取对数可以把 ∏\prod 变成 ∑\sum:

ln⁡L(θ)=ln⁡[∏i=1nP(yi∣θ)]=∑i=1nln⁡P(yi∣θ)\ln L(\theta) = \ln\left[\prod_{i=1}^n P(y_i | \theta)\right]=\sum_{i=1}^n \ln P(y_i | \theta)

由于 ln⁡\ln 函数的单调性,最大化 L(θ)L(\theta) 等价于最大化 ln⁡L(θ)\ln L(\theta) 。又为了配合梯度下降算法,这一寻找等价于最小化 −ln⁡L(θ)-\ln L(\theta),即负对数似然(NLL\mathrm{NLL})。

损失函数

回归任务

在回归任务中,预测值是连续的实数。记模型预测值为 t=f(x)t=f(x),假设真实值 yy 是在该预测值基础上叠加一个服从高斯分布的随机噪声 ϵ\epsilon。即:

y=t+ϵ,ϵ∼N(0,σ2)y = t + \epsilon, \quad \epsilon \sim \mathcal{N}(0, \sigma^2)

给定 xx,yy 的条件概率分布是一个以模型预测值 tt 为均值的高斯分布:

P(y∣x)=12πσ2exp⁡(−(y−t)22σ2)P(y|x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(y - t)^2}{2\sigma^2}\right) −ln⁡P(y∣x)=−ln⁡[12πσ2exp⁡(−(y−t)22σ2)]=12σ2(y−t)2−ln⁡12πσ2\begin{aligned} -\ln P(y|x) =& - \ln \left[ \frac{1}{\sqrt{2\pi\sigma^2}} \exp \left( -\frac{(y - t)^2}{2\sigma^2} \right)\right]\\ =& \frac{1}{2\sigma^2} (y - t)^2 -\ln\frac{1}{\sqrt{2\pi\sigma^2}} \end{aligned}

在优化 θ\theta 时,常数项和系数均不影响极值点。最终得到均方误差:

LossMSE=(y−t)2Loss_{MSE} = (y - t)^2

二分类任务

在二分类任务中,输出 y∈{0,1}y \in \{0, 1\},假设其服从伯努利分布。令模型的输出 tt 代表模型认为结果为 11 的概率:

P(y=1∣x)=tORP(y=0∣x)=1−tP(y=1 | x) = t \quad \mathrm{OR} \quad P(y=0 | x) = 1-t

为了使得似然估计能更好体现模型对真实数据的契合性,得到如下似然函数

P(y∣x)=ty(1−t)1−yP(y|x) = t^y (1-t)^{1-y}

取 NLL\mathrm{NLL} 之后得到二元交叉熵损失:

LossBCE=−log⁡[ty(1−t)1−y]=−yln⁡t−(1−y)ln⁡(1−t)Loss_{BCE} =-\log \left[ t^y (1-t)^{1-y} \right]= -y \ln t - (1-y) \ln (1-t)

多分类任务

多分类任务假设 yy 服从类别分布。若有 KK 个类别,输出的是一个概率向量 t=[t1,t2,⋯ ,tK]Tt = [t_1,t_2,\cdots,t_K]^T,其中 tkt_k 代表属于第 kk 类的概率。

同上,得到似然函数

P(y∣x)=∏k=1KtkykP(y|x) = \prod_{k=1}^K t_k^{y_k}

取 NLL\mathrm{NLL} 之后得到交叉熵损失:

LossCE=−ln⁡(∏k=1Ktkyk)=−∑k=1Kykln⁡tkLoss_{CE} = -\ln \left( \prod_{k=1}^K t_k^{y_k} \right) = -\sum_{k=1}^K y_k \ln t_k

激活函数

激活函数的选择并不是独立于损失函数和任务目标而存在的。更自然的理解顺序是先看输出需要满足什么约束,再看在该约束下反向传播会得到怎样的梯度形式。

回归任务

回归任务的目标值是连续实数,因此模型末层需要保留实数域上的自由表达能力,最自然的选择就是线性激活。设模型最后一层输出为

z=wTx+b,z = w^T x + b,

并令

t=z.t = z.

在使用带 12\frac{1}{2} 系数的均方误差

Loss=12(t−y)2,Loss = \frac{1}{2}(t-y)^2,

时,根据链式法则有

∂Loss∂z=∂Loss∂t⋅∂t∂z=(t−y)⋅1=t−y.\frac{\partial Loss}{\partial z} = \frac{\partial Loss}{\partial t}\cdot\frac{\partial t}{\partial z} = (t-y)\cdot 1 = t-y.

也就是说,线性激活既满足回归输出范围的需求,也使末层梯度直接化为 t−yt-y。

二分类任务

二分类任务需要输出可解释为“属于正类的概率”,因此输出应落在 (0,1)(0,1) 内,这正是 Sigmoid\mathrm{Sigmoid} 的作用。设最后一层先产生 logit\mathrm{logit} zz,再经过 Sigmoid\mathrm{Sigmoid}:

t=σ(z)=11+e−z.t = \sigma(z) = \frac{1}{1+e^{-z}}.

对应该任务的二元交叉熵损失为

Loss=−[yln⁡t+(1−y)ln⁡(1−t)].Loss = -\big[y\ln t + (1-y)\ln(1-t)\big].

先对 tt 求导可得

∂Loss∂t=−yt+1−y1−t=t−yt(1−t).\frac{\partial Loss}{\partial t} = -\frac{y}{t} + \frac{1-y}{1-t} = \frac{t-y}{t(1-t)}.

再由 Sigmoid\mathrm{Sigmoid} 导数

∂t∂z=t(1−t).\frac{\partial t}{\partial z} = t(1-t).

二者链式相乘得到

∂Loss∂z=∂Loss∂t⋅∂t∂z=t−yt(1−t)⋅t(1−t)=t−y.\frac{\partial Loss}{\partial z} = \frac{\partial Loss}{\partial t}\cdot\frac{\partial t}{\partial z} = \frac{t-y}{t(1-t)}\cdot t(1-t) = t-y.

因此,Sigmoid\mathrm{Sigmoid} 在给出概率语义的同时,也与 BCE\mathrm{BCE} 配对出简洁的末层梯度 t−yt-y。

多分类任务

多分类任务要求输出是一个合法的类别概率分布,即各分量非负且总和为 1,因此末层选择 Softmax\mathrm{Softmax}。设最后一层 logits\mathrm{logits} 为 z=[z1,⋯ ,zK]Tz=[z_1,\cdots,z_K]^T,其输出为

ti=ezi∑j=1Kezj.t_i = \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}.

对应交叉熵损失

Loss=−∑i=1Kyiln⁡ti.Loss = -\sum_{i=1}^K y_i\ln t_i.

Softmax\mathrm{Softmax} 导数可以分两种情况讨论。记

ti=ezi∑j=1Kezj.t_i=\frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}.

当 i=ki=k 时,有

∂ti∂zi=ezi(∑j=1Kezj)−eziezi(∑j=1Kezj)2=ezi∑j=1Kezj(1−ezi∑j=1Kezj)=ti(1−ti).\frac{\partial t_i}{\partial z_i} =\frac{e^{z_i}\left(\sum_{j=1}^K e^{z_j}\right)-e^{z_i}e^{z_i}}{\left(\sum_{j=1}^K e^{z_j}\right)^2} =\frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}\left(1-\frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}\right) =t_i(1-t_i).

当 i≠ki\neq k 时,有

∂ti∂zk=0⋅(∑j=1Kezj)−eziezk(∑j=1Kezj)2=−ezi∑j=1Kezjezk∑j=1Kezj=−titk.\frac{\partial t_i}{\partial z_k} =\frac{0\cdot\left(\sum_{j=1}^K e^{z_j}\right)-e^{z_i}e^{z_k}}{\left(\sum_{j=1}^K e^{z_j}\right)^2} =-\frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}\frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}} =-t_i t_k.

于是对任意第 kk 个 logit\mathrm{logit},利用链式法则可得

∂Loss∂zk=∑i=1K∂Loss∂ti∂ti∂zk=∑i=1K(−yiti)∂ti∂zk=(−yktk)tk(1−tk)+∑i≠k(−yiti)(−titk)=−yk(1−tk)+∑i≠kyitk=−yk+yktk+tk∑i≠kyi=−yk+tk∑i=1Kyi.\begin{aligned} \frac{\partial Loss}{\partial z_k} &= \sum_{i=1}^K \frac{\partial Loss}{\partial t_i}\frac{\partial t_i}{\partial z_k}\\ &=\sum_{i=1}^K\left(-\frac{y_i}{t_i}\right)\frac{\partial t_i}{\partial z_k}\\ &=\left(-\frac{y_k}{t_k}\right)t_k(1-t_k)+\sum_{i\neq k}\left(-\frac{y_i}{t_i}\right)(-t_i t_k)\\ &=-y_k(1-t_k)+\sum_{i\neq k}y_i t_k\\ &=-y_k+y_k t_k+t_k\sum_{i\neq k}y_i\\ &=-y_k+t_k\sum_{i=1}^K y_i. \end{aligned}

由于 one−hot\mathrm{one-hot} 满足 ∑i=1Kyi=1\sum_{i=1}^K y_i=1,故

∂Loss∂zk=tk−yk.\frac{\partial Loss}{\partial z_k}=t_k-y_k.

写成向量形式即

∇zLoss=t−y.\nabla_z Loss = t-y.

可见,Softmax\mathrm{Softmax} 不仅满足多分类分布约束,也在与交叉熵联用时给出统一的末层梯度形式 t−yt-y。

统一视角

可以看到,三种任务在最后一层都得到同一个核心误差:

∂Loss∂z=t−y.\frac{\partial Loss}{\partial z}=t-y.

不同任务激活函数不同,本质是因为输出空间和概率模型不同。从反向传播角度看,正是这些激活函数与损失函数的配对,使得梯度形式统一、实现简洁。