|
Andrey_Kireew |
|
|
|
Доброго времени суток, недавно столкнулся с проблемой сокращения размерности данных, до сих пор использовал для этого PCA и в принципе получил определённый положительный результат. Разумеется достигнутое хотелось бы улучшить и одним из перспективных путей такого улучшения, как по моим собственным соображений, так и судя по различным публикациям, является использование нейросетевых автокодировщиков.
Однако при практической реализации автокодировщика возникает ряд серьёзных проблем, решить которые мне пока не удалось. В литературе я не нашел конкретных указаний относительно структуры нейросети. Единственное, что понятно - первый слой должен состоять из сигмовидных нейронов и их число должно быть не меньше числа входов (если их меньше - то результат будет аналогичен предварительному сокращению размерности с помощью PCA). Второй слой в принципе может быть как сигмовидным, так и линейным, а число нейронов в нём должно быть меньше чем в первом (за счёт этого собственно и осуществляется сокращение размерности данных). Дальше уже не совсем понятно. Если второй слой линейный - то для восстановления исходных данных потребуется 2 слоя. Первый из них сигмовидный, число нейронов в нём, очевидно, должно быть не меньше чем в первом. И последний слой - линейный. Если же второй слой сигмовидный, то для восстановления может быть достаточно и 1-го линейного слоя (при этом сеть работает быстрее и нужно намного меньше памяти).
Численные эксперименты в Matlab Neural Network Toolbox не дали ничего хорошего. Дело в том, что ни одна из построенных мной сетей не смогла восстановить свои входы с приемлемой точностью. Даже если число нейронов второго слоя было равно числу входов, качество восстановления (в сравнении с PCA) было очень плохим, не говоря уже об "узком" горле.
В чём здесь может быть дело? для обучения сети использовался алгоритм сопряженных градиентов (Флетчера - Риваса), так же использовался gda (адаптивный градиентный алгоритм), инициализация весов сети - случайная,
многократный запуск алгоритма при фиксированной структуре сети даёт примерно одинаковую точность восстановления, т.е. он всё время сходится к одному и тому же решению.
С нетерпением жду ответов и комментариев
|
|
|
|
 |
|
cygnus |
|
|
|
Выбор архитектуры зависит от того с какими данными вы работаете, это картинки (2d, 3d), временные ряды (1d), или просто набор каких-то признаков? Использовать сигмовидную функцию активации внутри сети - не самая хорошая идея. Лучше начать с ReLU Я не знаю что именно пошло не так, могу только предложить найти сначала самую простую вещь которая работает, потом усложнять. Например, попробуйте обучить автоэнкодер с единственным линейным полносвязным слоем. Единичную матрицу-то этот тулбокс сможет выучить?
|
|
|
|
 |