跳到主要内容

逻辑回归的向量化

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

二元分类

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

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

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

数学建模

训练样本数和测试样本数

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

单个样本的特征数

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

单个样本的输入和输出

x(i)=[x1(i)x2(i)xn(i)]Rn,y(i){0,1}R1\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}

总样本的输入和输出

X=[x(1)x(2)x(m)]Rn×mY=[y(1)y(2)y(m)]R1×m\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 的情况。逻辑回归的目标是最小化其预测输出 y^\hat y 和实际输出 yy 的误差。

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

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

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

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

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

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

函数定义

定义损失函数 (Loss Function) 和成本函数 (Cost Function),以训练参数 wwbb

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

L(y^(i),y(i))=[y(i)log(y^(i))+(1y(i))log(1y^(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)=1y^{(i)} = 1,则 L(y^(i)y(i))=log(y^(i))L (\hat y^{(i)},y^{(i)}) = -\log (\hat y^{(i)}),最小化 LL 等价于 y^(i)\hat y^{(i)} 接近于 1。
  • y(i)=0y^{(i)} = 0,则 L(y^(i)y(i))=log(1y^(i))L (\hat y^{(i)},y^{(i)}) = -\log (1 - \hat y^{(i)}),最小化 LL 等价于 y^(i)\hat y^{(i)} 接近于 0。

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

J(w,b)=1mi=1mL(y^(i),y(i))=1mi=1m[y(i)log(y^(i))+(1y(i))log(1y^(i))]\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)F(x) 在点 aa 处可微且有定义,那么函数 F(x)F(x) 在点 aa 沿着梯度相反的方向下降最快。这里使用梯度下降法最小化成本函数 J(wb)J(w,b),以得到最优的参数 wwbb,其中 α\alpha 为学习率 (learning rate)。

wj:=wjαJwj,where j=1,2,,nb:=bαJb\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)=y^(i)=σ(z(i))a^{(i)} = \hat y^{(i)} = \sigma (z^{(i)})

{JL=1mLa(i)=y(i)a(i)+1y(i)1a(i)a(i)z(i)=ez(i)(1+ez(i))2=a(i)(1a(i))Jz(i)=JLLa(i)a(i)z(i)=1m(a(i)y(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)=w1x1(i)+w2x2(i)++wnxn(i)+bz^{(i)} = w_1 x^{(i)} _1 + w_2 x^{(i)} _2 + \cdots + w_n x^{(i)} _n + b,因此有:

Jwj=i=1mJz(i)z(i)wj=i=1mxj(i)Jz(i)Jb=i=1mJz(i)z(i)b=i=1mJz(i)\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=wTx+bz = w^T x + b 为例,原始输入输出为:

z(1)=w1x1(1)+w2x2(1)++wnxn(1)+bz(2)=w1x1(2)+w2x2(2)++wnxn(2)+bz(m)=w1x1(m)+w2x2(m)++wnxn(m)+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}

向量化之后为:

[z(1)z(2)z(m)]T=[w1w2wn]T[x1(1)x1(2)x1(m)x2(1)x2(2)x2(m)xn(1)xn(2)xn(m)]+[bbb]TZ=WTX+B\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}

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

Z=WTX+BA=σ(Z)dZ=JZ=1m(AY)dW=JW=X[dZ]Tdb=i=1mdZiW:=WαdWb:=bαdb\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 进行实现。