神经网络
-
无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大。
-
使用非线性的多项式项,能够帮助我们建立更好的分类模型。假设我们有非常多的特征,例如大于100个变量,我们希望用这100个特征来构建一个非线性的多项式模型,结果将是数量非常惊人的特征组合,即便我们只采用两两特征的组合 ( x 1 x 2 + x 1 x 3 + x 1 x 4 + . . . + x 2 x 3 + x 2 x 4 + . . . + x 99 x 100 ) (x_1x_2+x_1x_3+x_1x_4+...+x_2x_3+x_2x_4+...+x_{99}x_{100}) (x1x2+x1x3+x1x4+...+x2x3+x2x4+...+x99x100),我们也会有接近5000个组合而成的特征。这对于一般的逻辑回归来说需要计算的特征太多了。
-
神经网络是个比较古老的算法, 但是硬件的发展给它带来了新的活力
-
神经网络模型建立在很多神经元之上,每个神经元又是一个学习模型,称为激活单元(activation unit)。神经元作用是采纳输入,根据本身参数得到输出。参数也称为权重(weight)
-
下面展示一个以逻辑回归作为神经元的实例:
当然有时也绘制 x 0 x_0 x0,表达起来方便些
-
这个图就是输入经过权重再通过激活函数得到输出的过程,黄色圈圈代表激活函数,线代表权重。
-
一组神经元连接在一起就组成了神经网络,如图:
第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit):
下面引入一些标记法来帮助描述模型:
a i ( j ) a_{i}^{\left( j \right)} ai(j) 代表第 j j j 层的第 i i i 个激活单元。 θ ( j ) {{\theta }^{\left( j \right)}} θ(j)代表从第 j j j 层映射到第 j + 1 j+1 j+1 层时的权重的矩阵,例如 θ ( 1 ) {{\theta }^{\left( 1 \right)}} θ(1)代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第 j + 1 j+1 j+1层的激活单元数量为行数,以第 j j j 层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中 θ ( 1 ) {{\theta }^{\left( 1 \right)}} θ(1)的尺寸为 3*4。也很容易理解嘛, θ 0 \theta_0 θ0是与 x 0 x_0 x0也就是1相乘的,所以列是4,行是下一层输出的维度,也就是3个a, a 0 a_0 a0不算。
对于上图所示的模型,激活单元和输出分别表达为:
a 1 ( 2 ) = g ( Θ 10 ( 1 ) x 0 + Θ 11 ( 1 ) x 1 + Θ 12 ( 1 ) x 2 + Θ 13 ( 1 ) x 3 ) a_{1}^{(2)}=g(\Theta _{10}^{(1)}{{x}_{0}}+\Theta _{11}^{(1)}{{x}_{1}}+\Theta _{12}^{(1)}{{x}_{2}}+\Theta _{13}^{(1)}{{x}_{3}}) a1(2)=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)
a 2 ( 2 ) = g ( Θ 20 ( 1 ) x 0 + Θ 21 ( 1 ) x 1 + Θ 22 ( 1 ) x 2 + Θ 23 ( 1 ) x 3 ) a_{2}^{(2)}=g(\Theta _{20}^{(1)}{{x}_{0}}+\Theta _{21}^{(1)}{{x}_{1}}+\Theta _{22}^{(1)}{{x}_{2}}+\Theta _{23}^{(1)}{{x}_{3}}) a2(2)=g(Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3)
a 3 ( 2 ) = g ( Θ 30 ( 1 ) x 0 + Θ 31 ( 1 ) x 1 + Θ 32 ( 1 ) x 2 + Θ 33 ( 1 ) x 3 ) a_{3}^{(2)}=g(\Theta _{30}^{(1)}{{x}_{0}}+\Theta _{31}^{(1)}{{x}_{1}}+\Theta _{32}^{(1)}{{x}_{2}}+\Theta _{33}^{(1)}{{x}_{3}}) a3(2)=g(Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3)
h Θ ( x ) = g ( Θ 10 ( 2 ) a 0 ( 2 ) + Θ 11 ( 2 ) a 1 ( 2 ) + Θ 12 ( 2 ) a 2 ( 2 ) + Θ 13 ( 2 ) a 3 ( 2 ) ) {{h}_{\Theta }}(x)=g(\Theta _{10}^{(2)}a_{0}^{(2)}+\Theta _{11}^{(2)}a_{1}^{(2)}+\Theta _{12}^{(2)}a_{2}^{(2)}+\Theta _{13}^{(2)}a_{3}^{(2)}) hΘ(x)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))
我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION )
也可以这样表示:
我们可以得到
θ
⋅
X
=
a
\theta \cdot X=a
θ⋅X=a 。
向量化
相对于使用循环来编码,利用向量化的方法会使得计算更为简便。以上面的神经网络为例,试着计算第二层的值:
令划线部分为
z
1
(
2
)
z^{(2)}_1
z1(2),以此可以得到
z
2
z^2
z2
令
z
(
2
)
=
θ
(
1
)
x
{{z}^{\left( 2 \right)}}={{\theta }^{\left( 1 \right)}}x
z(2)=θ(1)x,则
a
(
2
)
=
g
(
z
(
2
)
)
{{a}^{\left( 2 \right)}}=g({{z}^{\left( 2 \right)}})
a(2)=g(z(2)) ,计算后添加
a
0
(
2
)
=
1
a_{0}^{\left( 2 \right)}=1
a0(2)=1。 计算输出的值为:
我们令
z
(
3
)
=
θ
(
2
)
a
(
2
)
{{z}^{\left( 3 \right)}}={{\theta }^{\left( 2 \right)}}{{a}^{\left( 2 \right)}}
z(3)=θ(2)a(2),则
h
θ
(
x
)
=
a
(
3
)
=
g
(
z
(
3
)
)
h_\theta(x)={{a}^{\left( 3 \right)}}=g({{z}^{\left( 3 \right)}})
hθ(x)=a(3)=g(z(3))。
- 神经网络相比于逻辑回归和线性回归有什么优势呢?其实是一个学习特征的过程,我们不用x作为特征而是相当于用学习到的a做特征,效果就比较好了,除了这种特征的学习,神经网络还可以实现复杂的函数,我们从二元逻辑来一探究竟。
二元逻辑表达式
假如我们要实现XNOR 功能(输入的两个值必须一样,均为1或均为0),也就是同或。如下:
XNOR = ( x 1 AND x 2 ) OR ( ( NOT x 1 ) AND ( NOT x 2 ) ) \text{XNOR}=( \text{x}_1\, \text{AND}\, \text{x}_2 )\, \text{OR} \left( \left( \text{NOT}\, \text{x}_1 \right) \text{AND} \left( \text{NOT}\, \text{x}_2 \right) \right) XNOR=(x1ANDx2)OR((NOTx1)AND(NOTx2))
- 下面讲解实现过程:
神经网络中,单层神经元(无中间层)的计算可用来表示逻辑运算,比如逻辑与(AND)、逻辑或(OR)
- 我们可以用这样的一个神经网络表示AND 函数:
其中 θ 0 = − 30 , θ 1 = 20 , θ 2 = 20 \theta_0 = -30, \theta_1 = 20, \theta_2 = 20 θ0=−30,θ1=20,θ2=20
我们的输出函数
h
θ
(
x
)
h_\theta(x)
hθ(x)即为:
h
Θ
(
x
)
=
g
(
−
30
+
20
x
1
+
20
x
2
)
h_\Theta(x)=g\left( -30+20x_1+20x_2 \right)
hΘ(x)=g(−30+20x1+20x2)
我们知道
g
(
x
)
g(x)
g(x)的图像是:
所以我们有:
h
Θ
(
x
)
≈
x
1
AND
x
2
h_\Theta(x) \approx \text{x}_1 \text{AND} \, \text{x}_2
hΘ(x)≈x1ANDx2
- 接下来再介绍一个OR函数:
OR与AND整体一样,区别只在于
θ
\theta
θ的取值不同。
- 下图的神经元(两个权重分别为 10,-20)可以被视为作用等同于逻辑非(NOT)
然后将表示 AND 的神经元和表示 ( NOT x 1 ) AND ( NOT x 2 ) \left( \text{NOT}\, \text{x}_1 \right) \text{AND} \left( \text{NOT}\, \text{x}_2 \right) (NOTx1)AND(NOTx2)的神经元以及表示 OR 的神经元进行组合:
我们就得到了一个能实现
XNOR
\text{XNOR}
XNOR 运算符功能的神经网络。
按这种方法我们可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值。
这就是神经网络的厉害之处。
多类分类
- 之前介绍过one vs all这个算法, 本质上是构建了多个二分类。
当我们有不止两种分类时(也就是 y = 1 , 2 , 3 … . y=1,2,3…. y=1,2,3….),比如以下这种情况,该怎么办?如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。例如,第一个值为1或0用于预测是否是行人,第二个值用于判断是否为汽车。其实这也被叫做one-hot表示。
输入向量
x
x
x有三个维度,两个中间层,输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现
[
a
b
c
d
]
T
{{\left[ a\text{ }b\text{ }c\text{ }d \right]}^{T}}
[a b c d]T,且
a
,
b
,
c
,
d
a,b,c,d
a,b,c,d中仅有一个为1,表示当前类。下面是该神经网络的可能结构示例:
神经网络算法的输出结果为四种可能情形之一: