Numpy Softmax函数

Numpy Softmax函数

在本文中,我们将会学习Numpy和CS231n的基础概念。本篇文章关注重点在对softmax loss function的梯度计算。如果你对于softmax loss function和梯度计算已有了大致的了解,那么读完这篇文章后将会对你的理解更加深入。

阅读更多:Numpy 教程

Softmax Loss Function

k)
$$

其中,p_k是softmax函数的预测概率,即p_k=\frac{e^{f_k}}{\sum_{j} e^{f_j}}

这个导数公式展示了softmax loss 的推导过程。当我们拥有了误差函数的导数,我们就可以更新权重并且减小误差了。在众多的深度学习框架中,这个过程通常是自动化的。比如TensorFlow和PyTorch等框架会自动计算导数,无需手动计算。

Numpy CS231n 代码实现

现在,我们来实现这个导数公式。在这个部分,我们将编写使用Numpy库计算导数的代码。

导入库和数据声明

import numpy as np

# 设置K为10,数据集中有十个类别
K = 10

# 生成两个包含10个元素的向量,分别表示真实标签和得分向量f
y = np.random.randint(K, size=10)
f = np.random.randn(K, 5)

# 权重数组W的维度为数据集中样本的维度和类别个数,这里设置为(5, 10)
W = np.random.randn(5,K)

在这里,我们先声明了一个K值为10的常量,这个值说明了我们模型的分类数量。接着,我们分别声明了包含10个元素的向量 y 和包含 K 个元素的k类得分向量 f。最后,我们也声明了权重数组W的维度为数据集中样本的维度和类别个数,这里设置为(5, 10)。

计算softmax概率值

# 计算每一个样本的softmax函数概率值
exp_f = np.exp(f)
p = exp_f / np.sum(exp_f, axis=0)

在这里,我们计算了每个样本的softmax函数概率值。使用Numpy中的exp函数将得分向量f中的每个值进行指数化处理。为了得到每个类别的概率值,我们需要对指数化后的值进行归一化,也就是将它们除以所有类别的指数化值和。在这里,我们使用了Numpy中的sum函数,对所有的类别进行了求和。使用axis=0参数,使得函数在每列中执行这个操作,每列代表一个样本的所有类别概率值。

计算损失值

# 计算每个样本的损失值
loss = -np.log(p[y, np.arange(K)])

这一步计算了每个样本的损失值。通过对于真实类别的概率值取对数,再乘以负数,我们可以获取每个样本的损失值。这里需要注意的是,为了获取正确的损失值,我们需要使用NumPy采取的广播机制。y向量包含了每个数据点真实的类别。我们使用它的值作为索引来获取p中每个样本的概率值。

计算导数

# 计算导数
dout = p.copy()
dout[y, np.arange(K)] -= 1

此时,我们已经计算出了我们想要的梯度的形式。这一步计算了softmax loss函数关于得分f的导数。dout是关于输入得分向量的导数。其计算方式如上文所述。

计算权重更新

dW = np.dot(X.T, dout)

dW是损失函数对权重W的导数。我们可以用前面的代码获得输入变量矩阵X,使用它来计算导数,公式如下: dW = X^Tdout

总结

到这里我们就完成了对于Numpy和CS231n的初学入门,并完成了对softmax loss function梯度的计算。在这个过程中,我们实现了代码,并解释了一些核心概念,比如如何计算softmax函数以及什么是导数以及它在深度学习中的应用。理解了本文中的核心概念,你就已经开始深入了解深度学习的工作原理。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程