第一章 神经网络基础知识

第一章学习神经网络的前置知识

1. 模型构建

  • 介绍

    神经元:神经元细胞可以分为三个部分,输入,中间节点,和输出。输入和输出在生物体内都是化学物质或者是电信号,给神经元一个或多个输入,可以被中间部分处理,最后获得输出。对于这样模拟的一个简化的神经元模型,在计算机中就叫感知器。
    输入可以是X1,X2,X3,输出为Y,这时候中间过程可以是一个函数,比如:线性函数Z=X1W1+X2W2+X3W3,其中W1,W2,W3便是X1,X2,X3的权值。这时候可以加一个偏置数b,使之不过原点,Z=X1W1+X2W2+X3W3+b。还可以进一步变成f(Z),使之成为一个非线性函数,这样就可以把解决问题的邻域扩展至全部区域。f(Z)展开为:y=f(x1w1+x2w2+x3w3+b)y=f(x_1w_1+x_2w_2+x_3w_3+b)y=f(x1w1+x2w2+x3w3+b)

2. 模型训练

  • 2.1介绍

    模型训练好以后,最重要的就是如何让模型如何自主训练,来解决一些非线性问题,这个过程也叫做机器学习的过程。

  • 2.2数学期望

    在知道如何训练模型之前,我们需要知道什么是数学期望。什么是期望呢?在概率论和统计学中,数学期望(mathematic expectation [4] )(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。通常用E(X)表示数学期望。

    离散型随机变量X的取值为X1,X2,X3...XnX_1,X_2,X_3...X_nX1,X2,X3...Xn,且p(X1),p(X2),p(X3)...p(Xn)p(X_1),p(X_2),p(X_3)...p(X_n)p(X1),p(X2),p(X3)...p(Xn)为X对应取值的概率,可理解为数据X1,X2,X3...XnX_1,X_2,X_3...X_nX1,X2,X3...Xn出现的频率f(Xi)f(X_i)f(Xi),则:
    E(X)=∑k=1n E(X)=\sum\limits_{k=1}^n E(X)=k=1n
    设连续性随机变量X的概率密度函数为f(x),若积分绝对收敛,则该数据的数学期望为,也就是每一点的值和其概率乘积的积分:
    E(X)=∫−∞+∞xf(x)dx E(X)=\int_{-\infty}^{+\infty}xf(x)dx E(X)=+xf(x)dx

    在了解什么是数学期望以后,我们可以开始学习如果进行误差的计算。

  • 2.3计算误差

    模型的训练很重要的一点就是误差的计算,如果我们把误差的期望输出记为y^\hat{y}y^。那么真实的值减去期望,再求绝对值,就可以代表我们运算结果和真实结果的偏离程度叫做误差,记为e,这样写e=∣y−y^∣e=|y-\hat{y}|e=yy^.但是这样的公式太简单,它对数据不敏感,不能很好的表现出数据的变化导致的误差变化,我们希望哪怕误差只减低了一点点也可以快速的表现出来,于是出现了均方误差计算公式e=12(y^−y)2e=\frac{1}{2}(\hat{y}-y)^2e=21(y^y)2,这样如果误差小于1,则会变得更小,误差大于一,没变大一点都会变得更大,同时,为了防止平方导致本来误差没有那么大,但是显得很大,所以加上一个12\frac{1}{2}21来进行平衡。当然,这样也不能完全平衡,所以目前主要使用交叉熵的公式,不需要费力理解,背下来即可,后面的内容中可能会对其进行描述,公式如下:
    e=−y^logy−(1−y^)log(1−y) e=-\hat{y}logy-(1-\hat{y})log(1-y) e=y^logy(1y^)log(1y)

    2.4学习规则
    在知道误差计算的方法以后,就可以根据误差计算的方法,制定一个学习规则,让计算机可以自动的去寻找一个使得误差最小的答案。规则可以是多种多样的,有效即可,这里我们介绍一个简单的规则,叫做反向传播误差的方法。

    反向传播误差,首先需要根据前面学到的这两个公式:
    (1)y=f(x1w1+x2w2+x3w3+b)y=f(x_1w_1+x_2w_2+x_3w_3+b)y=f(x1w1+x2w2+x3w3+b)
    (2)e=−y^logy−(1−y^)log(1−y)e=-\hat{y}logy-(1-\hat{y})log(1-y)e=y^logy(1y^)log(1y)
    知道其实e也是关于x的函数,但是我们的关键是目前已经知道一些x的值,所以需要得到确定的y的值,y越接近y^\hat{y}y^越好,所以现在把已知的x带进去,权值w就成了未知数,于是可以推出计算误差的导数:
    ew′=dedw e_w' = \frac{de}{dw} ew=dwde
    求导的方法就是正常的复合函数求导法,e对y求导之后y对w求导。在我们得到ew′e_w'ew的值以后,就可以根据ew′e_w'ew的值去调整权值w的大小,从而让误差越来越小。
    调整的思路是这样的,我们引入一个称为学习率的参数,记为α\alphaα,学习率的范围是(0~1),它可以控制权值的变化大学,从而影响模型学习的速度和精度,如果α\alphaα很小,那学习的速度就会更慢,但是得到的精度可能就会更高,因为是一点点逐渐变换的,反之学习速度会很快,但是可能会错过全局最优点,导致学习精度不高。因为我们要的是误差e越小越好,那么ew′e_w'ew如果大于0,则是单调递增,所以要变小就需要减小w的值,如果ew′e_w'ew小于0,则说明这是一个单调递减的函数,所以要变小它的值,要让w增大,于是可以想到公式 Δw=αew′\Delta w =\alpha e_w'Δw=αew,可以代表权值的变化,Δw\Delta wΔw可以随着学习率的变化而变大变小,同时,还可以同时跟随ew′e_w'ew的符号变化,所以可以得出权值的变化公式为:
    wnew=wpre−Δww_{new} = w_{pre} - \Delta wwnew=wpreΔw这里new的下标代表是新的,pre代表是先前的。
    当然,可以看到上面的公式(1)里面不仅仅只有w,还有一个偏置数b,这个b的变化可以参考上面说的,和w一样的变化,先对e求b的偏导得到eb′e_b'eb,之后就是一样的:
    第一步: eb′=dedbe_b' = \frac{de}{db}eb=dbde 第二步:Δb=αeb′\Delta b =\alpha e_b'Δb=αeb 第三步得到偏置数的变化公式:bnew=bpre−Δbb_{new}=b_{pre}-\Delta bbnew=bpreΔb
    我们只需要不断的进行上述的循环,到了Δw\Delta wΔwΔb\Delta bΔb几乎为0的时候,就找到了使得误差最小的公式,你也可以设置一个你期望的误差值,到了这个误差值就结束循环。
    同时,需要注意的是,因为权值有三个w1,w2,w3w_1,w_2,w_3w1,w2w3,所以我们在训练的时候也需要分别求出Δw1,Δw2,Δw3\Delta w_1,\Delta w_2,\Delta w_3Δw1,Δw2,Δw3,之后分别计算出w1new,w2new,w3neww_{1new},w_{2new},w_{3new}w1new,w2new,w3new

    总结一下,感知器模型的学习规则如下
    (1)计算误差对w和b的偏导数ew′e_w'eweb′e_b'eb;
    (2)设置一个学习率α\alphaα,并计算出w和b的变化量Δw\Delta wΔwΔb\Delta bΔb;
    (3)计算出改变后的新权值和新偏置数wneww_{new}wnewbnewb_{new}bnew;
    (5)不断重复以上操作,直到误差小到符合标准。

3. 激活函数

** 3.1 介绍**

在第一部分模型构建那里的公式y=f(x1w1+x2w2+x3w3+b)y=f(x_1w_1+x_2w_2+x_3w_3+b)y=f(x1w1+x2w2+x3w3+b),我们只说f(.)是一个非线性的函数,并没有说它是什么样子的。因为我们一开始仅有输入的x1,x2,x3x_1,x_2,x_3x1,x2,x3和数学期望y^\hat{y}y^,我们为了得到w和b,那我们就要先把公式y=f(x)写出来,只有f(x)确定了我们的工作才可以进行,所以,我们把这个公式f(x)称之为激活函数。当然,非线性函数的种类是无穷多的,要选择哪些来作为我们的激活函数,就是下面的内容。要记得,虽然真正符合这几个输入和输出的激活函数可能是千奇百怪的,但是f(z)的图像也不是向激活函数原本的图形那样规则的,因为它是复合函数,所以,这个f(z)在w和b的调整下,总是可以向着其原本图像的样子去逼近,从而得到一个可以接受的近似结果,这也就是选择任意的激活函数都有可能起作用的原因,差别只是逼近的好和坏而已,如果没有明确的可选的方法,那不如把各种激活函数都试试,看看谁更好。下面,我们将介绍三种常用的激活函数。

3.2 Sigmoid函数
Sigmoid函数的值域是(0,1),所以也经常被用于归一化操作,它的公式和图像如下:
f(z)=11+e−zf(z)=\frac{1}{1+e^{-z}}f(z)=1+ez1Sigmode函数,图片来自百度侵权请联系15125216546
该函数的好处是:可以把定义域在(+∞,−∞)(+\infty,-\infty)(+,)上的函数映射到(0,1)区间,这样y的值不会超过1,大大减少了计算负担,并且它结构简单,易于求导,所以是最早的激活函数。
ps:你把分子从1改成x,其输出范围就可以变成(0,x)
其结构简单的原因通过其求导就很容易证明:
f(z)′=(11+e−z)′=e−z(1+e−z)2=f(z)(1−f(z))f(z)'=(\frac{1}{1+e^{-z}})'=\frac{e^{-z}}{(1+e^{-z})^2}=f(z)(1-f(z))f(z)=(1+ez1)=(1+ez)2ez=f(z)(1f(z))
从其结果可知,在写程序时,如果激活函数是Sigmoid,那么根本就不需要真的进行求导计算,只需要进行加减法和乘法就行,效率大大提高

但是缺点是:当你的输入的值很大或很小时,函数的值会趋于0或者1,这样期望和输出几乎一样,难以判断,同时可以从图上看出,在这个时候,函数的梯度变化为0,这也叫做梯度消失现象,可能导致误差不会改变,误差求导也就不变,使得学习规则失效。

缺点的处理方法:控制输入,使之保持在不失效的范围,可以从图中看到,输入的在0附近的时候,梯度是不会消失的,可以利用好这一点进行处理。

3.3 Tanh函数
Tanh函数,中文是双曲正切函数,它是双曲正弦函数(sinh)与双曲余弦函数(cosh)的比值。它可以把输入是(−∞,+∞)(-\infty,+\infty)(,+)映射到(−1,1)(-1,1)(11),和Sigmoid相比,其优势在于可以输出负数,以下是Tanh函数的公式和图像(z=0z=0z=0时,f(z)=0f(z)=0f(z)=0,zzz趋于±∞\pm\infty±时,f(z)=±1f(z)=\pm1f(z)=±1)。
f(z)=ez−e−zez+e−z f(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}} f(z)=ez+ezezez图片来自网络,侵权请联系15125216546

