Классификация текста с помощью нейронной сети

Я новичок в машинном обучении и нейронных сетях. Я пытаюсь провести классификацию текста с помощью нейронной сети с нуля. В моем наборе данных 7500 документов, каждый из которых помечен одним из семи классов. Всего около 5800 уникальных слов. Я использую один скрытый слой с 4000 нейронами. Использование сигмоида для функции активации. Уровень обучения = 0,1, отсев нет.

Во время тренировки Примерно через 2–3 эпохи отображается предупреждение:

RuntimeWarning: в exp обнаружено переполнение. Результирующий выходной список выглядит следующим образом:

[  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00
   0.00000000e+00   0.00000000e+00   4.11701866e-10]  for every input except 4.11701866e-10.

сигмовидная функция:

def sigmoid(x):    
   output = 1/(1+np.exp(-x))
   return output

def sigmoid_output_to_derivative(output):
   return output*(1-output)

Как это исправить? Могу ли я использовать другую функцию активации?

Вот мой полный код: https://gist.github.com/coding37/a5705142fe1943b93a8cef4988b3ba5f


person Umair    schedule 15.02.2018    source источник


Ответы (2)


Дать точный ответ не так-то просто, поскольку проблем может быть множество и их очень сложно реконструировать, но я попробую:

Кажется, вы испытываете недостаточное заполнение, что означает, что веса ваших нейронов масштабируют ваш входной вектор x до значений, которые приведут к нулевым значениям в сигмоидной функции. Наивным предложением было бы увеличить точность с float32 до float64, но я думаю, вы уже достигли этой точности.

Вы пробовали изменять скорость обучения и / или пробовали адаптивную скорость обучения? (См. https://towardsdatascience.com/learning-rate-schedules-and-adaptive-learning-rate-methods-for-deep-learning-2c8f433990d1 для некоторых примеров). Возможно, для начала попробуйте больше итераций с более низкой скоростью обучения.

Также: используете ли вы сигмовидные функции в своем выходном слое? Дополнительная нелинейность может привести к насыщению ваших нейронов, то есть к вашей проблеме.

Вы проверили свои градиенты? Иногда это также может помочь в отслеживании ошибок (http://ufldl.stanford.edu/wiki/index.php/Gradient_checking_and_advanced_optimization).

В качестве альтернативы вы можете попробовать улучшить свое обучение, используя другие функции активации, например линейный для начала.

person thogra    schedule 15.02.2018
comment
Вы можете разместить здесь полный код, это поможет разобраться в проблеме - person Taimur Islam; 15.02.2018
comment
Если я увеличу или уменьшу количество нейронов в скрытом слое, как это повлияет на частоту ошибок? - person Umair; 15.02.2018
comment
Трудно сказать ... если вы не используете регуляризацию, большее количество нейронов делает сеть склонной к переобучению (en. wikipedia.org/wiki/Overfitting). Уменьшение количества нейронов может сделать сеть недостаточно выразительной для решения поставленной задачи. - person thogra; 15.02.2018

Поскольку вероятности в машинном обучении, как правило, очень малы, а вычисления на них приводят к еще меньшим значениям (что приводит к ошибкам переполнения), рекомендуется выполнять вычисления с логарифмическими значениями.

Использование типов float64 неплохо, но в конечном итоге тоже не удастся.

Поэтому вместо того, чтобы умножать две малые вероятности, вы должны сложить их логарифмические значения. То же самое и с другими операциями, такими как exp ().

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

person C. Doe    schedule 15.02.2018