神经网络是如何进行预测的?

 笔记来源于:

床长人工智能教程
吴恩达深度学习deeplearning.ai

 上一篇文章,我们初步了解到了神经网络的原来,神经网络是怎么一回事儿神经网络的分类以及数据是以何种形式传入神经网络,下面我们来介绍神经网络其他背后的逻辑。

神经网络是如何进行预测的

Logistic 回归

 在上一篇文章,上面我们知道了数据是通过什么样的方式来输入到神经网络中去的,就好比我举出来的例子,我们把图像抽象为三层叠加的矩阵,三个矩阵分别代表着红绿蓝,矩阵的每一个单位代表着该颜色在像素点的值,三种颜色,不同的值构造出同一个像素点,n 个像素点就构成了图像,图像以这样的方式传入神经网络,供神经网络来学习。那么,另外一个问题来了,神经网络是如何进行预测的呢

 这个预测的过程其实只是基于一个简单的公式,这里我们在引入上篇文章的神经元图片。

z = d o t ( W , X ) + b z = dot(W,X) + b z=dot(W,X)+b

 其实在逻辑回归公式中,W 其实应该写成 WT,因为实际运算中我们需要w的转置矩阵。这里为了简化理解,后面会详细给大家介绍的
在这里插入图片描述

 其实这个公式蛮简单的, 大家不要想复杂的,x 代表着输入特征向量,假设只有3个特征,那么x就可以用(x1,x2,x3)来表示。如上图的神经元。w表示权重,它对应于每个输入特征,代表了每个特征的重要程度。b表示阈值[yù zhí],用来影响预测结果。z就是预测结果。公式中的dot()函数表示将w和x进行向量相乘。我们现在只需要知道上面的公式展开后就变成了这样

z = d o t ( w , x ) + b = ( x 1 ∗ w 1 + x 2 ∗ w 2 + x 3 ∗ w 3 ) + b 。 z = dot(w,x) + b = (x1 * w1 + x2 * w2 + x3 * w3) + b。 z=dot(w,x)+b=(x1w1+x2w2+x3w3)+b

 下面我通过一个实例来帮助大家理解这个公式。

 假设周末即将到来,我知道古天乐要来我的城市拍戏。作为我的男神,我一定要去看的,然后我待着没事,搞了一个神经网络要预测我是否会去拍古天乐的剧组。但是拍戏的地点离我住的地方挺远,而且我女朋友想让你陪她宅在家里搞事情(假想我就有女朋友),但是天气预报说拍戏的那天天气特别好。

 分析:也就是说有3个因素会影响我的决定,这3个因素就可以看作是3个输入特征。那我到底会不会去呢?我的个人喜好——我对上面3个因素的重视程度——会影响我的决定。这3个重视程度就是3个权重。

 如果我觉得地点的远近无所谓,并且已经精力衰竭不太想搞事情了,而且我知道,见到古天乐本人的机会也许就这一次,那么神经网络将预测我会去拍戏地点。这个预测过程可以用前面的公式来表示。

 我们假设结果z大于0的话就表示会去,小于0表示不去。又设阈值b是-5。又设3个特征(x1,x2,x3)为(0,0,1),最后一个是1,它代表了好天气。又设三个权重(w1,w2,w3)是(2,2,7),最后一个是7表示你很喜欢好天气。那么就有

z = ( x 1 ∗ w 1 + x 2 ∗ w 2 + x 3 ∗ w 3 ) + b = ( 0 ∗ 2 + 0 ∗ 2 + 1 ∗ 7 ) + ( − 5 ) = 2 z = (x1 * w1 + x2 * w2 + x3 * w3) + b = (0 * 2 + 0 * 2 + 1 * 7) + (-5) = 2 z=(x1w1+x2w2+x3w3)+b=(02+02+17)+(5)=2

 预测结果z是2,2大于0,所以预测你会拍戏地点看古天乐。

 但是如果我最近欲火焚身,并且对其它两个因素并不在意,那么神经网络预测我将不会拍戏地点。这同样可以用我们的公式来表示。设三个权重(w1,w2,w3)是(2,7,2),w2是7表示我有顶穿钢板的欲火。那么就有
