一文速学-让神经网络不再神秘,一天速学神经网络基础(五)-最优化

news2024/11/25 13:54:30

前言

思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,不然如果以后数学建模竞赛或者是其他更优化模型如果用上了神经网络(比如利用LSTM进行时间序列模型预测),那么就更好向大家解释并且阐述原理了。但是深度学习的内容不是那么好掌握的,包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化,转换为我们比较熟悉的内容,我将尽力让大家了解并熟悉神经网络框架,保证能够理解通畅以及推演顺利的条件之下,尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法,以效率最高的方式熟练这些知识。

现在很多竞赛虽然没有限定使用算法框架,但是更多获奖的队伍都使用到了深度学习算法,传统机器学习算法日渐式微。比如2022美国大学生数学建模C题,参数队伍使用到了深度学习网络的队伍,获奖比例都非常高,现在人工智能比赛和数据挖掘比赛都相继增多,对神经网络知识需求也日渐增多,因此十分有必要掌握各类神经网络算法。

博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码,每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛,每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏。
 

这里损失函数并没有新开一篇文章细讲,是因为之前已经有一篇文章详细讲述了所有的损失函数形式以及实现代码和功能,推荐大家细读:损失函数(Loss Function)一文详解-分类问题常见损失函数Python代码实现+计算原理解析_fanstuck的博客-CSDN博客

还是简单的提一嘴让大家印象深刻一下,损失函数就是用以衡量实际值和预测值在当前位置的差值或误差,这提高了一些模型的有效性,通过向模型提供反馈,使其可以调整参数以最大程度减少误差。


当我们训练神经网络时,我们使用损失函数来度量模型预测值与真实值之间的差距。这个差距通常被称为误差或损失。我们的目标是通过调整模型的权重和参数,使损失函数的值最小化。换句话说,我们试图找到一组权重和参数,使得模型的预测结果尽可能接近真实值。

损失函数的值越小,意味着模型的预测与实际数据之间的差异越小,模型的性能越好。优化的过程就是通过反向传播和梯度下降等方法,逐步调整模型的权重和参数,以降低损失函数的值。

一、随机初始化

随机初始化的方式大家应该很好理解,我们可以一开始随机尝试很多不同的权重试一下,然后看看哪个权重集合的效果最好,听起来虽然很笨但确实很笨,这里仅作引入,实际不要采用此方法:

accuracy_cnt=0
batch_size=100
x = test_dataset.test_data.numpy().reshape(-1,28*28)
labels = test_dataset.test_labels
finallabels = labels.reshape(labels.shape[0],1)
bestloss = float('inf')
for i in range(0,int(len(x)),batch_size):
    network = init_network()
    x_batch = x[i:i+batch_size]
    y_batch = forward(network,x_batch)
    one_hot_labels = torch.zeros(batch_size,10).scatter_(1,finallabels[i:i+batch_size],1)
    loss = cross_entropy_error(one_hot_labels.numpy(),y_batch)
    if loss < bestloss:
        bestloss = loss
        bestw1,bestw2,bestw3 = network['W1'],network['W2'],network['W3']
    print("best loss: is %f" %(bestloss))

那么我们再来看看准确率的效果如何:

a1=x.dot(bestw1)
z1=_relu(a1)
a2=z1.dot(bestw2)
z2=_relu(a2)
a3=z2.dot(bestw3)
y=_softmax(a3)
print(y)
#找到在每列中评分最大的索引
Yte_predict=np.argmax(y,axis=1)
one_hot_labels=torch.zeros(x.shape[0],10).scatter_(1,finallabels,1)
true_labels=np.argmax(one_hot_labels.numpy(),axis=1)
#计算准确率
print(np.mean(Yte_predict==true_labels))

最后的输出结果为:

0.0948

差不多也正常和猜的概率一样。

二、梯度下降法

梯度下降法之前我有一篇文章专门写了此最优化算法,之前在写逻辑回归的算法时也用到过,想要详细了解的推荐细读,此篇文章仅详细讲述在反向传播中梯度下降算法的功能功能:

一文速学数模-最优化算法(二)梯度下降算法一文详解+Python代码

