八、神经网络:表述(Neural Networks: Representation)
8.1 非线性假设
当我们使用 x 1 x_1 x1, x 2 x_2 x2 的多次项式进行预测时,我们可以应用的很好。
但是,如果特征非常多(比如识别视觉对象),一般的逻辑回归处理不了,就需要神经网络。
8.2 神经元和大脑
神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器。
对于现代机器学习应用,神经网络是最有效的技术方法。
8.3 模型表示1
其中
x
1
x_1
x1,
x
2
x_2
x2,
x
3
x_3
x3是输入单元(input units),我们将原始数据输入给它们。
a
1
a_1
a1,
a
2
a_2
a2,
a
3
a_3
a3是中间单元,它们负责将数据进行处理,然后呈递到下一层。
最后是输出单元,它负责计算
h
θ
(
x
)
{h_\theta}\left( x \right)
hθ(x)。
引入一些标记:
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$ 层时的权重的矩阵,例如 θ ( 1 ) {{\theta }^{\left( 1 \right)}} θ(1)代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第 j + 1 j+1 j+1层的激活单元数量为行数,以第 j j j 层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中 θ ( 1 ) {{\theta }^{\left( 1 \right)}} θ(1)的尺寸为 3*4。
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))
上面的只是将特征矩阵中的一行交给了神经网络,我们需要将整个训练集都交给神经网络。
每一个 a a a都是由上一层所有的 x x x和每一个 x x x所对应的 Θ \Theta Θ决定的。
前向传播:从左到右
可以得到 θ ⋅ X = a \theta \cdot X=a θ⋅X=a
8.4 模型表示2
其实神经网络就像是logistic regression,只不过我们把logistic regression中的输入向量
[
x
1
∼
x
3
]
\left[ x_1\sim {x_3} \right]
[x1∼x3] 变成了中间层的
[
a
1
(
2
)
∼
a
3
(
2
)
]
\left[ a_1^{(2)}\sim a_3^{(2)} \right]
[a1(2)∼a3(2)], 即:
h
θ
(
x
)
=
g
(
Θ
0
(
2
)
a
0
(
2
)
+
Θ
1
(
2
)
a
1
(
2
)
+
Θ
2
(
2
)
a
2
(
2
)
+
Θ
3
(
2
)
a
3
(
2
)
)
h_\theta(x)=g\left( \Theta_0^{\left( 2 \right)}a_0^{\left( 2 \right)}+\Theta_1^{\left( 2 \right)}a_1^{\left( 2 \right)}+\Theta_{2}^{\left( 2 \right)}a_{2}^{\left( 2 \right)}+\Theta_{3}^{\left( 2 \right)}a_{3}^{\left( 2 \right)} \right)
hθ(x)=g(Θ0(2)a0(2)+Θ1(2)a1(2)+Θ2(2)a2(2)+Θ3(2)a3(2)) 我们可以把
a
0
,
a
1
,
a
2
,
a
3
a_0, a_1, a_2, a_3
a0,a1,a2,a3看成更为高级的特征值,也就是
x
0
,
x
1
,
x
2
,
x
3
x_0, x_1, x_2, x_3
x0,x1,x2,x3的进化体,并且它们是由
x
x
x与
θ
\theta
θ决定的,因为是梯度下降的,所以
a
a
a是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将
x
x
x次方厉害,也能更好的预测新数据。
这就是神经网络相比于逻辑回归和线性回归的优势。
8.5 例子和直观理解(一)
我们可以用这样的一个神经网络表示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
所以我们的:$h_\Theta(x) $
这就是AND函数。
接下来再介绍一个OR函数:
OR与AND整体一样,区别只在于的取值不同。
8.6 例子和直观理解(二)
我们可以利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。例如我们要实现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))
首先构造一个能表达
(
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)部分的神经元:
然后将表示 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 运算符功能的神经网络。
8.7 多类分类
输入向量 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,表示当前类。
神经网络算法的输出结果为四种可能情形之一:
九、神经网络的学习(Neural Networks: Learning)
9.1 代价函数
引入标记方法:
假设神经网络的训练样本有 m m m个,每个包含一组输入 x x x和一组输出信号 y y y, L L L表示神经网络层数, S I S_I SI表示每层的neuron个数( S l S_l Sl表示输出层神经元个数), S L S_L SL代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类: S L = 0 , y = 0 o r 1 S_L=0, y=0\, or\, 1 SL=0,y=0or1表示哪一类;
K K K类分类: S L = k , y i = 1 S_L=k, y_i = 1 SL=k,yi=1表示分到第 i i i类; ( k > 2 ) (k>2) (k>2)
回顾:逻辑回归中代价函数为:
$ J\left(\theta \right)=-\frac{1}{m}\left[\sum_\limits{i=1}{m}{y}{(i)}\log{h_\theta({x}{(i)})}+\left(1-{y}{(i)}\right)log\left(1-h_\theta\left({x}{(i)}\right)\right)\right]+\frac{\lambda}{2m}\sum_\limits{j=1}{n}{\theta_j}^{2} $
逻辑回归中,只有一个输出变量,也只有一个因变量。而在神经网络中,可以有很多输出变量,假设维度为 K K K,那么:
h θ ( x ) ∈ R K h_\theta\left(x\right)\in \mathbb{R}^{K} hθ(x)∈RK ( h θ ( x ) ) i = i t h output {\left({h_\theta}\left(x\right)\right)}_{i}={i}^{th} \text{output} (hθ(x))i=ithoutput
J ( Θ ) = − 1 m [ ∑ i = 1 m ∑ k = 1 k y k ( i ) log ⊂ k ( h Θ ( x ( i ) ) ) + ( 1 − y k ( i ) ) log ( 1 − ⊂ k ( h Θ ( x ( i ) ) ) ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j i ( l ) ) 2 J(\Theta) = -\frac{1}{m} \left[ \sum\limits_{i=1}^{m} \sum\limits_{k=1}^{k} {y_k}^{(i)} \log \sub k{(h_\Theta(x^{(i)}))} + \left( 1 - y_k^{(i)} \right) \log \left( 1- \sub k{\left( h_\Theta \left( x^{(i)} \right) \right)} \right) \right] + \frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_{l+1}} \left( \Theta_{ji}^{(l)} \right)^2 J(Θ)=−m1[i=1∑mk=1∑kyk(i)log⊂k(hΘ(x(i)))+(1−yk(i))log(1−⊂k(hΘ(x(i))))]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θji(l))2
上式与逻辑回归中的思想是一样的,希望通过代价函数来观察预测误差多大。不同的是,对于每一行特征,都会给出 K K K个预测。我们可以循环预测每一行特征的 K K K个结果,然后选择可能性最高的,再与 y y y中的实际数据进行比较。
9.2 反向传播函数
为了计算代价函数的偏导数 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta^{(l)}_{ij}}J\left(\Theta\right) ∂Θij(l)∂J(Θ),我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
假设我们的训练集只有一个样本 ( x ( 1 ) , y ( 1 ) ) \left({x}^{(1)},{y}^{(1)}\right) (x(1),y(1)),我们的神经网络是一个四层的神经网络,其中 K = 4 , S L = 4 , L = 4 K=4,S_{L}=4,L=4 K=4,SL=4,L=4:
前向传播:
我们从最后一层的误差开始计算,误差是激活单元的预测(
a
(
4
)
{a^{(4)}}
a(4))与实际值(
y
k
y^k
yk)之间的误差,(
k
=
1
:
k
k=1:k
k=1:k)。
我们用
δ
\delta
δ来表示误差,则:
δ
(
4
)
=
a
(
4
)
−
y
\delta^{(4)}=a^{(4)}-y
δ(4)=a(4)−y
我们利用这个误差值来计算前一层的误差:
δ
(
3
)
=
(
Θ
(
3
)
)
T
δ
(
4
)
∗
g
′
(
z
(
3
)
)
\delta^{(3)}=\left({\Theta^{(3)}}\right)^{T}\delta^{(4)}\ast g'\left(z^{(3)}\right)
δ(3)=(Θ(3))Tδ(4)∗g′(z(3))
其中
g
′
(
z
(
3
)
)
g'(z^{(3)})
g′(z(3))是
S
S
S 形函数的导数,
g
′
(
z
(
3
)
)
=
a
(
3
)
∗
(
1
−
a
(
3
)
)
g'(z^{(3)})=a^{(3)}\ast(1-a^{(3)})
g′(z(3))=a(3)∗(1−a(3))。而
(
θ
(
3
)
)
T
δ
(
4
)
(θ^{(3)})^{T}\delta^{(4)}
(θ(3))Tδ(4)则是权重导致的误差的和。下一步是继续计算第二层的误差:
$ \delta{(2)}=(\Theta{(2)}){T}\delta{(3)}\ast g’(z^{(2)})$
因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设
λ
=
0
λ=0
λ=0,即我们不做任何正则化处理时有:
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
=
a
j
(
l
)
δ
i
l
+
1
\frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=a_{j}^{(l)} \delta_{i}^{l+1}
∂Θij(l)∂J(Θ)=aj(l)δil+1
重要的是清楚地知道上面式子中上下标的含义:
l l l 代表目前所计算的是第几层。
j j j 代表目前计算层中的激活单元的下标,也将是下一层的第 j j j个输入变量的下标。
i i i 代表下一层中误差单元的下标,是受到权重矩阵中第 i i i行影响的下一层中的误差单元的下标。
9.3 反向传播算法的直观理解
δ j ( l ) \delta^{(l)}_{j} δj(l) 相当于是第 l l l 层的第 j j j 单元中得到的激活项的“误差”,即”正确“的 a j ( l ) a^{(l)}_{j} aj(l) 与计算得到的 a j ( l ) a^{(l)}_{j} aj(l) 的差。
而 a j ( l ) = g ( z ( l ) ) a^{(l)}_{j}=g(z^{(l)}) aj(l)=g(z(l)) ,(g为sigmoid函数)。我们可以想象 δ j ( l ) \delta^{(l)}_{j} δj(l) 为函数求导时迈出的那一丁点微分,所以更准确的说 δ j ( l ) = ∂ ∂ z j ( l ) c o s t ( i ) \delta^{(l)}_{j}=\frac{\partial}{\partial z^{(l)}_{j}}cost(i) δj(l)=∂zj(l)∂cost(i)
9.4 实现注意:展开参数
矩阵快速展开成向量。
Octava…
9.5 梯度检验
使用梯度下降时,可能会存在不易察觉的错误,导致最终结果不是最优解。
使用梯度的数值检验方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 θ \theta θ,我们计算出在 θ \theta θ-$\varepsilon $ 处和 θ \theta θ+$\varepsilon $ 的代价值($\varepsilon $是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ \theta θ 处的代价值。
9.6 随机初始化
在逻辑回归中,我们可以令所有参数为0,但这对于神经网络来说是不可行的。如果全0,第二层的所有激活单元都会是相同的值。
我们通常初始参数为正负ε之间的随机值。
9.7 小结
使用神经网络的步骤:
- 选择网络结构,多少层以及每层有多少单元。
- 参数随机初始化
- 正向传播计算 h θ ( x ) h_{\theta}(x) hθ(x)
- 计算代价函数 J J J
- 反向传播计算偏导
- 数值检验方法对偏导进行检验
- 使用优化算法来最小化代价函数
9.8 自动驾驶
使用梯度下降时,可能会存在不易察觉的错误,导致最终结果不是最优解。
使用梯度的数值检验方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 θ \theta θ,我们计算出在 θ \theta θ-$\varepsilon $ 处和 θ \theta θ+$\varepsilon $ 的代价值($\varepsilon $是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ \theta θ 处的代价值。
[外链图片转存中…(img-l1g0FPvY-1609068085245)]
9.6 随机初始化
在逻辑回归中,我们可以令所有参数为0,但这对于神经网络来说是不可行的。如果全0,第二层的所有激活单元都会是相同的值。
我们通常初始参数为正负ε之间的随机值。
9.7 小结
使用神经网络的步骤:
- 选择网络结构,多少层以及每层有多少单元。
- 参数随机初始化
- 正向传播计算 h θ ( x ) h_{\theta}(x) hθ(x)
- 计算代价函数 J J J
- 反向传播计算偏导
- 数值检验方法对偏导进行检验
- 使用优化算法来最小化代价函数
9.8 自动驾驶
神经网络学习重要例子。