神经网络的话,向前计算是容易地,基本上就是矩阵的乘法加上一点点激活函数的变换,所以这里不做笔记。
Backprop on NNet
下面对学习过程做一点笔记,backprop实际上就是偏导的链式法则
我们考虑的是平方误差,即
对于输出层,如下图绿框所示,我们对
en
e
n
关于第
L
L
层的权重做偏导
对于中间的隐含层,如红色框所示做偏导,有暂时不知道是什么,暂时设为 δ(l)j δ j ( l ) ,
下面再来处理
δ(l)j
δ
j
(
l
)
,如下图所示
我们发现
δ(l)j
δ
j
(
l
)
需要由所有的
δ(l+1)j
δ
j
(
l
+
1
)
得到,这样的话,结合GD,我们可以给出NN的权重更新算法
更新公式即
有时候不能让权重
Wij
W
i
j
过大,这是因为这会导致tanh函数的结果基本上集中在1附近,所以我们需要对
Ein
E
i
n
做点正则化,比如容易想到的是
∑(w(l)ij)2
∑
(
w
i
j
(
l
)
)
2
,不过似乎不是太好效果,往往使用下面这个标准化后的正则化条件。
autoencoder预训练
与PLA一样,如果一开始给定了合适的初值的话,收敛也好性能也好时间也好都有可能有较好的提升,所以我们也可以对NN进行预训练
即,首先仅仅依赖相近的两层,先将其权重预处理好,而不是random几个参数,
基本思想是:
weight就代表了把上一层的输出的信息做一个转换,亦或者说做一个编码,然后传输给下一层。如果我们能够让下一层接收到编码之后的信息所代表的信息是和上一层是基本一样的话,我们认为这就是好的weight
即如下图所示,我们希望能训练处
g(x)=x
g
(
x
)
=
x
一个不动点变换,这个思想还是蛮新颖的,隐含层保留了特征信息,那么由这些特征信息理论上也应该容易还原原来的信息。
可以采用平方误差,而输入则是
{(xn,xn)}
{
(
x
n
,
x
n
)
}
这样的形式,有时候如果要求更强一些,可以要求
W1ij=W2ji
W
i
j
1
=
W
j
i
2
,即解码器和编码器的权重是一样的,不过如何才能设置这个限制呢?还没做思考
有的时候为了让权重更加strong,我们可以对数据
{(xn,xn)}
{
(
x
n
,
x
n
)
}
加入一些噪声,比如令
(xn^=xn+noise)
(
x
n
^
=
x
n
+
n
o
i
s
e
)
,这样训练的话鲁棒性更好,这也属于一种regularization.
课程后面对将所有激活函数换成 h(x)=x h ( x ) = x 之后的情况进行了分析,直接变成了一个数值分析或者高等代数的习题2333(由此可以导出类似PCA的结果),这里不做赘述。可以查看这里。