z = ( x 1 ∗ w 1 + x 2 ∗ w 2 + x 3 ∗ w 3 ) + b = ( 0 ∗ 2 + 0 ∗ 7 + 1 ∗ 2 ) + ( − 5 ) = − 3 z = (x1 * w1 + x2 * w2 + x3 * w3) + b = (0 * 2 + 0 * 7 + 1 * 2) + (-5) = -3 z=(x1w1+x2w2+x3w3)+b=(02+07+12)+(5)=3
 预测结果z是-3,-3小于0,所以预测你不会去,会呆在家里搞事情。(滑稽)

 预测一张图片里有没有猫也是通过上面的公式。经过训练的神经网络会得到一组与猫相关的权重。当我们把一张图片输入到神经网络中,图片数据会与这组权重以及阈值进行运算,结果大于0就是有猫,小于0就是没有猫。

 大家平时上网时有没有发现网页上的广告都与你之前浏览过的东西是有关联的?那是因为很多网站都会记录下你平时的浏览喜好,然后把它们作为权重套入到上面的公式来预测你会购买什么。

 上面那个用于预测的公式我们业界称之为逻辑回归,这个名字有点奇怪,大家记住就行了,只是个名字而已。

激活函数

 这里要稍微提一下激活函数。在实际的神经网络中,我们不能直接用逻辑回归。因为由上面的逻辑回归公式算出来的值,可能比1大得多,或者甚至可能是一个负值,那这样的得出的概率值,其实没有什么实际意义的,其实所谓的概率问题把数字数值控制在0和1之间即可,所以说必须要在逻辑回归外面再套上一个函数。这个函数我们就称它为激活函数。,激活函数非常非常重要,如果没有它,那么神经网络的智商永远高不起来。而且激活函数又分好多种。后面我会花好几篇文章来给大家介绍激活函数。那么在这里,我只给大家简单介绍一种叫做sigmoid的激活函数。它的公式和图像如下。
在这里插入图片描述
 我们在这里先只介绍它的一个用途——把z映射到[0,1]之间。上图中的横坐标是z,纵坐标我们用 y ^ \widehat{y} y 来表示, y ^ \widehat{y} y 就代表了我们最终的预测结果。从图像可以看出,z越大那么 y ^ \widehat{y} y 就越靠近1,z越小那么 y ^ \widehat{y} y 就越靠近0。那为什么要把预测结果映射到[0,1]之间呢?因为这样不仅便于神经网络进行计算,也便于我们人类进行理解。例如在预测是否有猫的例子中,如果y’是0.8,就说明有80%的概率是有猫的。

 那么,一个完整的逻辑回归函数就是如下图,显而易见的就是,我们要做的并不是研究 特征向量X,而是 学习参数 w 和 b ,这样 y ^ \widehat{y} y 就变成了一个很好的估计。
在这里插入图片描述

 因为人工智能这个领域概念多,且难理解,所以我在前面一些文章内删除掉一些较难的细节,这样其实能够更快帮助大家理解一些重要的理论部分。在后面的文章,我会根据教程内容,通过笔记慢慢地把他们给介绍出来,大家一起循序渐进的学习嘛!!

神经网络到底预测的准不准呢

损失函数(成本函数)

  从上面的文章,我们就了解到 神经网络是如何进行预测的 —— 可以通过逻辑回归之类的算法来对输入进行预测,那么又一个问题出现了,我得让神经网络的预测结果是准确的,或者说是无限接近百分百准确的,不然的话,这跟蒙题有什么意义。

 让神经网络自己判断预测结果是否正确,是很重要的一步。因为只有知道自己预测结果是否准确,才能够对自身进行调整,好让结果越来越准确,这就是学习的过程。 那么验证学习成果,就要需要损失函数(loss function) 出现了。

在这里插入图片描述
 这里我们把上面的逻辑回归公式的庐山真面目贴出来,如上图, y ^ \widehat{y} y 就是预测的结果,^ 角标指代某一个训练样本,例如 y ^ \widehat{y} y 是对于训练样本 x ^ \widehat{x} x 的预测结果。

 那么损失函数来衡量我们的预测算法做的怎么样——就是说衡量的是预测算法的预测精度高不高,就比如下面这个“差平方”公式。
