一、神经网络背景
神经网络的灵感来源与人的大脑。实验证明大脑利用同一个学习算法实现了听觉、视觉等等所有的功能,这也是神经网络算法美好的愿景。
神经网络算法在八十到九十年代被广泛使用过, 20世纪90年代,各种各样的浅层机器学习模型相继被提出,例如支撑向量机(SVM,Support Vector Machines)、 Boosting、最大熵方法(如LR,Logistic Regression)等。但之后便使用的变少了。但最近又开始流行起来了,原因是神经网络非常依赖计算能力的算法,随着新计算机性能的提高,算法又成为了有效的技术。
二、神经网络模型表达
神经网络模型与人类神经元特别相似。
逻辑回归的激活函数
第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏倚单位(bias unit):X0,
下面引入一些标记法来帮助描述模型:
代表第j层的第i个激活单元。
三、正向传播
对于上面的神经网络我们可以计算第二层的值为:
计算后加上
根据第二层的值计算出第三层的值。
正向传播就是如此,从输入参数到最终结果
四、多类分类
如果输出结果超过两个我们使用多个输出节点,比如我们训练一个算法用来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。例如,第一个值为1或0用于预测是否是行人,第二个值用于判断是否为汽车。
下面是该神经网络的可能结构示例:
下面是该神经网络的可能结构示例:
神经网络算法的结果可能为这四种之一:
五、神经网络的代价函数(cost function)
我们还记得逻辑回归中的代价函数
其实只要理解Cost function反映的就是预测值与实际值的误差,那么完全可以根据问题自定义一个Cost function表达式。在Coursera Machine Learning课程中将神经网络看作是输出层采用逻辑回归的分类器,因此其代价函数如下:
![](https://i-blog.csdnimg.cn/blog_migrate/87ac283e3abc9237e09c2ef34c9c17b8.png)
其中 :
L代表一个神经网络中的层数
Sl
代表第l层的处理单元(包括偏见单元)的个数。
SL代表最后一层中处理单元的个数。
K代表我们希望分类的类的个数,与SL相等。
六、反向传播(BACKPROPAGATION )
反向传播算法就是首先计算最后一层的误差,然后再一层一层反向求出各层误差,直到倒数第二层。
因为第一层是输入变量不存在误差。
因为第一层是输入变量不存在误差。
首先,我们引入 符号 δ ,解释如下:
![](https://i-blog.csdnimg.cn/blog_migrate/417d7bada17d5ef566d60813849f0003.png)
代表了第 l 层的第 j 个节点的误差。
那么,各层各节点的error计算如下:
![](https://i-blog.csdnimg.cn/blog_migrate/9244b655e34ddfc89d1995d0e2907c96.png)
其中,
![](https://i-blog.csdnimg.cn/blog_migrate/badc0c787f51cf260959e983723f3af5.png)
我们有了所有的误差表达式后,便可以计算代价函数的导数了。假设λ=0,即我们不做任何归一化处理时有:
重要的是清楚地知道上面式子中上下标的含义:
l代表目前所计算的是第几层。
j代表目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标。
i代表下一层中误差单元的下标,是受到权重矩阵中第i行影响的下一层中的误差单元的下标。
l代表目前所计算的是第几层。
j代表目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标。
i代表下一层中误差单元的下标,是受到权重矩阵中第i行影响的下一层中的误差单元的下标。
在求出了之后,我们便可以计算代价函数的偏导数了,计算方法如下:
七、 梯度检查(Gradient Checking)
当我们对一个较复杂的模型使用 梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。
Octave中代码如下:
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
多参数使用公式:
![](https://i-blog.csdnimg.cn/blog_migrate/85ccbb3277b2e389fa5a9194c26fbea5.png)
八、随机初始化(Random Initialization)
我们不能式用全0或者全部相同数字来初始化参数。如果使用全0则会计算出相同的a1,a2。
那就意味着所有映射关系都是相同的,即所有的隐藏单元都在计算相同的激励值,那么多单元神经网络就是多余的,最终该网络只会得到一个特征。这被称为对称权重(Symmetric ways)。
我们使用随机初始化解决这种问题:
ɛ 的取值:
![](https://i-blog.csdnimg.cn/blog_migrate/4b0da2189be75184e37fd71101b8a8ff.png)
Θ 的初始化:
![](https://i-blog.csdnimg.cn/blog_migrate/5280501a8813c0ee22bec13a255da79f.png)