Нейронная сеть с активацией softmax - PullRequest
2 голосов
/ 21 апреля 2010

редактирование:

Более острый вопрос: Какую производную softmax следует использовать в моем градиентном спуске?


Это более или менее исследовательский проект для курса, и мое понимание NN очень / довольно ограничено, поэтому, пожалуйста, будьте терпеливы:)


В настоящее время я нахожусь в процессе создания нейронной сети, которая пытается изучить входной набор данных и вывести вероятность / вероятность каждой классификации (существует 5 различных классификаций). Естественно, сумма всех выходных узлов должна составлять до 1.

В настоящее время у меня есть два слоя, и я установил скрытый слой, содержащий 10 узлов.

Я придумал два разных типа реализаций

  1. Логистическая сигмоида для активации скрытого слоя, softmax для активации выхода
  2. Softmax для скрытого слоя и активации выхода

Я использую градиентный спуск, чтобы найти локальные максимумы, чтобы отрегулировать веса скрытых узлов и веса выходных узлов. Я уверен, что у меня есть это правильно для сигмовидной кишки. Я менее уверен с softmax (или могу ли я использовать градиентный спуск вообще), после небольшого исследования, я не смог найти ответ и решил вычислить производную сам и получил softmax'(x) = softmax(x) - softmax(x)^2 (это возвращает вектор столбца размер н). Я также изучил инструментарий MATLAB NN, производная softmax, предоставляемая инструментарием, вернула квадратную матрицу размера nxn, диагональ которой совпадает с softmax '(x), который я вычислил вручную; и я не уверен, как интерпретировать выходную матрицу.

Я запускал каждую реализацию со скоростью обучения 0,001 и 1000 итераций обратного распространения. Однако мой NN возвращает 0.2 (четное распределение) для всех пяти выходных узлов для любого подмножества входного набора данных.

Мои выводы:

  • Я вполне уверен, что мой градиент снижения выполнен неправильно, но я не знаю, как это исправить.
  • Возможно, я не использую достаточно скрытых узлов
  • Возможно, мне следует увеличить количество слоев

Любая помощь будет принята с благодарностью!

Набор данных, с которыми я работаю, можно найти здесь (обработано в Кливленде): http://archive.ics.uci.edu/ml/datasets/Heart+Disease

Ответы [ 3 ]

5 голосов
/ 22 апреля 2010

Используемый градиент на самом деле такой же, как с квадратом ошибки: output - target. Поначалу это может показаться удивительным, но хитрость в том, что минимизируется другая функция ошибок:

softmax error

(- \sum^N_{n=1}\sum^K_{k=1} t_{kn} log(y_{kn}))

где log - натуральный логарифм, N - количество обучающих примеров, а K - количество классов (и, следовательно, единиц в выходном слое). t_kn отображает двоичное кодирование (0 или 1) k-го класса в n-м обучающем примере. y_kn соответствующий сетевой выход.

Показ правильности градиента может быть хорошим упражнением, хотя я и сам этим не занимался.

К вашей проблеме: Вы можете проверить правильность вашего градиента с помощью численного дифференцирования. Скажем, у вас есть функция f и реализация f и f '. Тогда должно иметь место следующее:

numerical gradient of the softmax

(f'(x) = \frac{f(x - \epsilon) - f(x + \epsilon)}{2\epsilon} + O(\epsilon^2))
0 голосов
/ 01 июля 2013

посмотрите на ссылку: http://www.youtube.com/watch?v=UOt3M5IuD5s производная softmax: dyi / dzi = yi * (1,0 - yi);

0 голосов
/ 10 августа 2010

посмотрите на sites.google.com/site/gatmkorn программу симуляции Desire с открытым исходным кодом. Для версии Windows папка / mydesire / neural имеет несколько классификаторов softmax, некоторые с алгоритмом градиентного спуска, специфичным для softmax.

В примерах это хорошо работает для простой задачи распознавания символов.

См. Также

Корн, Г.А .: Усовершенствованное моделирование динамической системы, Wiley 2007

1009 * GAK *

...