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