# Logistic Regression逻辑回归的损失函数与梯度下降训练

$h(\alpha) = \frac{1}{1+e^{-\alpha}}$

$h_{\boldsymbol{\theta}}(\boldsymbol{x}) = g(\boldsymbol{\theta}^T \boldsymbol{x}) = \frac{1}{1+e^{-\boldsymbol{\theta}^T \boldsymbol{x}}} \tag{1}$

# 损失函数

$L(Y, P(Y|X)) = -\log(P(Y|X))$

L(h_{\theta}(x), y)= \left\{ \begin{aligned} & -\log(h_\theta(x)) & {y = 1}\\ & -\log(1-h_\theta(x)) & {y = 0}\\ \end{aligned} \right.

$L(h_{\theta}(x), y) = -y \log(h_\theta (x)) - (1-y)\log(1-h_\theta (x)) \tag{2}$

(2)式就是逻辑回归的损失函数的形式。如果$y=1$，loss会计算上式中的前半部分，如果$y = 0$，loss计算上式的后半部分。无论0或1，只要分类错误，loss都会变得很大。

$f(x) = P(y=1|x)^y \left(1-P(y=1|x)\right)^{(1-y)}$

$L(\boldsymbol\theta) = \prod_{i=1}^m P(y=1|x_i)^{y_i} \left(1-P(y=1|x_i)\right)^{(1-y_i)}$

\begin{aligned} \ln L(\boldsymbol{\theta}) &= \sum_{i=1}^m y_i \ln P(y=1|x_i) + (1-y_i) \ln \left(1-P(y=1|x_i)\right) \\ &= \sum_{i=1}^m y_i \ln h_{\boldsymbol{\theta}}(x_i) + (1-y_i) \ln \left(1-h_{\boldsymbol{\theta}}(x_i)\right) \end{aligned} \tag{3}

（3)式的形式和(2)式是等价的，只不过对数上一个取log一个取ln。因此才会有逻辑回归的损失函数是从极大似然估计推导而来的说法。

# 梯度下降法训练

## 损失函数求导

$g(z) = \frac{1}{1+e^{-z}}$

\begin{aligned} g'(z) &= \frac{\partial}{\partial z} \frac{1}{1+e^{-z}} \\ &= -\frac{1}{(1+e^{-z})^2} \frac{\partial} {\partial z} e^{-z} \\ &= \frac{e^{-z}}{(1+e^{-z})^2} \\ &= \left(1-\frac{1}{1+e^{-z}}\right) \frac{1}{1+e^{-z}} \\ & = g(z)(1-g(z)) \end{aligned} \tag{4}

(2)式的逻辑回归损失函数对参数$\theta$求导。求导时，我们先对单个样本的第$j$个参数$\theta_j$求导（即第j维特征），并且将(2)式中的对数取以e为底的对数。

\begin{aligned} \frac{\partial}{\partial \theta_j} L(\boldsymbol{\theta}) &= -y \frac{1}{g(\boldsymbol{\theta^T x})} \frac{\partial}{\partial \theta_j} g(\boldsymbol{\theta^T x}) + (1-y) \frac{1}{1-g(\boldsymbol{\theta^T x})} \frac{\partial} {\partial \theta_j} g(\boldsymbol{\theta^T x}) \\ &= \left[(1-y) \frac{1}{1-g(\boldsymbol{\theta^T x})} - y \frac{1}{g(\boldsymbol{\theta^T x})} \right] \frac{\partial} {\partial \theta_j} g(\boldsymbol{\theta^T x}) \\ &= \left[(1-y) \frac{1}{1-g(\boldsymbol{\theta^T x})} - y \frac{1}{g(\boldsymbol{\theta^T x})} \right] g(\boldsymbol{\theta^T x}) (1-g(\boldsymbol{\theta^T x})) \frac{\partial}{ \partial \theta_j} \boldsymbol{\theta^T x} \\ &= \left[(1-y) \frac{1}{1-g(\boldsymbol{\theta^T x})} - y \frac{1}{g(\boldsymbol{\theta^T x})} \right] g(\boldsymbol{\theta^T x}) (1-g(\boldsymbol{\theta^T x})) x_j \\ &= (g(\boldsymbol{\theta^T x}) - y) x_j \end{aligned} \tag{5}

$\theta_j := \theta_j - \alpha (g(\boldsymbol{\theta^T x}) - y) x_j \tag{6}$

$\theta_j := \theta_j - \alpha \sum_{i=1}^m (g(\boldsymbol{\theta^T x}^{(i)}) - y^{(i)}) x_j^{(i)}\tag{7}$

## 参数迭代表达式的向量化表示

(7)式就是某个参数的迭代表达式，如果完全按照(7)式的形式写程序，更新一个参数需要循环m次，但是如果写成矩阵的形式，写程序时用矩阵的数据结构，计算就会方便很多。

$\boldsymbol{X} = \left[ \begin{matrix} \boldsymbol{x}^{(1)} \\ \boldsymbol{x}^{(2)} \\ \vdots \\ \boldsymbol{x}^{(m)} \end{matrix} \right] = \left[ \begin{matrix} x_0^{(1)} & x_1^{(1)} & \cdots & x_n^{(1)} \\ x_0^{(2)} & x_1^{(2)} & \cdots & x_n^{(2)} \\ \vdots \\ x_0^{(m)} & x_1^{(m)} & \cdots & x_n^{(m)} \end{matrix} \right] \tag{8}$

