引言
简单回顾历史:深度学习的发展可以被概括为三个阶段。
在1940-1960年间,人们从神经科学找到灵感,期望于搭建能够模拟人脑工作模式的神经网络。这是深度学习的开端。随机梯度下降(SGD)算法就是这个时期提出的。
1980-1990年代的成果相对较多,比如反向传播算法(BP)还有常用的的长短时记忆网络(LSTM)都来自与这个时期。但是由于时代的限制,很多AI产品期望过高而又无法落地,比如硬件算力原因,最终研究热潮逐渐退去。
第三个阶段就是2006年至今,由于软硬件性能的提高,深度学习广泛应用于各个领域,成为主流行业之一。
其实历史我了解的不多,但是想从头谈神经网络,我想正是得从历史的开始谈起。所以我最先聊到的一定是线性回归(Linear Regression),我把它理解为深度学习的开始,因为你会听到一个词:感知机。
经典的机器学习算法:线性回归
1.机器学习概念
什么是机器学习?
机器学习算法最早是由统计学家提出的,从数据中自动分析获得模型,并利用模型对未知数据进行预测的一系列算法。
线性回归算法是其中之一。醉翁之意不在酒,介绍线性回归算法并不是让兄弟们耗费时间多塞一个机器学习算法,而是非介绍不可,深度学习的核心:梯度下降就在这里。可以说深度学习就是在梯度下降上搭建起来的。
2.线性回归
(1)定义与公式
线性回归(Linear regression)是利用回归方程对一个或多个自变量(这里理解为特征值)和因变量(目标值)之间关系进行建模的一种分析方式。我记得单一自变量的线性回归分析方法高中学过,当时好像还要算卡方作为评价拟合的直线好坏的标准,硬笔计算量不小。现在时代变了,我们遇到的问题很少会是单一变量的情况,一般都是由多个自变量组成,所以线性回归的通用公式为:
(2)回归方程
如何理解这个通用公式?我这里还是借用黑马的例子,他们的课件是真的不错。
这样就将目标值与特征值直接的关系利用了数学式子建立起来。这就是线性回归方程(对,回归方程有非线性的,但是这里不做探讨,它对我们理解神经网络帮助不大;)
(3)损失和优化原理
比奇堡的房产大亨希望海绵宝宝来帮他解决一个问题:找出房子的价格(目标)与房子的面积(特征)的关系,这样通过得知房子的面积,房产大亨可以给房子合理定价。
于是给了它一些数据(数据集),是一些离散的点。
海绵宝宝的瞪眼观察法显然没办法让它直接得到目标值和特征值的关系。所以它将这些点画在了纸上,找到了它们的关系:那是一条直线。
海绵宝宝通过这些点,画出了目标值和特征值的关系是一条直线,而你会算斜率(我们称为权重)和截距(我们称为偏置)刻画这条直线,因为你们都是生物,这是个有手就行的过程。
计算机可不会上来就为这些离散的点画一条直线去拟合它们。它是怎么完成这个算法的?
我们需要引入误差和损失的概念。如你所见,这些离散的点并不完全的落在这条直线上,你手动拟合的直线和数据是存在误差的。而所有这些点与直线的误差越小,拟合出来的直线也就越精确。
我们要介绍损失函数(Loss function)的概念。它十分的重要,甚至九分的重要
但在这之前,我们先得聊,数据(Data)到底是什么?
无论是机器学习还是深度学习,最重要的东西是数据。想要解决问题,你得先有一个数据集(DataSet),里面是一个一个一个数据,有监督学习的数据由两种东西组成:样本(Sample)和标签(Label)。在前面的例子里,DataSet就是这一些点,而房子面积就是Sample,房子面积对应的房子价格就是Label。
网上有很多公开数据集供你下载,比如著名的MINIST数据集,我们之后会用到。
我们继续介绍损失函数:这是我们拟合出的直线表达式
总的损失定义为:
yi为第i个样本的真实值
hw(xi)为第i个样本通过回归方程的预测值
Loss函数被称为损失函数,这种损失函数又叫最小二乘损失(MSEloss)
它刻画了每一个样本输入线性回归分类器得到的预测值和数据真实值的差距,通过它可以评判你拟合出来的直线的优劣,Loss越小,说明直线拟合效果越好,也就是说,想要直线拟合效果好,我们应该得到最小的Loss。
我们来看Loss的表达式:这是一个含有xi,yi的关于变量w的式子。仔细看,对于Loss函数来说,只有w(和b)是自变量,xi和yi都是常数。你想想,你想要改变直线的拟合程度,你是不是需要去改变直线的权重和偏置,从而得到更小的Loss,那所以,权重和偏置才是Loss的自变量,不是吗?
那么,让直线更好的拟合的问题,刚刚转化成了减小Loss的问题,现在是不是又转化成了关于w,b的多元函数求最(小)值的问题。复习一下高数下,多元函数求最值我们利用正规方程组解决。
但是这里我们不这么做。在数据量大的情况下,正规方程法的计算效率低。所以我们使用梯度下降(GD)。
3.梯度下降
终于聊到了今天的核心内容。梯度下降是一种在初值随机或者确定的情况下通过迭代的方式摸索出函数最值的算法,它是深度学习的根基之一。我们拿随机梯度下降(SGD)来说。
凸函数
对于上述问题,假设直线的权重特别大,是不是直线特别陡,拟合效果差。那权重特别小,曲线就特别平,拟合效果也差。权重要大了不行小了也不行,可以初步判断出Loss函数是个凸函数(有严格证明,这里省略),对吗?
梯度
复习一下高数下:对于一个函数,梯度可以定义为一个函数的全部偏导数构成的向量,而梯度向量的方向即为函数值增长最快的方向,那么梯度的反方向就是函数值下降的最快的方向。我们把寻找最小值的问题看作下山,你在出发前需要定一个方向,显然,沿着当前最陡的方向往下走,肯定是到达谷底最快的路。
SGD
SGD的执行步骤如下:
- 在Loss函数这条凸函数上,随机取一点,求梯度。
- 更新梯度:沿着梯度方向向下走一个步长(也可以叫学习率learning rate,这里用系数a表示)公式如下。
3.迭代上述过程,最终接近最小值。
当然,这是一个二维的图例方便理解,实际上我们遇到的问题Loss函数基本都是高维的超空间,画不出来。我们借用一下龙良曲老师的课件:
好,我们顺一下思路:我们想要去优化我们拟合出来的直线,所以聊到了衡量直线的一种评价手段,叫损失函数,即尽可能的让损失函数最小。所以我们采用梯度下降的方式,得到了最小的损失函数。我们将里面的w和b拿出来带入回归方程,构建我们优化完成的线性回归模型。既然可以优化,那么初始的w和b随机取一个值也无所谓了。(当然初值的选取也很重要,因为即便Loss是个凸函数,很多时候它会非常的褶皱,有很多极值点导致陷入局部最优解,这也是我们不想看到的)。
总结
我们今天聊了深度学习我理解的第一部分内容。从传统机器学习框架讲起,聊了一个经典算法的思想:线性回归,提到深度学习里的损失函数的概念和奠基性的算法:梯度下降。下面我们就直接聊多层感知机,希望能给兄弟们一点帮助,我的内容有问题或者需要改进的话也请麻烦指出,我会不定期修改完善。
参考: