编程作业放到了github上:coursera_machine_learning
Neural Network: Learning
上一周的课程中讲了神经网络的结构以及正向传播(feed forward)过程,了解了神经网络是如何进行预测的,但是预测的结果怎么和真是结果进行比较以及发现了错误如何修改还没有提及。
这一周的课程中,介绍了cost function作为结果比较的标准以及backpropagation方法作为错误修改的方式。
1. Cost Function
Linear regression使用平方差来表示结果之间的差距:
Logistic regression使用negative log来表示结果之间的差距:
Neural network实际上就是k个Logistic regression的一个集合,所以其cost function也是negative log的一个集合。整个网络产生的error其实就是每一个Logistic regression产生的error的和。
但是这里需要注意的是,在这里的k个分类器只关心“是”,并不关心“不是”,也就是说,只关心 y(i)k^=1 的概率,并不想知道道 y(i)k^=0 的概率,所以这里的cost function只要前面计算 y(i)k^=1 的error的一项即可。
另外惩罚函数就是每一层中所有权值的平方和:
又因为
y(i)
是一个one-hot向量,所属类别
c
处为1,即
2. Backpropagation
在Logistic regression中,模型是向着error的负梯度方向更新的,所以需要计算cost function的梯度,这在Neural Networks中也是如此,只不过这次的权值 θ 多了一些,需要一层一层慢慢求解了。
假设神经网络有4层:
先来回顾一下,一条训练数据的正向传播的情况,这次我们不把bias直接加到矩阵中去了,把它拿出来,令为 b(i) ,是一个列向量:
决定模型的有两种参数–权值weights Θ 和偏置bias b ,所以要求这两种参数的偏导:
先求最后一层的残差
接着求最后一层的权重 Θ(3) 和偏置 b(3) :
接着求倒数第二层的残差 δ(L−1) :
接着求倒数第二层的权重 Θ(2) 和偏置 b(2) :
接着求倒数第三层的残差 δ(L−1) :
接着求倒数第三层的权重 Θ(2) 和偏置 b(2) :
至此,所有的偏导都求完了,总结一下:
3. Gradient Checking
如果梯度计算不正确,那整个模型都错了。最惨的是,在训练了几个小时之后发现梯度算错了。所以梯度计算完之后,需要验算一下对不对。
梯度可以如下约等于:
验算过程如下:
4. Random Initialization
模型中权重和偏置的初始值可以随便设成任何数字,但是设置成什么样直接决定了模型收敛的快慢和程度,进而影响模型的performance。
把权重和偏置初始化为0非常不好。因为在前向传播过程中,全部初始化成0,则结果就是0,在得到残差之后,反向传播过程中,残差根据权重进行分配,因为权重全部为0,所以隐藏层的残差为0,即权重不更新,所以不能全部初始化成0,权重为0的神经元是死掉的,是不会更新的。
另外全部初始化成同样的数字也是不好的,模型将一直以同样的方式更新这些神经元。反向传播过程中,残差根据权重进行分配,因为权重都相同,所以权重的更新也是相同的,所以网络中的每一个神经元都是一样的。
一般从均匀分布中随机初始化权重和偏置,比如: