python 中的反向传播:无法理解一行代码

Backpropagation in python: cannot understand a line of code

我正在尝试阅读以下代码以在 python

中进行反向传播
probs = exp_scores /np.sum(exp_scores, axis=1, keepdims=True) 
#Backpropagation
delta3 = probs
delta3[range(num_examples), y] -= 1
dW2 = (a1.T).dot(delta3)
....

但我无法理解以下代码行:

delta3[range(num_examples), y] -= 1

你能告诉我这是做什么用的吗?

非常感谢您的帮助!

这里有两件事。首先,它使用 numpy 切片 select 只是 delta3 的一小部分。其次,它正在为矩阵的这一部分的每个元素删除 1。

更准确地说,delta3[range(num_example), y] 是 select 矩阵 delta3 的行,范围从 0 到 num_examples 但只有 select 列 y.

感兴趣的话,为什么是这样计算的,就是通过交叉熵损失的反向传播:

  • probs 是 class 概率的向量(通过 softmax 在前向传递中计算)。
  • delta3是损失函数的误差信号。
  • y 持有小批量的基本事实 classes。

其他一切都只是数学,在 this post 中有很好的解释,它们以相同的 numpy 表达式结束。