Implementação Python da função de custo na regressão logística: por que a multiplicação de pontos em uma expressão, mas a multiplicação por elementos em outra

18

Eu tenho uma pergunta muito básica que se relaciona com Python, numpy e multiplicação de matrizes no cenário de regressão logística.

Primeiro, peço desculpas por não usar a notação matemática.

Estou confuso sobre o uso da multiplicação de pontos na matriz versus a multiplicação por elementos. A função de custo é dada por:

insira a descrição da imagem aqui

E em python eu escrevi isso como

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

Mas, por exemplo, esta expressão (a primeira - a derivada de J em relação a w)

insira a descrição da imagem aqui

é

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

Não entendo por que é correto usar a multiplicação de pontos acima, mas use a multiplicação por elementos na função cost, ou seja, por que não:

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

Entendo perfeitamente que isso não é explicado de forma elaborada, mas acho que a pergunta é tão simples que qualquer pessoa com experiência básica em regressão logística entenderá meu problema.

Motoqueiro Fantasma
fonte
2
yilog(ai)Y * np.log(A)X(AY)Tnp.dot(X, dz.T)
2
Obrigado Neil. Desculpe pela ambiguidade. O segundo. Eu entendo as fórmulas matemáticas. Eu simplesmente não posso colocar minha cabeça em torno da intuição para a multiplicação de pontos em um, e elemento sábio multiplicação na outra
GhostRider

Respostas:

12

Nesse caso, as duas fórmulas matemáticas mostram o tipo correto de multiplicação:

  • yilog(ai)ya

  • ABC=ABCik=jAijBjknp.dot

Em parte, sua confusão decorre da vetorização aplicada às equações nos materiais do curso, que estão ansiosos por cenários mais complexos. Na verdade, você pode usar cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))ou cost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))enquanto Ye Atem forma (m,1)e deve dar o mesmo resultado. NB: np.sumestá apenas achatando um único valor, então você pode descartá-lo e, em vez disso, ter [0,0]no final. No entanto, isso não generaliza para outras formas de saída, (m,n_outputs)portanto, o curso não o utiliza.

Neil Slater
fonte
1
Neil - Sim, você está correto. Andrew Ngs novo curso de DL. E também sua resposta faz todo sentido. Obrigado pela contribuição.
GhostRider 22/08/19
"Portanto, cada elemento de y somente interage com seu elemento correspondente em a, que é basicamente a definição de elemento" - explicação incrivelmente lúcida.
GhostRider 22/08/19
2

Você está perguntando, qual é a diferença entre um produto escalar de dois vetores e a soma do produto elementar? Eles são os mesmos. np.sum(X * Y)é np.dot(X, Y). A versão do ponto seria mais eficiente e fácil de entender, geralmente.

Ynp.dot

Então, acho que a resposta é que são operações diferentes, fazendo coisas diferentes, e essas situações são diferentes, e a principal diferença é lidar com vetores versus matrizes.

Sean Owen
fonte
Obrigado. Não é bem isso que estou perguntando. Veja o código alternativo que tenho para a função de custo (último bit de código). Isso está incorreto, mas estou tentando entender por que está incorreto.
GhostRider
2
No caso do OP, np.sum(a * y)não será o mesmo que np.dot(a, y)porque ae ysão os vetores das colunas (m,1), portanto a dotfunção gerará um erro. Tenho certeza de que tudo isso é do coursera.org/learn/neural-networks-deep-learning (um curso que acabei de ver recentemente), porque a notação e o código são uma correspondência exata.
Neil Slater
0

Com relação a "No caso do OP, np.sum (a * y) não será o mesmo que np.dot (a, y) porque a e y são de vetores de colunas (m, 1); portanto, a função de ponto será gerar um erro. "...

(Não tenho elogios suficientes para comentar usando o botão de comentário, mas pensei em adicionar ..)

Se os vetores são vetores de coluna e têm forma (1, m), um padrão comum é que o segundo operador para a função ponto seja pós-fixado com um operador ".T" para transpor para forma (m, 1) e depois o ponto produto funciona como um (1, m). (m, 1). por exemplo

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

O valor comum para m permite que o produto escalar (multiplicação de matrizes) seja aplicado.

Da mesma forma, para vetores de coluna, veríamos a transposição aplicada ao primeiro número, por exemplo, np.dot (wT, X) para colocar a dimensão que é> 1 no 'meio'.

O padrão para obter um escalar no np.dot é fazer com que as duas formas de vetores tenham a dimensão '1' no lado de fora e a dimensão comum> 1 no lado de dentro:

(1, X). (X, 1) ou np.dot (V1, V2) Onde V1 é a forma (1, X) e V2 é a forma (X, 1)

SO, o resultado é uma matriz (1,1), ou seja, um escalar.

Gordon Hutchison
fonte