Простая нейронная сеть не может делать правильные прогнозы. Где я допустил ошибку?

#python #numpy #machine-learning #neural-network

#python #numpy #машинное обучение #нейронная сеть

Вопрос:

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

Аналогичный код работал, когда у меня был 1 вход и 3 выхода, или 3 выхода и 1 вход. Раньше я вычислял производные следующим образом: derivatives = inputs * pure_error . Но теперь, когда мне нужно сделать это для матрицы весов, которую я использую derivatives = np.outer(inputs, pure_errors) , это единственное изменение, которое я внес.

Код:

 import numpy as np 

inputs = np.array([3, 5, 1])
weights = np.array([[0.1,0.2,0.05],
                    [1.0,0.53,0.5],
                    [1.7,2.3,1.2]])
target_predictions = np.array([1.5, 10, 93])
learning_rate = 0.05

def ann(inputs, weights):
    predictions = np.dot(weights, inputs)
    return predictions

# Initial Predictions
predictions = ann(inputs, weights)
errors = (predictions - target_predictions) ** 2
print("Predictions:",predictions, "Errors:",errors)

for i in range(350):
    predictions = ann(inputs, weights)
    errors = (predictions - target_predictions) ** 2

    print("Predictions:",predictions, "Error:",errors)

    pure_errors = predictions - target_predictions
    derivatives = np.outer(inputs, pure_errors)
    weight_updates = derivatives * learning_rate

    weights -= weight_updates
  

Вывод:

 Predictions: [ 1.35  6.15 17.8 ] Error: [2.25000e-02 1.48225e 01 5.65504e 03]
Predictions: [15.585 29.875 22.545] Error: [ 198.387225  395.015625 4963.907025]
Predictions: [ 4.90875 12.08125 18.98625] Error: [1.16195766e 01 4.33160156e 00 5.47803519e 03]
.......
Predictions: [ 9.48428571 19.70714286 20.51142857] Error: [  63.74881837   94.22862245 5254.59298776]
Predictions: [ 9.48428571 19.70714286 20.51142857] Error: [  63.74881837   94.22862245 5254.59298776]
Predictions: [ 9.48428571 19.70714286 20.51142857] Error: [  63.74881837   94.22862245 5254.59298776]
  

Комментарии:

1. У вас есть 3 входных сигнала размера 1, поэтому вам понадобится только один вес и одно смещение.

Ответ №1:

Найдена ошибка. Вместо:

 derivatives = np.outer(inputs, pure_errors)
  

Мне нужно было сделать:

 derivatives = np.outer(pure_errors, inputs)
  

Передача переменных в неправильном порядке изменила результаты, каким-то образом поменяв местами числа и обновив неправильные веса.