神经网络基础-神经网络补充概念-23-神经网络的梯度下降法

news/2024/10/23 5:42:41/

概念

神经网络的梯度下降法是训练神经网络的核心优化算法之一。它通过调整神经网络的权重和偏差,以最小化损失函数,从而使神经网络能够逐渐逼近目标函数的最优值。

步骤

1损失函数(Loss Function):
首先,我们定义一个损失函数,用来衡量神经网络预测值与真实标签之间的差距。常见的损失函数包括均方误差(Mean Squared Error)和交叉熵(Cross-Entropy)等。

2初始化参数:
在训练之前,需要随机初始化神经网络的权重和偏差。

4前向传播:
通过前向传播计算神经网络的输出,根据输入数据、权重和偏差计算每一层的激活值和预测值。

5计算损失:
使用损失函数计算预测值与真实标签之间的差距。

6反向传播:
反向传播是梯度下降法的关键步骤。它从输出层开始,计算每一层的误差梯度,然后根据链式法则将梯度传递回每一层。这样,可以得到关于权重和偏差的梯度信息,指导参数的更新。

7更新参数:
使用梯度信息,按照一定的学习率(learning rate)更新神经网络的权重和偏差。通常采用如下更新规则:新权重 = 旧权重 - 学习率 × 梯度。

8重复迭代:
重复执行前向传播、计算损失、反向传播和参数更新步骤,直到损失函数收敛或达到预定的迭代次数。

9评估模型:
在训练过程中,可以周期性地评估模型在验证集上的性能,以防止过拟合并选择合适的模型。

python实现

import numpy as np# 定义 sigmoid 激活函数及其导数
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return x * (1 - x)# 设置随机种子以保证可重复性
np.random.seed(42)# 生成模拟数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])# 初始化权重和偏差
input_size = 2
output_size = 1
hidden_size = 4weights_input_hidden = np.random.uniform(-1, 1, (input_size, hidden_size))
bias_hidden = np.zeros((1, hidden_size))weights_hidden_output = np.random.uniform(-1, 1, (hidden_size, output_size))
bias_output = np.zeros((1, output_size))# 设置学习率和迭代次数
learning_rate = 0.1
epochs = 10000# 训练神经网络
for epoch in range(epochs):# 前向传播hidden_input = np.dot(X, weights_input_hidden) + bias_hiddenhidden_output = sigmoid(hidden_input)final_input = np.dot(hidden_output, weights_hidden_output) + bias_outputfinal_output = sigmoid(final_input)# 计算损失loss = np.mean(0.5 * (y - final_output) ** 2)# 反向传播d_output = (y - final_output) * sigmoid_derivative(final_output)d_hidden = d_output.dot(weights_hidden_output.T) * sigmoid_derivative(hidden_output)# 更新权重和偏差weights_hidden_output += hidden_output.T.dot(d_output) * learning_ratebias_output += np.sum(d_output, axis=0, keepdims=True) * learning_rateweights_input_hidden += X.T.dot(d_hidden) * learning_ratebias_hidden += np.sum(d_hidden, axis=0, keepdims=True) * learning_rateif epoch % 1000 == 0:print(f'Epoch {epoch}, Loss: {loss}')# 打印训练后的权重和偏差
print('Final weights_input_hidden:', weights_input_hidden)
print('Final bias_hidden:', bias_hidden)
print('Final weights_hidden_output:', weights_hidden_output)
print('Final bias_output:', bias_output)

http://www.ppmy.cn/news/1037844.html

相关文章

锁的升级过程(代码演示)

1 前言 锁的状态有4种,无锁,偏向锁、轻量级锁、重量级锁。那为什么会有锁升级的这种概念,其实大家都知道synchronized 在1.6之后做了升级,但具体是升级了什么?其实在jdk1.6之前锁只有重量级锁这个概念(但是…

【高阶数据结构】红黑树详解

文章目录 前言1. 红黑树的概念及性质1.1 红黑树的概念1.2 红黑树的性质1.3 已经学了AVL树,为啥还要学红黑树 2. 红黑树结构的定义3. 插入(仅仅是插入过程)4. 插入结点之后根据情况进行相应调整4.1 cur为红,p为红,g为黑…

rust踩雷笔记(2)——一道hard带来的思考[哈希表、字符串、滑动窗口]

今天被一道hard恶心坏了,算法不难,用C几分钟的事。用rust主要还是缺乏对语言的熟练度,记录一下,主要的坑在下面这个操作: 对String取其中某个位置的char。 可能你会有疑问:这不是直接nth()取就行了么。没错…

二刷LeetCode--148. 排序链表(C++版本),必会题,思维题

思路,本题其实考察了两个点:合并链表、链表切分。首先从1开始,将链表切成一段一段,因为需要使用归并,所以下一次的切分长度应该是当前切分长度的二倍,每次切分,我们拿出两段,然后将第…

Jetpack 中的 LiveData 粘性事件

什么叫粘性事件 LiveData使用篇Jetpack 中的 LiveData - 使用篇_简单不一定不好的博客-CSDN博客后再进一步了解LiveData。观察者和被观察者,正常情况下观察者先注册,被观察者再发送观察事件;所以粘性事件可以理解为观察者模式的升级&#xf…

LeetCode235. 二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 文章目录 [235. 二叉搜索树的最近公共祖先](https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/)一、题目二、题解方法一:递归方法二:迭代 一、题目 给定一个二叉搜索树, 找到该树中两个指定…

ZooKeeper的应用场景(集群管理、Master选举)

5 集群管理 随着分布式系统规模的日益扩大,集群中的机器规模也随之变大,因此,如何更好地进行集群管理也显得越来越重要了。 所谓集群管理,包括集群监控与集群控制两大块,前者侧重对集群运行时状态的收集,后…

uniapp 上传比较大的视频文件就超时

uni.uploadFile,上传超过10兆左右的文件就报错err:uploadFile:fail timeout,超时 解决: 在manifest.json文件中做超时配置 uni.uploadFile({url: this.action,method: "POST",header: {Authorization: uni.getStorage…