深度学习笔记: 最详尽解释Softmax 回归 Softmax Regression

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家!

Softmax 回归

Softmax 回归,也称为多项逻辑回归,是逻辑回归的广义,用于多类分类问题。虽然逻辑回归用于二分类,softmax 回归则用于类别超过两个的情况。

Softmax 回归的关键点:

  • 多类分类:当因变量可以有两个以上的类别时,使用 softmax 回归。例如,在 MNIST 数据集中对数字(0-9)进行分类。

  • 逻辑回归的广义:逻辑回归预测两个类别的概率,而 softmax 回归则预测所有可能类别的概率。

  • Softmax 函数:softmax 回归的核心是 softmax 函数,用于将原始预测分数(logits)转换为概率。softmax 函数定义如下:

    σ ( z ) i = e z i ∑ j = 1 K e z j \sigma(\mathbf{z})i = \frac{e^{z_i}}{\sum{j=1}^{K} e^{z_j}} σ(z)i=∑j=1Kezjezi

    其中, z \mathbf{z} z 是原始分数(logits)的输入向量, K K K 是类别数, σ ( z ) i \sigma(\mathbf{z})_i σ(z)i 是输入属于类别 i i i 的概率。

  • 损失函数:softmax 回归使用交叉熵损失函数,衡量分类模型输出为0到1之间概率值的性能。单个样本的交叉熵损失函数如下:

    ℓ s o f t m a x ( z , y ) = − log ⁡ ( σ ( z ) y ) \ell_{\mathrm{softmax}}(\mathbf{z}, y) = -\log(\sigma(\mathbf{z})_y) ℓsoftmax(z,y)=−log(σ(z)y)

    其中, y y y 是真实类别标签。

与线性回归和逻辑回归的区别:

  • 线性回归:用于预测连续因变量。它拟合自变量和因变量之间的线性关系。

    h ( x ) = x ⊤ θ h(\mathbf{x}) = \mathbf{x}^\top \mathbf{\theta} h(x)=x⊤θ

  • 逻辑回归:用于二分类。它将线性预测应用于逻辑(sigmoid)函数以建模二元结果的概率。

    P ( y = 1 ∣ x ) = σ ( x ⊤ θ ) = 1 1 + e − x ⊤ θ P(y=1|\mathbf{x}) = \sigma(\mathbf{x}^\top \mathbf{\theta}) = \frac{1}{1 + e^{-\mathbf{x}^\top \mathbf{\theta}}} P(y=1∣x)=σ(x⊤θ)=1+e−x⊤θ1

  • Softmax 回归:扩展逻辑回归到多类。它使用 softmax 函数将线性预测转换为每个类别的概率。

    P ( y = i ∣ x ) = σ ( z ) i = e x ⊤ θ i ∑ j = 1 K e x ⊤ θ j P(y=i|\mathbf{x}) = \sigma(\mathbf{z})_i = \frac{e^{\mathbf{x}^\top \mathbf{\theta}i}}{\sum{j=1}^{K} e^{\mathbf{x}^\top \mathbf{\theta}_j}} P(y=i∣x)=σ(z)i=∑j=1Kex⊤θjex⊤θi

总之,softmax 回归是一种为多类分类任务设计的逻辑回归。它使用 softmax 函数预测每个类别的概率,从而实现实例的多类别分类。

Softmax(即交叉熵)损失:

src/simple_ml.py 文件中的 softmax_loss() 函数中实现 softmax(即交叉熵)损失。回顾一下(希望这是复习,但我们也将在 9 月 1 日的讲座中讨论),对于可以取值为 y ∈ { 1 , ... , k } y \in \{1,\ldots,k\} y∈{1,...,k} 的多类输出,softmax 损失以一个 logits 向量 z ∈ R k z \in \mathbb{R}^k z∈Rk 和真实类别 y ∈ { 1 , ... , k } y \in \{1,\ldots,k\} y∈{1,...,k} 作为输入,返回定义的损失

ℓ s o f t m a x ( z , y ) = log ⁡ ∑ i = 1 k exp ⁡ z i − z y . \begin{equation} \ell_{\mathrm{softmax}}(z, y) = \log\sum_{i=1}^k \exp z_i - z_y. \end{equation} ℓsoftmax(z,y)=logi=1∑kexpzi−zy.

请注意,如其 docstring 中所述,softmax_loss() 接受一个 logits 的二维数组(即批量不同样本的 k k k 维 logits),以及相应的一维真实标签数组,并应输出整个批量的平均 softmax 损失。请注意,为了正确地做到这一点,您应该避免使用任何循环,而是使用 numpy 向量化操作进行所有计算(为此设定期望,我们应该注意到,例如我们的参考解决方案由一行代码组成)。

请注意,对于 softmax 损失的"真实"实现,您需要缩放 logits 以防止数值溢出,但在这里我们不会担心这个问题(即使您不担心这个问题,其余的作业也会正常工作)。

python 复制代码
def softmax_loss(Z, y):
    """ Return softmax loss.  Note that for the purposes of this assignment,
    you don't need to worry about "nicely" scaling the numerical properties
    of the log-sum-exp computation, but can just compute this directly.

    Args:
        Z (np.ndarray[np.float32]): 2D numpy array of shape
            (batch_size, num_classes), containing the logit predictions for
            each class.
        y (np.ndarray[np.uint8]): 1D numpy array of shape (batch_size, )
            containing the true label of each example.

    Returns:
        Average softmax loss over the sample.
    """
    ### BEGIN YOUR CODE
    # Formula for one training sample: \begin{equation} \ell_{\mathrm{softmax}}(z, y) = \log\sum_{i=1}^k \exp z_i - z_y. \end{equation}
    
    # Compute the log of the sum of exponentials of logits for each sample
    log_sum_exp = np.log(np.sum(np.exp(Z), axis = 1))
    # Extract the logits corresponding to the true class for each sample
    # np.arange(Z.shape[0]) generates array [0, 1, 2, ..., batch_size-1]
    # Z[np.arange(Z.shape[0]), y] = Z[[row_indices], [col_indices]]
    # This selects the logits Z[i, y[i]] for each i which is each row
    correct_class_logits = Z[np.arange(Z.shape[0]), y]
    losses = log_sum_exp - correct_class_logits
    return np.mean(losses)
    ### END YOUR CODE

例子:

python 复制代码
import numpy as np

# Logits for a batch of 3 samples and 4 classes
Z = np.array([[2.0, 1.0, 0.1, 0.5],
              [1.5, 2.1, 0.2, 0.7],
              [1.1, 1.8, 0.3, 0.4]])

# True labels for the 3 samples
y = np.array([0, 1, 2])

# np.arange(Z.shape[0]) creates an array [0, 1, 2]
row_indices = np.arange(Z.shape[0])
print("Row indices:", row_indices)  # Output: [0 1 2]

# y is [0, 1, 2]
print("True class labels:", y)  # Output: [0 1 2]

# Advanced indexing: Z[np.arange(Z.shape[0]), y] selects Z[0, 0], Z[1, 1], Z[2, 2]
correct_class_logits = Z[row_indices, y]

print("Correct class logits:", correct_class_logits)
# Output: [2.0, 2.1, 0.3]

数学证明

所有训练样本的公式

H ( Y , P ) = − ∑ i = 1 k Y i log ⁡ ( P i ) = H ( Y , σ ( z ) ) = − ∑ i = 1 k Y i log ⁡ ( σ ( z ) i ) H(Y, P) = -\sum_{i=1}^k Y_i \log(P_i) = H(Y, \sigma(z)) = -\sum\limits_{i=1}^k Y_i \log(\sigma(z)_i) H(Y,P)=−i=1∑kYilog(Pi)=H(Y,σ(z))=−i=1∑kYilog(σ(z)i)

单个训练样本的公式

H ( Y , σ ( z ) ) = − log ⁡ ( σ ( z ) y ) = − log ⁡ ( exp ⁡ ( z y ) ∑ j = 1 k exp ⁡ ( z j ) ) H(Y, \sigma(z)) = -\log(\sigma(z)y) = -\log\left( \frac{\exp(z_y)}{\sum\limits{j=1}^k \exp(z_j)} \right) H(Y,σ(z))=−log(σ(z)y)=−log j=1∑kexp(zj)exp(zy)

单个训练样本的简化公式

H ( Y , σ ( z ) ) = − z y + log ⁡ ( ∑ j = 1 k exp ⁡ ( z j ) ) H(Y, \sigma(z)) = -z_y + \log\left( \sum\limits_{j=1}^k \exp(z_j) \right) H(Y,σ(z))=−zy+log(j=1∑kexp(zj))

Softmax 函数

Softmax 函数将 logits(原始分数)转换为概率。对于长度为 k k k 的 logits 向量 z z z,softmax 函数 σ ( z ) \sigma(z) σ(z) 定义为:

σ ( z ) i = exp ⁡ ( z i ) ∑ j = 1 k exp ⁡ ( z j ) \sigma(z)i = \frac{\exp(z_i)}{\sum\limits{j=1}^k \exp(z_j)} σ(z)i=j=1∑kexp(zj)exp(zi)

其中 i = 1 , ... , k i = 1, \ldots, k i=1,...,k。

交叉熵损失

交叉熵损失衡量真实标签和预测概率之间的差异。对于真实标签向量 Y Y Y(独热编码)和预测概率向量 P P P(softmax 函数的输出),交叉熵损失 H ( Y , P ) H(Y, P) H(Y,P) 定义为:

H ( Y , P ) = − ∑ i = 1 k Y i log ⁡ ( P i ) H(Y, P) = -\sum_{i=1}^k Y_i \log(P_i) H(Y,P)=−i=1∑kYilog(Pi)

Softmax 和交叉熵的联系

在神经网络中使用 softmax 函数作为多类分类的最后一层时,预测概率向量 P P P 定义为:

P i = σ ( z ) i = exp ⁡ ( z i ) ∑ j = 1 k exp ⁡ ( z j ) P_i = \sigma(z)i = \frac{\exp(z_i)}{\sum\limits{j=1}^k \exp(z_j)} Pi=σ(z)i=j=1∑kexp(zj)exp(zi)

交叉熵损失变为:

H ( Y , σ ( z ) ) = − ∑ i = 1 k Y i log ⁡ ( σ ( z ) i ) H(Y, \sigma(z)) = -\sum_{i=1}^k Y_i \log(\sigma(z)_i) H(Y,σ(z))=−i=1∑kYilog(σ(z)i)

对于单个训练样本,其中真实类别为 y y y, Y Y Y 是一个独热编码向量, Y y = 1 Y_y = 1 Yy=1 且 Y i = 0 Y_i = 0 Yi=0 对于 i ≠ y i \neq y i=y。因此,交叉熵损失简化为:

H ( Y , σ ( z ) ) = − log ⁡ ( σ ( z ) y ) = − log ⁡ ( exp ⁡ ( z y ) ∑ j = 1 k exp ⁡ ( z j ) ) H(Y, \sigma(z)) = -\log(\sigma(z)y) = -\log\left( \frac{\exp(z_y)}{\sum\limits{j=1}^k \exp(z_j)} \right) H(Y,σ(z))=−log(σ(z)y)=−log j=1∑kexp(zj)exp(zy)

利用对数的性质,可以重写为:

H ( Y , σ ( z ) ) = − ( log ⁡ ( exp ⁡ ( z y ) ) − log ⁡ ( ∑ j = 1 k exp ⁡ ( z j ) ) ) H(Y, \sigma(z)) = -\left( \log(\exp(z_y)) - \log\left( \sum\limits_{j=1}^k \exp(z_j) \right) \right) H(Y,σ(z))=−(log(exp(zy))−log(j=1∑kexp(zj)))

H ( Y , σ ( z ) ) = − z y + log ⁡ ( ∑ j = 1 k exp ⁡ ( z j ) ) H(Y, \sigma(z)) = -z_y + \log\left( \sum\limits_{j=1}^k \exp(z_j) \right) H(Y,σ(z))=−zy+log(j=1∑kexp(zj))

Softmax 回归的随机梯度下降

在这个问题中,您将实现用于(线性)softmax 回归的随机梯度下降(SGD)。换句话说,如我们在 9 月 1 日的讲座中讨论的那样,我们将考虑一个假设函数,该函数通过以下函数将 n n n 维输入转换为 k k k 维 logits:

h ( x ) = Θ T x \begin{equation} h(x) = \Theta^T x \end{equation} h(x)=ΘTx

其中, x ∈ R n x \in \mathbb{R}^n x∈Rn 是输入, Θ ∈ R n × k \Theta \in \mathbb{R}^{n \times k} Θ∈Rn×k 是模型参数。给定数据集 { ( x ( i ) ∈ R n , y ( i ) ∈ { 1 , ... , k } ) } \{(x^{(i)} \in \mathbb{R}^n, y^{(i)} \in \{1,\ldots,k\})\} {(x(i)∈Rn,y(i)∈{1,...,k})},对于 i = 1 , ... , m i=1,\ldots,m i=1,...,m,softmax 回归相关的优化问题如下:

KaTeX parse error: Undefined control sequence: \minimize at position 18: ...egin{equation} \̲m̲i̲n̲i̲m̲i̲z̲e̲_{\Theta} \; \f...

