定制网站,徐州最大网架公司,phpcms 网站访问统计,网页设计参考网站前言
思索了很久到底要不要出深度学习内容#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新#xff0c;很多坑都没有填满#xff0c;而且现在深度学习的文章和学习课程都十分的多#xff0c;我考虑了很久决定还是得出神经网络系列文章#xff0c;…
前言
思索了很久到底要不要出深度学习内容毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新很多坑都没有填满而且现在深度学习的文章和学习课程都十分的多我考虑了很久决定还是得出神经网络系列文章不然如果以后数学建模竞赛或者是其他更优化模型如果用上了神经网络比如利用LSTM进行时间序列模型预测那么就更好向大家解释并且阐述原理了。但是深度学习的内容不是那么好掌握的包含大量的数学理论知识以及大量的计算公式原理需要推理。且如果不进行实际操作很难够理解我们写的代码究极在神经网络计算框架中代表什么作用。不过我会尽可能将知识简化转换为我们比较熟悉的内容我将尽力让大家了解并熟悉神经网络框架保证能够理解通畅以及推演顺利的条件之下尽量不使用过多的数学公式和专业理论知识。以一篇文章快速了解并实现该算法以效率最高的方式熟练这些知识。
现在很多竞赛虽然没有限定使用算法框架但是更多获奖的队伍都使用到了深度学习算法传统机器学习算法日渐式微。比如2022美国大学生数学建模C题参数队伍使用到了深度学习网络的队伍获奖比例都非常高现在人工智能比赛和数据挖掘比赛都相继增多对神经网络知识需求也日渐增多因此十分有必要掌握各类神经网络算法。
博主专注建模四年参与过大大小小数十来次数学建模理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使用各类数学模型、机器学习和深度学习以及代码每一篇文章都包含实战项目以及可运行代码。博主紧跟各类数模比赛每场数模竞赛博主都会将最新的思路和代码写进此专栏以及详细思路和完全代码。希望有需求的小伙伴不要错过笔者精心打造的专栏。 前向传播
上两篇文章讲述了神经网络的基本架构和各类常用的激活函数那么我们知道在神经网络中每个神经元都与其前后层的每个神经元相互连接那么神经网络要怎么通过输入的数据又是经过何种计算到输出层的呢我们现在就来看看它的工作原理。
神经网络的传递过程可以描述为四个关键的步骤
从输入到隐藏层
神经网络从输入层到隐藏层的计算方式涉及权重和偏置的线性组合然后将结果传递给激活函数。
输入信号 输入层接收外部输入的数据这些数据可以是图像、文本、数字等。每个输入都对应着网络中的一个输入神经元。假设输入层有个神经元分别为它们分别表示第1个到第个输入神经元的输出。权重和偏置 隐藏层包含多个神经元每个神经元与输入层的每个神经元都有一个连接连接上有一个权重。其中$j$ 表示隐藏层中的神经元索引表示输入层中的神经元索引。每个隐藏层神经元还有一个偏置 。线性组合 对于隐藏层中的第个神经元其输入信号将与权重相乘并加上偏置得到线性组合的值 激活函数 对于线性组合的值将其输入激活函数 $f$ 中得到隐藏层神经元的输出常见的激活函数包括 sigmoid、ReLU、tanh 等它们引入非线性性质使得神经网络能够学习更复杂的函数。逐层传递 上述步骤在每个隐藏层中的每个神经元都会重复进行。每个隐藏层神经元的输出将成为下一层神经元的输入。 这个计算过程将重复在每一层的每个神经元中直到得到隐藏层的输出。这些隐藏层的输出将成为下一层的输入以此类推直到达到输出层。通过这种逐层计算的方式神经网络可以从输入数据中提取并表示更高级别的特征。 如果理解上述文字描述感觉抽象吃力的话我们可以根据有一个小例子来具体理解神经网络的前向传递过程 如上图所示为一个神经网络基本结构我们设定两个输入节点,为实际真值情况那么我们设定权重
对输入层到隐藏层的节点进行加权求和结果分别如下
节点1的值为
节点2的值为 接着对隐藏层的节点的值执行Sigmoid激活,sigmoid函数在我上篇文章有详细讲述直接进行计算即可 然后对隐藏层的输出到输出节点进行加权求和 最后我们发现0.18和真值0.1还是有差距的若是权重设定不合适会导致更差的结果这个时候就需要使用到反向传播来使预测值更加接近真实值。当然如果是输入层较多隐藏层比较复杂我们一般是使用矩阵来进行例如 我们可以使用矩阵运算来表达 现在假设输入数据源是我们再进行一次计算
import numpy as np
def _sigmoid(in_data):return 1/(1np.exp(-in_data))
#输入层
x np.array([0.9,0.1,0.8])
#隐藏层需要计算输入层到中间隐藏层每个节点的组合中间隐藏层的每个节点都与输入层相连所以w1是一个3*3的矩阵
#因此每个节点都会得到输入信号的部分信息
#第一个输入节点与中间隐藏层第一个节点之间的权重w110.9输入的第二个节点与隐藏层之间的连接的权重为w220.8
w1 np.array([[0.9,0.3,0.4],[0.2,0.8,0.2],[0.1,0.5,0.6]])
#因为输出层包含了3个节点所以w2也是一个3x3的矩阵
w2 np.array([[0.3,0.7,0.5],[0.6,0.5,0.2],[0.8,0.1,0.9]
])Xhidden _sigmoid(w1.dot(x))
print(Xhidden)
Xoutput w2.dot(Xhidden)
print(Xoutput) #最终输出结果 下面再来看一个更加复杂的例子 这个案例我们增加一层隐藏层再来看看如何运算
def _sigmoid(in_data):return 1/(1np.exp(-in_data))def init_network():network{}network[w1]np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])network[b1]np.array([0.1,0.2,0.3])network[w2]np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])network[b2]np.array([0.1,0.2])network[w3]np.array([[0.1,0.3],[0.2,0.4]])network[b3]np.array([0.1,0.2])return networkdef forward(network,x):w1,w2,w3 network[w1],network[w2],network[w3]b1,b2,b3 network[b1],network[b2],network[b3]a1 x.dot(w1) b1z1 _sigmoid(a1)a2 z1.dot(w2) b2z2 _sigmoid(a2)a3 z2.dot(w3)b3ya3return ynetwork init_network()
x np.array([1.0,0.5])
y forward(network,x)
print(y) 那么前向传播到这里就全部讲完了没有很复杂的内容线性计算就可以下一章我们将着重讲述一下输出层的计算和功能。