Использование больших входных значений с автокодировщиками

Я создал нейронную сеть Auto Encoder в MATLAB. У меня довольно большие входные данные на первом уровне, которые я должен реконструировать через выходной слой сети. Я не могу использовать большие входные данные как есть, поэтому я конвертирую их между [0, 1], используя sigmf функцию MATLAB. Он дает мне значения 1.000000 для всех больших значений. Я пробовал использовать настройку формата, но это не помогло.

Есть ли обходной путь для использования больших значений в моем автокодировщике?


person Sasha    schedule 14.07.2014    source источник
comment
Думали ли вы об использовании другой нелинейности на выходе слоя, например, о замене sigmf на что-то другое, например, log, может быть?   -  person Shai    schedule 14.07.2014
comment
Поскольку я использую сигмоидальную функцию в сети, выходные значения не могут превышать 1. Использование журнала даст мне большие значения, чем это.   -  person Sasha    schedule 14.07.2014
comment
Я понимаю, что ваша проблема в том, что входы слишком велики, и вы используете sigmf для предварительной обработки своих входов перед использованием автоэнкодера, верно?   -  person Pablo EM    schedule 14.07.2014
comment
да. Входные данные не слишком велики, но достаточно велики, чтобы сигмоидальная функция могла производить одинаковые сопоставления для нескольких значений.   -  person Sasha    schedule 14.07.2014
comment
@Sasha, разве ваши входные данные не будут умножаться на веса до того, как сеть применит сигмовидную функцию? Таким образом, веса могут уменьшить значения до уровня ниже единицы. Похоже, вы хотите нормализовать свои данные, чтобы все ваши входные данные имели одинаковые диапазоны величин, вы можете сделать это, вычтя среднее значение для каждой переменной и затем разделив на стандартное отклонение. Этот процесс часто называют стандартизацией входных данных.   -  person Dan    schedule 14.07.2014
comment
@ Дэн, да, они будут. Но фактические входные данные велики, и автокодировщик попытался бы восстановить их, не так ли? Так как же это сделать, если используется сигмовидная активация?   -  person Sasha    schedule 15.07.2014
comment
@Sasha Похоже, сигмовидная функция не является подходящей функцией активации. Но если вы действительно хотите его использовать, ответ Пабло показывает вам, как для этого нормализовать ваши данные. Только не забудьте денормализовать вывод, используя те же исходные параметры (в данном случае max и min) в точном обратном порядке.   -  person Dan    schedule 15.07.2014
comment
@Dan Спасибо. Буду признателен, если вы дадите мне предложения по улучшению функции активации.   -  person Sasha    schedule 15.07.2014
comment
@Sasha Это вопрос для перекрестной проверки. Лично я бы просто выбрал несколько и выбрал на основе набора для проверки. Но люди из Cross Validated должны иметь лучшую интуицию в этом отношении. Шай дал кое-что в своем ответе ...   -  person Dan    schedule 15.07.2014


Ответы (2)


Процесс преобразования ваших входных данных в диапазон [0,1] называется нормализацией, однако, как вы заметили, функция sigmf не подходит для этой задачи. Эта ссылка может быть вам полезна.

Предположим, что ваши входные данные представлены матрицей из N строк и M столбцов, где каждая строка представляет собой шаблон ввода, а каждый столбец является функцией. Если ваш первый столбец:

vec =

   -0.1941
   -2.1384
   -0.8396
    1.3546
   -1.0722

Затем вы можете преобразовать его в диапазон [0,1], используя:

%# get max and min
maxVec = max(vec);
minVec = min(vec);

%# normalize to -1...1
vecNormalized = ((vec-minVec)./(maxVec-minVec))

vecNormalized =

    0.5566
         0
    0.3718
    1.0000
    0.3052

Как указывает @Dan в комментариях, еще один вариант - стандартизировать данные. Цель этого процесса - масштабировать входные данные, чтобы получить среднее значение 0 и дисперсию 1. В этом случае вам нужно вычесть среднее значение столбца и разделить на стандартное отклонение:

meanVec = mean(vec);
stdVec = std(vec);

vecStandarized = (vec-meanVec)./ stdVec

vecStandarized =

    0.2981
   -1.2121
   -0.2032
    1.5011
   -0.3839
