Реализация логистической регрессии с MNIST - не сходится?

Я надеюсь, что кто-то может мне помочь. Я реализовал логистическую регрессию с нуля (то есть без библиотеки, кроме numpy в Python).

Я использовал набор данных MNIST в качестве входных данных и решил попробовать (поскольку я выполняю двоичную классификацию) тест только на две цифры: 1 и 2. Мой код можно найти здесь

https://github.com/michelucci/Logistic-Regression-Explained/blob/master/MNIST%20with%20Logistic%20Regression%20from%20scratch.ipynb

Ноутбук должен работать в любой системе, в которой установлена ​​необходимая библиотека.

Почему-то моя функция стоимости не сходится. Я получаю сообщение об ошибке, так как мой A (моя сигмоида) становится равным 1, так как z становится очень большим.

Я все перепробовал, но своей ошибки не вижу. Может ли кто-нибудь взглянуть и сообщить мне, если я пропустил что-то очевидное? Дело здесь не в высокой точности. Заставляет модель к чему-то сходиться;)

Заранее спасибо, Умберто


person Umberto    schedule 30.08.2017    source источник


Ответы (2)


Я читал твои коды. Все выглядит нормально. Дело только в том, что у вас высокая скорость обучения. Я знаю, что 0.005 - небольшое число, но в данном случае оно слишком велико для сходимости алгоритма. Это видно по удорожанию. Стоимость на какое-то время снижается, а затем очень быстро начинает снижаться. Идея состоит в том, чтобы стоимость была близка к нулю. Здесь отрицательные числа не означают меньшей стоимости. Вы должны увидеть масштабы. Я использовал 0.000008 в качестве скорости обучения, и он отлично работает.

person Clock Slave    schedule 30.08.2017
comment
Спасибо. Рад слышать это. Позже попробую вашу скорость обучения и посмотрим, как она пойдет. Спасибо, что нашли время проверить мой код. - person Umberto; 30.08.2017

Я получил ошибку. Проблема заключалась в том, что я использовал в качестве меток классов 1 и 2 (тот, который вы можете найти в MNIST), но в двоичной классификации вы сравниваете эти значения с 0 и 1, поэтому модель не может сходиться, поскольку sigmoid() (см. Мой код) может только переходите от 0 до 1 (это вероятность).

Использование 0 и 1 вместо 1 и 2 прекрасно решило проблему. Теперь моя модель сходится с точностью 98% :-)

Спасибо всем за помощь!

С уважением, Умберто

person Umberto    schedule 30.08.2017
comment
Спасибо за размещение решения. - person Moondra; 30.08.2017