Плохая точность градиентного спуска перцептрона - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь начать с нейронных сетей с самого начала.Это значит начать играть с персептронами.В данный момент я пытаюсь реализовать пакетный градиентный спуск.Следующее руководство содержит следующий псевдокод:
enter image description here

Я попытался реализовать, как показано ниже, с некоторыми фиктивными данными, и заметил, что он не особенно точен.Это сходится к тому, что я предполагаю, это некоторые локальные минимумы.

Мой вопрос:
Какие у меня есть способы проверить, что это на самом деле локальные минимумы, я изучал, как построить это, но яне знаете, как на самом деле делать это.В дополнение к этому, есть ли способ добиться более точного результата с использованием градиентного спуска?Или мне придется использовать более сложный подход, или, возможно, запустить его много раз, начиная с разных случайных весов, чтобы попытаться найти глобальный минимум?

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

import pandas as pd
import numpy as np
import random
import math


def main():

    learningRate = 0.1
    np.random.seed(1)

    trainingInput = np.asmatrix([
              [1, -1],
              [2, 1],
              [1.5, 0.5],
              [2, -1],
              [1, 2]
            ])

    biasAccount = np.ones((5,1))
    trainingInput = np.append(biasAccount, trainingInput, axis=1)
    trainingOutput = np.asmatrix([
                [0],
                [1],
                [0],
                [0],
                [1]
            ])



    weights = 1 * np.random.random((3,1))-1

    for iteration in range(10000):
        prediction = np.dot(trainingInput, weights)

        print("Weights: \n" + str(weights))

        print("Prediction: \n" + str(prediction))

        error = trainingOutput - prediction

        print("Error: \n" + str(error))

        intermediateResult = np.dot(error.T, trainingInput)
        delta = np.dot(learningRate, intermediateResult)

        print("Delta: \n" + str(delta))

        weights += delta.T


main()

1 Ответ

0 голосов
/ 20 ноября 2018

Нет гарантии, что вы найдете глобальный минимум.Часто люди выполняют несколько пробежек и выбирают лучший.Прогрессивные подходы включают снижение скорости обучения, использование адаптивной скорости обучения (например, с помощью RMSProp или Adam) или использование GD с импульсом.

Существует несколько способов мониторинга конвергенции:

  • Используйте потерю (подсказка: (t -Xw)X является производной), проверьте для небольших значений или для небольших изменений.

  • Ранняя остановка : убедитесь, чтоошибка в (отложенном) проверочном наборе уменьшается, а если нет, прекращает тренировку.

  • (возможно, вы можете даже проверять расстояния между весами последовательными шагами, чтобы увидеть, есть ли что-нибудьизменения.)

...