在这里插入图片描述
 损失函数运算后得出的结果越大,那么预测就与实际结果的偏差越大,也就是说预测精度不高。我们可以看到这个"差平方’'公式,就是 y^ 越接近y,那么运算所得出的结果就越小,说明预测精度越高,损失最小,但是在实践中人们通常不会用这个“差平方”公式,因为当你学习这些参数的时候,你就会发现之后讨论的优化问题,最后会得到很多个局部最优解,其实我们想要的是一个全局最优解(具体原因在后面介绍给大家,现在为了方便大家理解什么损失函数),实践中我们使用的损失函数的公式是这样的。
在这里插入图片描述
 我们举几个例子来说明一下这个函数: 有这两种情况,第一种情况就是说,当 y = 1 时, L ( y ^ ( i ) , y ^ i ) = − ( y ( i ) l o g ( y ^ ( i ) ) ) L(\hat{y}^{(i)},\hat{y}^{i})=-(y^{(i)}log(\hat{y}^{(i)})) L(y^(i),y^i)=(y(i)log(y^(i))),因为第二项 1 − y 1-y 1y等于0,所以说此时,如果你想让 l o g ( y ^ ) log(\hat{y}) log(y^)够大的话,那么意味着, y ^ \hat{y} y^尽可能的大,也就是,如果 y = 1 y =1 y=1,你会想让 y ^ \hat{y} y^尽可能的大,但是他永远不会大于1 ,为什么加上负号呢,在log函数里,自变量小于1的 y ^ \hat{y} y^得出的值,永远是负的,所以要加上一个负号。第二种情况就是 当 y = 0 时, L ( y ^ ( i ) , y ^ i ) = − ( ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ) L(\hat{y}^{(i)},\hat{y}^{i})=-((1 - y^{(i)})log(1 - \hat{y}^{(i)})) L(y^(i),y^i)=((1y(i))log(1y^(i))),在学习过程中,想让损失函数小一些,也就意味着, l o g ( 1 − y ^ ( i ) ) log(1 - \hat{y}^{(i)}) log(1y^(i)) 够大,因为有一个负号存在,损失函数让 y ^ \hat{y} y^尽可能的小。

 这个公式与“差平方”公式的作用是一样的,努力使损失函数的值越小就是让努力让预测的结果越准确。

 我们需要注意到上方的步骤,其实是我们对单个训练样本定义了损失函数,所谓单个训练样本就是一张图片,一段话…,那么下面这个公式就是用于衡量预测算法对整个训练集(n个训练样本的集合)的预测精度。
在这里插入图片描述
 其实,就是对每个样本的“损失”进行累加,然后求出一个平均值,这种针对于整个训练集的损失函数,我们称之为成本函数。它的计算结果越大,说明成本就越大,预测的也就越不准确。

 损失函数从严格意义上讲:是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或者“损失”的函数。在应用中,损失函数通常是作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。

 损失函数是机器学习里最基础也是最为关键的一个要素,通过对损失函数的定义、优化,就可以衍生到我们现在常用的机器学习等算法中。

 损失函数的作用就是衡量模型模型预测的好坏。再简单一点说就是:失函数就是用来表现预测与实际数据的差距程度。换一种说法就是衡量两个分布之间的距离:其中一个分布应当是原始分布,或者正确的分(groundtruth),而另一个分布则是目前的分布,或者模型拟合的分布(prediction)。损失函数是可以很好的反映模型与实际数据差距的工具,理解损失函数能够更好的对后续优化工具(梯度下降等)进行分析与理解。很多时候遇到复杂的问题时,其实最难的一关是如何写出合适的损失函数。

神经网络是如何进行学习的

梯度下降法

 前面的内容,我们知道 逻辑回归 用来表示神经网络 它是如何进行预测的,也知道了,损失函数用来衡量单一训练集的效果,也就是神经网络到底预测的准不准的问题,而从成本函数用于衡量参数 w 和 b 的效果,在全部的训练集上来衡量 。
在这里插入图片描述
 而且,我们在前面的文章中,其实我们可以发现,参数 w 和 b 貌似是不可获取的两个值,预测的结果是否准确,主要是由 w 和 b 决定的,因为在上面的公式中, 输入x 和 实际结果 y 都是固定的,只有w 和 b 是可以动态变化的。所谓的“学习”或者叫做是"训练神经网络", 就是找到一组 w 和 b,使得损失函数的值最小(损失函数值越小,预测结果就越准确),那么在神经网络中,就是通过梯度下降算法来寻找最优的w 和 b 的。

