逻辑回归的向量化

本文介绍了逻辑回归(Logistic Regression)相关的数学知识,重点在于参数和变量的向量化。

二元分类

二元分类,是将示例归类为两个类别中的一类。

例如,有 1000 张 64 * 64 像素的图片,已知其中哪些是猫、哪些不是。
在这个基础上,给一张新的 64 * 64 像素的图片,需要判断是不是猫。

这种基础的图像识别问题,可以归为二元分类。

数学建模

训练样本数和测试样本数

$$\begin{align} m = m_{train} & = 1000 \\ m_{test} & = 1 \end{align}$$

单个样本的特征数

$$\begin{align} n = n_x = 64 \times 64 \times 3 \end{align}$$

单个样本的输入和输出

$$\begin{align} x^{(i)} = \begin{bmatrix} x^{(i)}_1 \\x^{(i)}_2 \\ \vdots \\ x^{(i)}_n \end{bmatrix} \in R^{n}, \quad y^{(i)} \in \{0,1\} \subset R^1 \end{align}$$

总样本的输入和输出

$$\begin{align} X & = \begin{bmatrix} x^{(1)} & x^{(2)} & \cdots & x^{(m)} \end{bmatrix} \in R^{n \times m} \\ Y & = \begin{bmatrix} y^{(1)} & y^{(2)} & \cdots & y^{(m)} \end{bmatrix} \in R^{1 \times m} \end{align}$$

逻辑回归

逻辑回归是一种学习算法,适用于输出为 0 或 1 的情况。
逻辑回归的目标是最小化其预测输出 $\hat y$ 和实际输出 $y$ 的误差。

$$\begin{align} Given \ x, \ \hat y = P(y =1 \mid x), \quad where \ 0 \leq \hat y \leq 1 \end{align}$$

对于单个样本,逻辑回归使用的参数如下:

  • 输入:$x \in R^n$
  • 实际输出:$y \in {0,1}$
  • 权重:$w \in R^n$
  • 阈值/偏置:$b \in R^1$
  • 净输入/加权输入:$z = w^T x + b$
  • 预测输出:$\hat y = \sigma (z) = \sigma (w^T x + b)$

将输入 $z$ 映射到输出 $\hat y$ 的函数称为激活函数(Activation Function)。
这里激活函数使用 Sigmoid 函数$\sigma (z)$,可以将输出映射到 $[0,1]$ 的范围内:

$$\begin{align} \sigma (z) = \frac 1 {1 + e^{-z}} \end{align}$$

如果 $z$ 很大,那么 $\hat y$ 接近于 1;反之则接近于 0。

函数定义

定义损失函数(Loss Fucntion)和成本函数(Cost Fucntion),以训练参数 $w$ 和 $b$。

损失函数用于单个样本,代表预测输出 $\hat y^{(i)}$ 和实际输出 $y^{(i)}$ 之间的误差。

$$\begin{align} L(\hat y^{(i)}, y^{(i)}) = -[y^{(i)} \log (\hat y^{(i)}) + (1 - y^{(i)}) \log (1 - \hat y^{(i)})] \end{align}$$
  • 若 $y^{(i)} = 1$,则 $L(\hat y^{(i)}, y^{(i)}) = -\log (\hat y^{(i)})$,最小化 $L$ 等价于 $\hat y^{(i)}$ 接近于 1。
  • 若 $y^{(i)} = 0$,则 $L(\hat y^{(i)}, y^{(i)}) = -\log (1 - \hat y^{(i)})$,最小化 $L$ 等价于 $\hat y^{(i)}$ 接近于 0。

成本函数是整个训练集的损失函数的平均值。最小化成本函数,可以得到最优的参数 $w$ 和 $b$。

$$\begin{align} J(w, b) & = {\frac 1 m} \sum _{i=1}^m L(\hat y^{(i)}, y^{(i)}) \\ & = -{\frac 1 m} \sum _{i=1}^m [y^{(i)} \log (\hat y^{(i)}) + (1 - y^{(i)}) \log (1 - \hat y^{(i)})] \end{align}$$

梯度下降法

