本文章仅代表作者对于入门神经网络的一些总结,不涉及高深的数学知识。
将深度学习之前我们先来了解一下什么是回归问题,关于回归问题的讲解可以直接百度,这里具体来说就是要让机器观察猫的特征或者一群学生的身高,然后根据这些特征对某种事物进行分类或预测(是否为猫,有多少个男生)
那么怎么解决回归问题呢,我们知道,机器和人不同,它不能用眼睛直观的看到这些特征,它只能看到一堆数字,一串矩阵,因此我们要让机器明白这些特征实际上是让机器在这些数字中找规律的问题。
比如这前六个数是0.14、0.57、1.29、2.29、3.57、5.14,请问第七个是几?我们把这几个数字在坐标轴上标识一下,用曲线连接这几个点,延着曲线的走势可以推算出第七个数字——7,如图:
可是机器并不能像我们人一样随手画一条先就可以这么好的拟合,那么我们怎么办才能让机器拟合这么多点呢?这个时候我们可以让机器随便画一条线y=wx+b,然后不旋转这条线(改变斜率w),还可以不断的平移(改变截距b),在这个过程中不断计算每个点到这条直线的距离(即误差),求出所有的误差之和,和越小就说明约拟合,这样不断的调整,直到误差趋近于0,这种方法就叫:最小二乘法是直接对残差求导找出全局最小,是非迭代法。
问题到这里似乎就解决了,可是我们需要一种适应于各种曲线拟合的方法,那就是下面的梯度下降法(这里记得区分一下最小二乘法和梯度下降法,其本质的区别就在于一个是直接全局最小,一个是先局部最小,逐步迭代,但他们的原理是大致相同的)。
梯度下降法(Gradient Descent)
梯度下降法是一种迭代法,先给定一个,然后向下降最快的方向调整,在若干次迭代之后找到局部最小。梯度下降法的缺点是到最小点的时候收敛速度变慢,并且对初始点的选择极为敏感,其改进大多是在这两方面下功夫。
宏观表现(凸函数)
(拟合过程——左:误差loss 右:梯度下降过程)。
梯度下降法的求解步骤:
(1)确定当前位置的损失函数的梯度,对于w,b,(其值为损失函数对分别对w和b求偏导取反)
(2)用步长乘以损失函数的梯度,得到当前位置下降的距离
(3)确定是否所有的w,b梯度下降的距离都接近于阈值时,如果接近则算法终止,当前所有的w,b
即为最终结果。否则进入第(4)步。
(4)更新所有的w,b,更新表达式如下,更新完成后转入步骤(1)
梯度下降法的条件:梯度、步长、终止条件
梯度:就是损失函数的导数,由于我们需要不断的往下走,所以一般确定梯度为导数的负数
步长(学习率):小于1-(模型自动调整)
终止条件:导数趋近于0
求损失函数最小值的过程看做“站在山坡某处去寻找山坡的最低点”。我们并不知道最低点的确切位置,“梯度下降”的策略是每次向“下坡路”的方向走一小步,经过长时间的走“下坡路”最后的停留位置也大概率在最低点附近。以均方差损失函数为例,我们的loss是一个二次函数,其总有一个最低点,找到最低点即最优的点,所以梯度下降就是为了一步一步的走向梯度最低的点。
这里需要说明梯度下降法的实质是不断的修改w、b这两个参数值,使最终的误差(损失函数)达到最小。
好了,以上是线性回归(Linear Regression)的一些基础知识,在线性回归基础上引入一个非线性的激活函数(后面有讲解),就变成了逻辑回归问题,就可以进行分类啦哈哈哈。
真正的深度学习从这里开始:
大家可以先想一想,我们生活中很多事情是不能简单的用一条线来拟合的(比如人类的语言),很显然,前面的回归方法已经不够用了,我们急需找到一种数学模型,能够在此基础上不断减少特征,降低维度,在这样的背景下,人工神经网络就诞生了,实际上线性回归也可也近似是简单的一层神经网络。 神经网络就像是一组神经元连接在一起的集合。神经网络的第一层是输入层,值为xi,最后一层是输出层,如果作为分类算法训练则有多少个类别就应该有多少个对应的输出单元,对应的输出单元被激活代表着分类的结果。隐藏层可以有多层,每层可以有多个单元,规模越大训练的模型越复杂。而对于隐藏层中的每个单元本身都是一个逻辑回归的过程,也就是说每个隐藏单元都训练出了一个比前一层更加复杂的特征,这样一层接一层我们就可以训练出越来越复杂的特征,直到得到结果。
一、函数(了解即可)
深度学习里所用到了函数的性质其实概况下来就是:
1.函数的饱和性:函数是否有界(及是否具有max,min),两者皆具则为全饱和,有其一为半饱和
2.函数的连续性:函数是否连续,从函数图可以直观的看出是一天没用断裂的线
3.函数的变化趋势:变化率:变化的快慢——求导(导数的几何意义是斜率),这个性质很重要。
函数图像:
在学习升读学习之前首先要了解一下这些常见函数的图像及基本性质
常函数、幂函数、指数函数(这个函数可以让我们总是得到一个得非负值)、对数函数(由于其运算法则它可以用来化简运算、图像可以看出它在x=1之后是变化率y越来越小,因此可以用来做数据压缩)、三角函数(了解)
激活函数(用来解决非线性问题,激活函数是用来加入非线性因素的,因为线性模型的表达力不够。)举个例子:二分类问题,如果不使用激活函数,例如使用简单的逻辑回归,只能作简单的线性划分这里知道即可,后面用到再详解。
Sigmoid:(0-1):
现在一般可做输出函数(由于在后面导数趋近于0,所以现在一般不作为激活函数)
Tanh:(-1-1):将取值为 (−∞,+∞) 的数映射到 (−1,1)
RelU-max(0,x):一般用来做激活函数
以下是三个常见激活函数对应的图像
二、前向传播
深度学习三大类
监督学习:准备了一大堆飞机和小鸟的照片,让机器学会如何识别飞机和小鸟,给这些照片打上标签,机器通过大量学习,就可以学会在新照片中认出飞机和小鸟。
非监督学习:虽然照片分了飞机和小鸟,但是机器并不知道哪个是飞机,哪个是小鸟。对于机器来说,相当于分成了 A、B 两类。
强化学习:一个智能体应该知道在什么状态下应该采取什么行为。
接下来我们通过监督学习来讲解神经网络
这是我在网上随便找的一个神经网络的模型(关于神经网络的细则我会在之后补)大家目前只需要知道神经网络是一个端到端的模型,即输入--->[神经网络(黑匣子)]-->输出。这里我们先把神经网络想象成一个黑匣子。
我们假设输入为x,中间的黑匣子是一个函数f(x)=wx+b,则输出y=wx+b(比如:为了判断一个猫是不是猫,我们就把它的很多特称(x1,x2,x3....)输入到神经网络黑匣子中。
这里我用一个一层神经网络(近似线性回归)来举例,输入特征之后我们会得到结果y,然乎我们需要会找到一个w和一个b来尽可能的拟合我们这些特征,并得到一条y=wx+b函数【这其实就是线性回归的思想】,如下图所示:
前面我们提到了这是一个监督学习,及有一个标签y(正确结果),那么这里我先引入一个概率,即loss[损失函数]的思想,loss表现的是我们的得到的拟合函数求出的值和原本真实值之间的差距。那么我们面临的第一个问题就是如果求出我们的w和b,来确定这一个函数,这里我们使用均方差(MSE)作为损失函数(y-y(真)**2。
知道了LOSS之后我们就可以通过其来判断我们的w,b是不是最好的,同时我们仍然面临一个问题,就是怎么确定最好的那个w,b值呢?这里我们就可以用上面提到的梯度下降法。
三、反向传播
前面我们利用梯度下降求可以求得函数拟合的程度是否最优,判断最优的本质就是看此时的w和b是不是最终我们想要的,如果不是,我们就要对齐进行修改,而修改的依据就是我们loss的值,这一个通过loss反向影响权重的过程就是反向传播的本质,即用前向传播最后输出的结果来计算误差的偏导数(残差),再用这个偏导数和前面的隐藏层进行加权求和,如此一层一层的向后传下去,直到输入层(不计算输入层),最后利用每个节点求出的偏导数来更新权重
剩下的问题就是我们是怎么通过loss去更新我们的权重(w,b)的呢?
这里我们又引入了:链式求导法则
这个看起来还不值观,那我们试试这个:
求y=sin2x的导数:令u=2x,y=sinu,及y的导数乘u的导数。
反向传播的过程中,单个神经元将最终获得整个网络的最终输出值在自己的输出值上的梯度。链式法则指出,单个神经元应该将回传的梯度乘以它对其的输入的局部梯度,从而得到整个网络的输出对该门单元的每个输入值的梯度 。
关于反向传播的推到过程后面会给大家详细推导,大家现在只需知道其中的思想就可以了。
四、从微积分、线性、概率来看待深度学习
通过上面的前向传播,梯度下降,以及反向传播,其实我们就完成了最简单的BP(Back Propagation)神经网络 的算法,使用梯度下降的方法,要不断的修改k、b两个参数值,使最终的误差达到最小,可是需要注意的是神经网络可不只k、b两个参数,事实上,网络的每条连接线上都有一个权重参数。如果我们不深究其里面的数学理论知识,这样看来其实神经网络也并非那么复杂。为了更深刻的来看待深度学习,我们分别从从微积分、线性、概率的角度来分析其数学意义。
1.微积分角度
大家都知道我们最开始求一个圆的周长是把他细分成了很多个条直线围成的多边形,在现实生活中我们也可以用一条绳子围成一个圆,我们把它拉直就是圆的周长。
这里提醒大家一点,在神经网络中,我们的wx+b是有很多层的,并非是简单的一个wx+b就把问题给解决了,这里就有人会思考,我们的每一层难道都是一是一条直线wx+b吗?
其实并非如此,我们每一层的神经网络的表达式可能是曲线,所以我们用微积分的思想把它近似的看成了很多条wx+b的直线,这样我们就能将非线性的事物转化为了线性,最后我们在每一层都加一个激活函数再把它转化成非线性即可。
2.从线性角度
---待写----
3.从概率角度
----已更新---
章节总结:
在以上的知识学习中我们虽没有涉及到神经网络的太多的理论知识,但是我们现在完全可以想象前面提到的黑匣子里面的东西,他其实就是通过一层一层的传播(每一层都是一个“简单”的函数——由微分思想分成很多个wx+b)得到的一个拟合出来的很复杂的复合函数。而它和机器学习不同的点在于,它更像我们人的学习方式,其拟合出来的最终的权重(w,b),并非通过数学运算得出的,神经网络更像是一种经验学习,就像人无法用任何一个确切的数学公式来描写“什么是猫”,究其本质是因为我们根本就只是“言传身教,看得多罢了",或许神经网络亦是如此。至于前面提到的从微积分、线性、概率来看待深度学习不过是一种近似的数学建模思想。