淄博做网站公司,建设银行民营企业,海外网站cdn加速,私域电商软件的直播解决方案如果小伙伴第一次看到这篇文章#xff0c;可以先浏览一下我这个系列的上一篇文章#xff1a;
政安晨#xff1a;【完全零基础】认知人工智能#xff08;一#xff09;【超级简单】的【机器学习神经网络】 —— 预测机https://blog.csdn.net/snowdenkeke/article/details/…如果小伙伴第一次看到这篇文章可以先浏览一下我这个系列的上一篇文章
政安晨【完全零基础】认知人工智能一【超级简单】的【机器学习神经网络】 —— 预测机https://blog.csdn.net/snowdenkeke/article/details/136139504
导入
神经元是神经网络的基本组成单元其底层算法主要包括输入加权和激活函数两个部分。
首先神经元接收来自其他神经元传递过来的输入信号并对每个输入信号进行加权求和。
每个输入信号都有一个对应的权重用来表示该信号在神经元中的重要性加权求和的过程可以用下面的公式表示
[ \text{{加权和}} \sum_{{i1}}^n w_i \cdot x_i ]
其中(w_i)是第(i)个输入信号的权重(x_i)是第(i)个输入信号的值(n)是输入信号的数量。
然后神经元将加权和输入到激活函数中进行处理。激活函数通常是非线性函数其作用是引入非线性特性使得神经网络可以学习复杂的问题。激活函数可以是 sigmoid、ReLU、tanh 等。
常用的 sigmoid 激活函数公式如下
[ f(x) \frac{1}{1 e^{-x}} ]
激活函数的输出值被传递给下一层神经元或作为最终的输出结果。
这些底层算法的组合使得神经元能够对输入信号进行权重加权和非线性激活处理从而实现了神经网络的学习和推理功能。
上面这些复杂的概念其实可以从简单的理解开始。
开始
每个神经元都与其前后层的每个神经元相互连接的三层神经元看起来让人相当惊奇。
但是计算信号如何经过一层一层的神经元从输入变成输出这个过程似乎有点令人生畏这好像是一种非常艰苦的工作。
即使此后我们将使用计算机做这些工作但是我认为这仍然是一项艰苦的工作。
但是这对说明神经网络如何工作非常重要这样我们就可以知道在神经网络内部发生了什么事情。
正因如此咱们尝试使用只有两层、每层两个神经元的较小的神经网络来演示神经网络如何工作如下图所示 咱们想象一下两个输入值分别为1.0和0.5。
这些值输入到这个较小的神经网络如下所示
每个节点使用激活函数将输入转变成输出。
我们还将使用先前看到的S函数 其中神经元输入信号的总和为x神经元输出为y。
权重是什么权重的初始值应该为多少
让我们使用一些随机权重
· w1,10.9
· w1,20.2
· w2,10.3
· w2,20.8
随机初始值是个不错的主意这也是我们在先前简单的线性分类器中选择初始斜率值时所做的事情随着分类器学习各个样本随机值就可以得到改进。对于神经网络链接的权重而言这也是一样的。
在这个小型的神经网络中由于连接每一层中两个节点的组合就只有四种连接方式因此只有四个权重。
如下图所示 咱们开始计算如下
第一层节点是输入层这一层不做其他事情仅表示输入信号。
也就是说输入节点不对输入值应用激活函数。这没有什么其他奇妙的原因自然而然地历史就是这样规定的神经网络的第一层是输入层这层所做的所有事情就是表示输入仅此而已。
第一层输入层很容易此处无需进行计算。
接下来第二层我们需要做一些计算。对于这一层的每个节点我们需要算出组合输入。
还记得上述S函数 吗这个函数中的x表示一个节点的组合输入。此处组合的是所连接的前一层中的原始输出但是这些输出得到了链接权重的调节。
下图就是我们先前所看到的一幅图但是现在这幅图包括使用链接权重调节输入信号的过程 因此首先让我们关注第二层的节点1
第一层输入层中的两个节点连接到了这个节点这些输入节点具有1.0和0.5的原始值。
来自第一个节点的链接具有0.9的相关权重来自第二个节点的链接具有0.3的权重。
因此组合经过了权重调节后的输入如下所示
x第一个节点的输出 * 链接权重第二个节点的输出 * 链接权重
x1.0 * 0.90.5 * 0.3
x0.90.15
x1.05
咱们不希望看到不使用权重调节信号只进行一个非常简单的信号相加1.00.5。
权重是神经网络进行学习的内容这些权重持续进行优化得到越来越好的结果。
至此咱们已经得到了x1.05这是第二层第一个节点的组合调节输入。最终我们可以使用激活函数计算该节点的输出我的上一篇文章谈到e的值为 2.71828 ……。
您甚至可以使用计算器来进行这个计算。
答案为y1 /10.34991 / 1.3499因此y0.7408。
这个工作真很有意义
现在我们得到了神经网络两个输出节点中的一个的实际输出。
让我们继续计算剩余的节点即第二层第二个节点。
组合调节输入x为
x第一个节点的输出*链接权重第二个节点的输出*链接权重
x1.0 * 0.20.5 * 0.8
x0.20.4
x0.6
因此现在我们可以使用S激活函数y1/(10.5488)1/1.5488
计算节点输出得到y0.6457。
现在咱们通过计算将刚刚那一幅神经网络的图补充完整输出已经补充完整啦。 从一个非常简化的网络得到两个输出值这个工作量相对较小。
对于一个相对较大的网络咱们不希望使用手工进行计算。
好在计算机在进行大量计算方面表现非常出色并且不知疲倦和厌烦即便如此对于具有多于两层每一层有4、8甚至100个节点的网络我也不希望编写计算机指令来对这样的网络进行计算。
即使只是写出所有层次和节点的计算指令也会让我感到枯燥让我犯错更不用说手工进行这些计算了。
好在即使是面对一个具有很多层、众多节点的神经网络数学可以帮助我们以非常简洁的方式写下计算出所有输出值的指令。由于这种简洁性指令变得非常短执行起来也更有效率因此这种简洁性不仅仅对人类读者有益处对计算机而言也一样大有裨益。
这一简洁方法就是使用矩阵接下来咱们就尝试矩阵。
矩阵
矩阵很多时候让人闻风丧胆。
它们也唤起了我的记忆我记得在学校进行矩阵乘法时那种让人咬牙切齿、枯燥费力的工作以及那毫无意义的时间流逝。
现在回头来看还是因为认知的维度不够站在更高的维度看待矩阵一切都豁然开朗。
刚刚我们手工对两层每一层只有两节点的神经网络进行计算。
对人类而言这样的工作量也是足够大了但是请你想象一下我们要对五层、每层100个节点的网络进行相同的计算这是一种什么感受单单是写下所有必要的计算也是一个艰巨的任务……对每一层每一个节点计算所有这些组合信号的组合乘以正确的权重应用S激活函数……
那么矩阵如何帮助我们简化计算呢
矩阵在两个方面帮助了我们
首先矩阵允许我们压缩所有这些计算把它们变成一种非常简单的缩写形式。
由于人类不擅长于做大量枯燥的工作而且也很容易出错因此矩阵对人类帮助很大。
第二个好处是许多计算机编程语言理解如何与矩阵一起工作计算机编程语言能够认识到实际的工作是重复性的因此能够高效高速地进行计算。
总之矩阵允许我们简洁、方便地表示我们所需的工作同时计算机可以快速高效地完成计算。
尽管我们在学校学习矩阵时有一段痛苦的经历但是现在大家知道咱们为什么要使用矩阵了吧。
让我们开始使用矩阵揭开矩阵的神秘面纱矩阵仅仅是一个数字表格、矩形网格而已。
对于矩阵而言其实已经没有更多复杂的内容了。
以下就是用表格表达的矩阵 上面的这些就是一张表格或一个数字网格与下面大小为“2乘以3”的示例矩阵一样 第一个数字代表行第二个数字代表列这是约定因此我们不说这是“3乘以2”的矩阵而是说这是“2乘以3”的矩阵。
其实这种方式是有好处的在机器学习领域我们还把放到最前面的称为样本数
一些人使用方括号表示矩阵另一些人与我们一样使用圆括号表示矩阵。
其实矩阵的元素也不必是数字它们也可以是我们命名的、但还未赋予实际的数值的一个量。
因此以下是这样一个矩阵
每个元素都是一个变量具有一定的意义。虽然每个元素也可以具有一个数字数值但是我们只是还未说明这些数值为多少。 矩阵对机器学习的神经网络很有用处让我们看看它们是如何相乘的 这种矩阵的点积运算并不是是简单地将对应的元素进行相乘而是有着它特有的规则咱们详细看一下 您可以看到 左上角的元素是通过第一个矩阵的顶行和第二个矩阵的左列计算得出的 顺着这些行和列将你遇到的元素进行相乘并将所得到的值加起来。 因此为了计算左上角元素的答案我们开始沿着第一个矩阵的第一行移动我们找到数字1当我们开始沿着第二个矩阵的左列移动我们找到数字5我们将1和5相乘得到5。 我们继续沿着行和列移动找到数字2和7将2和7相乘我们得到14保留这个数字。 我们已经到达了行和列的末尾因此我们将所有得到的数字相加即514得到19。 这就是结果矩阵中左上角的元素。虽然这描述起来非常啰嗦但是在操作时这很容易观察得到。
小伙伴们自己可以试一试。
用同样的方式咱们再看一下右下角元素是如何计算得出的
在下图中你可以观察到我们尝试计算的所对应的行和列在这个示例中是第二行和第二列我们得到3×6和4×8最后得到183250。 左下角的元素计算公式为3 * 54 * 7152843。
同样地右上角元素的计算公式为1 * 62 * 861622。 下面我们使用变量而不是数字来详细说明规则 这是我们说明矩阵相乘方法的另一种方式。
使用代表任意数字的字母我们可以更加清晰地理解矩阵相乘的一般规则。
这种规则可以应用到各种大小的矩阵上因此是一种通用规则。
虽然我们说这种方法适用于不同大小的矩阵但这里有一个重要的限制
你不能对两个任意矩阵进行乘法运算这两个矩阵需要互相兼容。
你可能已经观察到了第一个矩阵的行和第二个矩阵的列这两者应该是互相匹配的。
如果行元素的数量与列元素的数量不匹配那么这种方法就行不通了。
你不能将“2乘以2”的矩阵与“5乘以5”的矩阵相乘。你可以尝试一下就明白为什么这行不通了。为了能够进行矩阵相乘第一个矩阵中的列数目一行中的元素数应该等于第二个矩阵中的行数目一列中的元素数。
在机器学习的神经网络领域里你会经常看到这样的矩阵乘法称为点乘dot product或内积inner product。实际上对于矩阵而言有不同类型的乘法比如叉乘但是我们此处所指的是点乘。
请仔细观察如果我们将字母换成对神经网络更有意义的单词那么会发生什么情况呢
虽然第二个矩阵是2乘以1的矩阵但是乘法规则是相同的。 关键点来了
第一个矩阵包含两层节点之间的权重。
第二个矩阵包含第一层输入层的信号。
通过两个矩阵相乘我们得到的答案是输入到第二层节点组合调节后的信号仔细观察你就会明白这点。
由权重w1,1调节的input_1加上由权重w2,1调节的input_2就是第二层第一个节点的输入值。
这些值就是在应用S函数之前的x的值。
见下图 这件事非常有用而且是人工智能神经网络里最重要的事之一。
为什么呢
因为我们可以使用矩阵乘法表示所有计算计算出组合调节后的信号x输入到第二层的节点中。
我们可以使用下式非常简洁地表示
XW·I
此处W是权重矩阵I是输入矩阵X是组合调节后的信号即输入到第二层的结果矩阵。
矩阵通常使用斜体显示表示它们是矩阵而不是单个数字。
现在我们不需要在乎每一层有多少个节点。
如果我们有较多的节点那么矩阵将会变得较大但是我们不需要写出长长的一串数字或大量的文字。
我们可以简单地写为W·I不管I有2个元素还是有200个元素。
现在如果计算机编程语言可以理解矩阵符号那么计算机就可以完成所有这些艰辛的计算工作算出 XW·I而无需我们对每一层的每个节点给出单独的计算指令。
只要努力一点理解矩阵乘法就可以找到如此强大的工具这样我们无需花费太多精力就可以实现神经网络了。
有关激活函数我们该了解些什么呢
激活函数其实很简单并不需要矩阵乘法。
我们所需做的是对矩阵X的每个单独元素应用S函数 。
此处我们不需要组合来自不同节点的信号我们已经完成了这种操作答案就在X中。
虽然这听起来如此简单但是这是正确的。
正如我们先前看到的激活函数只是简单地应用阈值使反应变得更像是在生物神经元中观察到的行为
因此来自第二层的最终输出是
Osigmoid(X)
斜体的O代表矩阵这个矩阵包含了来自神经网络的最后一层中的所有输出。
表达式 XW·I 适用于前后层之间的计算。
比如说我们有3层我们简单地再次进行矩阵乘法使用第二层的输出作为第三层的输入。
当然这个输出应该使用权重系数进行调节并进行组合理论已经足够了现在让我们看看这如何在一个真实示例中工作。
总之 通过神经网络向前馈送信号所需的大量运算可以表示为矩阵乘法。 不管神经网络的规模如何将输入输出表达为矩阵乘法使得我们可以更简洁地进行书写。 一些计算机编程语言理解矩阵计算并认识到潜在的计算方法的相似性这允许计算机高速高效地进行这些计算。