CS231n笔记1--Softmax Loss 和 Multiclass SVM Loss

Softmax Loss 和 Multiclass SVM Loss

  • Softmax Loss 和 Multiclass SVM Loss
    • Softmax Loss
    • Multiclass SVM Loss
    • 对比
      • Every thing here nothing there

Softmax Loss

给出 xi,yi ,其中 xi 是图像, yi 是图像的类别(整数), s=fxi,W ,其中 s 是网络的输出,则定义误差如下:

P(Y=k|X=xi)=eskjesjLi=logP(Y=yi|X=xi)

例如 s=[3.2,5.1,1.7] ,则 p=[0.13,0.87,0.00] ,可得 Li=log(0.13)=0.89

向量化Python代码

def softmax_loss(x, y):
  """
  Computes the loss and gradient for softmax classification.

  Inputs:
  - x: Input data, of shape (N, C) where x[i, j] is the score for the jth class
    for the ith input.
  - y: Vector of labels, of shape (N,) where y[i] is the label for x[i] and
    0 <= y[i] < C

  Returns a tuple of:
  - loss: Scalar giving the loss
  - dx: Gradient of the loss with respect to x
  """
  probs = np.exp(x - np.max(x, axis=1, keepdims=True))
  probs /= np.sum(probs, axis=1, keepdims=True)
  N = x.shape[0]
  loss = -np.sum(np.log(probs[np.arange(N), y])) / N
  dx = probs.copy()
  dx[np.arange(N), y] -= 1
  dx /= N
  return loss, dx

Multiclass SVM Loss

给出 xi,yi ,其中 xi 是图像, yi 是图像的类别(整数), s=fxi,W ,其中 s 是网络的输出,则定义误差如下:

Li=jyimax(0,sjsyi+1)

例如 s=[3,2,5],yi=0 ,那么 Li=max(0,23+1)+max(0,53+1)=3

思考:
question1:如果允许 j=yi ,结果会怎么样?如果使用平均数而非求和又会怎么样?
ans1:如果允许 j=yi ,也就是加上 max(0,syisyi+1)=1 ;如果使用平均数,就是令结果乘于一个常数;这两种情况将导致误差与原误差不同,但是,由于都是正相关的,所以对于我们最后希望得到的模型没有影响,利用这样的特性,我们可以简化我们的代码。

question2:在初期,我们设置Weights近似于零,导致 s也近似于0,那么误差会是多少?
ans2:由于s也近似于0,也即 syi =sj ,那么 max(0,sjsyi+1)=1 ,故结果大致为#类别-1;用这个可以用作在早期检测我们的实现是否出现了问题。

向量化的Python代码

def svm_loss(x, y):
  """
  Computes the loss and gradient using for multiclass SVM classification.

  Inputs:
  - x: Input data, of shape (N, C) where x[i, j] is the score for the jth class
    for the ith input.
  - y: Vector of labels, of shape (N,) where y[i] is the label for x[i] and
    0 <= y[i] < C

  Returns a tuple of:
  - loss: Scalar giving the loss
  - dx: Gradient of the loss with respect to x
  """
  N = x.shape[0]
  correct_class_scores = x[np.arange(N), y]
  margins = np.maximum(0, x - correct_class_scores[:, np.newaxis] + 1.0)
  margins[np.arange(N), y] = 0
  loss = np.sum(margins) / N
  num_pos = np.sum(margins > 0, axis=1)
  dx = np.zeros_like(x)
  dx[margins > 0] = 1
  dx[np.arange(N), y] -= num_pos
  dx /= N
  return loss, dx

对比

Every thing here, nothing there

从误差的定义我们可以看出,Softmax在计算误差是考虑到了所有的类别的取值,因此,如果希望Softmax Loss尽可能的小,那么会导致其他类别的分数尽可能的低;但是在SVM Loss的定义中,我们可以看到,SVM Loss只考虑了那些在正确值附近或者压制了正确值的那些值,其他的均作为0处理,因此,SVM Loss更看重鲁棒性,只看重那些可能造成影响的点,这些所谓的可能造成影响的点也就是支持向量(现在你应该明白支持向量机是什么意思了);但是,在分类问题中,这两种方法得到的结果往往都是一致的,所以我们也不需要担心太多。

你可能感兴趣的:(机器学习,深度学习,开销函数,CS231n,softmax,svm,cnn)