Relu 多层感知器

问题描述 投票:0回答:1

有人可以帮我理解/纠正Relu多层感知器/神经网络/机器学习算法吗?我理解前向函数,但我不理解后向+更新权重函数。我不知道如何纠正上述功能。谢谢你

import numpy as np

class MLP:
    def __init__(self):
        self.input_size = 2
        self.hidden_size = 4
        self.output_size = 1
        
        self.w1 = np.random.random((self.input_size, self.hidden_size))
        self.w2 = np.random.random((self.hidden_size, self.output_size))
        self.b1 = np.array([np.random.random() for TO in range(self.hidden_size)])
        self.b2 = np.array([np.random.random() for TO in range(self.output_size)])
        
        self.ITERS = 100
        self.LR = 0.1
        self.alpha = 0.01

    def predict(self, x, return_hidden_output=False):
        hidden_input = self.forward(x, self.w1, self.b1)
        hidden_output = self.relu(hidden_input)
        if return_hidden_output:
            return hidden_output
        output_input = self.forward(hidden_output, self.w2, self.b2)
        output = self.relu(output_input)
        return output

    def forward(self, l1, w, b):
        l2 = np.dot(l1, w) + b
        return l2

    def train(self, X, Y):
        for _ in range(self.ITERS):
            for x, y in zip(X, Y):
                self.backward(x, y)

    def backward(self, x, y):
        hidden_output = self.predict(x, return_hidden_output=True)
        pred = self.predict(x)
        
        output_error = 2 * (pred - y) 
        hidden_error = np.dot(output_error, self.w2.T)
        
        w2_grad = hidden_output.T * output_error
        h_grad = np.dot(hidden_output, hidden_error.T)
        w1_grad = np.outer(x, h_grad)
        
        self.update_weights(self.w2, self.b2, w2_grad)
        self.update_weights(self.w1, self.b1, w1_grad)

    def update_weights(self, w, b, error):
        print(error)
        for FROM in range(w.shape[0]):
            for TO in range(w.shape[1]):
                w[FROM][TO] -= self.LR * error[FROM]
                b[TO] -= self.LR * error[FROM]

    def relu(self, x):
        return np.where(x > 0, x, 0)

X = np.array([
    [0, 0],
    [1, 0],
    [0, 1],
    [1, 1]
])
Y = np.array([[0], [1], [1], [0]])

model = MLP()
model.train(X, Y)


a = model.predict([1, 0])
print("Prediction:", a)

我尝试了一些方法来纠正提到的函数,但要么出现键外错误,要么预测值错误(等-3或0)。 Chatgpt 没有帮助我解决这个问题。

python machine-learning neural-network
1个回答
0
投票

您犯的一个明显错误是您没有更新偏差,这些偏差是可学习的参数,就像网络的权重(w)一样。这些也需要在反向传播期间更新。

为了阐明正在发生的事情,在反向传播期间,您从网络的输出开始并计算损失(在您的情况下为均方误差),然后从中应用链式法则微积分来计算损失相对于可学习参数的梯度(在您的情况下是 w 和 b )。我为反向传播链接的维基百科条目实际上有一个看起来像你的小型网络的示例,其中显示了推导。

为了更通用地处理具有更多隐藏层的大型网络的主题,Ian Goodfellow 的《深度学习》一书的第 6 章(您可以免费访问)提供了使用矩阵而不是标量进行梯度下降的一般推导(就像你在你的例子中所做的那样)。它的工作方式是相同的,除了算法 6.4 中应用的步骤基于矩阵演算,这在你的情况下可能是不必要的,但这些东西在实践中是如何实际实现的(在实践中,人们使用像 PyTorch 或 TensorFlow 这样的 autograd 库,为你处理数学问题,但按照你正在做的方式做是一个很好的练习,可以理解正在发生的事情)。

既然你提到了chatGPT,最后还有一点要注意。使用法学硕士来解释您不完全理解的内容可能很危险,这些模型有时会输出无意义的内容,虽然它们对于帮助您生成内容非常有用,但如果您正在寻找某个主题的解释,那么最好依赖于熟悉该主题的人撰写的文章,而不是依赖于解释许多此类文章的机器。

© www.soinside.com 2019 - 2024. All rights reserved.