| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> [深度学习][5] 前馈神经网络与反向传播 以及TensorFlow2.0实现 -> 正文阅读 |
|
[人工智能][深度学习][5] 前馈神经网络与反向传播 以及TensorFlow2.0实现 |
文章目录1 前馈神经网络及其产生动机1.1 问题的产生前馈神经网络(feedforward neural network)也称作深度前馈网络(deep feedforward network)或者多层感知机(multilayer perceptron MLP),是一种典型的机器学习模型。
来到一个具体典型的例子,例如多元线性回归模型,我们使用矩阵w作为映射矩阵,向量b作为偏置向量来描述输入与输出的关系,使用拟合值和实际值的均方误差MSE作为损失函数,采用梯度下降(其实是一步到位了,没有下降的过程)进行优化。 1.2 前馈神经网络的模型描述前馈神经网络中,我们使用非线性的复合函数去完成函数拟合,像这样
现在你可能会疑惑,包括为什么要这样定义每一层的映射,包括整个神经网络具体的函数递推式是怎样的,现在我希望从形象的角度阐述这个数学关系: 这里需要着重强调的是,激活函数的作用是为了给函数拟合网络添加非线性组成部分,某种程度上确实受到了神经科学的一点影响,但可以肯定的是神经网络的发展与生物神经科学以及人脑几乎没有什么关系,几乎完全依靠数学推动,神经网络的发展也并不是为了完成对人脑的近似,至少目前的研究方向是这样。如果了解了原理,那么到目前你应该能够发现它相对于之前的经典机器学习方法,只不过是一种能够对超级多参数(每一层就能产生那么多参数呢)进行优化拟合的万能函数近似器,本质上没有很大不同。 事实上万能近似定理没有那么棒,我们只知道可能无限逼近,却不知道无限逼近的代价是多大的算力。过多的层数可能引起过拟合,过少的层数可能引起欠拟合,越庞大的神经网络也需要越长的时间去优化,并且优化结束后你得到的是层层嵌套的复杂复合函数,极其不够直观,导致拟合结果缺乏很好的可解释性。 现在我们了解了神经网络的拓扑结构与数学关系,那么还剩下一些遗留的细节问题
2 损失函数的选择大多数现代神经网络都会使用最大似然来进行训练,如果你对概率论的内容还有印象的话应该不难得到,对于给定的数据集data,关于参数
θ
\theta
θ的预测模型model应该使得数据集出现的概率最大,由于假定了数据的独立同分布,可以拆成独立的概率分布相乘,由于我们不喜欢相乘的形式,于是用ln函数拆分开: 2.1 均方误差(MSE)我们考虑model是一个正态分布的情况: 2.2 交叉熵(cross entropy)我们考虑model是一个多项分布的情况: 3 输出层的选择(首先,这一部分在《深度学习》一书上占用了不小的篇幅,内容也几乎就是围绕着直接输出/二值输出/多项输出,书中从数学原理上给出了很深层的解读,说实话我再怎么仔细阅读也没有办法体悟除了功能性以外的东西 ,有需要的读者建议直接阅读原书籍) 3.1 Sigmoid输出单元对于一个二分类问题,即输出结果我们只期望0或者1,我们希望拟合结果可以在输出层从实数域映射到[0,1]区间上,于是我们使用sigmoid函数作为输出层,这样的输出层显然是单个结点输出: 3.2 Softmax输出单元对于一个多分类问题,我们希望知道输出在众多可行分类中属于哪一种,那么期望结果应该类似于
y
=
[
0
,
?
?
,
1
,
?
?
,
0
]
y=[0,\cdots, 1, \cdots,0]
y=[0,?,1,?,0]这样,应该保证各分量和为1,且各个分量属于[0,1]区间,从具体意义上来讲也就是每个分量代表对应类别的概率。显然这样的输出结果是一个n维的向量。 4 激活函数的选择4.1 整流线性单元及其拓展整流线性单元(Rectified Linear Unit,Relu):
σ
(
z
)
=
m
a
x
{
0
,
z
}
\sigma(z)=max\{0,z\}
σ(z)=max{0,z} 在TensorFlow中还提供了relu6函数,其实是relu的基础上再增加了最大值为6的限定。 渗漏整流线性单元(leaky ReLU,Maas et al. 2013) 提出将ReLU的0部分修改为斜率类似0.01的小值 4.2 Sigmoid函数sigmoid函数我们已经非常熟悉了,它具有在两端梯度非常小的缺点,会导致学习速度下降,当然这可以依靠选择适当的损失函数(对,就是交叉熵)来低效它的影响,但是显然依然不鼓励把它作为隐藏层的激活函数。 4.3 双曲正切tanh函数双曲正切的表达式不是那么好记的,不过有简单的方法,我们设sigmoid函数为
σ
(
z
)
\sigma(z)
σ(z),则双曲正切可以表示为 4.4 其他的激活函数首先要说明的是,激活函数的作用依然是添加模型的非线性部分,他并不一定就是模仿神经元的刺激。ReLU激活函数确实看起来很像生物神经元的“激活”作用,但是有作者使用
h
=
c
o
s
(
w
T
x
+
b
)
h=cos(w^Tx+b)
h=cos(wTx+b)在MNIST上测试了前馈网络,获得了小于1%的误差率,这个结果很好,但这个激活函数却相当诡异,他的确和生物神经元没什么关系对吧。
5 随机梯度下降与反向传播(BackPropagation)目前我们所讨论的神经网络均是基于梯度下降的优化算法进行的,更多的优化算法(例如Adam)会在以后讨论。 最后只剩下如何计算参数的梯度了,设损失函数为L,参数为w,那么问题就是求解
?
J
/
?
w
\partial J / \partial w
?J/?w,在反向传播出现以前这个问题非常困难,而反向传播简而言之就是复合函数求导链式法则罢了。 6 TensorFlow2.0的实现(这并不是关于TensorFlow2.0的系统性说明,所以仅仅只会用到足以实现本文内容的一小部分,更多详情可以参考官方教程) 本文使用的数据集取自阿里天池关于classification的数据集——depression,数据集给出了被调查人员的许多生活情况资料,包括
并包含被调查人员是否感到沮丧抑郁的布尔值。
这里我们使用Sequential建立神经网络模型,这种建立方式要求了神经网络应该只有单个输入单个输出(所谓的多个输入可以用一个向量,一个矩阵来表示,所以无所谓了),并且网络不应该有非线性的拓扑结构(这个问题也不会出现在我们这个简单的前馈神经网络里面)
model.compile()用于设置神经网络的具体参数,包括损失函数、优化器还有训练时实时输出的参考指标等等。你会在keras.losses后给出的自动展示中看到很多很多你熟悉的损失函数,仅仅是cross entropy就给出了三种,这里使用的是BinaryCrossentropy(),官方注释解释说这种损失函数是专门用于二分类问题的交叉熵,我也很好奇它和一般而言的交叉熵做了哪些改进。 在model.fit()中添加训练集就可以开始训练了。其中batch_size用于指定随机梯度下降时抽样的数量,正如你可以想象到的,这个数量如果过少,可能并不能很好地反映整体,导致很难收敛,这里我选择了200,默认是32。epochs指定了迭代次数,根据模型的拟合效果可以进行调整。 model.evaluate()用于检测测试集,可以体现拟合的泛化程度,我们总是希望泛化程度越高越好,如果你发现测试集的准确率显著低于训练集,那么显然是过拟合了,我们调整神经网络的结构就是为了在保证不过拟合的前提下,尽可能提高预测的准确率。
经过我自己的调整,最终模型可以在不过拟合的前提下最高达到87%左右的准确度,其实效果并不好,一方面我认为数据集不是很能反应人的沮丧状况,另一方面我也没有做预先的数据处理,除此之外我们使用的神经网络模型还是非常基础的模型,所以这个效果在意料之中我也可以接受。 7 最后写这篇文章的初衷是因为我容易忘记TensorFlow2.0的语法,csdn上相关的详细的资料也很少,我总不能每次都打开官方文档看一遍,不如自己写一份吧。但其实TensorFlow2.0实现部分是我最不喜欢的部分,机器学习的推动根本永远是依靠数学,从数学原理上理解这个运行流程是很酷的事情。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/22 10:22:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |