Machine learning 理解softmax分类器

Machine learning 理解softmax分类器,machine-learning,deep-learning,gradient-descent,calculus,softmax,Machine Learning,Deep Learning,Gradient Descent,Calculus,Softmax,我试图从这个链接了解Softmax分类器的一个简单实现-。在这里,他们实现了一个简单的softmax分类器。在链路上的Softmax分类器示例中,2D空间上随机有300个点以及与之相关联的标签。softmax分类器将学习哪个点属于哪个类 下面是softmax分类器的完整代码。或者你可以看到我提供的链接 # initialize parameters randomly W = 0.01 * np.random.randn(D,K) b = np.zeros((1,K)) # some hyper

我试图从这个链接了解Softmax分类器的一个简单实现-。在这里,他们实现了一个简单的softmax分类器。在链路上的Softmax分类器示例中,2D空间上随机有300个点以及与之相关联的标签。softmax分类器将学习哪个点属于哪个类

下面是softmax分类器的完整代码。或者你可以看到我提供的链接

# initialize parameters randomly
W = 0.01 * np.random.randn(D,K)
b = np.zeros((1,K))

# some hyperparameters
step_size = 1e-0
reg = 1e-3 # regularization strength

# gradient descent loop
num_examples = X.shape[0]
for i in xrange(200):

   # evaluate class scores, [N x K]
   scores = np.dot(X, W) + b 

   # compute the class probabilities
   exp_scores = np.exp(scores)
   probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True) # [N x K]

   # compute the loss: average cross-entropy loss and regularization
   corect_logprobs = -np.log(probs[range(num_examples),y])
   data_loss = np.sum(corect_logprobs)/num_examples
   reg_loss = 0.5*reg*np.sum(W*W)
   loss = data_loss + reg_loss
   if i % 10 == 0:
   print "iteration %d: loss %f" % (i, loss)

   # compute the gradient on scores
   dscores = probs
   dscores[range(num_examples),y] -= 1
   dscores /= num_examples

   # backpropate the gradient to the parameters (W,b)
   dW = np.dot(X.T, dscores)
   db = np.sum(dscores, axis=0, keepdims=True)

   dW += reg*W # regularization gradient

   # perform a parameter update
   W += -step_size * dW
   b += -step_size * db
我不明白他们是怎么计算梯度的。我假设他们计算了这里的梯度-

   dW = np.dot(X.T, dscores)
   db = np.sum(dscores, axis=0, keepdims=True)
   dW += reg*W # regularization gradient
但是怎么做呢?我的意思是为什么
dW
的梯度是
np.dot(X.T,dscores)
?为什么
db
的梯度是
np.sum(dscores,axis=0,keepdims=True)
??那么他们是如何计算重量和偏差的梯度的呢?还有为什么他们计算了
正则化梯度


我刚刚开始学习卷积神经网络和深度学习。我听说用于视觉识别的卷积神经网络是一个很好的起点。我不知道深度学习相关的职位应该放在哪里。所以,我把它们放在stackoverflow上。如果有任何地方可以发布与深度学习相关的问题,请让我知道

此处开始计算梯度:

# compute the gradient on scores
dscores = probs
dscores[range(num_examples),y] -= 1
dscores /= num_examples
首先,这将
dscores
设置为等于softmax函数计算的概率。然后,它从第二行中为正确的类计算的概率中减去
1
,然后除以第三行中的训练样本数

为什么要减去
1
?因为您希望正确标签的概率在理想情况下为
1
。所以它从实际预测中减去它应该预测的东西:如果它预测的东西接近
1
,减法将是一个大的负数(接近零),所以梯度将很小,因为你接近一个解。否则,它将是一个小的负数(远离零),因此梯度将更大,并且您将朝解决方案迈出更大的步伐

您的激活功能只是
w*x+b
。它对
w
的导数是
x
,这就是为什么
dW
x
和分数/输出层梯度之间的点积

w*x+b
相对于
b
的导数是
1
,这就是为什么在反向传播时只需对
dscores
求和。

反向传播是为了降低整个系统(此处为softmax分类器)的成本
J
,优化权重参数
W
以最小化成本是一个问题。如果成本函数
J=f(W)
是凸的,梯度下降
W=W-α*f'(W)
将导致
Wmin
最小化
J
。超参数
α
称为学习率,我们也需要对其进行优化,但不是在这个答案中

图中的
Y
应理解为
J
。假设你在一个地方的表面上,其形状定义为
J=f(W)
,你需要到达
Wmin
点。没有重力,所以你不知道哪条路通向底部,但你知道函数和坐标。你怎么知道你应该走哪条路?您可以从导数
f'(W)
中找到方向,并通过
W=W-α*f'(W)
移动到新坐标。通过重复此操作,您可以越来越接近点
Wmin

仿射层上的反向传播 在发生乘法或点运算(仿射)的节点处,函数为
J=f(W)=X*W
。假设有
m
个以X表示的固定二维坐标。我们如何找到使
J=f(W)=X*W
及其向量
W
最小的超平面

如果α合适,我们可以通过重复梯度下降
W+=-α*X
来接近最佳
W

链规 当仿射层之后有层时,例如softmax分类器中的softmax层和log loss层,我们可以使用链规则计算梯度。在图中,将sigmoid替换为softmax

reg_loss = 0.5*reg*np.sum(W*W)

如cs321页中所述,来自softmax层和log loss层的梯度贡献是dscore部分。请参见下面的注释部分

通过链规则将梯度应用于仿射层的梯度,导出代码,其中α替换为步长。实际上,步长也需要学习

dW = np.dot(X.T, dscores)
W += -step_size * dW
偏置梯度可以通过将链规则应用于偏置b,并使用来自post层的梯度(dscore)来导出

db = np.sum(dscores, axis=0, keepdims=True)
正规化 如cs231页的第页所述,成本函数(目标)通过添加正则化进行调整,正则化在代码中为reg_loss。这是为了减少过度装配。直觉是,在我的理解中,如果特定特征导致过度拟合,我们可以通过其权重参数W增加成本来减少过度拟合,因为梯度下降将减少权重的成本贡献。因为我们不知道是哪一个,所以使用allW0.5*W*W的原因是它给出了简单的导数W

reg_loss = 0.5*reg*np.sum(W*W)
梯度贡献
reg*W
来自reg\u损失的导数。reg是一个需要在实际训练中学习的超参数dW += reg*W # regularization gradient