梯度下降法的定义为,如果实值函数 $F(x)$ 在点 $a$ 处可微且有定义,那么函数 $F(x)$ 在点 $a$ 沿着梯度相反的方向下降最快。
这里使用梯度下降法最小化成本函数 $J(w, b)$,以得到最优的参数 $w$ 和 $b$,其中 $\alpha$ 为学习率(learning rate)。

$$\begin{align} w_j & := w_j - \alpha \frac {\partial J} {\partial w_j}, \quad where \ j = 1,2,\cdots,n \\ b & := b - \alpha \frac {\partial J} {\partial b} \end{align}$$

记 $a^{(i)} = \hat y^{(i)} = \sigma (z^{(i)})$:

$$\left \lbrace \begin{align} \frac {\partial J} {\partial L} & = \frac 1 m \\ \frac {\partial L} {\partial a^{(i)}} & = - {\frac {y^{(i)}} {a^{(i)}}} + {\frac {1 - y^{(i)}} {1 - a^{(i)}}} \\ \frac {\partial a^{(i)}} {\partial z^{(i)}} & = \frac {e^{-z^{(i)}}} {(1 + e^{-z^{(i)}})^2} = a^{(i)}(1 - a^{(i)}) \\ \end{align} \right . \\ \Rightarrow \frac {\partial J} {\partial z^{(i)}} = {\frac {\partial J} {\partial L}} {\frac {\partial L} {\partial a^{(i)}}} {\frac {\partial a^{(i)}} {\partial z^{(i)}}} = {\frac 1 m} (a^{(i)} - y^{(i)})$$

由于 $z^{(i)} = w_1 x^{(i)}_1 + w_2 x^{(i)}_2 + \cdots + w_n x^{(i)}_n + b$,因此有:

$$\begin{align} \frac {\partial J} {\partial w_j} & = \sum_{i=1}^m {\frac {\partial J} {\partial z^{(i)}}} {\frac {\partial z^{(i)}} {\partial w_j}} = \sum_{i=1}^m x_j^{(i)} {\frac {\partial J} {\partial z^{(i)}}} \\ \frac {\partial J} {\partial b} & = \sum_{i=1}^m {\frac {\partial J} {\partial z^{(i)}}} {\frac {\partial z^{(i)}} {\partial b}} = \sum_{i=1}^m {\frac {\partial J} {\partial z^{(i)}}} \end{align}$$

向量化

以 $z = w^T x + b$ 为例,原始输入输出为:

$$\begin{align} z^{(1)} & = w_1 x^{(1)}_1 + w_2 x^{(1)}_2 + \cdots + w_n x^{(1)}_n + b \\ z^{(2)} & = w_1 x^{(2)}_1 + w_2 x^{(2)}_2 + \cdots + w_n x^{(2)}_n + b \\ & \vdots \\ z^{(m)} & = w_1 x^{(m)}_1 + w_2 x^{(m)}_2 + \cdots + w_n x^{(m)}_n + b \end{align}$$

向量化之后为:

$$\begin{align} {\begin{bmatrix} z^{(1)} \\ z^{(2)} \\ \vdots \\ z^{(m)} \end{bmatrix}}^T & = {\begin{bmatrix} w_1 \\ w_2 \\ \vdots \\ w_n \end{bmatrix}}^T \begin{bmatrix} x^{(1)}_1 & x^{(2)}_1 & \cdots & x^{(m)}_1 \\ x^{(1)}_2 & x^{(2)}_2 & \cdots & x^{(m)}_2 \\ \vdots & \vdots & \ddots & \vdots \\ x^{(1)}_n & x^{(2)}_n & \cdots & x^{(m)}_n \end{bmatrix} + {\begin{bmatrix} b \\ b \\ \vdots \\ b \end{bmatrix}}^T \\ & \Downarrow \\ Z & = W^T X + B \end{align}$$

向量化之后,对整个训练样本进行单次训练,描述如下:

$$\begin{align} Z & = W^T X + B \\ A & = \sigma (Z) \\ dZ & = \frac {\partial J} {\partial Z} = {\frac 1 m} (A - Y) \\ dW & = \frac {\partial J} {\partial W} = X \cdot [dZ]^T \\ db & = \sum_{i=1}^m dZ_i \\ W & := W - \alpha \cdot dW \\ b & := b - \alpha \cdot db \end{align}$$

以上可以使用 Python Numpy 进行实现。