在开始训练模型之前,我们应该学习的一个重要主题是权重初始化。 错误的权重初始化可能导致“从不收敛训练”或缓慢的训练。
权重矩阵格式如下:
将输出f(an)(out)的数量视为行,将输入f(an)(in)的数量视为列。 您还可以考虑另一种格式:
这里f(an)(out) 为列,f(an)(in) 为行。
如果将权重初始化为零,则梯度下降将永远不会收敛:
用小值初始化:
一个更好的主意是使用接近零(但不为零)的值初始化权重,即:0.01
在这里,randn给出均值为零,单位标准偏差为零的随机数据。 是输入和输出的数量。 0.01项将使随机权重保持较小并接近零。
前一种初始化方法的问题在于,输出的方差将随输入数量的增加而增加。 为了解决这个问题,我们可以将随机项除以输入数量的平方根。
现在看来我们没有死亡的神经元,这种方法的唯一问题是将其与Relu神经元一起使用。
要解决此问题,只需添加一个简单的(除以2)项即可。…
因此,使用第二种形式来初始化Relu层。
功能缩放:
为了简化梯度下降算法的寿命,可以在训练/测试阶段将一些技术应用于您的数据。 如果输入向量上的特征超出比例,则损失空间将以某种方式拉伸。 这将使梯度下降收敛更困难,或者至少更慢。
在下面的示例中,您的输入X具有2个功能(房屋大小和卧室数量)。 问题在于房屋大小范围从0 … 2000,而卧室数范围从0 … 5。
集中数据并规范化:
在下面,我们将预处理输入数据以解决以下问题:1)数据不在零附近;2) 功能超出比例。
考虑您的输入数据 X = [N(x)D],其中N是输入数据上的样本数(批次大小),D是尺寸(在上一个示例中D是2,大小房屋,数量卧室)。
首先要做的是减去输入数据的平均值,这将使数据分散集中在零附近: X= X – np.mean(X,axis = 0)。
在预测阶段通常会存储要从测试示例中减去的平均值。 在图像分类的情况下,通常还可以将由一批图像创建的平均值图像存储在训练集中,或者将每个通道的平均值存储起来。将数据集中在零附近后,可以通过将X除以标准偏差来使所有要素具有相同的范围:X = X/np.std(X,axis = 0)
再次,此操作解决了我们的第一个问题,因为所有功能的范围都相似。 但是,如果您以某种方式知道功能具有相同的“权重”,则应使用此功能。 例如,在图像分类的情况下,所有像素都具有相同的范围(0…255),而一个像素本身的含义(权重)没有另一个像素更大的含义,因此,均值减法就足以满足图像分类的需要。
常见的错误:
关于预处理的重要一点是,任何预处理统计信息(例如数据均值)都必须仅在训练数据上计算,然后应用于验证/测试数据。 计算平均值并将其从整个数据集中的每个图像中减去,然后将数据拆分为训练/验证/测试拆分将是一个错误。 取而代之的是,必须仅对训练数据计算平均值,然后从所有分割(训练/验证/测试)中平均减去该平均值。