Нейронная сеть - потеря не сходится

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

import numpy as np
import matplotlib.pyplot as plt

n = 100
alp = 1e-4
a0 = np.random.randn(100,1) # Also x
y = 7*a0+3+np.random.normal(0,1,(100,1))

w = np.random.randn(100,100)*0.01
b = np.random.randn(100,1)

def compute_loss(a1,y,w,b):
       return np.sum(np.power(y-w*a1-b,2))/2/n

def gradient_step(w,b,a1,y):

    w -= (alp/n)*np.dot((a1-y),a1.transpose())
    b -= (alp/n)*(a1-y)  
    return w,b

loss_vec = []
num_iterations = 10000

for i in range(num_iterations):

    a1 = np.dot(w,a0)+b
    loss_vec.append(compute_loss(a1,y,w,b))
    w,b = gradient_step(w,b,a1,y)
plt.plot(loss_vec)

person srkdb    schedule 16.09.2018    source источник


Ответы (2)


Сходимость также зависит от используемого вами значения альфы. Я немного поиграл с вашим кодом и для

alp = 5e-3

Я получаю следующую сходимость, построенную на логарифмической оси x

plt.semilogx(loss_vec)

Вывод

введите здесь описание изображения

person Sheldore    schedule 16.09.2018
comment
Я признаю, но вам придется поиграть с альфа-значениями. Что вы можете сделать, так это сгенерировать диапазон альфа-значений и поместить свой код в функцию, вызвать ее для разных альфа-значений и построить график сходимости, чтобы увидеть, какое значение является оптимальным. - person Sheldore; 16.09.2018
comment
Да, выглядит хорошо для меня. Больше сокращать нечего. Попробуйте сгенерировать альфа = 0,1, 0,5, 0,01, 0,05, 0,001, 0,005, 0,0001 и так далее. - person Sheldore; 16.09.2018
comment
Хорошо. Кроме того, я думаю, что неразумно ожидать почти нулевых потерь без каких-либо скрытых слоев, верно? - person srkdb; 16.09.2018
comment
Хм, я не могу прокомментировать это из-за моих почти ничтожных знаний о NN. Мой комментарий об альфе был основан на других проблемах минимизации, над которыми я работал. - person Sheldore; 16.09.2018

Если я правильно понимаю ваш код, у вас есть только одна весовая матрица и один вектор смещения, несмотря на то, что у вас есть 2 слоя. Это странно и может быть по крайней мере частью вашей проблемы.

person JacKeown    schedule 16.09.2018
comment
Да, одна весовая матрица и один вектор смещения. Там нет скрытого слоя. Только входной и выходной слои. Что еще кажется странным? - person srkdb; 16.09.2018
comment
У вас есть одна весовая матрица, w, но тогда ваша функция потерь при вычислении шаткая. у вас есть np.sum(np.power(y-w*a1-b,2))/2/n вместо np.sum(np.power(y-a1,2))/2/n - person JacKeown; 19.09.2018