参数展开
在神经网络中,我们有一些参数矩阵,例如:
有时为了使用方便,需要将这些矩阵统一到一个向量中去
thetaVector = [ Theta1(:); Theta2(:); Theta3(:); ]
deltaVector = [ D1(:); D2(:); D3(:) ]
这样就合并了三个矩阵,
假如 是一个
的矩阵,
是一个
的矩阵,
是一个
的矩阵
则 thetaVector 是一个的矩阵
当要使用时,同样要将这一个向量,拆分成三个矩阵:
Theta1 = reshape(thetaVector(1:30),5,6)
Theta2 = reshape(thetaVector(31:60),5,6)
Theta3 = reshape(thetaVector(61:66),1,6)
随机初始化
在逻辑回归里,使用梯度下降算法时,需要初始化,这里可以设置成零向量
,元素全为0的向量。
但是在神经网络里,这样做不行。
举例说明,假设
...
这样
当反向传播时会发现每层的每个节点都是一样的,这样算法就会出现对称问题。
因此初始化的时候要随机一些初始值。初始化不同的随机址会打破对称问题。
将内每个值都随机在
之间。(
)
例如:
Theta1 = rand(10,11) * (2init_epsilon) - init_epsilon;
Theta2 = rand(1,11) * (2init_epsilon) - init_epsilon;
rand(x,y)是一个初始化一个 维的,其内之在0, 1之间的随机值。
梯度检验(Gradient Checking)
在使用反向传播算法时,因为反向传播有很多复杂的细节,这些细节会导致一些bug,虽然代价函数的值在减小,但是可能的结果和实际的还是有很大误差。
梯度检验可以减少这种错误的概率。
在数学上
PS:这个和初始化随机的参数不一样
是一个很小的值,例如
对于多个
epsilon = 1e-4;
for i = 1:n,
thetaPlus = theta;
thetaPlus(i) += epsilon;
thetaMinus = theta;
thetaMinus(i) -= epsilon;
gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;
将反向传播计算的DVec和梯度校验计算的gradApprox比较一下,两者一致则说明算法没有问题。但是在最终使用反向传播取训练样本集时,关掉梯度校验,因为这个非常耗时。
隐藏层
每个隐藏层的单元数理论上越多准确度越好,但是实际上为了和计算成本平衡,需要选择何时的隐藏层单元数量。一般隐藏层单元数目稍大于输入层的特征值数。
隐藏层的数量越多,算法准确度越高,相应的计算成本也会增高,一般来说1个隐藏层。如果有多个隐藏层,建议在每个隐藏层中使用相同数量的单元。
转载自:
https://codeeper.com/2020/01/20/tech/machine_learning/neural_network_backpropagation.html
网友评论