📜  了解多层前馈网络(1)

📅  最后修改于: 2023-12-03 15:21:39.404000             🧑  作者: Mango

了解多层前馈网络

多层前馈网络(Multilayer Feedforward Network)是一种基本的人工神经网络,也被称为前馈神经网络(Feedforward Neural Network),它是一种最简单、最基础的网络结构模型之一。多层前馈网络通过将多个神经元按特定的权重和偏置级联堆叠,通过映射输入和输出之间的复杂非线性关系来学习模式。

基本结构

多层前馈网络由三部分组成:

1.输入层:将原始数据输入网络中。

2.隐层(隐藏层):对输入层的特征进行分析和抽象,从而提取出有意义的中间特征。

3.输出层:将隐层的结果映射到最终的输出结果上。

前馈与反馈

多层前馈网络中的前馈是指信号从输入层到输出层的单向传递。在数据从输入层通过隐含层到达输出层的过程中,信号并没有沿着相同的路径弹回来。而反馈是指信号在前馈信号的基础上增加了一条反馈通路,将输出层的信号反过来传送到输入层或隐含层。

反向传播算法

在多层前馈网络中,反向传播(Backpropagation)算法是最常用的训练方法。反向传播算法是一种基于梯度下降法的优化算法,通过不断地迭代调整网络的权重和偏置,最终让网络输出结果与实际结果之间的误差尽可能地小。

同时,反向传播算法还需要依靠链式法则(chain rule)来计算误差对各个参数的梯度,进而进行反向传播调整。

代码示例

以下是一个简单的多层前馈网络的 Python 代码示例:

import numpy as np

class MultilayerPerceptron:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size

        self.weights1 = np.random.randn(self.input_size, self.hidden_size)
        self.biases1 = np.zeros((1, self.hidden_size))
        self.weights2 = np.random.randn(self.hidden_size, self.output_size)
        self.biases2 = np.zeros((1, self.output_size))

    def forward(self, X):
        self.z1 = np.dot(X, self.weights1) + self.biases1
        self.a1 = np.tanh(self.z1)
        self.z2 = np.dot(self.a1, self.weights2) + self.biases2
        exp_scores = np.exp(self.z2)
        self.probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
        return self.probs

    def backward(self, X, y, learning_rate=0.1):
        delta3 = self.probs
        delta3[range(X.shape[0]), y] -= 1
        dweights2 = np.dot(self.a1.T, delta3)
        dbiases2 = np.sum(delta3, axis=0, keepdims=True)
        delta2 = np.dot(delta3, self.weights2.T) * (1 - np.power(self.a1, 2))
        dweights1 = np.dot(X.T, delta2)
        dbiases1 = np.sum(delta2, axis=0)

        self.weights1 -= learning_rate * dweights1
        self.biases1 -= learning_rate * dbiases1
        self.weights2 -= learning_rate * dweights2
        self.biases2 -= learning_rate * dbiases2

    def train(self, X, y, num_epochs=20000, learning_rate=0.1):
        for epoch in range(num_epochs):
            self.forward(X)
            self.backward(X, y)
            if epoch % 1000 == 0:
                loss = self.calc_loss(X, y)
                print(f"Loss after epoch {epoch}: {loss}")

    def predict(self, X):
        probs = self.forward(X)
        return np.argmax(probs, axis=1)

    def calc_loss(self, X, y):
        num_examples = len(X)
        correct_probs = self.probs[range(num_examples), y]
        cross_entropy_loss = -np.log(correct_probs)
        loss = np.sum(cross_entropy_loss)
        return loss
总结

多层前馈网络是一种基本的神经网络结构,它通过权重和偏差的组合,将输入数据映射到输出数据上。在训练过程中,可以使用反向传播算法来调整网络的参数,以达到最小化误差的目的。