$\boldsymbol{y} = \left[ \begin{matrix} y^{(1)} \\ \vdots \\ y^{(m)} \end{matrix} \right] \tag{9}$

$\boldsymbol{\theta}^T = \left[ \begin{matrix} \theta_0 \\ \vdots \\ \theta_n \end{matrix} \right] \tag{10}$

$\boldsymbol{A} = \boldsymbol{\theta}^T \boldsymbol{X}$

\begin{aligned} \boldsymbol{A} &= \boldsymbol{\theta}^T \boldsymbol{X} \\ &= \left[ \begin{matrix} \theta_0 \\ \vdots \\ \theta_n \end{matrix} \right] \cdot \left[ \begin{matrix} x_0^{(1)} & x_1^{(1)} & \cdots & x_n^{(1)} \\ x_0^{(2)} & x_1^{(2)} & \cdots & x_n^{(2)} \\ \vdots \\ x_0^{(m)} & x_1^{(m)} & \cdots & x_n^{(m)} \end{matrix} \right] \\ &= \left[ \begin{matrix} \theta_0 x_0^{(1)} & \theta_1 x_1^{(1)} & \cdots & \theta_n x_n^{(1)} \\ \theta_0 x_0^{(2)} & \theta_1 x_1^{(2)} & \cdots & \theta_n x_n^{(2)} \\ \vdots \\ \theta_0 x_0^{(m)} & \theta_1 x_1^{(m)} & \cdots & \theta_n x_n^{(m)} \end{matrix} \right] \end{aligned} \tag{11}

$\boldsymbol{E} = g(\boldsymbol{\theta^T \boldsymbol{X}}) - \boldsymbol{y}$

$\boldsymbol{E} = g(\boldsymbol{\theta^T \boldsymbol{X}}) - \boldsymbol{y} =\left[ \begin{matrix} g(\boldsymbol{A}^{(1)})-y^{(1)} \\ g(\boldsymbol{A}^{(2)})-y^{(2)} \\ \vdots \\ g(\boldsymbol{A}^{(m)})-y^{(m)} \end{matrix} \right] =\left[ \begin{matrix} e^{(1)} \\ e^{(2)} \\ \vdots \\ e^{(m)} \end{matrix} \right] \tag{12}$

\begin{aligned} \theta_j &:= \theta_j - \alpha \sum_{i=1}^m (g(\boldsymbol{\theta^T x}^{(i)}) - y^{(i)}) x_j^{(i)} \\ &:= \theta_j - \alpha \sum_{i=1}^m e^{(i)} x_j^{(i)} \\ &:= \theta_j - \alpha \left(x_j^{(0)}, x_j^{(1)}, \cdots, x_j^{(m)}\right) \cdot \left(e^{(0)}, e^{(1)}, \cdots, e^{(m)}\right)^T \\ &:= \theta_j - \alpha \left(x_j^{(0)}, x_j^{(1)}, \cdots, x_j^{(m)}\right) \boldsymbol{E} \end{aligned}

$\boldsymbol{\theta} := \boldsymbol{\theta} - \alpha \boldsymbol{X}^T \boldsymbol{E} \tag{13}$

(13)式中，$\boldsymbol{X}^T$$n+1$$m$列，$\boldsymbol{E}$$m$行1列，相乘得到的结果是$n+1$行1列，与$\boldsymbol{\theta}$的维度相同，perfect!

1. 求出当前迭代位置参数的梯度
(5)式求的是第j个参数的偏导，参数的梯度就是：
$\left(\frac{\partial}{\partial \theta_0} J(\boldsymbol{\theta}), \frac{\partial}{\partial \theta_1} J(\boldsymbol{\theta}), \cdots, \frac{\partial}{\partial \theta_n} J(\boldsymbol{\theta})\right)$

2. 确定对所有的$\theta_j$，沿梯度下降的距离是否都小于预先确定的阈值$\epsilon$，如果小于$\epsilon$，算法停止，否则，进入第3步

3. 根据(7)式，使用所有样本（$m$个样本），更新所有参数，需循环m次。如果使用(13)式，就不需要循环，效率会高一点。所有参数更新完成后，返回第1步，开始下一轮迭代

epsilon = 0.001 // 新旧梯度的距离，迭代停止条件之一
max_iter = 1000 // 最大迭代次数，迭代停止条件之一
distance = 100
iter_idx = 0
alpha = 0.001 // 学习率
theta = zeros() // 初始化参数
theta_old = theta
m, n = init(X_train, y_train, theta_old) // 初始化各参数,并返回样本个数m和参数个数n
while distance > epsilon or iter_idx < max_iter:
'''
根据(7)式循环所有样本更新参数
'''
for i in range(m):
theta += update(theta_old)
distance = g_distance(theta, theta_old)
iter_idx += 1
theta_old = theta


1. 选择$k$个训练样本（一共有$m$个训练样本）
2. 在这$k$个样本中进行$k$次迭代，每次迭代只使用一个样本（即SGD）
3. $k$次迭代得到$k$个梯度，对这$k$个梯度加权求和（比如取平均）的结果来更新参数