我试图使用矩阵来学习神经网络,并且这样做我决定给自己设置挑战,训练一个简单的神经网络输出0.5 * sigma(x)。
我猜这是足够的,因为W需要为0.5。
但是我遇到了关于损失函数和权重的问题。
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)
我一定是在误解某些东西,或者在一个简单的错误中迷惑自己。
有人可以澄清我在这里做错了什么吗?
我应该在标记的地方做什么?
这是对的吗?
谢谢。
答案 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