机器学习入门:从感知机到逻辑回归,理解线性分类器与Softmax CS188 Note20 学习笔记

强烈推荐的更好的阅读体验

Perceptron

Linear Classifiers

我们在上次的Note19中提及到了Naive Bayes中的提取feature的思想,我们在这里尝试把一个数据点的所有特征提取出来,提取成为一个向量的形式

text 复制代码
f(x) = [f1(x), f2(x), ..., fn(x)]

与之对应的,每个feature还有一个权重

text 复制代码
w = [w1, w2, ..., wn]

线性分类器的基本思想是利用特征的线性组合来进行分类,我们把这个值叫做激活值激活函数之前的值即activation 。具体公式如下

activation w ( x ) = h w ( x ) = ∑ i w i f i ( x ) = w ⊤ f ( x ) = w ⋅ f ( x ) \large \begin{align*} \text{activation}_w(x) &= h_w(x) = \sum_i w_i f_i(x) = \mathbf{w}^\top \mathbf{f}(x) = \mathbf{w}\cdot\mathbf{f}(x) \end{align*} activationw(x)=hw(x)=i∑wifi(x)=w⊤f(x)=w⋅f(x)

我们来着重看一下 h w ( x ) h_w(x) hw(x)这个值:

如果我们只有两个lable,可以回忆一下之前提及到的垃圾邮件的例子,这就是只有两个标签--只有ham和spam。

  • 这时候 h w ( x ) h_w(x) hw(x)如果为正,我们就把数据点标记为正类。
  • 如果 h w ( x ) h_w(x) hw(x)值为负,我们就把数据点标记为负类

Decision Boundary

我们用数学的角度来看一下 h w ( x ) h_w(x) hw(x)的值:

h w ( x ) = w ⋅ f ( x ) = ∥ w ∥    ∥ f ( x ) ∥ cos ⁡ ( θ ) \begin{align*} h_{\mathbf{w}}(\mathbf{x}) &= \mathbf{w}\cdot\mathbf{f}(\mathbf{x}) = \|\mathbf{w}\|\;\|\mathbf{f}(\mathbf{x})\|\cos(\theta) \end{align*} hw(x)=w⋅f(x)=∥w∥∥f(x)∥cos(θ)

看最后一串,决定 h w ( x ) h_w(x) hw(x)值正负的是cosθ,因为两个向量的模是正的。也就是说