神经网络的学习也要求梯度,这里的梯度说表示的是损失函数中关于权重以及偏移量(bias)的梯度。比如一个形状为2*2的权重为W的神经网络,损失函数用L表示:

其梯度表示为:

 \frac{\vartheta L}{\vartheta W}的元素由各个元素关于W的偏导数构成。对于每一个偏导数,其表示的意义是,当每个W稍微变化的时候,损失函数L会发生多大的变化。

#基于数值微分的梯度下降法
def numerical_gradient(f,x):
    h = 1e-4 #0.0001
    grad = np.zeros_like(x)
    it = np.nditer(x,flags=['multi_index'],op_flags=['readwrite'])
    while not it.finished:
        idx = it.multi_index
        tmp_val = x[idx]
        x[idx] = float(tmp_val)+h
        fxh1 = f(x) #f(x+h)
        
        x[idx] = tmp_val-h
        fxh2 = f(x) #f(x-h)
        grad[idx] = (fxh1 - fxh2) / (2*h)
        
        x[idx] = tmp_val #还原值
        it.iternext()
        
    return grad

之后经过初始重置权重数据集后,使用梯度下降算法的权重集合为:

损失函数值:

了解到了梯度下降算法以及工作原理,那么我们就可以开始反向传播的研究了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/953381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka系列三基础概念

文章首发于个人博客&#xff0c;欢迎访问关注&#xff1a;https://www.lin2j.tech Kafka 是一款分布式消息发布和订阅系统&#xff0c;其高性能、高吞吐量的特点决定了其适用于大数据传输场景。 基础概念 Broker Broker 其实就是一个运行 Kafka 服务的服务器。Kafka 集群包…

chatGPT训练过程

强化学习基础 强化学习是指智能体在不确定环境中最大化其获得的奖励从而达到自主决策的目的。其执行过程为&#xff1a;智能体依据策略决策从而执行动作&#xff0c;然后感知环境获取环境的状态&#xff0c;进而得到奖励(以便下次再到相同状态时能采取更优的动作)&#xff0c;…

(java)进程和线程的联系和区别 。Java如何进行多线程编程?Thread 类及常见方法。

目录 进程 1.进程具有独立性 ———— 虚拟地址空间 线程 为什么要引入多个线程&#xff1f; 多线程注意点 ⁜⁜总结&#xff1a;线程和进程的区别和联系⁜⁜ &#xff08;经典面试题&#xff09; Java如何进行多线程编程&#xff1f; 创建线程 ——方法1 继承 Thre…

webrtc 的Bundle group 和RTCP-MUX

1&#xff0c;最近调试程序的时候发现抱一个错误 max-bundle configured but session description has no BUNDLE group 最后发现是一个参数设置错误 config.bundle_policy webrtc::PeerConnectionInterface::BundlePolicy::kBundlePolicyMaxBundle; 2&#xff0c;rtcp-mu…

SpringBoot项目,执行install命名时,控制台显示:Unable to find main class

构建springboot多模块项目&#xff0c;启动时可以正常启动&#xff0c;执行了父工程的maven的clean也没问题&#xff0c;执行install的时候就报错了&#xff1a;Unable to find main class。显而易见 这个错是找不到主类。 记录下解决过程&#xff1a; 首先看自己项目的父工程…

膦酸基官能团高盐环境下去除钙镁离子树脂

项目名称 某新能源公司除钙镁项目 工艺选择 串联运行 工艺原理 膦酸基官能团高盐环境下去除钙镁离子 项目背景 锂及其盐类是国民经济和国防建设中具有重要意义的战略物资&#xff0c;也是与人们生活息息相关的能源材料。而碳酸Li作为锂盐的基础盐&#xff0c;是制取锂化…

Matlab 基本教程

1 清空环境变量及命令 clear all % 清除Workspace 中的所有变量 clc % 清除Command Windows 中的所有命令 2 变量命令规则 &#xff08;1&#xff09;变量名长度不超过63位 &#xff08;2&#xff09;变量名以字母开头&#xff0c; 可以由字母、数字和下划线…

vue3路由跳转以及传参。和vue2路由跳转传参的区别

