神经网络
引入:例子
假如现在我们已知了一组房子规模-价格数据:
如果我们要对其进行一个预测,很明显这就是一个简单的线性回归(以2维空间为例)的问题:
-
我们首先随机给定一个w,b,那么就可以确定一条“可能满足这几个点的需求”的直线:
y = ω x + b y=\omega x +b y=ωx+b -
然后利用最小二乘法作为我们的评判指标——也就是损失函数loss,
j ( θ ) = 1 n ∑ i = 1 n ( f ( x i ) − y i ) 2 j ( θ ) 是 损 失 值 x i 就 是 样 本 y i 就 是 真 实 标 签 值 f ( x i ) 是 预 测 标 签 值 j(\theta)=\frac{1}{n}\sum^{n}_{i=1}(f(x_i)-y_i)^2\\ j(\theta)是损失值\quad x_i就是样本\quad y_i就是真实标签值\quad f(x_i)是预测标签值 j(θ)=n1i=1∑n(f(xi)−yi)2j(θ)是损失值xi就是样本yi就是真实标签值f(xi)是预测标签值
通过loss函数,我们就可以得到每一个预测值的成绩——总损失值 -
但是在现实生活中,我们一般是一组预测值对应一组样本,所以我们只能在得到第一次的成绩的基础上,对我们的预测值进行一个修正——目的就是让我们的loss最小,从而更好地去让直线去拟合这一堆数据,那么就引入了梯度下降算法。(更详细介绍请看后面)
-
梯度下降算法是什么呢?简单来说,根据梯度的数学意义——就是表示函数在某一点的最为陡峭的一个向量,如果我给定的是loss与某一个甚至是多个变量的关系函数,那么就可以通过这个**“最为陡峭的向量”将我们的这个点移动到下一个更为接近最低点的点**(但是注意这个点不是我们说的样本点哦,它是loss值与n个变量组成的点)。如此迭代多次,便可以找到这个最低点,从而得到满足loss最小的点,在这个过程中不断地更新权重omega和偏置b(机器学习中习惯这样称呼omega和b)。
从而就可以得到一个可以比较好地拟合数据的直线了。
但是在这个预测-修正的过程中我们发现y肯定是不能为0的,所以如果我们假设拟合直线与x轴交点为
(
x
0
,
0
)
(x_0,0)
(x0,0)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/b6b27f0b217a8d6771f35970d9383b23.png
那么我们就得对
f
(
x
)
f(x)
f(x)
这个函数进行一定的修改——让他**呈非线性(non-linear)输出,从而满足我们的不同需求**。
像这种f(x),我们称之为**relu激活函数(rectified linear unit activation function)**
一.神经网络(neural network)
在上面的引例中,将一个样本x输入到修正单元当中,然后再进行线性回归并得到最后的房价关系拟合直线的过程:
y
=
f
(
x
)
=
r
e
l
u
(
x
)
y=f(x)=relu(x)
y=f(x)=relu(x)
在这个过程中,修正线性单元其实就相当于一个很小、很简单的神经网络了。
这几乎就是最简单的神经网络了,但是针对大一点的、比较复杂的神经网络,我们其实是先对其进行一个堆叠。比较大的神经网络,就是由无数个神经元堆叠起来的。
二.较为复杂的神经网络
引入:假如说,我们现在的任务是需要根据用户财政收入情况、地区邮政编码、户型大小以及寝室数目来综合预测某个情况下的户型价格,那么应该怎么做呢?
显然,我们现在的x是一个大小为[1,4]的张量,而输出是一个数字,那么显然如果要从这个输入提取出特征,并使得神经网络的输出为一个数字的话,我们中间就需要使用到不止一个神经元。
那么我们就可以使用上面的图来进行一个特征信息的提取。但是需要注意的是:
- 如果训练所使用的数据集够大,那么在一定程度上,神经网络就能够构建足够精准的映射
- 在上方的图中,其实我可以对其进行一些更改或者说是创新。就比如,如果我现在想有多个输出,其中的两个除了上面的综合考虑4个方面的输出外,我们还可以设定一个神经元,但只让其中的3个方面的信息或者其相关特征对其进行输入。其次类推,我们就可以有
4 × 3 × 2 × 1 4\times 3\times 2\times 1 4×3×2×1
种输出,以此就可以实现满足不同用户对不同信息尺度的考虑。
三.关于梯度下降算法那些事
类别:如果要类比一下的话,用现在进化算法的类比方法就是说,我滑雪选手要找到一个“函数山”上坡度最大的地方进行滑雪,以此来达到位于极值点的最低点。
1.梯度
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率(为该梯度的模)最大。
2.具体实现过程
(1)已知数学公式
之前我们以及知道了loss函数:
J
(
θ
)
J(\theta)
J(θ)
是一个关于theta的函数,那么我们就设定最初的滑雪起点为:
θ
0
\theta_0
θ0
(2)选手就位以后,我们就要出发了,经过第一次的loss后,他就得通过滑行一段距离来减少与极值点的差距,那么这个距离怎么定合适呢?毕竟我们的梯度只是给他指定了一个方向(向量是有方向的),但是具体要走多远,还是得要我们自己来设定,所以我们引入一个参数
α
(
l
r
)
\alpha(lr)
α(lr)
又称作**学习率(learning rate)**,顾名思义就是说我不断迭代的这个过程中,我到底要根据正确的方向,学多少、走多远。
θ
1
=
θ
0
−
α
∗
g
r
a
d
0
\theta_1=\theta_0-\alpha*grad_0
θ1=θ0−α∗grad0
如果是在下降的过程中,梯度是小于零的,起始点是小于终止点的;
如果是在上升的过程中,梯度是大于零的,起始点是大于终止点的,
符合实际要求。
(3)如此迭代以后,最终就达或者说几近达到到了“山谷”,也就是最终点。