Подтвердить что ты не робот

Как использовать обучение в Hebbian?

Я хочу обновить свой симулятор эволюции, чтобы использовать изучение Hebb, например этот. Я в основном хочу, чтобы маленькие существа могли научиться находить пищу. Я достиг этого с основными сетями, поддерживающими прямую связь, но я застрял в понимании того, как это сделать с обучением Hebb. Основной принцип обучения Хебба заключается в том, что, если два нейрона стреляют вместе, они соединяются вместе.

Итак, веса обновляются следующим образом:

weight_change = learning_rate * input * output

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

В моей текущей версии симулятора весы между действием и входом (движением, глазами) увеличиваются, когда существо ест кусочек пищи, и я не вижу, как это может перевести в эту новую модель. Там просто нет места, чтобы сказать, было ли здесь что-то правильно или неправильно, потому что единственными параметрами являются вход и выход! В принципе, если один вход активирует движение в одном направлении, вес будет постоянно увеличиваться, независимо от того, что существо что-то есть или нет!

Применяю ли я неверное изучение обучения Хебба? Просто для справки, я использую Python.

4b9b3361

Ответ 1

Hebbs law - блестящая проницательность для associative learning, но единственная ее часть. И вы правы, реализованы так, как вы это делали, и оставили неконтролируемый вес, просто продолжайте расти. Ключ состоит в том, чтобы добавить в какой-то форме нормализацию или ограничение процесса. Это хорошо иллюстрируется страницей wiki для правила Oja. То, что я предлагаю вам сделать, это добавить шаг post-synaptic divisive normalisation, что означает, что вы делите через вес на сумму всех весов, сходящихся на один и тот же постсинаптический нейрон (т.е. Сумма всех весов, сходящихся на нейроне фиксируется при 1).

Что вы хотите сделать, это можно сделать, построив сеть, использующую Hebbian learning. Я не совсем уверен в том, что вы передаете в качестве входных данных в свою систему, или о том, как вы это настроили. Но вы можете посмотреть LISSOM, который является расширением Hebbian для SOM, (самоорганизующаяся карта).

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

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

Ответ 2

Несмотря на то, что обучение в Hebbian, как общая концепция, формирует основу для многих алгоритмов обучения, включая backpropagation, простая, линейная формула, которую вы используете, очень ограничена. Мало того, что веса растут бесконечно, даже когда сеть узнала все шаблоны, но сеть может отлично изучать только ортогональные (линейно независимые) шаблоны.

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

Итак, если вы настаиваете на использовании нейронной сети, я предлагаю добавить скрытые слои нейронов и ввести нелинейности, как в весах, например. как предложено fraxel, и при стрельбе из нейронов --- здесь вы можете использовать сигмовидную функцию, например tanh (да, использование отрицательных значений для "non-firing" хорошо, так как это может привести к уменьшению веса). В своей обобщенной форме правило Hebbian может быть выражено как

weight_change = learning_rate * f1(input, weight) * f2(output, target_output)

где f1 и f2 - некоторые функции. В вашем случае нет target_output, поэтому f2 может игнорировать его.

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

Но действительно ли нейронная сеть нужна или даже подходит для вашей проблемы? Считаете ли вы простую взаимосвязь? Я имею в виду, что Хебб получил свое правило, чтобы объяснить, как обучение может функционировать в биологических системах, а не как лучший алгоритм машинного обучения.

Ответ 3

Я не очень хорошо знаком с этим типом нейронной сети, но похоже, что вы ожидаете, что он будет работать как контролируемый метод обновления, пока он не контролируется. Это означает, что вы не можете научить его правильному, он только узнает, что по-другому, путем ассоциации. То есть, он в конечном итоге свяжет действия с конкретными кластерами исходных данных. В вашей ситуации, когда вы хотите, чтобы она улучшала процесс принятия решений с обратной связью, я не думаю, что обновлений для Hebbian будет достаточно. Вы могли бы объединить его с каким-то обратным распространением.

Ответ 4

Вы можете попробовать с моим кодом.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modelhebb;

/**
 *
 * @author Raka
 */
public class ModelHebb {
    public static void main(String[] args) {
        Integer xinput[][]  = new Integer[][]{
            {1, 1},
            {1, -1},
            {-1, 1},
            {-1, -1}
        };
        Integer xtarget[]   = new Integer[]{
            1,
            -1,
            -1,
            -1
        };
        Integer xweight[]   = new Integer[xinput[0].length];
        System.out.println("\t Iterasi \t");
        Integer bayes   = 0;
        for (int i = 0; i < xtarget.length; i++) {
            for (int j = 0; j < xinput[i].length; j++) {
                int temp    = xweight[j]==null?0:xweight[j];
                xweight[j]  = temp + (xinput[i][j] * xtarget[i]);
                System.out.print("W"+j+": "+xweight[j]+"\t");
            }
            bayes   = bayes + xtarget[i];
            System.out.println("Bobot : " + bayes);
        }
    }
}