人类大脑可以处理非常多的不同事情,但不需要用实现成千上万个不同的程序,只需要一个单一的学习算法,然后通过神经网络自学掌握如何处理这些不同类型的数据。神经网络算法是模拟大脑学习的一种很古老的且计算量偏大的算法。
2.6.1 神经网络算法基础
2.6.1.1 大脑中的神经网络
大脑神经元模型:树突接受输入信息,输入信息经由神经核根据自身的模型进行处理,由轴突将处理后的信息向其他神经元传递。
- 树突(Dendrite):信息输入单元,一个神经元可包含多个输入。
- 神经核(Nucleus):信息处理单元。
- 轴突(Axon):信息输出单元,一个神经元有且只有一个输出。
大脑神经网络模型:由大量神经元相互链接并通过电脉冲来交流的一个网络。
2.6.1.2 神经网络模型
神经元模型:
- \(x_0\)代表偏置量,固定值为1。
- \( g(z)= \frac {1}{1+e^{-z}} \) 为激励函数。
- 参数\(θ\)为权重。
- \(θ_0^{(1)}\) \(x_0\)为偏置,一般记为\(b\).
神经网络一般模型:
模型描述:训练集 \(\{(x^{(1)} , y^{(1)}) , (x^{(2)} , y^{(2)}) ,…, (x^{(m)} , y^{(m)})\}\) 有\(m\)个训练样本;神经网络总层数\(L=4\);每层网络的神经元个数 \(S_1=3;S_2=5;S_3=5;S_4=4\);输出层神经元个数个数\(S_L=4\);输出单元的个数\(K=4\);
- 输入层负责原始数据输入:\(x_1,x_2,x_3\)
- 隐藏层负责将数据进行处理,然后呈递到下一层, \(a_i^{(j)}\) 代表第\(j\)层第\(i\)个激活单元输出值。 如:第2层的第1、2、3激活单元的输出值为 \(a_1^{(2)} , a_2^{(2)} , a_3^{(2)}\)
- 输出层负责最终输出\(h_θ (x)\)。
- 神经网络中除输入层外每个神经元都包含有一个偏置\(b\)。
- \( θ^{(j)} \)代表从第\(j\)层映射到第\(j+1\)层时的权重矩阵。若神经网络在\(j\)层有\(m\)个单元,\(j+1\)层有\(n\)个单元,则\( θ^{(j)} \)的维度为\( n(m+1) \) 。
模型表示:\(x\)代表输入层矩阵,\(z\)代表中间层激活单元的带权输入值矩阵,\(a\)代表中间层激活单元输出值矩阵,\(θ\)代表每层的权重矩阵.
神经网络分类:
- 二类分类神经网络:\(S_L=1,yϵ\{0,1\}\)</br>
多类分类神经网络(\(K\)类分类:神经网络输出层有多个输出)
- 描述:
- 示例:训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层应该有四个值,输出层四个神经元分别用来表示4 类。
2.6.1.3 神经网络与逻辑回归
可以将逻辑回归看做是仅含有一个神经元的单层的神经网络。也可理解为神经网络来源于逻辑回归,神经网络只不过把逻辑回归中的输出重新变成了中间层的输入。
2.6.1.4 神经网络与逻辑函数构造
神经网络可以构造出基本的逻辑运算,通过逻辑运算的叠加,又可以构造出越来越复杂的函数。
逻辑与:\(x1,x_2∈{0,1} ; \ \ \ y= x1\ AND \ x_2\)
权重矩阵:\(θ=(-30,20,20)\)则:\(hθ (x)=g(-30+20x_1+20x_2)\),神经网络模型及真值表:
逻辑或:\(x1,x_2∈{0,1} ; \ \ \ y=x_1 \ OR \ x_2\)
权重矩阵:\(θ=(-10,20,20)\)则:\(hθ (x)=g(-10+20x_1+20x_2)\),神经网络模型为及真值表:
逻辑非:\(x1∈{0,1} ; \ \ \ \ \ y=NOT \ x_1\)
权重矩阵:\(θ=(10,-20)\)则:\(hθ (x)=g(10-20x_1)\),神经网络模型为为及真值表:
都取零结果才为1逻辑:\(x1,x_2∈{0,1} ; \ \ \ y=(NOT \ x_1 )AND (NOT \ x_2 )\)
权重矩阵:\(θ=(10,-20,-20)\)则:\(hθ (x)=g(10-20x_1-20x_2)\)
逻辑异或取反:\(x_1,x_2∈{0,1} \ \ \ \ y=x_1 \ XNOR \ x_2\)
权重矩阵:
2.6.2 神经网络梯度下降算法
神经网络代价函数:
- \(Hθ (x)ϵR^K, (Hθ (x))_k\) 为神经网络最后一层第\(k\)个输出。
- \(ι\)代表目前所计算的是第几层。
- \(j\)代表目前计算层中的激活单元的下标,也将是下一层的第\(j\)个输入变量的下标。
- \(i\)代表下一层中误差单元的下标,是受到权重矩阵中第\(i\)行影响的下一层中的误差单元的下标。
前向传播算法:
计算每一层激活单元的输出,每一个\(a\)都是由上一层所有的输入和每一个输入所对应的权重矩阵决定,把这样从左到右的算法称为前向传播算法。
反向传播算法:
计算代价函数的偏导数\(∂/(∂Θ_{ij}^{(l)}) J(θ)\)
算法思想:首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。</br>
算法演示:最后一层的误差是激活单元 \( ak^{(4)} \) 与实际值 \( y_k \) 之间的误差,记为 \( δ^{(4)} \) ,\( δ_j^{(l)} \)表示第\(ι\)层神经网络的第\(j\)个神经元的误差 </br>
第四层第j个神经元误差: $$δ_j^{(4)}=a_j^{(4)}-y_j\第四层误差:δ^{(4)}=a^{(4)}-y\
第三层误差:δ^{(3)}=(θ^{(3)})^Tδ^{(4)}.g^{‘}(z^{(3)})<=>δ^{(3)}=a^{(3)}.(1-a^{(3)})\第二层误差:δ^{(2)}=(θ^{(2)})^T δ^{(3)}.g^{‘} (z^{(2)})<=>δ^{(2)}=a^{(2)}.(1-a^{(2)})\第一层是输入变量,不存在误差:
δ^{(1)} 不存在\
\frac {∂}{∂θ{ij}^{(l)}} J(θ)=a_j^l δ_i^{l+1} 假设λ=0$$
神经网络梯度算法实现:
- 首先用正向传播方法计算出每一层的激活单元输出\(a^{(l)}\)。
- 其次利用训练集的结果与神经网络预测结果求出最后一层的误差。
- 然后利用该误差运用反向传播法计算出直至第二层的所有误差。
- 最后求得求得
2.6.3 神经网络算法应用
神经网络算法应用注意点:
梯度检验:
梯度检验的必要性:当对一个较为复杂的模型使用梯度下降算法时,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。可采取梯度数值检验的方法来计算的导数值是否和通过反向传播算法计算出的\( \frac {∂}{∂θ_{ij}^{(l)}} J(θ)\)大致相同。 </br>
梯度检验实现方法:对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的\(θ\),计算出在\(θ-ε\)和\(θ+ε\)代价值,\(ε\)是一个非常小的值,通常选取0.0001,然后求两个代价的平均,用以估计在\(θ\)处的代价值:
参数随机初始化:
- 任何优化算法都需要一些初始的参数,初始所有参数为0对于逻辑回归来说是可行的。
- 对于神经网络若令所有的初始参数都为0,这将意味着第二层的所有激活单元都会有相同的值。同理,如果初始所有的参数都为一个非0 的数,结果也是一样的。
- 通常初始参数为正负\(ε\)之间的随机值。
神经网络算法应用步骤:
第一步:选择网络结构决定选择多少层以及决定每层分别有多少个单元
- 确定第一层的单元数:训练集的特征数量。
- 确定最后一层的单元数:训练集的结果类的数量。
- 确定隐藏层的层数和每个隐藏层的单元数:若隐藏层数大于1,确保每个隐藏层的单元个数相同;隐藏层单元数取决于训练集的特征数量、输出的结果类的数量,一般大于训练集的特征数量;通常情况下隐藏层单元的个数越多越好。
第二步:训练神经网络
- 参数的随机初始化。
- 利用正向传播方法计算所有的\(x^{(i)}\)的\(H_θ (x^{(i)})\)。
- 编写计算代价函数\(J(θ)\)的代码。
- 利用反向传播方法计算所有偏导数,并利用梯度检验这些偏导数。
- 使用优化算法来最小化代价函数。