神经网络损失函数和权重矩阵不匹配

时间:2018-02-18 03:24:06

标签: python matrix neural-network

我试图使用矩阵来学习神经网络,并且这样做我决定给自己设置挑战,训练一个简单的神经网络输出0.5 * sigma(x)。

我猜这是足够的,因为W需要为0.5。

enter image description here

但是我遇到了关于损失函数和权重的问题。

import sys
import math
import numpy as np
import random

@np.vectorize
def dlossbydw(X,W,Y):
    t = np.dot(X,W)
    Yhat = sig(t)
    n = Y-Yhat
    l = 2*n * -1 * sig(t)*(1-sig(t))*X
    return l

@np.vectorize
def sig(Z):
    return (1.0/ (1.0 + math.exp(-Z)))

@np.vectorize
def toMatch(Z):
    return 0.5*sig(Z)

def main(args):
    #This is the matrix that should be output
    Y = np.array([[toMatch(x)] for x in range(-5,5)])

    #This is the input matix
    X = np.array([[x] for x in range(-5,5)])

    random.seed(5)
    r = random.random()

    #And this is the weight matrix
    W = np.array([r])

    rate = 1e-1
    for i in range(1000):
        print("dlossbydw: " + str(dlossbydw(X,W,Y)))
        #???

    print("expected out:" + str(Y))
    print("post training:" + str(sig(np.dot(X,W))))

if(__name__=="__main__"):
    main(sys.argv[1:])

权重矩阵W的维数是1x1,(只有一个权重连接输入神经元和输出)然而当我做数学计算相对于w的损失时,它给了我一个10x1矩阵,我的猜测它是否为输入矩阵输入的每个X提供了损失,但我该如何处理呢?损失中的每个值都与上一个值不同,这很奇怪,因为它们都需要W中的相同移位(朝向0.5)

enter image description here

我一定是在误解某些东西,或者在一个简单的错误中迷惑自己。

有人可以澄清我在这里做错了什么吗?

我应该在标记的地方做什么?

这是对的吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您的NN具有一个权重,一个输入,无偏差和S形激活函数,则输出计算如下:

y = sig(w*x)

如果您尝试匹配0.5*sig(x),则权重w不一定是0.5。

我用你的代码玩了一下:

确保您的砝码形状正确。它目前有(1,)。我解决了这个问题:

random.seed(5)
W = np.array([random.random()])
W.shape=(1,1)

你的数学是正确的。问题是,您必须使用numpy区分分量乘法和点积,如下所示:

 l = np.dot(X.T, 2*n * -1 * sig(t)*(1-sig(t)))

np.vectorize删除dlossbydw,因为它不应该应用于向量的各个元素,因为最后需要点积来获得一个标量值。

l现在是一个1x1矩阵,它为您提供适合您体重的渐变。

for i in range(1000):
    l = dlossbydw(X,W,Y)
    print("dlossbydw: " + str(l))
    W = W-l