![PyTorch深度学习应用实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/410/52842410/b_52842410.jpg)
2-3 神经网络
有了以上的基础后,我们就可以进一步探讨神经网络(Neural Network)如何求解,这是进入深度学习领域非常重要的概念。
2-3-1 神经网络概念
神经网络是深度学习最重要的算法,它主要是模仿生物神经网络的传导系统,希望通过层层解析,归纳出预测的结果。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P25_2044.jpg?sign=1739216680-qgOYBacukHeUu3m1Ec424irhJy0MRV4M-0-a357d8408bd02d974af2f146b0a0805e)
图2.3 生物神经网络的传导系统
生物神经网络中表层的神经元接收到外界信号,归纳分析后,再通过神经末梢,将分析结果传给下一层的每个神经元,下一层神经元进行相同的动作,再往后传导,最后传至大脑,大脑做出最后的判断与反应。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P25_25762.jpg?sign=1739216680-DoAP7HEgCyEBOSZBZMhkCnhpc3rp7NHT-0-207b5febe445bdb66fd6624b5f87a61e)
图2.4 神经元结构
于是,AI科学家将上述生物神经网络简化成下列的网络结构。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P25_2093.jpg?sign=1739216680-e6iFH6sb2iWVsNDpKkmjkgyyt791Fm4x-0-88a283b4828d7c2c06a1cccd262b60f5)
图2.5 AI神经网络
AI神经网络最简单的连接方式称为完全连接(Full Connected, FC),亦即每个一神经元均连接至下一层的每个神经元,因此,我们可以把第二层以后的神经元均视为一条回归线的y,它的特征变量(x)就是前一层的每一个神经元,例如下面的y1、z1两条回归线。
y1=w1x1+w2x2+w3x3+b
z1=w1y1+w2y2+w3y3+b
所以,简单讲,一个神经网络可视为多条回归线组合而成的模型。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P26_25770.jpg?sign=1739216680-3b8ByFXPtCjrZ6s4FT8PTFmCYmZ1uRw9-0-cad2dfd685afa3117858e40b6cf4fc0c)
图2.6 一个神经网络可视为多条回归线组合而成的模型
以上的回归线是线性的,为了支持更通用性的解决方案(Generic Solution),模型还会乘上一个非线性的函数,称为激励函数(Activation Function),期望也能解决非线性的问题,如下图所示。由于中译名称“激励函数”并不能明确表达其原意,故以下直接以英文Activation Function表示。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P26_25771.jpg?sign=1739216680-a7SeEGk7NfwlhQXDVIHkEQrhuUSWFBsy-0-1a33d66225a264392e7b20e31d67c5b2)
图2.7 激励函数(Activation Function)
如果不考虑Activation Function,每一条线性回归线的权重(Weight)及偏差(Bias)可以通过最小平方法(OLS)求解,但乘上非线性的Activation Function,就比较难用单纯的数学公式求解了,因此,学者就利用优化(Optimization)理论,针对权重、偏差各参数分别偏微分,沿着切线(即梯度)逐步逼近,找到最佳解,这种算法就称为“梯度下降法” (Gradient Descent)。
有一个很好的比喻来形容这个求解过程:当我们在山顶时,不知道下山的路,于是,就沿路往下走,遇到叉路时,就选择坡度最大的叉路走,直到抵达平地为止。所以梯度下降法利用偏微分(Partial Differential)求解斜率,沿斜率的方向,一步步往下走,逼近最佳解,直到损失函数没有显著改善为止,这时我们就认为已经找到最佳解了。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P27_2246.jpg?sign=1739216680-V9trDXz0zAiURCvq4IH84SwSe2VrYqvg-0-4c48b65d4d1b17753a8af2f16dfaf4be)
图2.8 梯度下降法(Gradient Descent)示意图
2-3-2 梯度下降法
梯度其实就是斜率,单变量回归线的权重称为斜率,对于多变量回归线,须个别作偏微分求取权重值,就称为梯度。以下,先针对单变量求解,示范如何使用梯度下降法(Gradient Descent)求最小值。
范例1.假定损失函数f(x)=x2,而非MSE,请使用梯度下降法求最小值。
注意,损失函数又称为目标函数或成本函数,在神经网络相关文献中大多称为损失函数,本书将统一以“损失函数”取代“目标函数”。
下列程序代码请参考【02_02_梯度下降法.ipynb】。
(1)定义函数(func)及其导数(dfunc)。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P27_2251.jpg?sign=1739216680-GVMxpfldjzBpEQecD7h5fi4VG9iOmoiw-0-27493497dbdcda4e9a388d4da5285b4d)
(2)定义梯度下降法函数,反复更新x,更新的公式如下,后面章节我们会推算公式的由来。
新的x=目前的x-学习率(learning_rate)*梯度(gradient)
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P27_2258.jpg?sign=1739216680-omUFrB5VuM0zW55lo0v7Jhd4ZZNYkHyo-0-6c52d739925230984cf5e2a21801c789)
(3)设定起始点、学习率(lr)、执行周期数(epochs)等参数后,调用梯度下降法求解。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P28_2278.jpg?sign=1739216680-sA8cnI8txoORFJxpDQlIu8zSxRsATSrA-0-6824b8f292715d2214d0d2dfe17798f7)
执行结果:
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P28_2285.jpg?sign=1739216680-WuAXwo3p9mGM4fzwEmec02IWFQldGebS-0-dfae6d2843cdba08b5dce4cd7eff062c)
每一执行周期的损失函数如下,随着x变化,损失函数逐渐收敛,即前后周期的损失函数差异逐渐缩小,最后当x=0时,损失函数f(x)等于0,为函数的最小值,与最小平方法(OLS)的计算结果相同。
[5.2, 0.8, 0.32, 0.13, 0.05, 0.02, 0.01, 0, 0, 0, 0, 0, 0, 0, 0]
如果改变起始点(x_start)为其他值,例如-5,依然可以找到相同的最小值。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P28_2288.jpg?sign=1739216680-G0zdwDIlI3O0DQJKGUhmEcNVcRHdvUT2-0-91e5451ba1afa3be6dddeab5de0f93c9)
范例2.假定损失函数f(x)=2x4−3x2++2x −20,请使用梯度下降法求取最小值。
(1)定义函数及其微分。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P29_2307.jpg?sign=1739216680-gQwlE3Ud9UWPDLTSutzOJmUyJfg5qQFs-0-44cedafb630f07a55b262444bde1064f)
(2)绘制损失函数。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P29_2314.jpg?sign=1739216680-5IetOO4BcWnMKxamZc6E9XGsMo1wP76g-0-7cad345b0525c564104d455566195532)
执行结果:
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P29_2317.jpg?sign=1739216680-UJzLty6NBK8XlDc3wUUxc4k9ezQRuqm5-0-8efca813ea88174d5f48321527bc1009)
梯度下降法函数(GD)不变,执行程序,如果学习率不变(lr=0.3),会出现错误信息:Result too large,原因是学习率过大,梯度下降过程错过最小值,往函数左方逼近,造成损失函数值越来越大,最后导致溢出。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P29_2320.jpg?sign=1739216680-mmkwSU5KMHnbOBO41iTGT2ILR90fDekT-0-f199b52c354d9956f66f80c8f57a2aa8)
修改学习率(lr=0.001),同时增加执行周期数(epochs=15000),避免还未逼近到最小值,就提早结束。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P30_2340.jpg?sign=1739216680-UG0tSOux7W6vmSwsp8FY0F5x1sdGAl4q-0-61292057da21fa03df039448f8de93c6)
执行结果:当x=0.51时,函数有最小值。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P30_2347.jpg?sign=1739216680-mz8A2yp84Q4n3Iri7Gtj9YATkx4Pwphe-0-7453750e090369603490f4cb51ac3a84)
观察上述范例,不管函数为何,我们以相同的梯度下降法(GD函数)都能够找到函数最小值,最重要的关键是“x的更新公式”:
新的x=目前的x-学习率(learning_rate)*梯度(gradient)
接着我们会说明此公式的由来,也就是神经网络求解的精华所在。
2-3-3 神经网络权重求解
神经网络权重求解是一个正向传导与反向传导反复执行的过程,如下图所示。
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P30_25781.jpg?sign=1739216680-S3sbv2d9IEXQbbDIO146W0solwkn2pwd-0-7eaf3069887b146a5db78c4199bb1d19)
图2.9 神经网络权重求解过程
(1)由于神经网络是多条回归线的组合,建立模型的主要任务就是计算出每条回归线的权重(w)与偏差(b)。
(2)依上述范例的逻辑,一开始我们指定w、b为任意值,建立回归方程式y=wx+b,将特征值(x)代入方程式,可以求得预测值,进而计算出损失函数,例如MSE,这个过程称为正向传导(Forward Propagation)。
(3)通过最小化MSE的目标和偏微分,可以找到更好的w、b,并依学习率来更新每一层神经网络的w、b,此过程称为反向传导(Back Propagation)。这部分可以由微分的连锁率(Chain Rule),一次逆算出每一层神经元对应的w、b,公式为:
Wt+1=Wt-学习率(learning rate)*梯度(gradient)
其中:
![](https://epubservercos.yuewen.com/128DEE/31397898903670606/epubprivate/OEBPS/Images/Figure-P31_25790.jpg?sign=1739216680-FhYNr57jI8XOgjmeIy64zefIo7cVWU1R-0-d2a3748a1dfa63dd7cb6ac28023440aa)
学习率是优化器事先设定的固定值或动能函数。
(4)重复(2)、(3)步骤,一直到损失函数不再有明显改善为止。
梯度(gradient)公式证明如下:
(1)损失函数,因n为常数,故仅考虑分子,即SSE。
(2)
(3)以矩阵表示,SSE=y2−2ywx+w2x2
(4)
(5)同理,
(6)为了简化公式,常把系数2拿掉。
(7)最后公式为:
调整后权重=原权重+ (学习率*梯度)
(8)有些文章将梯度负号拿掉,公式就修正为:
调整后权重=原权重 - (学习率*梯度)。
以上是以MSE为损失函数时的梯度计算公式,若使用其他损失函数,梯度计算结果也会有所不同,如果再加上Activation Function,梯度公式计算就更加复杂了。还好,深度学习框架均提供自动微分(Automatic Differentiation)、计算梯度的功能,我们就不用烦恼了。后续有些算法会自定义损失函数,因而产生意想不到的功能,例如风格转换(Style Transfer)可以合成两张图像,生成对抗网络(Generative Adversarial Network, GAN),产生几可乱真的图像。也因为如此关键,我们才花费了这么多的篇幅铺陈“梯度下降法”。
基础原理介绍到此,下一章,我们就以PyTorch实现自动微分、梯度下降、神经网络层,进而构建各种算法及相关的应用。