逻辑函数中成本函数的Python实现:为什么在一个表达式中使用点乘法但在另一个表达式中使用逐元素乘法


18

我有一个非常基本的问题,涉及逻辑回归设置中的Python,numpy和矩阵乘法。

首先,让我为未使用数学符号表示歉意。

我对矩阵点乘法与元素明智的倍增的使用感到困惑。成本函数由下式给出:

在此处输入图片说明

在python中,我将其写为

    cost = -1/m * np.sum(Y * np.log(A) + (1-Y) * (np.log(1-A)))

但例如,此表达式(第一个表达式-J关于w的导数)

在此处输入图片说明

   dw = 1/m * np.dot(X, dz.T)

我不明白为什么在上面使用点乘法是正确的,但是在成本函数中使用逐元素乘法,即为什么不这样做:

   cost = -1/m * np.sum(np.dot(Y,np.log(A)) + np.dot(1-Y, np.log(1-A)))

我完全理解这一点并没有得到详尽的解释,但是我想这个问题是如此简单,以至于即使具有基本逻辑回归经验的人也会理解我的问题。


2
您是在质疑数学公式,还是在数学公式与代码之间的转换?也就是说,您是否想知道为什么将成本函数表示为和,而将梯度计算表示为矩阵乘法?还是你想理解为什么成为同时X - Ÿ 牛逼变?ÿ一世日志一种一世Y * np.log(A)X一种-ÿŤnp.dot(X, dz.T)
尼尔·斯莱特

2
谢谢尼尔。抱歉,含糊不清。第二。我了解数学公式。我只是无法直觉一个点的乘法,另一个就元素明智的乘法
GhostRider

Answers:


12

在这种情况下,两个数学公式将为您显示正确的乘法类型:

  • 成本函数中的 y i log a i是标量值。将标量值组合成每个示例的给定总和不会改变这一点,并且您绝不会在此总和中将一个示例的值与另一个示例的值合并。这样的每个元素 Ý仅在其匹配元件相互作用一个,这基本上是逐元素的定义。ÿ一世日志一种一世ÿ一种

  • 一种C=一种C一世ķ=Ĵ一种一世ĴĴķnp.dot

在某种程度上,您的困惑源于对课程资料中的方程式进行了矢量化处理,它们期待着更复杂的场景。你可以在实际上使用cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))cost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))同时YA具有形状(m,1),并应给予同样的结果。注意,那np.sum只是在扁平化一个值,因此您可以删除它,而[0,0]最后保留它。但是,这不会推广到其他输出形状,(m,n_outputs)因此课程不会使用它。


1
尼尔-是的,您是正确的。Andrew Ngs的新DL课程。而且,您的答案也很合理。感谢您的输入。
GhostRider

“因此y的每个元素仅与a中的匹配元素相互作用,这基本上是元素方式的定义”-难以理解的解释。
GhostRider

2

您是在问两个向量的点积与它们的元素乘积之和有什么区别?他们是一样的。np.sum(X * Y)np.dot(X, Y)。通常,点版本会更高效且更易于理解。

ÿnp.dot

因此,我想答案是它们是做不同事情的不同操作,而这些情况是不同的,主要区别在于处理向量与矩阵。


谢谢。那不是我要的。有关成本函数,请参见我拥有的备用代码(代码的最后一部分)。这是不正确的,但是我试图理解为什么它是不正确的。
GhostRider

2
在OP的情况下np.sum(a * y)np.dot(a, y)由于ay是列向量shape (m,1),因此该dot函数将引发错误。我很确定这一切都是来自coursera.org/learn/neural-networks-deep-learning(我最近刚看过的一门课程),因为符号和代码是完全匹配的。
尼尔·斯莱特

0

关于“在OP的情况下,np.sum(a * y)与np.dot(a,y)不会相同,因为a和y是列向量形状(m,1),因此点函数将引发错误。“ ...

(我没有太多的荣誉可以使用评论按钮发表评论,但我想我会补充..)

如果向量是列向量并且具有形状(1,m),则常见的模式是将点函数的第二个运算符后缀“ .T”运算符以将其转置为形状(m,1),然后再将点积计算为(1,m)。(m,1)。例如

np.dot(np.log(1-A),(1-Y).T)

m的公共值使点乘(矩阵乘法)成为可能。

类似地,对于列向量,人们会看到将转置应用于第一个数字,例如np.dot(wT,X),将大于1的维放在“中间”。

从np.dot获取标量的模式是使两个矢量形状在“外部”具有“ 1”尺寸,在“内部”具有公共的> 1尺寸:

(1,X)。(X,1)或np.dot(V1,V2)其中V1是形状(1,X),V2是形状(X,1)

因此,结果是一个(1,1)矩阵,即标量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.