Следует ли обновлять весовые коэффициенты персептрона на основе значений прогноза или потерь? - PullRequest
0 голосов
/ 23 января 2019

Книга Нейронные сети и глубокое обучение Чару С. Аггарвал перечисляет правило обновления веса Перцептрона как

Ш <- <strong>Ш + a * (y_i - y_hat_i) * X

где W - ваш весовой вектор, X - ваш вектор данных с y_i в качестве соответствующей метки, y_hat_i - прогнозируемая метка для y_i и, наконец, a - скорость обучения.

Я понимаю это.

В книге говорится, что обновления веса по существу

Ш <- <strong>Ш + a * ∇w_i * L-i

после разговора о гладких функциях суррогатных потерь для критериев персептрона.

Итак, если я внедряю свой собственный Perceptron, я не уверен, какой из них мне действительно нужно использовать в моих обновлениях веса?

Задача классификации, над которой я работаю, заключается в простой классификации данных в класс на основе того, с какой стороны строки y = x (между (0,0) и (1,1)) случайной пары (x, y) падения.

Если я использую первую из перечисленных формул, я получу 100% точность обучения, но не всегда высокую точность проверки.

Я пока не знаю, как бы вы реализовали вторую формулу.

Если вы используете первую упомянутую мной схему обновления веса, я не до конца понимаю, как обновления потери и веса даже связаны с алгоритмом персептрона.

            data_instance = self.features[index]
            label_instance = self.true_labels[index]
            w_sum = 
            self.weighted_sum(data_instance,self.weight_vector[index])

            prediction = self.sign_activation(w_sum)
            print(prediction)
            predicted_labels[index] = prediction

            loss = self.squared_loss(prediction, label_instance)
            print('Loss: ', loss)


            #WEIGHT UPDATES--Perceptron Criteria
            label_distance = self.true_labels[index] - prediction

            label_distance_lr = self.lr * label_distance

            updated_data_instance = [x*label_distance_lr for x in data_instance]

            new_weight_list = [None] * len(self.weight_vector[index])

            current_weights = self.weight_vector[index]

            for i in range(len(new_weight_list)):
                new_weight_list[i] = current_weights[i] + updated_data_instance[i]



            self.weight_vector[index] = new_weight_list

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

...