classify ( x ) = { + if θ < π 2 − if θ > π 2 \large \begin{align*} \text{classify}(\mathbf{x}) &= \begin{cases} +& \text{if }\ \theta < \dfrac{\pi}{2}\\6pt -&\text{if }\ \theta > \dfrac{\pi}{2} \end{cases} \end{align*} classify(x)=⎩ ⎨ ⎧+−if θ<2πif θ>2π

我们已知了向量w,那我们是不是可以画一条与向量w垂直的虚线,任何位于这条线上的特征向量其 h w ( x ) h_w(x) hw(x)的值都为0,即满足式子 w T f ( x ) = 0 \mathbf{w}^T\mathbf{f}(\mathbf{x}) = 0 wTf(x)=0,我们把这条线叫做决策边界即Decision Boundary

我们可以根据决策边界来判断 h w ( x ) h_w(x) hw(x)的值


Binary Perceptron

二分类感知机是一个简单的线性分类器,它的目的是为了找到一个权重向量w让训练集中的样本都可以正确分类。

Perceptron Algorithm

text 复制代码
1. Initialize weights: w = 0
2. For each training example (x, y*):
   a. Compute prediction:
      y = classify(x)
   b. If y == y*, do nothing
   c. If y != y*, update weights:
      w ← w + y* f(x)
3. Repeat until all samples are classified correctly in one pass

其中:

  • y*是真实的lable
  • y是模型预测的lable
  • f(x)是样本特征向量

算法正确性验证

核心的更新规则就是 w ← w + y ∗ f ( x ) w ← w + y^* f(x) w←w+y∗f(x)

1.我们假设 y ∗ = 1 y^* = 1 y∗=1, y = − 1 y = -1 y=−1。即原本为正类的数据点被分错分到负类里去了

2.我们可以推断的是:当前的 h w ( x ) h_w(x) hw(x)是偏小的,我们期望是让 h w ( x ) h_w(x) hw(x)变大

3.更新后的权重为

w ′ = w + f ( x ) \large \begin{align*} w' &= w + f(x) \end{align*} w′=w+f(x)

4.更新后的激活值为

h w ′ ( x ) = ( w + f ( x ) ) T f ( x ) = w T f ( x ) + f ( x ) T f ( x ) = h w ( x ) + f ( x ) T f ( x ) \large \begin{align*} h_{w'}(x) &= (w + f(x))^{T} f(x) = w^{T} f(x) + f(x)^{T} f(x) = h_w(x) + f(x)^Tf(x) \end{align*} hw′(x)=(w+f(x))Tf(x)=wTf(x)+f(x)Tf(x)=hw(x)+f(x)Tf(x)

5.因为

f ( x ) T f ( x ) ≥ 0 \large \begin{align*} f(x)^Tf(x) \ge 0 \end{align*} f(x)Tf(x)≥0

即激活值会变大,这也就表明了这种更新法则是符合我们的预期--让 h w ( x ) h_w(x) hw(x)变大

Bias

如果我们的决策边界模型只有 w T f ( x ) w^Tf(x) wTf(x),那么我们的决策边界就必须经过原点,这非常限制模型的能力,因为很多不同lable的数据点虽然能被一条直线分开,但那条直线不一定经过原点。我们就参考着一次函数的样式加入了bias term,让它变成

w T f ( x ) + b = 0 \large \begin{align*} w^{T} f(x) + b &= 0 \end{align*} wTf(x)+b=0

实现方法通常是给每个特征向量额外加一个恒等于1的feature,然后通过控制权重w来控制大小,这样模型仍然可以写成点积的形式:

h w ( x ) = w T f ( x ) \large \begin{align*} h_w(x) &= w^{T} f(x) \end{align*} hw(x)=wTf(x)


Multiclass Perceptron

多个类别的和binary非常类似,如果有Klable,那么就有K个权重。与二分类感知机对应的是,二分类感知机只有一个权重,因为可以用正负来区别两个lable.

对于输入样本,计算它的每个lable的score:

score k = w k  ⁣ T   f ( x ) \large \begin{align*} \text{score}_k &= w_k^{\!T}\, f(x) \end{align*} scorek=wkTf(x)

选择分数最高的lable:

y ^ = arg ⁡ max ⁡ k w k T f ( x ) \large \begin{align*} \hat{y} &= \arg\max_{k} w_k^{T} f(x) \end{align*} y^=argkmaxwkTf(x)

多分类感知机更新规则

同样的:

  • y*是真实的并且正确的lable
  • y是被错误预测的lable
  • f(x)是样本特征向量

那么就可以得到:

w y ∗ ← w y ∗ + f ( x ) w y ← w y − f ( x ) \large \begin{align*} w_{y^*} &\leftarrow w_{y^*} + f(x)\\ w_{y} &\leftarrow w_{y} - f(x) \end{align*} wy∗wy←wy∗+f(x)←wy−f(x)

给正确类别的权重加上这个样本,给错误类别减去这个样本


Linear Regression

和前面不同的是:

  • Regression预测的是连续的数值,比如房价温度销量等等
  • Classification预测的是类别
    和前面相同的是:
  • 模型相同,即权重和特征向量的格式相同
    特征向量是
    x = 1 , x 1 , x 2 , ... , x n \large \begin{align*} x &= 1, x_1, x_2, \\dots, x_n \end{align*} x=1,x1,x2,...,xn
    对应的权重也是和之前的格式,注意特征向量的第一项1bias term,那么我们可以得到 h w ( x ) h_w(x) hw(x)为:
    h w ( x ) = w 0 + w 1 x 1 + w 2 x 2 + ⋯ + w n x n = w T x \large \begin{align*} h_w(x) &= w_0 + w_1 x_1 + w_2 x_2 + \cdots + w_n x_n = \mathbf{w}^T\mathbf{x} \end{align*} hw(x)=w0+w1x1+w2x2+⋯+wnxn=wTx

L2 Loss

训练线性回归时,我们希望预测值接近真实值

对于第 j 个样本:

error j = y j − h w ( x j ) \large \begin{align*} \text{error}_j &= y_j - h_w(x_j) \end{align*} errorj=yj−hw(xj)

L2 Loss是误差平方:

( y j − h w ( x j ) ) 2 \large \begin{align*} (y_j - h_w(x_j))^2 \end{align*} (yj−hw(xj))2

整个训练集上的loss:

L o s s ( h w )    =    1 2 ∑ j = 1 N ( y j − h w ( x j ) ) 2 \large \begin{align*} Loss(h_w)\; &=\; \frac{1}{2}\sum_{j=1}^{N}\big(y_j - h_w(x_j)\big)^2 \end{align*} Loss(hw)=21j=1∑N(yj−hw(xj))2

前面加上1/2是为了求导时抵消平方项前面的2,让整体公式更加整洁

Matrix Form矩阵形式

将所有的训练样本堆起来:

y = y 1 y 2 ⋮ y N \large \begin{align*} \mathbf{y} &= \begin{bmatrix} y_1\\4pt y_2\\4pt \vdots\\4pt y_N \end{bmatrix} \end{align*} y= y1y2⋮yN

设计矩阵:

X = 1 x 1 1 ⋯ x n 1 1 x 1 2 ⋯ x n 2 ⋮ ⋮ ⋱ ⋮ 1 x 1 N ⋯ x n N \large \begin{align*} \mathbf{X} &= \begin{bmatrix} 1 & x_{1}^{1} & \cdots & x_{n}^{1} \\ 1 & x_{1}^{2} & \cdots & x_{n}^{2} \\ \vdots & \vdots & \ddots & \vdots \\ 1 & x_{1}^{N} & \cdots & x_{n}^{N} \end{bmatrix} \end{align*} X= 11⋮1x11x12⋮x1N⋯⋯⋱⋯xn1xn2⋮xnN

权重为:

w = w 0 w 1 ⋮ w n \large \begin{align*} \mathbf{w} &= \begin{bmatrix} w_0\\4pt w_1\\4pt \vdots\\4pt w_n \end{bmatrix} \end{align*} w= w0w1⋮wn

那么loss可以写成:

Loss ⁡ ( h w ) = 1 2 ∥ y − X w ∥ 2 2 \large \begin{align*} \operatorname{Loss}(h_w) &= \tfrac{1}{2}\left\lVert \mathbf{y} - \mathbf{X}\mathbf{w} \right\rVert_2^2 \end{align*} Loss(hw)=21∥y−Xw∥22

线性回归最重要的一个特点是它有闭式解( closed-form solution )

我们对loss求梯度:

∇ w 1 2 ∥ y − X w ∥ 2 2 = − X T y + X T X w \large \begin{align*} \nabla_w \frac{1}{2}\|y - Xw\|_2^2 &= -X^{T}y + X^{T}Xw \end{align*} ∇w21∥y−Xw∥22=−XTy+XTXw

令梯度为0:

X T X w = X T y \large \begin{align*} X^{T} X w &= X^{T} y \end{align*} XTXw=XTy

如果 X T X X^TX XTX可逆的话,那么就可以得到:

w ^ = ( X ⊤ X ) − 1 X ⊤ y \large \begin{align*} \hat{\mathbf{w}} &= (X^\top X)^{-1} X^\top \mathbf{y} \end{align*} w^=(X⊤X)−1X⊤y


Logistic Regression

Logistic Regression用logistic function把线性模型输出转成概率,需要注意的是

Logistic Regression 名字里有 regression,但它主要用于 classification

Logistic Function / Sigmoid Function

Logistic Function:

g ( z ) = 1 1 + e − z \large \begin{align*} g(z) &= \frac{1}{1+e^{-z}} \end{align*} g(z)=1+e−z1

其中

z = w T x \large \begin{align*} z &= \mathbf{w}^{T} \mathbf{x} \end{align*} z=wTx

h w ( x ) = 1 1 + e − w T x . \large \begin{align*} h_{\mathbf{w}}(\mathbf{x}) &= \frac{1}{1 + e^{-\mathbf{w}^T \mathbf{x}}}. \end{align*} hw(x)=1+e−wTx1.

它的输出一定在0到1之间,因此可以解释为:

当 h w ( x ) > 0.5 h_w(x) > 0.5 hw(x)>0.5时预测为正类,下面的式子为样本属于正类的概率

P ( y = + 1 ∣ f ( x ) ; w ) = 1 1 + e − w ⊤ f ( x ) \large \begin{align*} P\bigl(y=+1\mid \mathbf{f}(x);\mathbf{w}\bigr) &= \frac{1}{1+e^{-\mathbf{w}^\top \mathbf{f}(x)}} \end{align*} P(y=+1∣f(x);w)=1+e−w⊤f(x)1

和当 h w ( x ) < 0.5 h_w(x) < 0.5 hw(x)<0.5时预测为负类,下面的式子属于样本属于负类的概率

P  ⁣ ( y = − 1 ∣ f ( x ) ; w ) = 1 − 1 1 + e − w ⊤ f ( x )   \large \begin{align*} P\!\left(y=-1\mid f(\mathbf{x});\mathbf{w}\right) &= 1 - \frac{1}{1 + e^{-\mathbf{w}^\top f(\mathbf{x})}}\, \end{align*} P(y=−1∣f(x);w)=1−1+e−w⊤f(x)1

Logistic Regression的损失函数和梯度

首先有一个数学小性质

g ′ ( z ) = g ( z ) ( 1 − g ( z ) ) \large \begin{align*} g'(z) &= g(z)\bigl(1 - g(z)\bigr) \end{align*} g′(z)=g(z)(1−g(z))

然后我们看L2 Loss的函数:

L o s s ( w ) = 1 2 ( y − h w ( x ) ) 2 \large \begin{align*} Loss(w) &= \tfrac{1}{2}\bigl(y - h_w(x)\bigr)^2 \end{align*} Loss(w)=21(y−hw(x))2

然后对第i个权重求偏导

∂ ∂ w i 1 2 ( y − h w ( x ) ) 2 = ( y − h w ( x ) ) ∂ ∂ w i ( y − h w ( x ) ) = − ( y − h w ( x ) ) h w ( x ) ( 1 − h w ( x ) ) x i \begin{align*} \frac{\partial}{\partial w_i}\frac{1}{2}\big(y-h_w(x)\big)^2 &= \big(y-h_w(x)\big)\frac{\partial}{\partial w_i}\big(y-h_w(x)\big) = -\big(y-h_w(x)\big)h_w(x)\big(1-h_w(x)\big)x_i \end{align*} ∂wi∂21(y−hw(x))2=(y−hw(x))∂wi∂(y−hw(x))=−(y−hw(x))hw(x)(1−hw(x))xi

因为logistic regression没有简单的closed-form solution, 所以通常用gradient descent来估计权重


Multi-Class Logistic Regression

和之前Perceptron的思路一样,都是从binary变成多类别的,对于多分类逻辑回归我们希望模型输出一个概率分布:

text 复制代码
P(y=1|x), P(y=2|x), ..., P(y=K|x)
其中需要满足:
每个概率都 ≥ 0
所有概率加起来 = 1

我们用的模型是Softmax FunctionSoftmaxlogistic function的多分类拓展:

对于类别i我们有:

P ( y = i ∣ f ( x ) ; w ) = e w i ⊤ f ( x ) ∑ k = 1 K e w k ⊤ f ( x ) . \large \begin{align*} P\bigl(y=i\mid \mathbf{f(x)};\mathbf{w}\bigr) &= \frac{e^{\mathbf{w}i^{\top} \mathbf{f(x)}}}{\sum{k=1}^K e^{\mathbf{w}_k^{\top} \mathbf{f(x)}}}. \end{align*} P(y=i∣f(x);w)=∑k=1Kewk⊤f(x)ewi⊤f(x).

其中:

  • 每个类别都有自己的权重向量 w_i
  • 每个类别都会得到一个 score;
  • 对 score 做指数变换;
  • 再除以所有类别指数分数之和;
  • 得到每个类别的概率

Likelihood

我们在这里用Likelihood方法来表示参数w以使观测到的数据有最大的可能性,我们的训练目标就是最大化这个likelihood

ℓ ( w 1 , ... , w K ) = ∏ i = 1 n P ( y i ∣ f ( x i ) ; w ) \large \begin{align*} \ell(\mathbf{w}_1,\dots,\mathbf{w}K) &= \prod{i=1}^n P\big(y_i\mid f(x_i);\mathbf{w}\big) \end{align*} ℓ(w1,...,wK)=i=1∏nP(yi∣f(xi);w)

注意一下区分:

Softmax 负责算每个类别的概率;

Likelihood 负责把每个样本"真实类别的概率"拿出来乘在一起

然后我们为了写出多分类的likelihood,定义下面:

t i , k = { 1 , y i = k 0 , y i ≠ k \large \begin{align*} t_{i,k} &= \begin{cases} 1, & y_i = k\\4pt 0, & y_i \neq k \end{cases} \end{align*} ti,k=⎩ ⎨ ⎧1,0,yi=kyi=k

即:

  • 如果第 i 个样本真实类别是 k,那么 t_{i,k}=1
  • 否则 t_{i,k}=0
    这里举个例子更容易理解,对于某个样本x_i,Softmax会输出:
text 复制代码
P(猫 | x_i)
P(狗 | x_i)
P(鸟 | x_i)

但是真实标签只有一个,比如真实标签是狗,我们只想保留:

text 复制代码
P(狗 | x_i)

我们就用 t i , k t_{i, k} ti,k来表示:

text 复制代码
如果第 i 个样本真实类别是 k,那么 t_{i,k} = 1
否则 t_{i,k} = 0

所以就可以得到如果真实类别是狗,也就是第二类那么:

text 复制代码
t_i = [0, 1, 0]

所以说:

P ( 猫 ∣ x i ) 0 × P ( 狗 ∣ x i ) 1 × P ( 鸟 ∣ x i ) 0 = P ( 狗 ∣ x i ) \large \begin{align*} P(\mathrm{猫}\mid x_i)^{0}\times P(\mathrm{狗}\mid x_i)^{1}\times P(\mathrm{鸟}\mid x_i)^{0} = P(\mathrm{狗}\mid x_i) \end{align*} P(猫∣xi)0×P(狗∣xi)1×P(鸟∣xi)0=P(狗∣xi)

然后我们的likelihood公式就可以写成:

ℓ ( w 1 , ... , w K ) = ∏ i = 1 n ∏ k = 1 K ( e w k  ⁣ T f ( x i ) ∑ ℓ = 1 K e w ℓ  ⁣ T f ( x i ) ) t i , k \large \begin{align*} \ell(\mathbf{w}1,\dots,\mathbf{w}K) &= \prod{i=1}^n \prod{k=1}^K \left(\frac{e^{\mathbf{w}k^{\!T} \mathbf{f}(\mathbf{x}i)}}{\sum{\ell=1}^K e^{\mathbf{w}\ell^{\!T} \mathbf{f}(\mathbf{x}i)}}\right)^{t{i,k}} \end{align*} ℓ(w1,...,wK)=i=1∏nk=1∏K ∑ℓ=1KewℓTf(xi)ewkTf(xi) ti,k

对应的log- likelihood就是:

l o g ℓ ( w 1 , ... , w K ) = ∑ i = 1 n ∑ k = 1 K t i , k log ⁡ ( e w k  ⁣ T f ( x i ) ∑ ℓ = 1 K e w ℓ  ⁣ T f ( x i ) ) \large \begin{align*} log\ell(\mathbf{w}1,\dots,\mathbf{w}K) &= \sum{i=1}^n \sum{k=1}^K t_{i, k}\log\left(\frac{e^{\mathbf{w}k^{\!T} \mathbf{f}(\mathbf{x}i)}}{\sum{\ell=1}^K e^{\mathbf{w}\ell^{\!T} \mathbf{f}(\mathbf{x}_i)}}\right) \end{align*} logℓ(w1,...,wK)=i=1∑nk=1∑Kti,klog ∑ℓ=1KewℓTf(xi)ewkTf(xi)

Softmax的梯度

∇ w j log ⁡ ℓ ( w ) = ∑ i = 1 n ∇ w j ∑ k = 1 K t i , k log ⁡  ⁣ ( e w k ⊤ f ( x i ) ∑ ℓ = 1 K e w ℓ ⊤ f ( x i ) ) = ∑ i = 1 n ( t i , j − e w j ⊤ f ( x i ) ∑ ℓ = 1 K e w ℓ ⊤ f ( x i ) ) f ( x i ) \begin{align*} \nabla_{\mathbf{w}j}\log \ell(\mathbf w) &= \sum{i=1}^n \nabla_{\mathbf{w}j}\sum{k=1}^K t_{i,k}\log\!\left(\frac{e^{\mathbf{w}k^{\top}\mathbf{f}(\mathbf{x}i)}}{\sum{\ell=1}^K e^{\mathbf{w}\ell^{\top}\mathbf{f}(\mathbf{x}i)}}\right) = \sum{i=1}^n\left(t_{i,j}-\frac{e^{\mathbf{w}j^{\top}\mathbf{f}(\mathbf{x}i)}}{\sum{\ell=1}^K e^{\mathbf{w}\ell^{\top}\mathbf{f}(\mathbf{x}_i)}}\right)\mathbf{f}(\mathbf{x}_i) \end{align*} ∇wjlogℓ(w)=i=1∑n∇wjk=1∑Kti,klog(∑ℓ=1Kewℓ⊤f(xi)ewk⊤f(xi))=i=1∑n(ti,j−∑ℓ=1Kewℓ⊤f(xi)ewj⊤f(xi))f(xi)

相关推荐
2601_961194021 小时前
2026初级会计实务教材电子版|章节讲义+习题PDF
python·考研·django·pdf·virtualenv·pygame
chushiyunen1 小时前
json-rpc笔记
笔记·rpc·json
无负今日_tq1 小时前
【无标题】
人工智能·深度学习·条纹
郑洁文1 小时前
基于CNN的异常流量监测系统的设计与实现
人工智能·神经网络·网络安全·cnn
爱吃肉的鹏1 小时前
基于深度学习的电缆异常检测
人工智能·深度学习
极客笔记Jack1 小时前
Scanpy 富集分析实战:gseapy 从基因列表到通路解读
python
钓了猫的鱼儿1 小时前
基于深度学习+AI的茶叶病害目标检测与预警系统(Python源码+数据集+UI可视化界面+YOLOv11训练结果)
人工智能·深度学习·目标检测
codefan※1 小时前
干掉幻觉实战:如何构建企业级知识图谱增强 RAG
人工智能·大模型·llm·知识图谱·neo4j·rag·graphrag
码农大坚果1 小时前
智能体开发实战02|Harness工程入门
人工智能·agent