回顾课堂内容,线性 softmax 目标的梯度如下:

∇ Θ ℓ s o f t m a x ( Θ T x , y ) = x ( z − e y ) T \begin{equation} \nabla_\Theta \ell_{\mathrm{softmax}}(\Theta^T x, y) = x (z - e_y)^T \end{equation} ∇Θℓsoftmax(ΘTx,y)=x(z−ey)T

其中,

KaTeX parse error: Undefined control sequence: \normalize at position 75: ...a^T x)} \equiv \̲n̲o̲r̲m̲a̲l̲i̲z̲e̲(\exp(\Theta^T ...

(即, z z z 只是归一化后的 softmax 概率), e y e_y ey 表示第 y y y 个单位基,即在第 y y y 个位置为 1 其余为 0 的向量。

我们还可以用课堂上讨论的更紧凑的符号来表示。即,如果我们让 X ∈ R m × n X \in \mathbb{R}^{m \times n} X∈Rm×n 表示一些 m m m 个输入的设计矩阵(整个数据集或一个小批量), y ∈ { 1 , ... , k } m y \in \{1,\ldots,k\}^m y∈{1,...,k}m 是相应的标签向量,并且扩展 ℓ s o f t m a x \ell_{\mathrm{softmax}} ℓsoftmax 以指代平均 softmax 损失,那么

∇ Θ ℓ s o f t m a x ( X Θ , y ) = 1 m X T ( Z − I y ) \begin{equation} \nabla_\Theta \ell_{\mathrm{softmax}}(X \Theta, y) = \frac{1}{m} X^T (Z - I_y) \end{equation} ∇Θℓsoftmax(XΘ,y)=m1XT(Z−Iy)

其中,

KaTeX parse error: Undefined control sequence: \normalize at position 22: ...{equation} Z = \̲n̲o̲r̲m̲a̲l̲i̲z̲e̲(\exp(X \Theta)...

表示 logits 矩阵, I y ∈ R m × k I_y \in \mathbb{R}^{m \times k} Iy∈Rm×k 代表标签 y y y 的独热基的拼接。

使用这些梯度,实现 softmax_regression_epoch() 函数,该函数使用指定的学习率/步长 lr 和小批量大小 batch 运行 SGD 的单个周期(对数据集的一次遍历)。如 docstring 所述,您的函数应原地修改 Theta 数组。实现后,运行测试。

代码:

python 复制代码
def softmax_regression_epoch(X, y, theta, lr = 0.1, batch=100):
    """ Run a single epoch of SGD for softmax regression on the data, using
    the step size lr and specified batch size.  This function should modify the
    theta matrix in place, and you should iterate through batches in X _without_
    randomizing the order.

    Args:
        X (np.ndarray[np.float32]): 2D input array of size
            (num_examples x input_dim).
        y (np.ndarray[np.uint8]): 1D class label array of size (num_examples,)
        theta (np.ndarrray[np.float32]): 2D array of softmax regression
            parameters, of shape (input_dim, num_classes)
        lr (float): step size (learning rate) for SGD
        batch (int): size of SGD minibatch

    Returns:
        None
    """
    ### BEGIN YOUR CODE
    num_examples = X.shape[0]
    num_classes = theta.shape[1]
 
    for start in range(0, num_examples, batch):
        end = min(start + batch, num_examples)
        X_batch = X[start:end]
        y_batch = y[start:end]

        # Compute the logits
        logits = X_batch @ theta

        # Compute the softmax probabilities
        exp_logits = np.exp(logits)
        probabilities = exp_logits / np.sum(exp_logits, axis=1, keepdims=True)

        # Create a one-hot encoded matrix of the true labels
        I_y = np.zeros_like(probabilities)
        I_y[np.arange(y_batch.size), y_batch] = 1

        # Compute the gradient
        gradient = X_batch.T @ (probabilities - I_y) / y_batch.size

        # Update the parameters
        theta -= lr * gradient
   
    ### END YOUR CODE

数学证明(Softmax 损失相对于参数的梯度)

Softmax 函数和损失

给定 logits z z z 和真实标签 y y y,softmax 函数和相应的损失函数定义如下:

Softmax 函数:

σ ( z i ) = exp ⁡ ( z i ) ∑ j exp ⁡ ( z j ) \sigma(z_i) = \frac{\exp(z_i)}{\sum_j \exp(z_j)} σ(zi)=∑jexp(zj)exp(zi)

我们将类别 i i i 的 softmax 输出(概率)表示为 p i = σ ( z i ) p_i = \sigma(z_i) pi=σ(zi)。

Softmax 损失:

真实类别 y y y 的 softmax 损失为:
ℓ s o f t m a x ( z , y ) = log ⁡ ( ∑ i = 1 k exp ⁡ ( z i ) ) − z y \ell_{\mathrm{softmax}}(z, y) = \log \left( \sum_{i=1}^k \exp(z_i) \right) - z_y ℓsoftmax(z,y)=log(i=1∑kexp(zi))−zy

梯度推导

为了推导 softmax 损失相对于参数 Θ \Theta Θ 的梯度,我们需要遵循以下步骤:

损失相对于 logits 的梯度:

我们需要计算每个 i i i 的 ∂ ℓ s o f t m a x ∂ z i \frac{\partial \ell_{\mathrm{softmax}}}{\partial z_i} ∂zi∂ℓsoftmax。

对于 i = y i = y i=y(真实类别):

∂ ℓ s o f t m a x ∂ z y = ∂ ∂ z y ( log ⁡ ( ∑ i = 1 k exp ⁡ ( z i ) ) − z y ) = exp ⁡ ( z y ) ∑ i = 1 k exp ⁡ ( z i ) − 1 = p y − 1 \frac{\partial \ell_{\mathrm{softmax}}}{\partial z_y} = \frac{\partial}{\partial z_y} \left( \log \left( \sum_{i=1}^k \exp(z_i) \right) - z_y \right) = \frac{\exp(z_y)}{\sum_{i=1}^k \exp(z_i)} - 1 = p_y - 1 ∂zy∂ℓsoftmax=∂zy∂(log(i=1∑kexp(zi))−zy)=∑i=1kexp(zi)exp(zy)−1=py−1

对于 i ≠ y i \neq y i=y:

∂ ℓ s o f t m a x ∂ z i = ∂ ∂ z i log ⁡ ( ∑ i = 1 k exp ⁡ ( z i ) ) = exp ⁡ ( z i ) ∑ i = 1 k exp ⁡ ( z i ) = p i \frac{\partial \ell_{\mathrm{softmax}}}{\partial z_i} = \frac{\partial}{\partial z_i} \log \left( \sum_{i=1}^k \exp(z_i) \right) = \frac{\exp(z_i)}{\sum_{i=1}^k \exp(z_i)} = p_i ∂zi∂ℓsoftmax=∂zi∂log(i=1∑kexp(zi))=∑i=1kexp(zi)exp(zi)=pi

将这些结合起来,我们得到:

∂ ℓ s o f t m a x ∂ z i = p i − δ i y \frac{\partial \ell_{\mathrm{softmax}}}{\partial z_i} = p_i - \delta_{iy} ∂zi∂ℓsoftmax=pi−δiy

其中 δ i y \delta_{iy} δiy 是克罗内克函数,如果 i = y i = y i=y 则为 1,否则为 0。

相对于参数 Θ \Theta Θ 的梯度:

使用链式法则,损失相对于 Θ \Theta Θ 的梯度为:

∂ ℓ s o f t m a x ∂ Θ = ∂ ℓ s o f t m a x ∂ z ⋅ ∂ z ∂ Θ \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta} = \frac{\partial \ell_{\mathrm{softmax}}}{\partial z} \cdot \frac{\partial z}{\partial \Theta} ∂Θ∂ℓsoftmax=∂z∂ℓsoftmax⋅∂Θ∂z

我们知道 z = Θ T x z = \Theta^T x z=ΘTx,所以:

∂ z i ∂ Θ j k = ∂ ( Θ k i x k ) ∂ Θ j k = x j δ i k \frac{\partial z_i}{\partial \Theta_{jk}} = \frac{\partial (\Theta_{ki} x_k)}{\partial \Theta_{jk}} = x_j \delta_{ik} ∂Θjk∂zi=∂Θjk∂(Θkixk)=xjδik

因此,对于单个输入 x x x,梯度为:

∂ ℓ s o f t m a x ∂ Θ j k = ∑ i ∂ ℓ s o f t m a x ∂ z i ∂ z i ∂ Θ j k = ∑ i ( p i − δ i y ) x j δ i k \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{jk}} = \sum_i \frac{\partial \ell_{\mathrm{softmax}}}{\partial z_i} \frac{\partial z_i}{\partial \Theta_{jk}} = \sum_i (p_i - \delta_{iy}) x_j \delta_{ik} ∂Θjk∂ℓsoftmax=i∑∂zi∂ℓsoftmax∂Θjk∂zi=i∑(pi−δiy)xjδik

这简化为:

∂ ℓ s o f t m a x ∂ Θ j k = x j ( p k − δ k y ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{jk}} = x_j (p_k - \delta_{ky}) ∂Θjk∂ℓsoftmax=xj(pk−δky)

矩阵形式

在矩阵形式中,这变为:
∇ Θ ℓ s o f t m a x ( Θ T x , y ) = x ( z − e y ) T \nabla_{\Theta} \ell_{\mathrm{softmax}}(\Theta^T x, y) = x (z - e_y)^T ∇Θℓsoftmax(ΘTx,y)=x(z−ey)T

其中 z = σ ( Θ T x ) z = \sigma(\Theta^T x) z=σ(ΘTx) 是 softmax 概率向量, e y e_y ey 是真实类别 y y y 的独热编码向量。


克罗内克函数 δ i j \delta_{ij} δij 是两个变量(通常是整数)的函数,如果两个变量相等则为1,否则为0。它以德国数学家 Leopold Kronecker 的名字命名。数学上定义为:

δ i j = { 1 如果 i = j 0 如果 i ≠ j \delta_{ij} = \begin{cases} 1 & \text{如果 } i = j \\ 0 & \text{如果 } i \neq j \end{cases} δij={10如果 i=j如果 i=j

∂ ℓ s o f t m a x ∂ Θ \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta} ∂Θ∂ℓsoftmax 的例子

考虑一个简单的例子:

  • n = 2 n = 2 n=2 个特征,
  • k = 3 k = 3 k=3 个类别。

输入向量 x x x 和参数矩阵 Θ \Theta Θ 给定如下:

x = ( x 1 x 2 ) x = \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} x=(x1x2)

Θ = ( Θ 11 Θ 12 Θ 13 Θ 21 Θ 22 Θ 23 ) \Theta = \begin{pmatrix} \Theta_{11} & \Theta_{12} & \Theta_{13} \\ \Theta_{21} & \Theta_{22} & \Theta_{23} \end{pmatrix} Θ=(Θ11Θ21Θ12Θ22Θ13Θ23)

假设真实类别 y y y 是2(即第二类)。

计算 Logits z z z

首先,计算 logits z z z:

z = Θ T x = ( Θ 11 Θ 21 Θ 12 Θ 22 Θ 13 Θ 23 ) ( x 1 x 2 ) = ( Θ 11 x 1 + Θ 21 x 2 Θ 12 x 1 + Θ 22 x 2 Θ 13 x 1 + Θ 23 x 2 ) z = \Theta^T x = \begin{pmatrix} \Theta_{11} & \Theta_{21} \\ \Theta_{12} & \Theta_{22} \\ \Theta_{13} & \Theta_{23} \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} = \begin{pmatrix} \Theta_{11} x_1 + \Theta_{21} x_2 \\ \Theta_{12} x_1 + \Theta_{22} x_2 \\ \Theta_{13} x_1 + \Theta_{23} x_2 \end{pmatrix} z=ΘTx= Θ11Θ12Θ13Θ21Θ22Θ23 (x1x2)= Θ11x1+Θ21x2Θ12x1+Θ22x2Θ13x1+Θ23x2

计算 Softmax 概率 σ ( z ) \sigma(z) σ(z)

接下来,计算 softmax 概率:

σ ( z i ) = exp ⁡ ( z i ) ∑ j = 1 k exp ⁡ ( z j ) \sigma(z_i) = \frac{\exp(z_i)}{\sum_{j=1}^k \exp(z_j)} σ(zi)=∑j=1kexp(zj)exp(zi)

令:

z 1 = Θ 11 x 1 + Θ 21 x 2 , z 2 = Θ 12 x 1 + Θ 22 x 2 , z 3 = Θ 13 x 1 + Θ 23 x 2 z_1 = \Theta_{11} x_1 + \Theta_{21} x_2, \quad z_2 = \Theta_{12} x_1 + \Theta_{22} x_2, \quad z_3 = \Theta_{13} x_1 + \Theta_{23} x_2 z1=Θ11x1+Θ21x2,z2=Θ12x1+Θ22x2,z3=Θ13x1+Θ23x2

然后,softmax 概率为:

σ ( z 1 ) = exp ⁡ ( z 1 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) \sigma(z_1) = \frac{\exp(z_1)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} σ(z1)=exp(z1)+exp(z2)+exp(z3)exp(z1)

σ ( z 2 ) = exp ⁡ ( z 2 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) \sigma(z_2) = \frac{\exp(z_2)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} σ(z2)=exp(z1)+exp(z2)+exp(z3)exp(z2)

