Реалізація функції витрат Python в логістичній регресії: чому кратне множення в одному виразі, але елементарне множення в іншому


18

У мене дуже основне питання, яке стосується Python, нумерування та множення матриць при встановленні логістичної регресії.

По-перше, дозвольте мені попросити вибачення за те, що не використовую математичні позначення.

Мене плутає використання матричного множення крапок проти мультиплікаційного множення елементів. Функція витрат задається:

введіть тут опис зображення

І в 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 ( A - Y ) Tуiжурнал(аi)Y * np.log(A)Х(А-Y)Тnp.dot(X, dz.T)
Ніл Слейтер

2
Дякую Нілу. Вибачте за неоднозначність. Другий. Я розумію математичні формули. Я просто не можу
обернути

Відповіді:


12

У цьому випадку дві математичні формули показують вам правильний тип множення:

  • log ( a i ) y aуi та у функції витрат є скалярними значеннями. Складання скалярних значень у задану суму над кожним прикладом не змінює цього, і ви ніколи не комбінуєте значення одного прикладу з іншим у цій сумі. Таким чином, кожен елемент взаємодіє лише зі своїм відповідним елементом у , що в основному є визначенням елемента.журнал(аi)уа

  • Терміни в розрахунку градієнта є матрицями, і якщо ви бачите дві матриці і помножені на позначення типу , ви можете записати це як більш складну суму: . Саме ця внутрішня сума на кількох термінах виконується.B C = A B C i k = j A i j B j kАБС=АБСiк=jАijБjк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)))той час , Yі Aмають форму , (m,1)і це повинно дати той же результат. Зверніть увагу, що np.sumце просто вирівнювання одного значення в цьому, щоб ви могли скинути його і замість цього мати [0,0]кінцеве значення. Однак це не узагальнює інші форми виводу, (m,n_outputs)тому курс не використовує його.


1
Ніл - Так, ти прав. Ендрю Нгс новий курс DL. А також ваша відповідь має ідеальний сенс. Дякуємо за вклад.
GhostRider

"Отже, кожен елемент y лише взаємодіє зі своїм елементом, що відповідає, в а, що в основному є визначенням елемента", - неймовірно зрозуміле пояснення.
GhostRider

2

Ви запитуєте, яка різниця між точковим твором двох векторів та підсумовуванням їхнього елементарного продукту? Вони однакові. np.sum(X * Y)є np.dot(X, Y). Версія точок була б більш ефективною і зрозумілою, як правило.

Ynp.dot

Тож я здогадуюсь, що відповідь полягає в тому, що вони виконують різні операції, роблячи різні речі, і ці ситуації різні, і головна відмінність стосується векторів проти матриць.


Спасибі. Це не зовсім те, про що я прошу. Дивіться альтернативний код, який я маю для функції витрат (останній біт коду). Це неправильно, але я намагаюся зрозуміти, чому це неправильно.
GhostRider

2
У випадку з ФП в np.sum(a * y)не збирається бути таким же , як np.dot(a, y)тому , що aі yв колонці векторів форми (m,1), тому dotфункція викличе помилку. Я майже впевнений, що це все з курсуrara.org/learn/neural-networks-deep-learning (курс, який я недавно переглянув), тому що позначення та код - це точно збіг.
Ніл Слейтер

0

Що стосується "У випадку ОП np.sum (a * y) не буде таким самим, як np.dot (a, y), оскільки a і y - це вектори стовпців (m, 1), тож крапка функція буде підвищити помилку. "...

(У мене недостатньо кудо, щоб коментувати за допомогою кнопки коментарів, але я думав, що додам ..)

Якщо вектори є векторами стовпців і мають форму (1, м), загальним малюнком є ​​те, що другий оператор точкової функції розміщується на постфіксі з оператором ".T", щоб перенести його у форму (m, 1), а потім крапку продукт працює як (1, м). (м, 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), тобто скаляр.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.