person Pablo EM    schedule 14.07.2014
comment
Пожалуйста, включите краткое описание решения по этой ссылке в свой фактический ответ - в противном случае я согласен, что это правильный путь - person Dan; 14.07.2014
comment
Применение @Dan различной нормализации / стандартизации для каждого образца может быть немного проблематичным: вы можете изменить базовое распределение образцов. Возможно, лучше применить одинаковую нормализацию ко всем входным данным (как для обучения, так и для тестирования). Вы можете изучить глобальный minVal и глобальный maxVal, который будет использоваться для нормализации ВСЕХ входных данных для обучения и тестирования. - person Shai; 14.07.2014
comment
стандартизация здесь не кажется лучшим решением, поскольку ввод стандартизации не находится в диапазоне [0..1], а скорее около 0 - он не совсем совместим с диапазоном sigmf. - person Shai; 14.07.2014
comment
@Shai Я не согласен по обоим пунктам. Я лично считаю, что потребность OP в том, чтобы данные были в [0,1], ошибочна, поэтому я упомянул стандартизацию в комментарии к вопросу. Что касается глобальной нормы, я никогда не видел, чтобы это делалось таким образом, но мне было бы интересно узнать об этом больше. Но, насколько мне известно, масштабирование ваших входных данных должно выполняться отдельно, чтобы не допустить, чтобы те, у которых более высокие порядки величины, не отображали малые значения. Я не думаю, что линейное масштабирование повлияет на зависимости распределений, но я могу ошибаться. Я просто никогда не видел, чтобы это было так раньше - person Dan; 14.07.2014
comment
@Dan AFAIK, когда вы используете PCA для своих данных, вы используете одно и то же среднее значение и коэффициенты для нормализации как обучающих, так и тестовых данных, я не понимаю, почему масштабирование должно быть другим? Применяя глобальный сдвиг и масштаб, вы сохраняете геометрические свойства точек данных (с высокой яркостью). Однако, применяя различный сдвиг / масштаб к каждой точке, вы фактически заставляете их менять положение относительно друг друга. Я не думаю, что эти локальные изменения полезны для обучения. Опять же, это мое мнение. - person Shai; 14.07.2014
comment
@Shai Вы обязательно должны применить те же параметры нормализации к набору тестов, что и к набору обучения, но это для каждого входа. Однако каждая входная переменная должна быть нормализована независимо от другой входной переменной. Это очень стандартная практика в обучении алгоритмов. На самом деле, я думаю, есть неявное предположение, что все входные переменные независимы, статистики обычно называют их независимыми переменными. Если вы хотите смоделировать зависимости, вам часто приходится включать термин взаимодействия (например, X1 * X2) в качестве отдельной новой входной переменной. - person Dan; 14.07.2014
comment
@ Дэн Я подозреваю, что у нас небольшое недоразумение. Что вы имеете в виду под вводом? Предположим, у нас есть n образец измерения p. Это для обучающей выборки, то есть у вас n разных параметра нормализации? Или это для каждого входного измерения, и в этом случае у вас есть p разных параметра нормализации? - person Shai; 14.07.2014
comment
@Shai, о котором я говорил по входному измерению - person Dan; 14.07.2014
comment
@Dan, в этом случае мы полностью согласны. Прошу прощения, если я не был ясен в своих предыдущих замечаниях. - person Shai; 14.07.2014

Прежде чем я дам вам свой ответ, давайте немного подумаем о причинах, лежащих в основе автокодировщика (AE):
Цель автокодировщика состоит в том, чтобы неконтролируемым образом узнать что-то о базовой структуре входных данных. . Как AE достигает этой цели? Если ему удается восстановить входной сигнал из выходного сигнала (который обычно имеет меньшую размерность), это означает, что он не потерял информацию и ему удалось эффективно изучить более компактное представление.

В большинстве примеров предполагается, для простоты, что и входной, и выходной сигнал находятся в диапазоне [0..1]. Следовательно, одна и та же нелинейность (sigmf) применяется как для получения выходного сигнала, так и для восстановления входных данных из выходов.
Что-то вроде

output = sigmf( W*input + b ); % compute output signal
reconstruct = sigmf( W'*output + b_prime ); % notice the different constant b_prime

Затем этап обучения AE пытается минимизировать ошибку обучения || output - reconstruct ||.

Однако кто сказал, что нелинейность реконструкции должна быть идентична той, которая используется для вычисления выходных данных?

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

Если, например, ваш входной диапазон находится в (0..inf), вы можете рассмотреть возможность использования exp или ().^2 в качестве нелинейности реконструкции. Вы можете использовать многочлены различной степени log или любую другую функцию, которая, по вашему мнению, может соответствовать размеру ваших входных данных.


Отказ от ответственности: я никогда не сталкивался с таким случаем и не встречал такого типа решения в литературе. Однако я считаю, что это имеет смысл и, по крайней мере, стоит попробовать.

person Shai    schedule 14.07.2014