神经网络
一、线性回归与神经网络
神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。
单层
单个输出
假设现需要预测房屋的出售价格,房屋通过以下特征,面积( x 1 x_{1} x1)空气指数( x 2 x_{2} x2),交通指数( x 3 x_{3} x3),最终输出价格( y y y)
面积( x 1 x_{1} x1) | 空气指数( x 2 x_{2} x2) | 交通指数( x 3 x_{3} x3) | 价格( y y y) |
---|---|---|---|
100 | 25 | 40 | 30 |
120 | 35 | 45 | 50 |
… | … | … | … |
若上表为数据样本集,
使用线性回归去训练模型并预测,步骤如下:
-
设定线性方程为:
y = w 1 x 1 + w 2 x 2 + w 3 x 3 + b y=w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+b y=w1x1+w2x2+w3x3+b -
通过数据集训练,求出最合适的参数:
w 1 , w 2 , w 3 , b w_{1},w_{2},w_{3},b w1,w2,w3,b
-
从而得到得到一个完整的表达式:
y = w 1 x 1 + w 2 x 2 + w 3 x 3 + b y=w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+b y=w1x1+w2x2+w3x3+b -
当输入一个新的数据(输入特征值 x 1 , x 2 , x 3 x_{1},x_{2},x_{3} x1,x2,x3),代入3中的方程,即可实现预测 y y y的效果。
向量化:
将
w
1
,
w
2
,
w
3
w_{1},w_{2},w_{3}
w1,w2,w3看成一个列向量:
w
=
[
w
1
w
2
w
3
]
\mathbf{w}=\begin{bmatrix} w_{1}\\ w_{2}\\ w_{3} \end{bmatrix}
w=⎣⎡w1w2w3⎦⎤
将输入特征也
x
1
,
x
2
,
x
3
x_{1},x_{2},x_{3}
x1,x2,x3也看成一个列向量:
x
=
[
x
1
x
2
x
3
]
\mathbf{x}=\begin{bmatrix} x_{1}\\ x_{2}\\ x_{3} \end{bmatrix}
x=⎣⎡x1x2x3⎦⎤
此时表达式
y
=
w
1
x
1
+
w
2
x
2
+
w
3
x
3
+
b
y=w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+b
y=w1x1+w2x2+w3x3+b
向量化即转换为:
y
=
w
T
x
+
b
y=\mathbf{w^Tx}+b
y=wTx+b
以上是线性回归实现预测房屋价格的例子
用图来表示即
在这个例子中,只有一个输出:
y
y
y
多个输出
若,
将预测房屋价格问题进行修改,不光要预测价格,还要预测房屋内的房间数量
如此以来,训练样本集的特征以及 标签即如下表所示。
面积( x 1 x_{1} x1) | 空气指数( x 2 x_{2} x2) | 交通指数( x 3 x_{3} x3) | 价格( y 1 y_{1} y1) | 房间数量 y 2 y_{2} y2 |
---|---|---|---|---|
100 | 25 | 40 | 30 | 5 |
120 | 35 | 45 | 50 | 6 |
… | … | … | … | … |
此时,若要实现该模型,则需要设2个方程
分别为
y
1
=
w
1
T
x
+
b
1
y_{1}=\mathbf{w_{1}^Tx}+b_{1}
y1=w1Tx+b1
y
2
=
w
2
T
x
+
b
2
y_{2}=\mathbf{w_{2}^Tx}+b_{2}
y2=w2Tx+b2
通过训练集分别求出
w
11
,
w
12
,
w
13
,
b
1
(
即
w
1
,
b
1
w_{11},w_{12},w_{13},b_{1}(即\mathbf{w_{1}},b_{1}
w11,w12,w13,b1(即w1,b1
w
21
,
w
22
,
w
23
,
b
22
(
即
w
1
,
b
2
w_{21},w_{22},w_{23},b_{22}(即\mathbf{w_{1}},b_{2}
w21,w22,w23,b22(即w1,b2
将新输入的特征分别代入两个方程中即可预测
y
1
,
y
2
y_{1},y_{2}
y1,y2
示意图如下,此时有2个输出:
y
1
,
y
2
y_{1},y_{2}
y1,y2
多层
- 单层单个输出中,我们直接将 x 1 , x 2 , x 3 x_{1},x_{2},x_{3} x1,x2,x3代入方程中,得到输出的预测值 y y y
- 单层多个输出中,将 x 1 , x 2 , x 3 x_{1},x_{2},x_{3} x1,x2,x3,代入不同的方程,得到不同的输出预测值 y 1 , y 2 y_{1},y_{2} y1,y2
缺点:使用线性回归,最终都是通过一个直线,或者平面对数据进行拟合,但是,在实际问题中,许多问题并不都是线性的
现将问题再进行修改,我需要预测房屋中的家庭人口数量
训练样本集的特征以及标签即如下表所示。
面积( x 1 x_{1} x1) | 空气指数( x 2 x_{2} x2) | 交通指数( x 3 x_{3} x3) | 人口数量 y y y |
---|---|---|---|
100 | 25 | 40 | 4 |
120 | 35 | 45 | 5 |
… | … | … | … |
此时依旧可以使用线性回归,使用如下方式进行线性拟合
但是,从特征和标签的相关性来看,家庭人口数与 面积(
x
1
x_{1}
x1),空气指数(
x
2
x_{2}
x2),交通指数(
x
3
x_{3}
x3) 似乎并没有直接的关联性,若只使用线性回归进行拟合可能会导致训练出来的效果非常差。
从另一方面来看,家庭人口数这个标签,和 房间数量 以及 房屋的价格(等价于经济水平),相关性比较大,因此使用房间数量和房屋价格作为特征,所训练出来的效果可能会更好。
但是给出的特征里,并没有房间数量和房屋价格这两个特征。
这个时候就可以借助单层的问题思路,引出多层的概念
我们定义一个新的方程
y
=
l
1
y
1
+
l
2
y
2
+
c
y=l_{1}y_{1}+l_{2}y_{2}+c
y=l1y1+l2y2+c
y
1
y_{1}
y1为房间数量特征,
y
2
y_{2}
y2为房屋价格特征
在之前的问题中,我们可以通过特征值
x
1
,
x
2
,
x
3
x_{1}, x_{2}, x_{3}
x1,x2,x3分别代入以下两个方程中,得到
y
1
,
y
2
y_{1},y_{2}
y1,y2
y
1
=
w
1
T
x
+
b
1
y_{1}=\mathbf{w_{1}^Tx}+b_{1}
y1=w1Tx+b1
y
2
=
w
2
T
x
+
b
2
y_{2}=\mathbf{w_{2}^Tx}+b_{2}
y2=w2Tx+b2
此时,再将
y
1
,
y
2
y_{1},y_{2}
y1,y2作为已知的特征,代入最终的方程,进行训练得到合适的参数
l
1
,
l
2
,
l
3
,
c
l_{1},l_{2},l_{3},c
l1,l2,l3,c:
y
=
l
1
y
1
+
l
2
y
2
+
c
y=l_{1}y_{1}+l_{2}y_{2}+c
y=l1y1+l2y2+c
即可得到所需要的
y
y
y
为了区分,使用 l 1 , l 2 , c l_{1},l_{2},c l1,l2,c作为参数
向量化即为:
y
=
l
T
x
+
c
y=\mathbf{l^Tx}+c
y=lTx+c
用图进行表示即为
这个就有点类似于神经元,每个节点干不同的事情
在机器学习中的神经网络也是这样一个结构,但是相比机器学习的神经网络还少了一个部分,激活函数。
二、神经网络原理
在神经网络中,
y
1
,
y
2
y_{1},y_{2}
y1,y2并没有明确的含义,在之前为了表达更直观,将
y
1
,
y
2
y_{1},y_{2}
y1,y2称作为房间数量
和房屋价格
这两个特征,但是实际上,在一个完整的神经网络中,隐藏层的输出的不会给出明确含义
同样,一个多层的神经网络结构包含了输入层,隐藏层,输出层
而,在神经网络中,神经元节点会套一层激活函数。
例如在上述的隐藏层和输出层表达式中,
y
1
=
w
1
T
x
+
b
1
y_{1}=\mathbf{w_{1}^Tx}+b_{1}
y1=w1Tx+b1
y
2
=
w
2
T
x
+
b
2
y_{2}=\mathbf{w_{2}^Tx}+b_{2}
y2=w2Tx+b2
y
=
l
T
y
+
c
y=\mathbf{l^Ty}+c
y=lTy+c
加入对应的激活函数=>
y
1
=
f
1
(
w
1
T
x
+
b
1
)
y_{1}=f_{1}(\mathbf{w_{1}^Tx}+b_{1})
y1=f1(w1Tx+b1)
y
2
=
f
2
(
w
2
T
x
+
b
2
)
y_{2}=f_{2}(\mathbf{w_{2}^Tx}+b_{2})
y2=f2(w2Tx+b2)
y
=
f
3
(
l
T
y
+
c
)
y=f_{3}(\mathbf{l^Ty}+c)
y=f3(lTy+c)
其中,
f
1
(
x
)
,
f
2
(
x
)
,
f
3
(
x
)
f_{1}(x),f_{2}(x),f_{3}(x)
f1(x),f2(x),f3(x)为激活函数。
用图表示如下:
一般结构
神经网络中,如下图
输入层,m个特征,即m个输入,分别为
x
1
x_{1}
x1~
x
m
x_{m}
xm。
隐藏层,有k层,每一层的节点个数分别为
n
1
,
n
2
,
.
.
.
,
n
k
n_{1},n_{2},...,n_{k}
n1,n2,...,nk,即第i层有
n
i
n_{i}
ni个输出
第1层隐藏层的第1个节点,其表达式为:
y 1 [ 1 ] = f ( w 11 [ 1 ] x 1 + w 12 [ 1 ] x 2 + . . . + w 1 m [ 1 ] x m + b 1 [ 1 ] ) y^{[1]}_{1}=f(w^{[1]}_{11}x_{1}+w^{[1]}_{12}x_{2}+...+w^{[1]}_{1m}x_{m}+b^{[1]}_{1}) y1[1]=f(w11[1]x1+w12[1]x2+...+w1m[1]xm+b1[1])
m为上一层的输入,向量形式为
y 1 [ 1 ] = f ( w 1 [ 1 ] x + b 1 [ 1 ] ) y^{[1]}_{1}=f(\mathbf{w^{[1]}_{1}x}+b^{[1]}_{1}) y1[1]=f(w1[1]x+b1[1])
-----------------------------------------------------------------------------------
第1层隐藏层的第2个节点,其表达式为:
y 2 [ 1 ] = f ( w 21 [ 1 ] x 1 + w 22 [ 1 ] x 2 + . . . + w 2 m [ 1 ] x m + b 2 [ 1 ] ) y^{[1]}_{2}=f(w^{[1]}_{21}x_{1}+w^{[1]}_{22}x_{2}+...+w^{[1]}_{2m}x_{m}+b^{[1]}_{2}) y2[1]=f(w21[1]x1+w22[1]x2+...+w2m[1]xm+b2[1])
m为上一层的输入,向量形式为
y 2 [ 1 ] = f ( w 2 [ 1 ] x + b 2 [ 1 ] ) y^{[1]}_{2}=f(\mathbf{w^{[1]}_{2}x}+b^{[1]}_{2}) y2[1]=f(w2[1]x+b2[1])
-----------------------------------------------------------------------------------
第1层隐藏层的第j个节点, j ∈ [ 1 , 2 , 3... , n 1 ] j \in [1,2,3...,n_{1}] j∈[1,2,3...,n1],
其表达式为:
y j [ 1 ] = f ( w j 1 [ 1 ] x 1 + w j 2 [ 1 ] x 2 + . . . + w j m [ 1 ] x m + b j [ 1 ] ) y^{[1]}_{j}=f(w^{[1]}_{j1}x_{1}+w^{[1]}_{j2}x_{2}+...+w^{[1]}_{jm}x_{m}+b^{[1]}_{j}) yj[1]=f(wj1[1]x1+wj2[1]x2+...+wjm[1]xm+bj[1])
m为上一层的输入,向量形式为
y 2 [ 1 ] = f ( w j [ 1 ] x + b j [ 1 ] ) y^{[1]}_{2}=f(\mathbf{w^{[1]}_{j}x}+b^{[1]}_{j}) y2[1]=f(wj[1]x+bj[1])
第i层隐藏层的第j个节点, i ∈ [ 1 , 2 , 3... , k ] i \in [1,2,3...,k] i∈[1,2,3...,k], j ∈ [ 1 , 2 , 3... , n j ] j \in [1,2,3...,n_{j}] j∈[1,2,3...,nj]
且设第i层隐藏层的输入为 x 1 [ i ] , x 2 [ i ] , . . . , x n i − 1 [ i ] x^{[i]}_{1},x^{[i]}_{2},...,x^{[i]}_{n_{i-1}} x1[i],x2[i],...,xni−1[i](向量形式: x [ i ] \mathbf{x^{[i]}} x[i])
(输入的个数为上一层的输出个数)
表达式为:
y i [ i ] = f ( w i 1 [ i ] x 1 [ i ] + w i 2 [ i ] x 2 [ i ] + . . . + w i n i − 1 [ i ] x n i − 1 [ i ] + b i [ i ] ) y^{[i]}_{i}=f(w^{[i]}_{i1}x^{[i]}_{1}+w^{[i]}_{i2}x^{[i]}_{2}+...+w^{[i]}_{in_{i-1}}x^{[i]}_{n_{i-1}}+b^{[i]}_{i}) yi[i]=f(wi1[i]x1[i]+wi2[i]x2[i]+...+wini−1[i]xni−1[i]+bi[i])
向量形式为
y i [ i ] = f ( w j [ i ] x [ i ] + b i [ 1 ] ) y^{[i]}_{i}=f(\mathbf{w^{[i]}_{j}x^{[i]}}+b^{[1]}_{i}) yi[i]=f(wj[i]x[i]+bi[1])
输出层:
输出层的n个输出, y 1 y_{1} y1~ y n y_{n} yn表达式为:
y 1 = f ( w 1 k + 1 x ) y_{1}=f(\mathbf{w^{k+1}_{1}x}) y1=f(w1k+1x) (k+1表示隐藏层的后一个)
y 2 = f ( w 2 k + 1 x ) y_{2}=f(\mathbf{w^{k+1}_{2}x}) y2=f(w2k+1x)
…
y n = f ( w n k + 1 x ) y_{n}=f(\mathbf{w^{k+1}_{n}x}) yn=f(wnk+1x)
神经网络传播过程
以该结构为例,
输出
y
y
y
y
=
f
3
(
l
1
y
1
+
l
2
y
2
+
c
)
=
f
3
(
l
T
x
+
c
)
y=f_{3}(l_{1}y_{1}+l_{2}y_{2}+c)=f_{3}(\mathbf{l^Tx}+c)
y=f3(l1y1+l2y2+c)=f3(lTx+c)
y
1
=
f
1
(
w
11
x
1
+
w
12
x
2
+
w
13
x
3
+
b
1
)
=
f
1
(
w
1
T
x
+
b
1
)
y_{1}=f_{1}(w_{11}x_{1}+w_{12}x_{2}+w_{13}x_{3}+b_{1})=f_{1}(\mathbf{w_{1}^Tx}+b_{1})
y1=f1(w11x1+w12x2+w13x3+b1)=f1(w1Tx+b1)
y
2
=
f
2
(
w
21
x
1
+
w
22
x
2
+
w
23
x
3
+
b
2
)
=
f
2
(
w
2
T
x
+
b
2
)
y_{2}=f_{2}(w_{21}x_{1}+w_{22}x_{2}+w_{23}x_{3}+b_{2})=f_{2}(\mathbf{w_{2}^Tx}+b_{2})
y2=f2(w21x1+w22x2+w23x3+b2)=f2(w2Tx+b2)
联立以上3个方程,可得
y
=
f
3
(
l
1
f
1
(
w
11
x
1
+
w
12
x
2
+
w
13
x
3
+
b
1
)
+
l
2
f
2
(
w
21
x
1
+
w
22
x
2
+
w
23
x
3
+
b
2
)
+
c
)
y=f_{3}(l_{1}f_{1}(w_{11}x_{1}+w_{12}x_{2}+w_{13}x_{3}+b_{1})+l_{2}f_{2}(w_{21}x_{1}+w_{22}x_{2}+w_{23}x_{3}+b_{2})+c)
y=f3(l1f1(w11x1+w12x2+w13x3+b1)+l2f2(w21x1+w22x2+w23x3+b2)+c)
=>
y
=
f
3
(
l
1
f
1
(
w
1
T
x
+
b
1
)
+
l
2
f
2
(
w
2
T
x
+
b
2
)
+
c
)
y=f_{3}(l_{1}f_{1}(\mathbf{w_{1}^Tx}+b_{1})+l_{2}f_{2}(\mathbf{w_{2}^Tx}+b_{2})+c)
y=f3(l1f1(w1Tx+b1)+l2f2(w2Tx+b2)+c)
若所有的激活函数为线性函数,
即
f
(
x
)
=
x
f(x)=x
f(x)=x,则输出
y
y
y的表达式如下
y = l 1 ( w 1 T x + b 1 ) + l 2 ( w 2 T x + b 2 ) + c y=l_{1}(\mathbf{w_{1}^Tx}+b_{1})+l_{2}(\mathbf{w_{2}^Tx}+b_{2})+c y=l1(w1Tx+b1)+l2(w2Tx+b2)+c
三、激活函数
为什么要使用非线性激活函数
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
即此时相当于线性激活函数为
f
(
x
)
=
x
f(x)=x
f(x)=x
可以通过数学证明,若在所有的隐藏层和输出层中,使用线性激活函数
,那么无论隐藏层有多少层,最后所训练出来的模型的效果,和直接单层输出的效果是一样的
。
如果使用非线性激活函数,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
常用的激活函数
(1) sigmoid函数
f ( x ) = 1 1 + e − z = s i g m o i d ( x ) f(x)=\frac{1}{1+e^{-z}} =sigmoid(x) f(x)=1+e−z1=sigmoid(x)
曲线:
用于隐层神经元输出,取值范围为(0,1)
它可以将一个实数映射到(0,1)的区间,可以用来做二分类。
在特征相差比较复杂或是相差不是特别大时效果比较好。
(2) Tanh函数
f
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
=
t
a
n
h
(
x
)
f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} =tanh(x)
f(x)=ex+e−xex−e−x=tanh(x)
取值范围为[-1,1],tanh在特征相差明显时的效果会很好
与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好,经过测试,tanh 也确实是比 sigmoid更好