在这里插入图片描述

  上面的图,就是关于损失函数J 的形状,我们将 下面的两个轴定为 w 轴 和 b 轴, 那么在这里来看,w 和 b 会是一个实数值(这里方便大家理解),但是实际上,w 可以是一个更高维的表达形式,比如说矩阵。如图所示,损失函数J 的图像一个向下凸的图像(所以也称为凸函数),我们选择J函数作为损失函数也正是因为它是一个凸函数,因为我们从图中来看,我们在任意点对 w 和 b 进行初始化,那么通过梯度下降算法,这个值会不断向下更新,直到 w 和 b的值到达函数的最低端(这个最低端,我们称之为 全局最优值)这个位置就代表 神经网络找到了最合适的 w 和 b 的值。

 这里有同学就会问,为什么选择凸函数呢,下面的这个简略非凸函数的图像。在这里插入图片描述
 我们就会发现,这样的非凸函数里,局部最优占据大部分,而且 梯度下降算法找的全局最优,所以单一的凸函数是最有效的,且最直接的。

在这里插入图片描述

 我们从二维平面上来看这个函数,方便大家理解,这里的J 函数只有一个参数 w (我们先忽略 b 的存在),且 w 是一个实数值。那么梯度下降算法其实就是重复操作: w ′ = w − r ∗ d J ( w ) d w w' = w - r * \frac{d{J(w)}}{d{w}} w=wrdwdJ(w) 这个公式来不停的更新 w w w 的值, r r r 用来表示学习率,更加贴切的说法是学习步长, 而 d J ( w ) d w \frac{d{J(w)}}{d{w}} dwdJ(w)是对参数 w w w 的更新 或者变化量,简化后的公式就表示为:

w ′ = w − r ∗ d w w' = w - r * d{w} w=wrdw

 结合上图中的函数图像,起初 w w w 是在初始位置,我们不要忘记导数的含义是函数在这个点的斜率,斜率 = 当前点所在的 高 / 宽 高/宽 / ,在当前点相切于 J ( w ) J(w) J(w)的一个小三角形,如图所示在最低点的右侧,导数是正的,此时, 新 w w w 的值 等于 旧 w w w 的值 -学习率 r r r d J ( w ) d w \frac{d{J(w)}}{d{w}} dwdJ(w) 求导的值。正因为导数为正,旧的值减去一个正数,那么 w w w 就会不断减小 ,在图像上就会不断向左移动,趋于最低点。相反,如果将 w w w 初始化在最低点的左侧,导数就是负的,那么 w w w 就会不断增加 ,在图像上就会不断向右移动,趋于最低点。 相当于 d w dw dw 导数的正负决定了, w w w 的移动方向。

w ′ = w − r ∗ ∂ J ( w , b ) ∂ w w' = w - r * \frac{\partial{J(w,b)}}{\partial{w}} w=wrwJ(w,b)
b ′ = b − r ∗ ∂ J ( w , b ) ∂ b b' = b - r * \frac{\partial{J(w,b)}}{\partial{b}} b=brbJ(w,b)

 那么其实在原本 J ( w , b ) J(w,b) J(w,b) 是一个含有 w w w b b b 的函数,也就是说这个函数有两个自变量,在这种情况下,梯度下降的内循环就是上面的两个公式了。

 有人会说,那我每次都使 w w w 改变很多,那么就会更快的到达 J ( w , b ) J(w,b) J(w,b) 的最小值处,此时 r r r 学习率(学习步长)就要起作用了,因为如果你每次让 w w w改变太多,那么可能会错过了J的最小值处,例如上图中你可能会从 w w w的初始位置直接到了绿色小三角的位置(跳过了J的最小值处),之后你会左右来回跳,永远到不了J的最小值处,用它来控制 w w w 改变的步进,所以选择一个正确的学习率很重要。选错了,那么你的神经网络可能会永远找不到损失函数的最小值处,即你的神经网络预测得永远不会很准。

  • 13
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值