神经网络
上图中每个圆圈都是一个神经元,每条线表示神经元之间的连接。我们可以看到,上面的神经元被分成了多层,层与层之间的神经元有连接,而层内之间的神经元没有连接。
- 最左边的层叫做输入层,这层负责接收输入数据;
- 最右边的层叫输出层,我们可以从这层获取神经网络输出数据。
- 输入层和输出层之间的层叫做隐藏层。
感知机(Perceptrons)
介绍
为了理解神经网络,我们应该先理解神经网络的组成单元——神经元,神经元也叫做感知机。感知器算法在上个世纪50-70年代很流行,也成功解决了很多问题,并且感知机算法也是非常简单的。
感知机有如下组成部分:
- 输入权值:一个感知器可以接受多个输入 ( x 1 , x 2 , . . . x n ) (x_1,x_2,...x_n) (x1,x2,...xn),每个输入有一个权值 w i w_i wi,此外还有一个偏置项 x 0 x_0 x0(不妨思考一下为什么要加一个 x 0 x_0 x0?)
- 激活函数:感知机的激活函数可以有很多选择,比如我们可以选择下面这个阶跃函数f来作为激活函数:(其中0为threshold,我们可以自定义,不一定是0)
o ( x 1 , . . . , x n ) = { 1 w 0 + w 1 × x 1 + . . . + w n × x n > 0 0 o t h e r w i s e o(x_1,...,x_n) = \begin{cases} 1 & w_0+w_1×x_1+...+w_n×x_n >0 \\ 0 & otherwise \end{cases} o(x1,...,xn)={10w0+w1×x1+...+wn×xn>0otherwise - 输出:感知机的输出由下面这个公式来计算
y = f ( w ∗ x + b ) y = f(w*x+b) y=f(w∗x+b)
感知机模型的几何解释
线性方程
ω
∗
x
+
b
ω*x+b
ω∗x+b对应于特征空间的一个超平面S,ω代表超平面的法向量,b代表截距。这个超平面将特征空间分为两个部分,位于两部分的点(特征向量)被划分为正负两类,所以超平面S被称为分离超平面(separating hyperplane)。
案例
用感知器实现and函数
用感知器实现or函数
为什么要加偏置项
左边这幅图是没加偏置项时的超平面。不难看出,它总是经过[0,0]点的。
右边这幅图是偏置项分别为0,0.2,-0.2时的超平面。不难看出,它们是平行的。
我们可以说,系数a决定了函数的角度,而分量b决定了函数与x轴的交点
此时我想你已经注意到了一些问题,对吧?如果没有b,函数将会失去很多灵活性。只不过对一些分布进行分类时偏置项可能有用,但不是对所有情况都有用。怎样测试它的实际效果呢?
让我们使用一个简单的例子:OR函数。
让我们先来看看它的分布:绘制在笛卡尔坐标系中的OR函数:
我想你已经想明白了这个问题。图中两个点([0,0]和[1,0])是两个不同的类,但任何一条过[0,0]的直线都没有办法将这两个点分开。
梯度下降
什么是梯度下降?
因为梯度下降是一种思想,没有严格的定义,所以用一个比喻来解释什么是梯度下降。
简单来说,梯度下降就是从山顶找一条最短的路走到山脚最低的地方。但是因为选择方向的原因,我们找到的的最低点可能不是真正的最低点。如图所示,黑线标注的路线所指的方向并不是真正的地方。
既然是选择一个方向下山,那么这个方向怎么选?每次该怎么走?
先说选方向,在算法中是以随机方式给出的,这也是造成有时候走不到真正最低点的原因。
如果选定了方向,以后每走一步,都是选择最陡的方向,直到最低点。
总结起来就一句话:随机选择一个方向,然后每次迈步都选择最陡的方向,直到这个方向上能达到的最低点。
梯度下降是用来做什么的?
在机器学习算法中,有时候需要对原始的模型构建损失函数,然后通过优化算法对损失函数进行优化,以便寻找到最优的参数,使得损失函数的值最小。而在求解机器学习参数的优化算法中,使用较多的就是基于梯度下降的优化算法(Gradient Descent, GD)。
优缺点
优点:效率。在梯度下降法的求解过程中,只需求解损失函数的一阶导数,计算的代价比较小,可以在很多大规模数据集上应用
缺点:求解的是局部最优值,即由于方向选择的问题,得到的结果不一定是全局最步长选择,过小使得函数收敛速度慢,过大又容易找不到最优解。
批量梯度下降法(Batch Gradient Descent)
批量梯度下降法具体步骤
批量梯度下降法是最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行梯度的更新。
-
根据目标值 t d t_d td和实际值 o d o_d od来计算误差,这里用 1 2 \frac{1}{2} 21是用于下方的求偏导可以直接消去
-
对误差进行求偏导
其中求导过程如下:
-
根据偏导和 学习率(learning Rate) 来计算权重的修改值。前面加了了负号是因为当偏导大于0时,意味着此时误差和权值是成的,权值越大,误差越大,如果我们不加负号,意味着我们将继续增加权值,只会增加误差。因此加了负号,当偏导大于0时,我们应该减小权值,从而减小误差。
将偏导带入,不难得出
-
因为是批量学习,所以在计算每一个修改值后,再进行修改