第一章 神经网络如何工作
将修正值取为误差值的百分比,直觉上这是正确的:大误差意味着需要大的修正值,小误差意味着需要小的修正值。
有些类似于迭代算法。
分类器与预测器并无太大差别
接受输入并做出应有的预测,因此被称为预测器。
训练简单的分类器
用来训练预测器或者分类器的真实实例被称为训练数据。
我们希望能够找到一种可重复的方法,也就是用一系列的计算机指令来达到这个目标。计算机科学家称这一系列的指令为算法(algorithm)。
可以利用误差对分类器进行调整。
我们希望直线不要经过训练数据,而是稍微高于或者低于训练数据。
在机器学习中,我们应当适度改进(moderate)。
Δ A = L E x \Delta{A} = L \frac{E}{x} ΔA=LxE
其中的调节系数L通常称为学习率。
来自真实世界的训练样本可能充满噪声或包含错误,适度更新有利于限制这些错误样本的影响。
有时候一个分类器不足以求解问题
在一些任务中,根本性问题不是线性可分的,也就是说单一的一条直线于事无补。
我们可以使用多个分类器一起工作,这就是神经网络的核心思想。
神经元——大自然的计算机器
生物神经元与简单的线性函数不一样,不能简单地对输入做出响应,生成输出。神经元不会立即反应,而是会抑制输入,直到输入增强,强大到可以触发输出。
直观上,这是神经元不希望传递微小的噪声信号,而只是传递有意识的明显信号。只有超过了阈值(threshold),足够接通电路,才会产生输出信号。
S函数(Sigmoid function):
y = 1 1 + e − x y = \frac{1}{1 + e^{-x}} y=1+e−x1
初始使用完全连接形式的原因:
- 这种一致的完全连接形式事实上可以相对容易地编码成计算机指令
- 神经网络的学习过程中将会弱化那些实际上不需要的连接
在神经网络中追踪信号
学习到目前为止,学习到的神经网络的功能是给定神经元层数及每层的神经元数量,给定输入,通过激活函数计算输出。
初始权重可以不归一化。
x = ( 第 一 个 节 点 的 输 出 × 链 接 权 重 ) + ( 第 二 个 节 点 的 输 出 × 链 接 权 重 ) x = (第一个节点的输出\times链接权重)+(第二个节点的输出\times链接权重) x=(第一个节点的输出×链接权重)+(第二个节点的输出×链接权重)
凭心而论,矩阵乘法大有用途
[ w 1 , 1 w 2 , 1 w 1 , 2 w 2 , 2 ] [ i n p u t 1 i n t p u 2 ] = [ w 1 , 1 × i n p u t 1 + w 2 , 1 × i n p u t 2 w 1 , 2 × i n p u t 1 + w 2 , 2 × i n p u t 2 ] \begin{bmatrix} w_{1, 1} & w_{2, 1} \\ w_{1, 2} & w_{2, 2} \end{bmatrix} \begin{bmatrix} input_1 \\ intpu_2 \end{bmatrix} = \begin{bmatrix} w_{1, 1} \times input_1 + w_{2, 1} \times input_2 \\\\ w_{1, 2} \times input_1 + w_{2, 2} \times input_2 \end{bmatrix} [w1,1w1,2w2,1w2,2][input1intpu2]=⎣⎡w1,1×input1+w2,1×input2w1,2×input1+w2,2×input2⎦⎤
即:
X = W ⋅ I X = {W}\cdot{I} X=W⋅I
使用矩阵乘法的三层神经网络示例
第一层为输入层,最后一层为输出层,中间层我们称之为隐藏层。
最后,我们还需要将神经网络的输出值与训练样本中的输出值进行比较,计算出误差。我们需要使用这个误差值来调整神经网络本身,进而改进神经网络的输出值。
学习来自多个节点的权重
我们认为较大链接权重的链接需要分配更多的误差。
在使用神经网络时,在两件事情上使用了权重。第一件事情,使用权重将信号从输入向前传播到输出层;第二件事情,使用权重将误差从输出向后传播到网络中。通常将向后传播称为反向传播。
多个输出节点反向传播误差
根据权重来分割误差:
w 1 , 1 ′ = w 1 , 1 + e 1 × w 1 , 1 w 1 , 1 + w 2 , 1 w_{1, 1}^{'} = w_{1, 1} + e_1 \times \frac{w_{1, 1}}{w_{1, 1} + w_{2, 1}} w1,1′=w1,1+e1×w1,1+w2,1w1,1
w 2 , 1 ′ = w 2 , 1 + e 1 × w 2 , 1 w 1 , 1 + w 2 , 1 w_{2, 1}^{'} = w_{2, 1} + e_1 \times \frac{w_{2, 1}}{w_{1, 1} + w_{2, 1}} w2,1′=w2,1+e1×w1,1+w2,1w2,1
反向传播误差到更多层中
训练样本数据只给出了最终节点的输出,而没有给出其他任何层节点的输出。
第一个隐藏层节点的误差是与这个节点向前连接所有链接中分割误差的和。
e h i d d e n , 1 = e o u t p u t , 1 × w 1 , 1 w 1 , 1 + w 2 , 1 + e o u t p u t , 2 × w 1 , 2 w 1 , 2 + w 2 , 2 e_{hidden, 1} = e_{output, 1} \times \frac{w_{1, 1}}{w_{1, 1} + w_{2, 1}} + e_{output, 2} \times \frac{w_{1, 2}}{w_{1, 2} + w_{2, 2}} ehidden,1=eoutput,1×w1,1+w2,1w1,1+eoutput,2×w1,2+w2,2w1,2
使用矩阵乘法进行反向传播误差
联系上一节的内容,误差的反向传播矩阵为:
e h i d d e n = [ w 1 , 1 w 1 , 1 + w 2 , 1 w 1 , 2 w 1 , 2 + w 2 , 2 w 2 , 1 w 2 , 1 + w 1 , 1 w 2 , 2 w 2 , 2 + w 1 , 2 ] [ e 1 e 2 ] e_{hidden} = \begin{bmatrix} \frac{w_{1, 1}}{w_{1, 1} + w_{2, 1}} & \frac{w_{1, 2}}{w_{1, 2} + w_{2, 2}} \\\\ \frac{w_{2, 1}}{w_{2, 1} + w_{1, 1}} & \frac{w_{2, 2}}{w_{2, 2} + w_{1, 2}} \end{bmatrix} \begin{bmatrix} e_1 \\\\ e_2 \end{bmatrix} ehidden=⎣⎡w1,1+w2,1w1,1w2,1+w1,1w2,1w1,2+w2,2w1,2w2,2+w1,2w2,2⎦⎤⎣⎡e1e2⎦⎤
舍弃归一化因子(分母)后,上式变为:
e h i d d e n = [ w 1 , 1 w 1 , 2 w 2 , 1 w 2 , 2 ] [ e 1 e 2 ] e_{hidden} = \begin{bmatrix} w_{1, 1} & w_{1, 2} \\ w_{2, 1} & w_{2, 2} \end{bmatrix} \begin{bmatrix} e_1 \\ e_2 \end{bmatrix} ehidden=[w1,1w2,1w1,2w2,2][e1e2]
这与之前的正向传播相似:
[ w 1 , 1 w 2 , 1 w 1 , 2 w 2 , 2 ] [ i n p u t 1 i n t p u 2 ] = [ w 1 , 1 × i n p u t 1 + w 2 , 1 × i n p u t 2 w 1 , 2 × i n p u t 1 + w 2 , 2 × i n p u t 2 ] \begin{bmatrix} w_{1, 1} & w_{2, 1} \\ w_{1, 2} & w_{2, 2} \end{bmatrix} \begin{bmatrix} input_1 \\ intpu_2 \end{bmatrix} = \begin{bmatrix} w_{1, 1} \times input_1 + w_{2, 1} \times input_2 \\ w_{1, 2} \times input_1 + w_{2, 2} \times input_2 \end{bmatrix} [w1,1w1,2w2,1w2,2][input1intpu2]=[w1,1×input1+w2,1×input2w1,2×input1+w2,2×input2]
只是权重矩阵做了转置。
总的来说:
e r r o r h i d d e n = W h i d d e n o u t p u t T ⋅ e r r o r o u t p u t error_{hidden} = W_{hidden_output}^{T} \cdot error_{output} errorhidden=WhiddenoutputT⋅erroroutput
我们实际上如何更新权重
梯度下降:正梯度意味着要减小x值,负梯度意味着要增加x值。
∂ E ∂ w j , k \frac{\partial{E}}{\partial{w_{j, k}}} ∂wj,k∂E表示当权重 w j , k w_{j, k} wj,k发生变化时,误差E是如何改变的。
∂ E ∂ w j , k = ∂ ∂ w j , k ( t k − o k ) 2 \frac{\partial{E}}{\partial{w_{j, k}}} = \frac{\partial}{\partial{w_{j, k}}}(t_{k} - o_{k})^2 ∂wj,k∂E=∂wj,k∂(tk−ok)2
∂ E ∂ w j , k = ∂ E ∂ o k ⋅ ∂ o k ∂ w j , k = − 2 ( t k − o k ) ⋅ ∂ o k ∂ w j , k \frac{\partial{E}}{\partial{w_{j, k}}} = \frac{\partial{E}}{\partial{o_{k}}} \cdot \frac{\partial{o_{k}}}{\partial{w_{j, k}}} = -2(t_{k} - o_{k}) \cdot \frac{\partial{o_{k}}}{\partial{w_{j, k}}} ∂wj,k∂E=∂ok∂E⋅∂wj,k∂ok=−2(tk−ok)⋅∂wj,k∂ok
∂ s i g m o i d ( x ) ∂ x = s i g m o i d ( x ) ( 1 − s i g m o i d ( x ) ) \frac{\partial{sigmoid(x)}}{\partial{x}} = sigmoid(x)(1-sigmoid(x)) ∂x∂sigmoid(x)=sigmoid(x)(1−sigmoid(x))
∂ E ∂ w j , k = − ( t k − o k ) ⋅ s i g m o i d ( Σ j ( w j , k ⋅ o j ) ) ( 1 − s i g m o i d ( Σ j ( w j , k ⋅ o j ) ) ) ⋅ o j \frac{\partial{E}}{\partial{w_{j, k}}} = - (t_{k} - o_{k}) \cdot sigmoid(\Sigma_j(w_{j,k} \cdot o_j))(1 - sigmoid(\Sigma_j(w_{j,k} \cdot o_j))) \cdot o_j ∂wj,k∂E=−(tk−ok)⋅sigmoid(Σj(wj,k⋅oj))(1−sigmoid(Σj(wj,k⋅oj)))⋅oj
w i , j n e w = w i , j o l d − α ⋅ ∂ E ∂ w i , j w_{i,j}^{new} = w_{i,j}^{old} -\alpha \cdot \frac{\partial{E}}{\partial{w_{i, j}}} wi,jnew=wi,jold−α⋅∂wi,j∂E