对Tanh函数求导可得:
f(z)′=(ez−e−zez+e−z)′=4(ez+e−z)2=1−f(z)2 f(z)'=(\frac{e^z-e^{-z}}{e^z+e^{-z}})'=\frac{4}{(e^z+e^{-z})^2}=1-f(z)^2 f(z)=(ez+ezezez)=(ez+ez)24=1f(z)2
优点:可以看到,tanh函数和sigmoid函数一样,求导也具有简单的形式,并且它的范围要比sigmoid更广,并且在输入是0附近时,梯度下降更快,也就代表它在这里可以更快地逼近目标值。
缺点:比sigmoid要复杂一些,并且也具有梯度消失现象。

3.4 ReLU函数
正所谓大道至简,最高明的变化就是不变化,所以就出现了ReLU函数,也叫修正线性单元(Rectified Linear Unit)。它是一个分段函数,大于0时,值就是其本身,小于0时,值为0.单从分段来看它是线性函数,但是从整体来看,它又是非线性函数。其思路是一个非线性函数,不管它怎么扭,单从某一个区间来看,它还是一个线性函数,所以可以趋近于这个区间,在人工智能运用是,往往是多段ReLU的集合(因为输入X是有许多的,同一个位置的X1X_1X1也会有好多个,这么多ReLU足以组合成任意的复杂曲线。以下是ReLU的函数和图像:
f(z)={z,z>00,z≤0 f(z)=\left\{ \begin{aligned} z, \hspace{1cm}& z>0\\ 0, \hspace{1cm}& z\leq{0} \end{aligned} \right. f(z)={z0z>0z0
图片来自网络,侵权请联系1700098233@qq.com
ReLU函数是现在用得最多的激活函数,原因也很简单,因为它比前面两种都要简单,并且求导更简单:
f(x)’={1,z>00,z≤0 f(x)’=\left\{ \begin{aligned} 1, \hspace{1cm}&z>0\\ 0, \hspace{1cm}&z\leq{0} \end{aligned} \right. f(x)={1,0,z>0z0

可以见到,如果输入大于0,则输出恒为1并且永远不会出现梯度消失的情况,并且它的下降速度要比前面的sigmoid和Tanh函数要快,所以性能更好。但是缺点就是在输入小于0时,会出现梯度消失的情况,所以有了其变种公式Leaky ReLU函数,其公式和图像如下:
f(x)={z,z>0az,z≤0 f(x)=\left\{ \begin{aligned} z,\hspace{1cm} z>0\\ az,\hspace{1cm}z\leq{0} \end{aligned} \right. f(x)={z,z>0az,z0
图片来自网络,侵权请联系1700098233@qq.com
虽然LeakyReLU函数看着比ReLU函数更好,但是因为往往输入都不涉及到负数,所以用ReLU函数即可。

3.5总结
没有哪个激活函数是最好的这样的说法,主要看的是需求。Sigmoid函数主要用于解决回归问题,比如研究电线的粗细和上面的站的麻雀数量是否相关这样的问题。Tanh函数也可以用于回归问题,或者其他的一些问题,比较灵活。ReLU在解决分类问题上有着不错的效果(因为不是可以为0)。

4.损失函数

4.1 介绍
我们在最开始已经讨论过误差e的计算方法,每种误差的计算函数都叫做损失函数,记为JJJ,损失函数就等同于误差,它输出的值越小,网络就越精确。其实常见的损失函数就是我们一开始介绍的那三种计算误差的函数,我们来依次说明一下。

4.2 绝对值损失函数
在一开始,我们介绍的误差计算中e=∣y−y^∣e=|y-\hat{y}|e=yy^,这是在假设只有一组输入X=x1,x2,x3X={x_1,x_2,x_3}X=x1,x2,x3的情况下,但是实际上往往会有多组输入(记为m组)。于是,我们可以得出其损失函数为,全部的e加起来的平均值,称之为绝对值损失函数:
J(y,y^)=J(w,b)=1m∑i=1m∣yi−yi^∣m为样本的数量,yi为第i个样本的实际值,yi^为第i个样本的期望输出值 J(y,\hat{y})=J(w,b)=\frac{1}{m}\sum\limits_{i=1}^{m}|y_i-\hat{y_i}|\\ m为样本的数量,y_i为第i个样本的实际值,\hat{y_i}为第i个样本的期望输出值 J(y,y^)=J(w,b)=m1i=1myiyi^m为样本的数量,yi为第i个样本的实际值,yi^为第i个样本的期望输出值
因为,y^\hat{y}y^是一个常数,所以JJJ其实是一个关于yyy的函数,但是yyy又是关于w,bw,bw,b的二元函数,所以JJJ也是一个二元函数,所以它的图像是三维的,类似于一个倒着的锥子,找不到三维的图,我又不想画,只有二维的界面图,大家自行想象一下。
图片来自网络,侵权请联系1700098233@qq.com

训练的话就是找这个锥子的尖头。当然如果w的个数不为1,则它是一个多维函数,但是训练时也是找最低点。

4.3 均方差损失函数
我们可以根据上面的绝对值损失函数和前面计算误差的知识,猜到这个==均方差损失函数(Mean Square Eorr,MSE)==长什么样子:
J(y,y^)=1m.12.∑i=1m∣y−y^∣2 J(y,\hat{y}) = \frac{1}{m}.\frac{1}{2}.\sum\limits_{i=1}^m{|y-\hat{y}|}^2 J(y,y^)=m1.21.i=1myy^2
均方差损失,函数如果w只有一个,则它的图形也是一个三维的图像,要比绝对值损失函数,恰好像一个正着放的碗,所以也叫做碗函数,太难画了,我就不画了,找了一个横截面,自行想象。
图片来自网络,侵权请联系1700098233@qq.com
但是,如果w不仅仅只有一个,那它也就成了多维函数,这时候就有一个上面没有提到的问题,它可能有多个最低点,可以画一个平面图说明:
我自己画的,不侵权了
可以看到,它的有许多个”最低点“,里面最低的点叫做全局最优点,其他叫做局部最优点。有时候数据不够或者其他的,会陷入局部最优点里面出不来(因为该点两边的梯度符号相反,会让电脑认为找到了最优点)。但是,不需要担心,因为多数情况下,局部最优点的误差也是在人们可以接受的范围内,它输出的值和用全局最优的输出的值差距不大,所以模型也可以很好的工作。如果误差真的很大,可以考虑改变初始参数,重新训练一下试试。

4.4 交叉熵损失函数
我们可以先回忆一下之前的交叉熵误差公式e=−y^logy−(1−y^)log(1−y)e=-\hat{y}logy-(1-\hat{y})log(1-y)e=y^logy(1y^)log(1y),我们可以发现,如果规定了y^\hat{y}y^的值为0或者是1,那么这个函数完全可以变成一个分段函数,我们称其为Cost函数。
e={−logy,y^=1−log(1−y),y^=0 e=\left\{ \begin{aligned} -logy,\hspace{1cm}\hat{y}=1\\ -log(1-y),\hspace{0.12cm}\hat{y}=0 \end{aligned} \right. e={logy,y^=1log(1y),y^=0
于是可以这样表述交叉熵损失函数的公式:
J(y,y^)=J(w,b)=1m∑i=1mCost(yi,yi^) J(y,\hat{y})=J(w,b)=\frac{1}{m}\sum\limits_{i=1}^mCost(y_i,\hat{y_i}) J(y,y^)=J(w,b)=m1i=1mCost(yi,yi^)
∑i=1mCost(yi,yi^)={ −log(yi),yi^=1−log(1−yi),yi^=0 \sum\limits_{i=1}^m Cost(y_i,\hat{y_i})=\left\{\ \begin{aligned} -log(y_i),\hspace{1cm} \hat{y_i}=1\\ -log(1-y_i),\hspace{0.45cm}\hat{y_i}=0 \end{aligned} \right. i=1mCost(yi,yi^)={ log(yi),yi^=1log(1yi),yi^=0
其实稍加分析,我们就会发现,y的值也被限定在(0,1)之间,那什么样的z会是0,1呢,那就只有分类,是就是1,不是就是0。因为交叉熵函数的的输出y是固定的,所以其实它不会存在局部最优的问题,顾常常用于分类问题,以后遇到分类问题就想到交叉熵损失函数即可
最后,其实用一开始的公式来表达交叉熵损失函数也可以,这样就不用分段了,求导也不用分开:
J(yi,yi^)=J(w,b)=1m.−yi^log(yi)−(1−yi^)log(1−yi)=−1m.yi^log(yi)+(1−yi^)log(1−yi)J(y_i,\hat{y_i})=J(w,b)=\frac{1}{m}.-\hat{y_i}log(y_i)-(1-\hat{y_i})log(1-y_i)=\\-\frac{1}{m}.\hat{y_i}log(y_i)+(1-\hat{y_i})log(1-y_i)J(yi,yi^)=J(w,b)=m1.yi^log(yi)(1yi^)log(1yi)=m1.yi^log(yi)+(1yi^)log(1yi)

4.5 总结
神经网络解决的问题其实可以分为两种,一种回归,一种分类,回归问题用绝对值损失函数或者是均方差损失函数解决,分类问题用交叉熵损失函数解决,当然,具体问题可以具体分析。

5.本章总结

在本章,我们学习了一个简单的感知器模型长什么样子,学习了误差的计算方法,从而学会了如果设计简单的感知器模型。之后我们学习了三个激活函数,分别是Sigmoid函数,Tanh函数和ReLU函数,它其实都是非线性函数,用于把输入扩展到非线性领域。还学习了损失函数,也是三个,分别是绝对值损失函数,均方差损失函数,交叉熵损失函数,它们其实就是误差的计算方法,代表着误差。解决回归问题主要用Sigmoid函数或者是Tanh函数作为激活函数,绝对值函数或者均方差函数作为损失函数;解决分类问题用ReLU函数作为激活函数,用交叉熵函数作为损失函数效果更好。
在下一章,我们开始学习如何搭建单层的神经网络。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值