二刷(李宏毅深度学习,醍醐灌顶,长刷长爽)
一.什么是深度学习
本质上就是构建一个人类难以写出来的函数,通过构建模型去拟合满足功能的函数。
二,深度学习(机器学习)的几大任务
Regression :回归
Classiification: 分类
structure learning:结构化学习
三:深度学习的基本原理(怎么找函数)
如图:假如我们要知道该课程在YouTube上的订阅量随时间的变化关系 ,最终预测下一天该账号的订阅量。
我们希望通过之前的订阅数据,去找到(拟合)一个函数,实现回归求解。
(1)初始函数构建(基于domain knowledge)
现在我们假设这样一个model函数是y=wx+b (其中,y是订阅数,x是时间,w,b分别是两个parameters(参数)。通常,我们称w为权重(weight),b为偏置(bias)
(2)损失函数
我们可以利用domain knowledge去初始设定w,b的值(当然,在后续的模型中,我们完全可以随机的定一个初始矩阵参数),那么我们需要怎么样去衡量这些参数是不是最能拟合我们想要的函数,找到这些参数的最好值,以此实现对未知数据的预测呢?
这时候,我们就需要另一个函数---Loss函数
比如:
在本道题中,我们另该函数为L(w,b)=
其中e为真实值与计算值进行残差计算的结果。
通过将已有数据带入拟合的函数求出预测值与实际值进行残差计算得到并平均求和,我们就可以得到该参数下,函数的损失情况,我们也可以理解为误差函数。
通过分别计算w,b下损失函数的值,我们可以建立误差曲面,判断选择什么样的参数,能够使得函数的拟合效果最好。
(3)梯度下降(gradint descent)
现在的问题是,我们不可能自己一个个去实验参数,为了能够自动找到最佳参数,我们学会了利用梯度下降。
假如我们现在参数w的损失函数是这样的,如下图:
我们首先随机选择w0,计算该处微分值,假如微分值<0,则说明左边高,右边低。那就说明增大w的值,可以使得损失函数减小,反之亦是如此。通过不断迭代,使得该过程可以自动根据梯度值(微分值)的大小,不断向损失函数小的参数进行移动,最终找到一个损失值较小的局部最优解,这种过程我们称为梯度下降。
(3.1)学习率(learning rate)
现在的问题就是如果w移动的很小,那耗费的时间会很长,如果w移动的太大,可能达不到预期效果。
这个时候,我们通过学习率和梯度值的大小来决定每次损失后,参数值移动的大小。有图可知,当学习率/梯度值越大时,w0-->w1的变化幅度(步长)越大。
ps:在机器学习中,需要我们自己设定的参数称为超参数(hyperparameters)
为了防止过拟合,我们需要用已经有的训练数据(x,y都已经知道),测试数据(y不知道)去计算损失。
(4)激活函数
之前我们定义的函数明显为linear函数,但是众所周知,现实中大多数问题难以通过线性函数去准确表达。例如下图:我们的目标函数是红色函数:
但是无论怎么调整w,b的值,函数始终是线性函数,难以完美拟合红色函数。那么很明显我们需要去构建一个更加复杂,更具有弹性的Model。我们可以利用傅里叶/信号系统/泰勒展开的相关知识。
假如我们以一个函数(蓝色函数)作为基函数,对于该红色函数,我们可以用一个常数+n个不同的蓝色函数叠加进行拟合。如下图:
通过常数与多条蓝色函数的叠加,我们可以最终拟合出红色函数,虽然我们不能写出该函数的数学表达式,这就是深度学习的核心(感觉)。
而蓝色函数,就是激活函数。
典型激活函数有relu函数:
通过对激活函数配置不同的参数(斜率,初值等)我们就可以得到各式各样的像上上图中①②③各种relu函数,通过对激活函数的叠加+常数(consant),最终拟合出目标函数。
对于曲线目标函数,由傅里叶变换的知识我们也可以得知,通过线段的无限逼近,我们可以用无数线性线段去逼近曲线函数。
常见的激活函数还有sigmoid函数。通过调整c,b,w三个参数,可以得到各式各样的叠加函数。
现在的问题是我们不知道蓝色激活函数的表达式。
对于蓝色函数,我们可以通过sigmoid函数去拟合不同的蓝色函数,再将不同的蓝色函数叠加+consant去拟合最终的红色函数。(本质上还是典型的激活函数去拟合不同函数,然后不同函数最终拟合目标函数,太酷啦)而在这个过程中,找到这些满足要求的函数所需的参数,便是深度学习训练过程中的任务。
(4.1)横向神经元排列的原理
在之前的问题中,我们的输出y由一个x决定,但是现实生活中,有多个变量x导致y的产生。但是,利用激活函数,不管是多变量还是单变量,我们可以把简单的线性函数模型转换为弹性更高的复杂函数。
而多个x也解释了为什么在神经网络图中,有单层多个神经元的原因(这里可能讲的不大对,x不是隐藏层)。
(4.2) 图像理解
通过网络图,我们可以清晰理解函数拟合原理:
线性代数表示:
(5) 基于sigmod函数的参数求解
现在我们不再是用linear函数了,而是用sigmod函数进行函数拟合,那么其参数的获取和模型的建立就要重新进行(1)(2)(3)的步骤了。
在梯度下降部分,我们把所有参数用θ0,θ1,θ2....进行表示,将所有参数汇总到一个矩阵。(这有利于代码编写)然后进行梯度计算。
ps:这里的▽是拉普拉斯算子,相关知识点自查
(6)小批量随机梯度下降
对于大批量的数据,如果我们每次都将所有数据进行函数带入计算损失(平均),这样的计算量是无比巨大的。为此,我们采用小批量随机梯度下降。
如图:我们将数据分成n个批次(batch).
在每一个epoch中,我们会将一个个batch中的m个数据带入计算loss与grad
grad=▽L(θ;x1,x2...)
接着将梯度进行平均:1/n*Σ▽L(θ;x1,x2...)
最后进行参数更新θn<--θ(n-1)-ng (n为学习率)
所以,在一轮(epoch)中,参数更新的次数为n次。(总数据量为n*m)
(7)深层神经网络
当每一层的激活函数够多时,我们变有了横向排列的神经网络(神经元)
当我们将一层激活函数的值作为x带入到另一层激活函数时,我们就构成了多层纵向神经网络。
ps:神经网络构建的太复杂会产生over fitting!
今天就学到这,谢谢。
喜欢的小朋友请点赞,追番,投币哦
不好意思,走错了