路由的安装和引入以及注册就不过多赘述&#xff0c;直接说区别和怎么跳转页面 vue2路由跳转以及传递参数 vue2只需要创建好router文件夹和index.js&#xff0c;配置好我们的路由&#xff0c;在main.js引入 import router from "/router"; // vue路由app.use(route…

如何避免重复消费消息

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

【函数栈帧解析:代码的迷人堆积和无限嵌套】

本章重点 一、何为函数栈帧 二、函数栈帧特性 - 同栈 - 后进先出 三、认识内存空间布局图 四、认识相关寄存器 五、认识相关汇编命令 六、测试代码&#xff1a; 七、函数栈帧全过程 要解决的问题​​​​​​​ 局部变量是怎么创建的&#xff1f;为什么局部变量的值是随机值&am…

10项必备的IT国际认证

10项必备国际IT认证对于希望在数字时代提升职业生涯的专业人士来说&#xff0c;已成为一项重要资产。 此类认证不仅肯定了你在特定IT领域的专业知识&#xff0c;还展现了你会在以后的生涯中不断学习和专业成长的决心。为了帮助你查询这些选择&#xff0c;我们编制了一份2023年…

华为OD机试 - 租车骑绿道 - 双指针(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、解题思路1、输入2、输出3、说明4、双指针算法 五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 部门组织绿岛骑行团建活动&#xff0c;租用公共双人自行车骑行&#xff0c;…

装箱、拆箱

装箱&#xff1a;将基本类型用它们对应的引用类型包装起来&#xff1b;拆箱&#xff1a;将包装类型转换为基本数据类型&#xff1b; Java 可以自动对基本数据类型和它们的包装类进行装箱和拆箱。 为什么要有包装器类型 因为java的三种集合&#xff0c;List、Set、Map&#xf…

【python零基础入门学习】python基础篇之判断与for循环(二)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

iTOP-RK3588开发板Android12 设置系统默认不休眠

修改文件&#xff1a; device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults. xml 文件&#xff0c;如下图所示&#xff1a; - <integer name"def_screen_off_timeout">60000</integer> <integer name&q…

电子相册制作新技巧,让你惊叹不已!

​近年来&#xff0c;随着科技的不断进步&#xff0c;电子相册制作已经成为了一种流行的趋势。无论是记录旅行的美好瞬间&#xff0c;还是展示生活中的点滴幸福&#xff0c;电子相册都能够将这些珍贵的回忆永久保存下来。 在我们制作电子相册之前&#xff0c;我们需要选择一款专…

QQ邮件营销

邮件营销效果好的莫过于QQ邮件营销&#xff0c;QQ邮件收件会自动弹窗提示&#xff0c;邮件的阅读率是所有目前邮箱中最高的&#xff0c;而QQ邮件规则使用的叶贝思反垃圾邮件算法会有效防止一般的群发邮件&#xff0c;一米智能QQ邮件营销系统针对性的解决了这个难题。另外我们对…

00. 深入编程原理系列文章前言

名称的含义 为什么要用《从0到1&#xff0c;第一行代码》这个名字&#xff0c;有两重含义&#xff1a; 有一本很著名的书&#xff0c;就叫《从0到1》&#xff0c;表示从无到有的意思&#xff0c;这里也叫从0到1&#xff0c;表示代码到底怎么来的&#xff0c;程序到底是怎么运行…

Java 数据库改了一个字段, 前端传值后端接收为null问题解决

前端传值后端为null的原因可能有很多种&#xff0c;我遇到一个问题是&#xff0c;数据库修改了一个字段&#xff0c;前端传值了&#xff0c;但是后台一直接收为null值&#xff0c; 原因排查&#xff1a; 1、字段没有匹配上&#xff0c;数据库字段和前端字段传值不一致 2、大…

事前规划,事半功倍!与大家聊聊项目管理的重要性

大家好&#xff0c;我是你们的小米&#xff01;希望大家都过得开开心心&#xff0c;工作顺利&#xff0c;生活美满。今天我要和大家分享一个让我深有感触的话题——项目管理中的事前规划&#xff0c;以及它所带来的重要性。就在昨晚&#xff0c;我经历了一次让人啼笑皆非的经历…