σ ( z 3 ) = exp ⁡ ( z 3 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) \sigma(z_3) = \frac{\exp(z_3)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} σ(z3)=exp(z1)+exp(z2)+exp(z3)exp(z3)

计算 δ k y \delta_{ky} δky

假设真实类别 y = 1 y = 1 y=1(第二类),则独热编码向量 e y e_y ey 为:

e y = ( 0 1 0 ) e_y = \begin{pmatrix} 0 \\ 1 \\ 0 \end{pmatrix} ey= 010

偏导数 ∂ ℓ s o f t m a x ∂ Θ j k \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{jk}} ∂Θjk∂ℓsoftmax

我们要计算每个元素 Θ j k \Theta_{jk} Θjk 的偏导数:

∂ ℓ s o f t m a x ∂ Θ j k = x j ( σ ( z k ) − δ k y ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{jk}} = x_j (\sigma(z_k) - \delta_{ky}) ∂Θjk∂ℓsoftmax=xj(σ(zk)−δky)

让我们使用符号表达式明确计算几个:

当 j = 1 j = 1 j=1, k = 1 k = 1 k=1 时:

∂ ℓ s o f t m a x ∂ Θ 11 = x 1 ( σ ( z 1 ) − δ 1 y ) = x 1 ( exp ⁡ ( z 1 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) − 0 ) = x 1 ( exp ⁡ ( z 1 ) ∑ j = 1 3 exp ⁡ ( z j ) ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{11}} = x_1 (\sigma(z_1) - \delta_{1y}) = x_1 \left(\frac{\exp(z_1)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} - 0\right) = x_1 \left(\frac{\exp(z_1)}{\sum_{j=1}^3 \exp(z_j)}\right) ∂Θ11∂ℓsoftmax=x1(σ(z1)−δ1y)=x1(exp(z1)+exp(z2)+exp(z3)exp(z1)−0)=x1(∑j=13exp(zj)exp(z1))

当 j = 1 j = 1 j=1, k = 2 k = 2 k=2 时:

∂ ℓ s o f t m a x ∂ Θ 12 = x 1 ( σ ( z 2 ) − δ 2 y ) = x 1 ( exp ⁡ ( z 2 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) − 1 ) = x 1 ( exp ⁡ ( z 2 ) ∑ j = 1 3 exp ⁡ ( z j ) − 1 ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{12}} = x_1 (\sigma(z_2) - \delta_{2y}) = x_1 \left(\frac{\exp(z_2)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} - 1\right) = x_1 \left(\frac{\exp(z_2)}{\sum_{j=1}^3 \exp(z_j)} - 1\right) ∂Θ12∂ℓsoftmax=x1(σ(z2)−δ2y)=x1(exp(z1)+exp(z2)+exp(z3)exp(z2)−1)=x1(∑j=13exp(zj)exp(z2)−1)

当 j = 1 j = 1 j=1, k = 3 k = 3 k=3 时:

∂ ℓ s o f t m a x ∂ Θ 13 = x 1 ( σ ( z 3 ) − δ 3 y ) = x 1 ( exp ⁡ ( z 3 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) − 0 ) = x 1 ( exp ⁡ ( z 3 ) ∑ j = 1 3 exp ⁡ ( z j ) ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{13}} = x_1 (\sigma(z_3) - \delta_{3y}) = x_1 \left(\frac{\exp(z_3)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} - 0\right) = x_1 \left(\frac{\exp(z_3)}{\sum_{j=1}^3 \exp(z_j)}\right) ∂Θ13∂ℓsoftmax=x1(σ(z3)−δ3y)=x1(exp(z1)+exp(z2)+exp(z3)exp(z3)−0)=x1(∑j=13exp(zj)exp(z3))

当 j = 2 j = 2 j=2, k = 1 k = 1 k=1 时:

∂ ℓ s o f t m a x ∂ Θ 21 = x 2 ( σ ( z 1 ) − δ 1 y ) = x 2 ( exp ⁡ ( z 1 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) − 0 ) = x 2 ( exp ⁡ ( z 1 ) ∑ j = 1 3 exp ⁡ ( z j ) ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{21}} = x_2 (\sigma(z_1) - \delta_{1y}) = x_2 \left(\frac{\exp(z_1)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} - 0\right) = x_2 \left(\frac{\exp(z_1)}{\sum_{j=1}^3 \exp(z_j)}\right) ∂Θ21∂ℓsoftmax=x2(σ(z1)−δ1y)=x2(exp(z1)+exp(z2)+exp(z3)exp(z1)−0)=x2(∑j=13exp(zj)exp(z1))

当 j = 2 j = 2 j=2, k = 2 k = 2 k=2 时:

∂ ℓ s o f t m a x ∂ Θ 22 = x 2 ( σ ( z 2 ) − δ 2 y ) = x 2 ( exp ⁡ ( z 2 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) − 1 ) = x 2 ( exp ⁡ ( z 2 ) ∑ j = 1 3 exp ⁡ ( z j ) − 1 ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{22}} = x_2 (\sigma(z_2) - \delta_{2y}) = x_2 \left(\frac{\exp(z_2)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} - 1\right) = x_2 \left(\frac{\exp(z_2)}{\sum_{j=1}^3 \exp(z_j)} - 1\right) ∂Θ22∂ℓsoftmax=x2(σ(z2)−δ2y)=x2(exp(z1)+exp(z2)+exp(z3)exp(z2)−1)=x2(∑j=13exp(zj)exp(z2)−1)

当 j = 2 j = 2 j=2, k = 3 k = 3 k=3 时:

∂ ℓ s o f t m a x ∂ Θ 23 = x 2 ( σ ( z 3 ) − δ 3 y ) = x 2 ( exp ⁡ ( z 3 ) exp ⁡ ( z 1 ) + exp ⁡ ( z 2 ) + exp ⁡ ( z 3 ) − 0 ) = x 2 ( exp ⁡ ( z 3 ) ∑ j = 1 3 exp ⁡ ( z j ) ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{23}} = x_2 (\sigma(z_3) - \delta_{3y}) = x_2 \left(\frac{\exp(z_3)}{\exp(z_1) + \exp(z_2) + \exp(z_3)} - 0\right) = x_2 \left(\frac{\exp(z_3)}{\sum_{j=1}^3 \exp(z_j)}\right) ∂Θ23∂ℓsoftmax=x2(σ(z3)−δ3y)=x2(exp(z1)+exp(z2)+exp(z3)exp(z3)−0)=x2(∑j=13exp(zj)exp(z3))

梯度总结

