杭州免费建站,高端网站改版顾问,嘉兴网站专业制作,建设学院实验网站的作用在构建乳腺癌预测神经网络过程中#xff0c;我们主要分为3大部分#xff1a;
1.用Python从零开始创建一个神经网络#xff0c;并使用梯度下降算法训练模型。
2.在该神经网络中使用威斯康星乳腺癌数据集#xff0c;根据9种不同的特征#xff0c;预测肿瘤是良性还是恶性的…
在构建乳腺癌预测神经网络过程中我们主要分为3大部分
1.用Python从零开始创建一个神经网络并使用梯度下降算法训练模型。
2.在该神经网络中使用威斯康星乳腺癌数据集根据9种不同的特征预测肿瘤是良性还是恶性的。
3.探索反向传播和梯度下降算法的工作原理。
在这个领域中有很多大牛都通过视频和博文分享了自己掌握的专业知识如fast.ai的Jeremy Howard、吴恩达、Andrej Karpathy、Yann Lecun等等。
他们一致认为深度学习的关键之一就是尽快亲自动手编写一个深度学习的模型。当前深度学习领域中有很多强大的库可供我们使用如Tensorflow、 PyTorch、 Fast.ai、 Keras、 Mxnett、 Nctk、DL4J 等。如果仅仅直接使用这些强大的库我们可能会错过很多关键的东西因此我们需要进一步思考这些进程中最重要的那部分。
如果能自己亲自动手编码创建一个神经网络我们就不得不面对创建过程中出现的一些问题和障碍挖掘深度学习背后隐藏的那些令人惊叹的知识。
当前深度学习领域中有各种各样的架构和开发卷积神经网络、循环神经网络和生成对抗网络等等。在这些不同种类的网络背后都包含了两个相同的算法反向传播算法和梯度下降算法。
探索神秘的函数
宇宙中的很多事物都可以用函数表示。本质上来说函数是一种数学结构接受一个输入并产生一个输出表示因果关系、输入输出关系。
当我们审视周围的世界时会接收到很多信息我们将这些信息转化为数据就可以从这些数据中学到很多知识。在利用这些数据进行学习的时候会有很多不同的种类。通常来说深度学习中有三种最常见的类型
1.监督学习从一组有标签已分类的训练数据中学习函数输入和输出是成对的数据集。
2.非监督学习从没有任何标签或分类的数据中学习到函数。
3.强化学习代理人会在特定环境中做出相应的动作通过最大化代理人得到的奖励得到函数。
监督学习
本文中我们主要关注监督学习。现在我们有一个数据集包含输入及对应的输出。下面我们想了解这些输入和输出是如何通过一个神秘的函数联系起来的。
当数据集达到一定的复杂度时寻找这个函数的难度就相当大。因此我们就需要使用神经网络和深度学习来探索这个神秘的函数。
本质上来说神经网络通过一系列的中间“权重”连接我们的输入和期望输出数据。这些权重实际上就是一些数字。 当我们使用正确的架构和参数通过神经网络的结构和优化算法我们可将神经网络近似成一个通用函数近似器将输入和输出数据联系起来。
创建一个神经网络
一般来说简单的神经网络包括两层输入不计入层数
1.输入神经网络的输入包含了我们的源数据。并且神经元的数量与源数据的特征数量相匹配。下图中有4个输入当我们使用威斯康星乳腺癌数据集创建神经网络的时候就会使用9个输入。
2.第一层隐藏层包含一些隐藏层神经元这些神经元将会与周围层中的所有单元相连接。
3.第二层有一个单元为神经网络的输出。
在实际的神经网络构建过程中我们可以使用更多的层比如10个或20个层的网络。为了简单起见在这里我们使用2个层。千万不要小看这2个层它能够实现很多功能。 神经网络如何进行学习
问题来了在这个神经网络中学习将在哪个部分进行
我们来回顾一下我们在神经网络的输入层放置了一些数据并向网络展示某个输入应该对应什么输出也就是说神经网络的输出第2层应该是什么结果。
在神经网络中每个神经元都有一个相关的权重以及一个偏差。这些权重只是神经网络在开始学习时候初始化的一些随机数字。
神经网络根据输入数据和这些权重值进行计算通过神经网络传播直到输出产生最终的结果。
这些计算的结果就是一个将输入映射到输出的函数。
我们需要的就是这些神经网络能够计算出一个最佳权重值。因为网络通过计算不同的权重和不同的层结合起来会近似出不同类型的函数。
现在我们来进一步探索正在探寻的函数。为了方便阅读我们需要解释下这些变量的名称
1.X表示输入层即提供给网络的数据集。
2.Y表示与输入x对应的目标输出由输入经过网络进行一系列的计算得到的输出。
3.Yh(y hat)表示预测函数即我们像网络提供输入数据集x后经过神经网络一系列的计算产生的输出。因此Y是理想的输出Yh是神经网络接收到输入数据后产生的实际输出。
4.W表示网络各层的权重。
我们首先看第一层——隐藏层它执行了一个运算W*X即W和X的乘积。 然后进行一个加权和
1.这一层中的每个单元都和前一层中的每个单元相连接。
2.权重值存在于每个连接中。
3.该层中每个单元的值都是由前一个层中每个单元的值*权重的总和而该权重则是1中所得到的权重。
从某种程度上来说权重表示连接的强度即不同层之间单元连接的强度。
现在我们要在这个架构中添加一个额外的量——偏差W*Xb。
这个偏差能够给神经网络带来更多的灵活性偏差允许网络“移动”单位的线性计算加强网络学习这些函数的能力。
b代表单位偏差项。
我们看到W*Xb就是一个线性方程通过乘积与和运算表示输入和输出的线性关系。
现在我们的神经网络只有2层但是请记住一个神经网络可以有很多层比如20个甚至200个。因此我们用数字表述这些变量属于哪一层。这样一来定义隐藏层第1层的线性方程则为W1*Xb1并为其输出命名为Z表示某一层计算的输出。因此我们得到如下方程
Z1W1*Xb1
注意这个计算应该针对每个层的每个单元进行。当我们为神经网络编写代码的时候我们将使用向量化编程也就是说利用矩阵将某一层的所有计算放在一个单一的数学运算中。
上面所讲述的是只有一个层的神经网络。现在我们考虑一个有很多层的神经网络每个层执都执行一个类似上面的线性运算当所有的线性运算连接在一起时这个神经网络就能够计算复杂的函数了。
激活函数
然而现在就有一个问题线性函数——太简单了吧。
这个世界是复杂的因此线性函数远远满足不了实际需求。一般来说复杂的函数往往都是非线性的。而且如果神经网络的架构仅仅由线性函数计算那么就很难计算非线性行为。这就是为什么我们要在神经网络的每一层末尾加上一个额外的量激活函数。现在我们介绍4个最典型的例子。
为了方便我们后续对激活函数进行深入探索首先需要介绍梯度这一概念。一个函数在某一点上的梯度也称为函数的导数表示该函数在该点输出值的变化率。
我们来思考这样一个问题当特定输入发生变化时函数的输出会发生怎样的变化
当梯度导数非常小即函数的输出变化非常平坦时我们称之为梯度消失。在后边的反向传播算法中我们可以通过梯度了解网络中每个参数将会如何影响网络的输出从而就能够决定如何调整网络的权值也就是说了解这个参数的变化将会使网络的输出增加还是减少
梯度消失是我们所面临的一个问题因为如果某一点的梯度变化很小或趋于0我们就很难确定该神经网络在该点的输出方向。
当然我们也会遇到相反的情况——梯度爆炸。当梯度值非常大时神经网络可能就会变得非常不稳定。
不同的激活函数有各自的优点但是都会面临梯度消失和梯度爆炸这两大问题。 1Sigmoid激活函数——1/(1e**-x)
1.输出范围[0,1]。
2.非线性输出为两个极端变量0和1。适用于二分类问题。
3.曲线变化温和因此梯度导数比较容易控制。
4.该激活函数的主要缺点为在极端情况下函数的输出曲线变得非常平坦也就是说函数的导数变化率将变得非常小在这种情况下Sigmoid激活函数的计算效率和速度将会非常低甚至会完全没效率。
5.当Sigmoid激活函数出现在神经网络的最后一层时将会特别有用因为Sigmoid激活函数有助于将输出变为0或1即二分类问题。如果将Sigmoid激活函数放在神经网络的其他层就会出现梯度消失问题。
2Tanh激活函数——(2/(1e**-2x))-1
1.输出范围[-1,1]。
2.曲线和Sigmoid激活函数的曲线类似是Sigmoid激活函数曲线的缩小版。
3.Tanh激活函数曲线较为陡峭因此该激活函数的导数变化率比较大。
4.Tanh激活函数的缺点与Sigmoid激活函数类似。
3Relu激活函数——max (0,x)
1.如果输入大于0那么输出值等于输入值否则输出为0。
2.Relu激活函数的范围是[0,∞)这就意味着输出可能是∞可能会存在梯度爆炸问题。
3.优点使神经网络轻量化因为一些神经元可能输出为0防止所有的神经元被同时激活。
4.Relu激活函数存在一个问题即输入为0的时候输出全部为0这将会导致梯度为0会让我们忽视某些神经元的一些有用的计算。
5.Relu激活函数计算简单成本低廉。
6.当前Relu激活函数是神经网络内层最经常使用的激活函数。
ï¼4ï¼Â   Leaky Relu激活函数——e**x / Sum(e**x)
1.输出范围[0,1]
2.Leaky Relu激活函数将输入进行标准化处理为一个概率分布。
3.通常用于多分类场景中的输出层。
在这里我们在输出层使用Sigmoid激活函数在隐藏层使用Relu激活函数。
好了现在我们已经理解了激活函数那么就需要对其进行命名
A表示激活函数的输出。
因此在神经网络的隐藏层中将会进行如下计算
A1Relu(Z1)
Z1W1*Xb1
在第二层的输出层中将会进行如下计算
A2Sigmoid(Z2)
Z2W2*A1b2
请注意第二层输出层的输入为第一层的输出即A1。
第二层的输出就是网络的最终输出。将上面的计算归纳一下就得到2层神经网络所执行的全部计算
Yh A2 Sigmoid(W2*ReLU (W1*X b1) b2 ) 因此本质上来说神经网络是一连串的函数有些是线性函数有些是非线性函数它们共同组成了一个复杂的函数将我们的输入数据和想要的输出数据连接了起来。
现在我们注意到在这个方程的所有变量中W和b是两个未知数这就是神经网络需要学习的地方。也就是说神经网络必须进行不断的学习找到W和b的正确值才能计算出正确的函数。
因此我们训练神经网络的目的也变得明了了即寻找W1b1W2b2的正确值。但是在开始训练神经网络之前我们必须首先对这些值进行初始化即用随机函数对其进行初始化处理。
初始化以后我们就可以对神经网络进行编码我们使用Python构建一个类对这些主要的参数进行初始化处理。 一站式开发者服务海量学习资源0元起 阿里热门开源项目、机器学习干货、开发者课程/工具、小微项目、移动研发等海量资源更有开发者福利Kindle、技术图书幸运抽奖100%中--》https://www.aliyun.com/acts/product-section-2019/developer?utm_contentg_1000047140
原文链接 本文为云栖社区原创内容未经允许不得转载。