神经网络三个基础问题
通过三个基础问题引入神经网络非常基础且重要的三个函数。
神经网络如何预测的?
神经网络通过逻辑回归函数进行预测,又成预测算法。
逻辑回归函数
神经网络的预测过程的公式为,表示将和进行向量相乘。b表示阈值[yù zhí],用来影响预测结果。逻辑回归函数中,神经网络预测的是否准确就由和决定。
⚠️这里的实际上应该是转置矩阵
举三个小例子来理解一下这个公式⬇️
- 假设周末即将到来,你听说在你的城市将会有一个音乐节。我们要预测你是否会决定去参加。音乐节离地铁挺远,而且你女朋友想让你陪她宅在家里搞事情,但是天气预报说音乐节那天天气特别好。也就是说有3个因素会影响你的决定,这3个因素就可以看作是3个输入特征。那你到底会不会去呢?你的个人喜好——你对上面3个因素的重视程度——会影响你的决定。这3个重视程度就是3个权重。
- 预测图片里有没有猫也是通过上面的公式。经过训练的神经网络会得到一组与猫相关的权重。当我们把一张图片输入到神经网络中,图片数据会与这组权重以及阈值进行运算,结果大于0就是有猫,小于0就是没有猫。
- 很多网站都会记录下你平时的浏览喜好,然后把它们作为权重套入到上面的公式来预测你会购买什么。
激活函数——以sigmoid函数为例
在实际的神经网络中,我们不能直接用逻辑回归。必须要在逻辑回归外面再套上一个激活函数。激活函数非常非常重要,如果没有激活函数那么神经网络的智商永远高不起来。
激活函数又分好多种,目前只给大家简单介绍一种叫做sigmoid的激活函数。
其公式为$\sigma (z)=\frac{1}{1+e^{-z}} $,图像如下:
先只介绍它的一个用途——把z映射到[0,1]之间,方便理解预测结果。上图中的横坐标是z,纵坐标我们用y’来表示,y’就代表了我们最终的预测结果。从图像可以看出,z越大那么y’就越靠近1,z越小那么y’就越靠近0。那为什么要把预测结果映射到[0,1]之间呢?因为这样不仅便于神经网络进行计算,也便于我们人类进行理解。例如在预测是否有猫的例子中,如果y’是0.8,就说明有80%的概率是有猫的。
预测结果
逻辑回归函数和激活函数结合使用,结合上述,预测结果公式如下:
$\begin{cases}z{(i)}=dot(w{T},x^{(i)})+b&\ \sigma (z{(i)})=\frac{1}{1+e{-z^{(i)}}} &\ \hat{y}^{(i)} =\sigma (w{T}x{(i)}+b)&{}\end{cases} $
其中==$\hat{y}^{(i)} x^{(i)}$的预测结果==。
神经网络预测的准确吗
只有能够判断预测的是否准确,才能不断改进、优化算法。神经网络中==损失函数(loss function)负责判断预测是否准确==。损失函数是机器学习中最为基础、最为重要的一环。
损失函数的作用
损失函数有很多种,但其作用都是用来衡量模型模型预测的好坏,通俗来讲就是尽可能用一个合理的公式来体现预测与实际数据的差距程度。
换一种学术点的说法,就是衡量两个分布之间的距离,一个分布是原始分布、正确的分布(ground truth),而另一个分布是预测的分布、模型拟合的分布(prediction)。
理解损失函数能够对后续优化工具(梯度下降等)进行分析和理解。损失函数需要具体问题具体分析,很多时候最难的地方就是如何写出复杂的损失函数。
损失函数举例
结合初中学过的方差,最容易想到的一个差平方的损失函数公式如下:
其中==表示对训练样本对预测结果,表示实际结果==,这个类似方差的差平方公式非常好理解,二者的差越小,说明预测的越精准,结果也就越小。但实际上这个公式并不能使用。
实践中我们可能使用的一个损失函数如下:
$L(\hat{y}^{(i)} ,y^{(i)})=-\left( y^{(i)}log\left( \hat{y}^{(i)} \right) +(1-y^{(i)})log\left( \hat{y}^{(i)} \right) \right) $
具体这样做的数学细节我们暂且不考虑,但他们的目的是一样的。
成本函数
针对整个训练集的损失函数称为成本函数(cost function),公式如下:
$J(w,b)=\frac{1}{m} \sum^{m}{i=1} L(\hat{y}^{(i)} ,y^{(i)})=\frac{1}{m} \sum^{m}{i=1} \left( y^{(i)}log\left( \hat{y}^{(i)} \right) +(1-y^{(i)})log\left( \hat{y}^{(i)} \right) \right) $
该公式其实就是对每个训练集的损失函数进行累加并求平均值,计算结果越大,说明成本越大,即预测越不准确。
神经网络如何学习
解决了神经网络如何预测、预测的是否准确后,下一步自然就是神经网络如何学习,即如何让自己的预测变得越来越准确。
损失函数的意义
前文所述,神经网络预测的是否准确,由和决定,那么==“学习”也就是找到合适的和==,梯度下降算法(gradient descent)就可以实现这个过程。梯度下降算法会逐步地改变和的值,使得新的和逐步让损失函数的值越来越小,从而最终达到预测更加精准的目的。
我们来总体回顾一下之前学过的公式:
$\begin{cases} \hat{y}^{(i)} =\sigma (w{T}x{(i)}+b)&\ \sigma (z{(i)})=\frac{1}{1+e{-z^{(i)}}} &\ J(w,b)=\frac{1}{m} \sum^{m}{i=1} L(\hat{y}^{(i)} ,y^{(i)})=\frac{1}{m} \sum^{m}{i=1} \left( y^{(i)}log\left( \hat{y}^{(i)} \right) +(1-y^{(i)})log\left( \hat{y}^{(i)} \right) \right) &{} \end{cases} $
其中输入的训练集和输出的实际结果都是固定的,所以损失函数可以理解为一个关于和的函数。"学习"也就是找到最合适的和,使得损失函数最小,即结果最精准。
⬆️损失函数的数学意义
损失函数的图像如下:
可见损失函数实际上就像一个漏斗一样(凸函数),而我们的目的也就是是的找到那个“漏斗底部”的和(极值),使得最小。
梯度下降的原理
梯度下降算法通过梯度下降,逐步更新和使得逐步逼近最小值,过程如下:
为方便理解,我们先假设损失函数只有一个参数且是一个实数(实际上是一个向量),我们通过下列公式改变的值:
是新的的值,是损失函数关于的偏导数,即关于的斜率。是一个参数用来表示学习率(learning rate)。
⬇️数学意义
由于是一个凸函数,即单调函数,所以其关于的偏导数一定大于0,且单调性与保持一致,值还一定比小,我们就可以利用其这些数学特性来使得它逐步减小逼近的极值,用来调节速率,当过大时也有可能变为负值,此时就说明“学习过头了”。如果不合适,的值可能一直在最小值附近来回跳。所以说找到一个合适的的值对梯度下降非常重要。
⬆️看不懂去翻翻高数课本,凸函数的性质。由此可见为什么说算法岗都是调参侠,因为参数太重要了。