总结这些, Θ \Theta Θ 的各个元素的梯度为:

∂ ℓ s o f t m a x ∂ Θ = ( ∂ ℓ s o f t m a x ∂ Θ 11 ∂ ℓ s o f t m a x ∂ Θ 12 ∂ ℓ s o f t m a x ∂ Θ 13 ∂ ℓ s o f t m a x ∂ Θ 21 ∂ ℓ s o f t m a x ∂ Θ 22 ∂ ℓ s o f t m a x ∂ Θ 23 ) = ( x 1 ( exp ⁡ ( z 1 ) ∑ j = 1 3 exp ⁡ ( z j ) ) x 1 ( exp ⁡ ( z 2 ) ∑ j = 1 3 exp ⁡ ( z j ) − 1 ) x 1 ( exp ⁡ ( z 3 ) ∑ j = 1 3 exp ⁡ ( z j ) ) x 2 ( exp ⁡ ( z 1 ) ∑ j = 1 3 exp ⁡ ( z j ) ) x 2 ( exp ⁡ ( z 2 ) ∑ j = 1 3 exp ⁡ ( z j ) − 1 ) x 2 ( exp ⁡ ( z 3 ) ∑ j = 1 3 exp ⁡ ( z j ) ) ) \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta} = \begin{pmatrix} \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{11}} & \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{12}} & \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{13}} \\ \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{21}} & \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{22}} & \frac{\partial \ell_{\mathrm{softmax}}}{\partial \Theta_{23}} \end{pmatrix} = \begin{pmatrix} x_1 \left(\frac{\exp(z_1)}{\sum_{j=1}^3 \exp(z_j)}\right) & x_1 \left(\frac{\exp(z_2)}{\sum_{j=1}^3 \exp(z_j)} - 1\right) & x_1 \left(\frac{\exp(z_3)}{\sum_{j=1}^3 \exp(z_j)}\right) \\ x_2 \left(\frac{\exp(z_1)}{\sum_{j=1}^3 \exp(z_j)}\right) & x_2 \left(\frac{\exp(z_2)}{\sum_{j=1}^3 \exp(z_j)} - 1\right) & x_2 \left(\frac{\exp(z_3)}{\sum_{j=1}^3 \exp(z_j)}\right) \end{pmatrix} ∂Θ∂ℓsoftmax=(∂Θ11∂ℓsoftmax∂Θ21∂ℓsoftmax∂Θ12∂ℓsoftmax∂Θ22∂ℓsoftmax∂Θ13∂ℓsoftmax∂Θ23∂ℓsoftmax)= x1(∑j=13exp(zj)exp(z1))x2(∑j=13exp(zj)exp(z1))x1(∑j=13exp(zj)exp(z2)−1)x2(∑j=13exp(zj)exp(z2)−1)x1(∑j=13exp(zj)exp(z3))x2(∑j=13exp(zj)exp(z3))

矩阵维度示例

让我们用一个例子来说明这一点。

权重矩阵 Θ \Theta Θ:

Θ = ( Θ 11 Θ 12 Θ 13 Θ 21 Θ 22 Θ 23 ) \Theta = \begin{pmatrix} \Theta_{11} & \Theta_{12} & \Theta_{13} \\ \Theta_{21} & \Theta_{22} & \Theta_{23} \end{pmatrix} Θ=(Θ11Θ21Θ12Θ22Θ13Θ23)

这里, Θ \Theta Θ 是一个 2 × 3 2 \times 3 2×3 矩阵,用于具有 2 个特征和 3 个类别的模型。

输入向量 x x x:

x = ( x 1 x 2 ) x = \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} x=(x1x2)

Softmax 概率 σ ( z ) \sigma(z) σ(z):

σ ( z ) = ( σ ( z 1 ) σ ( z 2 ) σ ( z 3 ) ) \sigma(z) = \begin{pmatrix} \sigma(z_1) \\ \sigma(z_2) \\ \sigma(z_3) \end{pmatrix} σ(z)= σ(z1)σ(z2)σ(z3)

这是一个 3 × 1 3 \times 1 3×1 向量。

独热编码真实类别 e y e_y ey:

如果真实类别 y y y 是2(即第二类),则:

e y = ( 0 1 0 ) e_y = \begin{pmatrix} 0 \\ 1 \\ 0 \end{pmatrix} ey= 010

梯度矩阵 ∇ Θ ℓ s o f t m a x \nabla_\Theta \ell_{\mathrm{softmax}} ∇Θℓsoftmax:

梯度矩阵为:

∇ Θ ℓ s o f t m a x = x ( σ ( z ) − e y ) T \nabla_\Theta \ell_{\mathrm{softmax}} = x (\sigma(z) - e_y)^T ∇Θℓsoftmax=x(σ(z)−ey)T

计算外积 x ( σ ( z ) − e y ) T x (\sigma(z) - e_y)^T x(σ(z)−ey)T:

σ ( z ) − e y = ( σ ( z 1 ) σ ( z 2 ) σ ( z 3 ) ) − ( 0 1 0 ) = ( σ ( z 1 ) σ ( z 2 ) − 1 σ ( z 3 ) ) \sigma(z) - e_y = \begin{pmatrix} \sigma(z_1) \\ \sigma(z_2) \\ \sigma(z_3) \end{pmatrix} - \begin{pmatrix} 0 \\ 1 \\ 0 \end{pmatrix} = \begin{pmatrix} \sigma(z_1) \\ \sigma(z_2) - 1 \\ \sigma(z_3) \end{pmatrix} σ(z)−ey= σ(z1)σ(z2)σ(z3) − 010 = σ(z1)σ(z2)−1σ(z3)

外积 x ( σ ( z ) − e y ) T x (\sigma(z) - e_y)^T x(σ(z)−ey)T 为:

x ( σ ( z ) − e y ) T = ( x 1 x 2 ) ( σ ( z 1 ) σ ( z 2 ) − 1 σ ( z 3 ) ) = ( x 1 σ ( z 1 ) x 1 ( σ ( z 2 ) − 1 ) x 1 σ ( z 3 ) x 2 σ ( z 1 ) x 2 ( σ ( z 2 ) − 1 ) x 2 σ ( z 3 ) ) x (\sigma(z) - e_y)^T = \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} \begin{pmatrix} \sigma(z_1) & \sigma(z_2) - 1 & \sigma(z_3) \end{pmatrix} = \begin{pmatrix} x_1 \sigma(z_1) & x_1 (\sigma(z_2) - 1) & x_1 \sigma(z_3) \\ x_2 \sigma(z_1) & x_2 (\sigma(z_2) - 1) & x_2 \sigma(z_3) \end{pmatrix} x(σ(z)−ey)T=(x1x2)(σ(z1)σ(z2)−1σ(z3))=(x1σ(z1)x2σ(z1)x1(σ(z2)−1)x2(σ(z2)−1)x1σ(z3)x2σ(z3))

更新权重矩阵 Θ \Theta Θ

使用梯度矩阵,我们更新权重矩阵 Θ \Theta Θ 如下:

Θ : = Θ − η ∇ Θ ℓ s o f t m a x \Theta := \Theta - \eta \nabla_\Theta \ell_{\mathrm{softmax}} Θ:=Θ−η∇Θℓsoftmax

对于我们的例子,如果学习率 η \eta η 是 0.01,更新后的权重为:

Θ = Θ − 0.01 ( x 1 σ ( z 1 ) x 1 ( σ ( z 2 ) − 1 ) x 1 σ ( z 3 ) x 2 σ ( z 1 ) x 2 ( σ ( z 2 ) − 1 ) x 2 σ ( z 3 ) ) \Theta = \Theta - 0.01 \begin{pmatrix} x_1 \sigma(z_1) & x_1 (\sigma(z_2) - 1) & x_1 \sigma(z_3) \\ x_2 \sigma(z_1) & x_2 (\sigma(z_2) - 1) & x_2 \sigma(z_3) \end{pmatrix} Θ=Θ−0.01(x1σ(z1)x2σ(z1)x1(σ(z2)−1)x2(σ(z2)−1)x1σ(z3)x2σ(z3))

结论

梯度矩阵 ∇ Θ ℓ s o f t m a x \nabla_\Theta \ell_{\mathrm{softmax}} ∇Θℓsoftmax 与权重矩阵 Θ \Theta Θ 是分开的。它用于计算在训练过程中需要最小化损失函数的更新方向和幅度。在训练过程中,使用梯度下降或其他优化算法迭代更新权重矩阵 Θ \Theta Θ。


单个样本的梯度

回顾单个样本的梯度:

∇ Θ ℓ s o f t m a x ( Θ T x , y ) = x ( z − e y ) T \nabla_\Theta \ell_{\mathrm{softmax}}(\Theta^T x, y) = x (z - e_y)^T ∇Θℓsoftmax(ΘTx,y)=x(z−ey)T

其中:

  • x x x 是单个样本的输入向量。
  • z z z 是输入样本的 softmax 概率向量。
  • e y e_y ey 是真实类别 y y y 的独热编码向量。

扩展到多个样本(批量)

∇ Θ ℓ s o f t m a x ( X Θ , y ) = 1 m X T ( Z − I y ) \nabla_\Theta \ell_{\mathrm{softmax}}(X \Theta, y) = \frac{1}{m} X^T (Z - I_y) ∇Θℓsoftmax(XΘ,y)=m1XT(Z−Iy)

当我们有多个样本时,我们可以将输入表示为矩阵 X X X,其中每一行都是第 i i i 个样本的输入向量 x i x_i xi。同样,我们可以将真实标签表示为矩阵 I y I_y Iy,其中每一行是第 i i i 个标签的独热编码向量 e y i e_{y_i} eyi。

矩阵 Z Z Z 是所有样本的 softmax 概率矩阵,其中每一行包含相应样本的 softmax 概率。

符号和维度

让我们定义矩阵及其维度:

  • X ∈ R m × n X \in \mathbb{R}^{m \times n} X∈Rm×n:设计矩阵,包含 m m m 个输入向量,每个向量有 n n n 个特征。
  • Θ ∈ R n × k \Theta \in \mathbb{R}^{n \times k} Θ∈Rn×k:权重矩阵,将 n n n 个特征映射到 k k k 个类别。
  • Z ∈ R m × k Z \in \mathbb{R}^{m \times k} Z∈Rm×k:包含 m m m 个样本和 k k k 个类别的 softmax 概率矩阵。
  • I y ∈ R m × k I_y \in \mathbb{R}^{m \times k} Iy∈Rm×k:包含 m m m 个样本和 k k k 个类别的真实标签的独热编码矩阵。

计算梯度

m m m 个样本的平均 softmax 损失梯度可以通过对每个样本的梯度求和然后除以 m m m 来计算:

∇ Θ ℓ s o f t m a x = 1 m ∑ i = 1 m x i ( z i − e y i ) T \nabla_\Theta \ell_{\mathrm{softmax}} = \frac{1}{m} \sum_{i=1}^m x_i (z_i - e_{y_i})^T ∇Θℓsoftmax=m1i=1∑mxi(zi−eyi)T

在矩阵形式中,可以表示为:

∇ Θ ℓ s o f t m a x ( X Θ , y ) = 1 m X T ( Z − I y ) \nabla_\Theta \ell_{\mathrm{softmax}}(X \Theta, y) = \frac{1}{m} X^T (Z - I_y) ∇Θℓsoftmax(XΘ,y)=m1XT(Z−Iy)

这个公式为什么有效

  • 矩阵 X X X
    X X X 的每一行是输入向量 x i x_i xi。

  • 矩阵 Z Z Z
    Z Z Z 的每一行是相应输入 x i x_i xi 的 softmax 概率 z i z_i zi。

  • 矩阵 I y I_y Iy
    I y I_y Iy 的每一行是真实类别 y i y_i yi 的独热编码向量 e y i e_{y_i} eyi。

  • 矩阵乘法
    X T ( Z − I y ) X^T (Z - I_y) XT(Z−Iy) 计算了所有批量样本的外积 x i ( z i − e y i ) T x_i (z_i - e_{y_i})^T xi(zi−eyi)T 的和。除以 m m m 得到平均梯度。

用 softmax 回归训练 MNIST

虽然这不是测试的一部分,但既然你已经写了这段代码,你也可以尝试使用 SGD 训练一个完整的 MNIST 线性分类器。为此,你可以使用 src/simple_ml.py 文件中的 train_softmax() 函数(我们已经为你编写了这个函数,所以你不需要自己编写,但你可以看看它是如何工作的)。

你可以使用以下代码看看它是如何工作的。作为参考,如下所示,我们的实现在 Colab 上运行大约需要 3 秒,并且达到了 7.97% 的错误率。

python 复制代码
def loss_err(h,y):
    """ Helper funciton to compute both loss and error"""
    # h: (np.ndarray[np.float32]): 2D numpy array of shape (batch_size x num_classes), containing the logit predictions for each class.
    return softmax_loss(h,y), np.mean(h.argmax(axis=1) != y)


