最近刚开始学习深度学习相关知识,今天就先从理论开始整理这几天自己所学的深度学习相关笔记。
一、学习主要参考网址:
http://www.huaxiaozhuan.com/【AI算法工程师手册】
在看手册的过程中,对于不懂的参考的网址:
深度前馈网络:异或问题
https://blog.csdn.net/rookiew/article/details/77602598
代价函数(损失函数)、目标函数:
https://blog.csdn.net/lyl771857509/article/details/79428475
https://www.cnblogs.com/Belter/p/6653773.html?utm_source=itdadao&utm_medium=referral
反向传播算法:
http://www.cnblogs.com/charlotte77/p/5629865.html
二、深度学习基础知识
深度学习:计算机从经验中学习,以层次化的概念(concept
)来理解世界。
深度学习 < 特征学习 < 机器学习 < AI
下图给出了不同AI
系统中,不同部分的关联。
深度学习的成功的关键有三个:
- 训练集大小的增长。
- 硬件和软件的发展。包括更快的
CPU
、通用的GUP
发展、更大内存、更快的网络连接、更好的软件基础。 - 算法优化。激活函数从
sigmoid
转换到ReLU
函数。它使得基于梯度下降的算法运行的更快。迭代网络的效率也更高了。
主要学习深度学习框架:Tensorflow,Keras
三、最简单的神经网络
神经网络基本示意图:
其中重要的就是激活函数:使得线性变为非线性。从而也就使得神经网络具有能理解任意输入变量间的非线性关系。
常见的激活函数有sigmoid、softmax、relu等,这里就不详细讲解了。
异或问题是最能体现神经网络的作用的。
什么是异或问题?
and: (0,0) → 0;(0,1) → 0;(1,0) → 0;(1,1) → 1
nand:(0,0) → 1;(0,1) → 0;(1,0) → 0;(1,1) → 0
or: (0,0) → 0;(0,1) → 1;(1,0) → 1;(1,1) → 1
xor: (0,0) → 0;(0,1) → 1;(1,0) → 1;(1,1) → 0
其中and,nand,or都可以用线性的方法将其分类开来,即y = wx+b的形式将结果分为正负,正为1,负为0。但是xor却用线性的方法区分不开了。
示例:
x1 and x2 x1 nand x2 x1 or x2
x1 xor x2
具体代码参见我的github:https://github.com/ly987/deep-learning/tree/master/xor_problem
四、代价函数与目标函数
关于代价函数:
线性回归中,最常用的是均方误差,具体形式为:
逻辑回归中,最常用的是代价函数是交叉熵,具体形式为:
学习过神经网络后,发现逻辑回归其实是神经网络的一种特例(没有隐藏层的神经网络)。因此神经网络中的代价函数与逻辑回归中的代价函数非常相似,具体形式为:
大多数神经网络采用最大似然准则,令代价函数为负的对数似然函数。
至于为什么神经网络会采用对数来作为代价函数,我是在后边学习唐宇迪老师讲的深度学习入门视频课程中弄懂的。主要原因还是与激活函数有关。就拿softmax激活函数来说,它对输出的每个类别i的得分值进行处理,得到每个类别的概率,先使得得分值大的通过指数扩大很多倍,得分值为负的呢就变成很小的数;再使用归一化进行所有类别的值相加为1。这样处理后,再对本来正确分类的那个类别概率值进行更改,使得其越接近1代价越小,而log函数正好符合这一条件。
关于目标函数:
在迭代更新过程中,并不是代价越小越好,因为可能会导致过拟合。
所以这里会添加一个正则项来对w进行惩罚。
所以我们最终的优化函数是:
什么是过拟合?
我看到有两个解释:
1. 就比如,在更新权重w时,存在两组权重参数使得最后的代价一样,如w1(1,0,0,0)和w2(0.25,0.25,0.25,0.25),我们该选择哪一组权重参数呢?显然如果选择w1这组权重参数的话,就很容易造成过拟合,也就是在训练的这个样本计算出来的代价很小,但是如果换给测试样本,可能会使得代价变得很大,因为w1的意思就是第一个特征很重要,后面两个特征一点用都没有,这时我们就可以通过正则惩罚项使得神经网络选择w2这组权重。
2. 这里讲解得很直观,如下图:
在神经网络层越多的时候,样本的数据的代价就越小,但是也出现一个问题--过拟合,也就是如果出现一个错误的样本数据,它会很影响整个网络的模型,有时我们不需要它分得太过于正确了,这样的话,就太局限性了,界限太过于分明了。
神经网络中过拟合的一般解决办法:
1. 添加正则化项:增大惩罚项,使得泛化能力好。
2. 全连接操作改为drop-out,即每层只选择某些神经元进行处理。
五、反向传播算法
反向传播:允许来自代价函数的信息通过网络反向流动,以便计算梯度。
关于反向传播,这个博客网址里有一个实例讲解,很清楚的讲了什么时反向传播,以及怎么计算等。这里就不详细讲解了。