Logistic regression 将 sigmoid 函数 $s(x) = frac{1}{1+e^{-x}}$ 视为样本属于正例($y=1$)的概率。给定一个参数向量 $ heta$,所有训练样本都属于它们被标记的类别的概率为 $$L( heta) = prod_i (s(x_i^T heta))^{y_i}(1-s(x_i^T heta))^{1-y_i}$$ 其中 $x_i$ 表示第 $i$ 个训练样本的各个特征组成的向量,$y_i$ 表示第 $i$ 个训练样本的“答案分类”,是一个为 0 或者为 1 的数值。对上式取对数并加上负号,就获得了 logistic regression 的损失函数 $$J( heta) = -sum_i (y_i ext{log}(s(x_i^T heta)) + (1-y_i) ext{log}(1-s(x_i^T heta)))$$ 显然 $J( heta)$ 越小,$L( heta)$ 就越大。也就是说,logistic regression 使用了极大似然估计法,作为训练 $ heta$ 的标准。
我们可以通过求出 $J( heta)$ 的梯度,再使用梯度下降法从而求出 $ heta$ 的最优值。当然,这就要求 $J( heta)$ 是一个凸函数。以下对这些内容进行简单推导。
代价函数是否为凸函数
首先将代价函数展开并进行整理,我们可以发现 $$J( heta) = -sum_i (y_ix_i^T heta - ext{log}(1+e^{x_i^T heta}))$$
接下来我们证明 $J( heta)$ 为凸函数。为了简化问题,我们转而证明 $J(x) = -yx+ ext{log}(1+e^x)$ 是凸函数(其中 $x$ 和 $y$ 均为数值)。很容易发现两者的证明是等价的。
要证明 $J(x)$ 为凸函数,我们可以观察它的二次导数:$$J^{''}(x) = frac{e^x(1+e^x)-(e^x)^2}{(1+e^x)^2} = frac{e^x}{(1+e^x)^2}$$ 容易发现 $J(x)$ 的二次导数非负,可以证明 $J(x)$ 是凸函数,也就证明了 $J( heta)$ 是凸函数,可以使用梯度下降法进行优化。
梯度的计算
接下来我们计算 $ abla_ heta J( heta)$:$$ abla_ heta J( heta) = sum_i abla_ heta ext{log}(1+e^{x_i^T heta}) - sum_i abla_ heta y_ix_i^T heta$$ 对第二项使用 $ ext{tr}(ABC) = ext{tr}(CAB)$ 有(注意到 $y_i$ 是数值,并不需要交换顺序): $$ abla_ heta y_ix_i^T heta = abla_ heta ext{tr}( heta y_ix_i^T) = y_ix_i$$ 对第一项使用链式求导法则有:$$ abla_ heta ext{log}(1+e^{x_i^T heta}) = frac{e^{x_i^T heta}}{1+e^{x_i^T heta}} abla_ heta x_i^T heta = s(x_i^T heta)x_i$$ 所以我们有:$$ abla_ heta J( heta) = sum_i(s(x_i^T heta) - y_i)x_i$$ 这样我们就可以使用梯度下降法求出最优的 $ heta$ 了。