def train_softmax(X_tr, y_tr, X_te, y_te, epochs=10, slr=0.5, batch=100,
                  cpp=False):
    """ Example function to fully train a softmax regression classifier """
    # X_tr.shape[1]: the number of features in the training data
    # y_tr.max()+1 : the number of classes
    # weight matrix theta's shape (number of features x number of classes)
    theta = np.zeros((X_tr.shape[1], y_tr.max()+1), dtype=np.float32)
    print("| Epoch | Train Loss | Train Err | Test Loss | Test Err |")
    for epoch in range(epochs):
        if not cpp:
            softmax_regression_epoch(X_tr, y_tr, theta, lr=lr, batch=batch)
        else:
            softmax_regression_epoch_cpp(X_tr, y_tr, theta, lr=lr, batch=batch)
        # Computes the loss and error for the entire training dataset
        # X_tr @ theta ((num_examples x number of features)@(number of features x number of classes)) = (num_examples x num_classes)
        train_loss, train_err = loss_err(X_tr @ theta, y_tr)
        test_loss, test_err = loss_err(X_te @ theta, y_te)
        print("|  {:>4} |    {:.5f} |   {:.5f} |   {:.5f} |  {:.5f} |"\
              .format(epoch, train_loss, train_err, test_loss, test_err))

解释 np.mean(h.argmax(axis=1) != y)

python 复制代码
import numpy as np

# Predicted logits for 5 samples and 3 classes
h = np.array([[0.2, 0.5, 0.3],
              [0.1, 0.3, 0.6],
              [0.7, 0.2, 0.1],
              [0.4, 0.4, 0.2],
              [0.1, 0.6, 0.3]])

# True class labels
y = np.array([1, 2, 0, 1, 2])

# Predicted classes
predicted_classes = h.argmax(axis=1)
print("Predicted classes:", predicted_classes)
# Output: [1 2 0 0 1]

# Comparison of predicted classes with true classes
comparison = predicted_classes != y
print("Comparison (predicted != true):", comparison)
# Output: [False False False  True  True]

# Calculate the mean (classification error rate)
error_rate = np.mean(comparison)
print("Error rate:", error_rate)
# Output: 0.4 since (0 + 0 + 0 + 1 + 1) / 5 = 2 / 5 = 0.4

Softmax 回归作为线性分类器

让我们通过一个具体的例子来说明为什么软最大回归(多项逻辑回归)被认为是线性分类器。我们将使用一个简单的二维数据集以便于可视化。

示例设置

假设我们有一个包含两个特征 X 1 X_1 X1 和 X 2 X_2 X2 的数据集,以及三个类别(A、B 和 C)。让我们将输入特征向量表示为 x = [ X 1 , X 2 ] \mathbf{x} = [X_1, X_2] x=[X1,X2]。

Softmax 回归模型

线性变换

我们有一个形状为 ( 2 , 3 ) (2, 3) (2,3) 的权重矩阵 Θ \Theta Θ,其中每列对应一个类别的权重。

假设:

Θ = [ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] \Theta = \begin{bmatrix} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21} & \theta_{22} & \theta_{23} \end{bmatrix} Θ=[θ11θ21θ12θ22θ13θ23]

Logit 计算

每个类别的 logit 计算如下:

Z = x Θ = [ X 1 , X 2 ] [ θ 11 θ 12 θ 13 θ 21 θ 22 θ 23 ] = [ Z 1 , Z 2 , Z 3 ] Z = \mathbf{x} \Theta = [X_1, X_2] \begin{bmatrix} \theta_{11} & \theta_{12} & \theta_{13} \\ \theta_{21} & \theta_{22} & \theta_{23} \end{bmatrix} = [Z_1, Z_2, Z_3] Z=xΘ=[X1,X2][θ11θ21θ12θ22θ13θ23]=[Z1,Z2,Z3]

其中:

Z 1 = θ 11 X 1 + θ 21 X 2 Z_1 = \theta_{11} X_1 + \theta_{21} X_2 Z1=θ11X1+θ21X2

Z 2 = θ 12 X 1 + θ 22 X 2 Z_2 = \theta_{12} X_1 + \theta_{22} X_2 Z2=θ12X1+θ22X2

Z 3 = θ 13 X 1 + θ 23 X 2 Z_3 = \theta_{13} X_1 + \theta_{23} X_2 Z3=θ13X1+θ23X2

Softmax 函数

softmax 函数将这些 logit 转换为概率:

P ( y = i ∣ x ) = e Z i e Z 1 + e Z 2 + e Z 3 P(y=i \mid \mathbf{x}) = \frac{e^{Z_i}}{e^{Z_1} + e^{Z_2} + e^{Z_3}} P(y=i∣x)=eZ1+eZ2+eZ3eZi

决策边界

决策边界是分类器在两个类别之间无差别的地方。例如:

  • 类别 A 和类别 B 之间的边界是 Z 1 = Z 2 Z_1 = Z_2 Z1=Z2:

    θ 11 X 1 + θ 21 X 2 = θ 12 X 1 + θ 22 X 2 \theta_{11} X_1 + \theta_{21} X_2 = \theta_{12} X_1 + \theta_{22} X_2 θ11X1+θ21X2=θ12X1+θ22X2

    整理后,我们得到:

    ( θ 11 − θ 12 ) X 1 + ( θ 21 − θ 22 ) X 2 = 0 (\theta_{11} - \theta_{12}) X_1 + (\theta_{21} - \theta_{22}) X_2 = 0 (θ11−θ12)X1+(θ21−θ22)X2=0

    这是一个表示在 X 1 X_1 X1- X 2 X_2 X2 平面上直线的线性方程。

  • 类别 B 和类别 C 之间的边界是:

    ( θ 12 − θ 13 ) X 1 + ( θ 22 − θ 23 ) X 2 = 0 (\theta_{12} - \theta_{13}) X_1 + (\theta_{22} - \theta_{23}) X_2 = 0 (θ12−θ13)X1+(θ22−θ23)X2=0

  • 类别 A 和类别 C 之间的边界是:

    ( θ 11 − θ 13 ) X 1 + ( θ 21 − θ 23 ) X 2 = 0 (\theta_{11} - \theta_{13}) X_1 + (\theta_{21} - \theta_{23}) X_2 = 0 (θ11−θ13)X1+(θ21−θ23)X2=0

参考:

  • CMU 10714 深度学习系统
相关推荐
东胜物联8 分钟前
探寻5G工业网关市场,5G工业网关品牌解析
人工智能·嵌入式硬件·5g
cuisidong199710 分钟前
5G学习笔记三之物理层、数据链路层、RRC层协议
笔记·学习·5g
乌恩大侠11 分钟前
5G周边知识笔记
笔记·5g
南宫理的日知录17 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
皓74119 分钟前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
coberup26 分钟前
django Forbidden (403)错误解决方法
python·django·403错误
wangyue436 分钟前
c# 深度模型入门
深度学习
川石课堂软件测试1 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
985小水博一枚呀1 小时前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