目录
习题4-1 对于一个神经元编辑,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢。
习题4-5 如果限制一个神经网络的总神经元数量(不考虑输入层)为N+1,输入层大小为编辑,输出层大小为1,隐藏层的层数为L,每个隐藏层的神经元数量为编辑,试分析参数数量和隐藏层层数L的关系。
习题4-7 为什么在神经网络模型的结构化风险函数中不对偏置b进行正则化?
习题4-8 为什么在用反向传播算法进行参数学习时要采用随机参数初始化的方式而不是直接令W=0,b=0?
习题4-9 梯度消失问题是否可以通过增加学习率来缓解?
总结
习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢。
分析一下这句话,首先采用的是Sigmoid函数,且函数的性质,如图所示
代码如下:
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
y = 1 / (1 + np.exp(-x))
return y
x = np.linspace(start=-5, num=50, stop=5)
plt.figure()
y = sigmoid(x)
plt.plot(x, y)
# 设置坐标轴
ax = plt.gca()
# 取消右侧和上侧坐标轴
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 设置默认的x轴和y轴方向
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# 设置坐标原点为(0,0)
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
plt.title('f(x)=Sigmoid')
plt.figure()
y = y * (1 - y)
plt.plot(x, y)
plt.title('f\'(x)')
# 设置坐标轴
ax = plt.gca()
# 取消右侧和上侧坐标轴
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
# 设置默认的x轴和y轴方向
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# 设置坐标原点为(0,0)
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
plt.show()
零均值化是什么?
零均值化是一种常见的数据预处理方法,也称为特征中心化。它通过将数据减去其均值,使得数据的均值变为0。具体而言,对于输入数据集X,零均值化的过程可以表示为 X_new = X - mean(X),其中mean(X)是数据集X的均值。
同时根据对Sigmoid梯度的观察我们得到了问题的答案,数据经过零均值化后,使得输入的数据分布接近零中心。从而使梯度大小和方向更加稳定(可见Sigmoid梯度的函数在零中心附近的分布),从而提高收敛的速度。
扩展
为什么要采取零均值化或者说零均值化有什么好处?
增加收敛速度:零均值化可以使数据的分布接近零中心,消除数据中的偏差。这有助于减少梯度下降过程中的震荡现象,使得优化算法更快地找到全局最优解或局部最优解,从而加快模型的收敛速度。
提高模型的稳定性:如果数据的均值较大,那么梯度更新的幅度也会相应增大。这可能导致模型训练过程不稳定,难以获得良好的收敛性能。通过零均值化,可以减小梯度的幅度,使得优化过程更加稳定,从而提高模型的稳定性和可靠性。
增加模型的泛化能力:零均值化可以减小特征之间的尺度差异,使得不同特征的权重更加平衡。这可以避免某些特征对模型训练的主导影响,从而提高模型的泛化能力。通过零均值化,模型能够更好地学习特征之间的关系,提高对新样本的预测准确性。
降低模型过拟合的风险:过拟合是指模型在训练集上表现良好,但在测试集或新样本上表现不佳的现象。零均值化可以帮助降低模型过拟合的风险,因为它有助于减小特征之间的相关性和共线性,提高模型对新数据的泛化能力。
预处理的其他常用的操作:
1.特征缩放:将输入数据按比例缩放到一定范围内,如[0, 1]或[-1, 1]。常用的特征缩放方法包括最小-最大缩放和标准化。
最小-最大缩放(Min-Max Scaling):将数据线性映射到指定的范围内,公式为 X_scaled = (X - min(X)) / (max(X) - min(X))。
标准化(Standardization):将数据转化为均值为0,标准差为1的标准正态分布。标准化的公式为 X_scaled = (X - mean(X)) / std(X)。
2.特征编码:对于分类任务中的类别型特征,可以使用独热编码(One-Hot Encoding)将其转换为二进制表示,以便神经网络能够更好地处理。
预处理的好处:
- 提高模型性能:预处理可以使得数据更适合于神经网络的训练,从而提高模型的性能和泛化能力。
- 改善优化过程:通过预处理,可以减小梯度下降的不稳定性,加快优化过程的收敛速度。
- 减少模型偏见:预处理可以去除数据中的偏差,使得模型更加公正地学习特征之间的关系。
- 提高模型鲁棒性:通过预处理可以减小数据的尺度差异,增加模型对噪声和异常值的鲁棒性。
习题4-5 如果限制一个神经网络的总神经元数量(不考虑输入层)为N+1,输入层大小为,输出层大小为1,隐藏层的层数为L,每个隐藏层的神经元数量为,试分析参数数量和隐藏层层数L的关系。
首先,对于一个前馈神经网络,参数主要包括权重和偏置,层与层之间是全连接。
假设隐藏层平分所有神经元,且能完整平分
可以把神经网络分成三部分
-
输入层到第一个隐藏层之间的参数数量:
- 权重:需要连接输入层的每个神经元与第一个隐藏层的每个神经元,共有个权重。
- 偏置:由于每个隐藏层的神经元数量都是 ,所以第一个隐藏层共有 个神经元,因此需要 个偏置。
-
第一个隐藏层到最后一个隐藏层之间的参数数量:
- 权重:每个隐藏层之间的连接都满足每个神经元与其他神经元之间都有权重连接,因此共有个权重。
- 偏置:由于每个隐藏层的神经元数量都是 ,所以从第二个隐藏层到最后一个隐藏层共有个偏置。
-
最后一个隐藏层到输出层之间的参数数量:
- 权重:需要连接最后一个隐藏层的每个神经元与输出层的神经元,共有 个权重。
- 偏置:因为输出层只有一个神经元,所以只需要1个偏置。
综上所述,参数数量的计算公式为:
大概化简一下
咳咳,看不出来单调性,虽然我们都知道一定是单调增的
代数法!!!
-
当L=1时,即只有一个隐藏层
-
当L=2时,有两个个隐藏层
到此我好像都没弄清楚到底是不是递增的嘶,插个眼,等晚点回来再算,现在脑子有点迷糊
习题4-7 为什么在神经网络模型的结构化风险函数中不对偏置b进行正则化?
在神经网络模型中,偏置 b 是每个神经元的偏移量,用于控制神经元的激活水平。虽然偏置b和权重w具有类似的作用,都是调整神经元的输出,但两者的性质有所不同。权重 w 在模型训练过程中是需要更新的,通过反向传播算法来进行梯度下降更新。正则化可以有效地控制权重的大小,抑制过拟合现象。而对于偏置 b,它不同于权重 w,一般情况下是初始化为 0 或者随机值,而不是需要训练得到的。因此,在训练过程中不需要对偏置b进行正则化操作,因为偏置 b本身不会引起过拟合问题。
并且如果对b进行惩罚,其实是没有作用的,因为在对输出结果的贡献中,参数b对于输入的改变是不敏感的,不管输入改变是大还是小,参数b的贡献就只是加个偏置而已。举个例子,如果你在训练集中,w和b都表现得很好,但是在测试集上发生了过拟合,b是不背这个锅的,因为它对于所有的数据都是一视同仁的(都只是给它们加个偏置),要背锅的是w,因为它会对不同的数据产生不一样的加权。
更直白的说,偏置在偏导中是为0的是不对对模型参数引起改变,真正会引起不良改变的是w。
顺便提一下,吴恩达老师说,其实是可以对b加偏置的,但是没必要,因为做不做没什么区别,所以这也是个不加正则化的理由吧~老师的视频链接
习题4-8 为什么在用反向传播算法进行参数学习时要采用随机参数初始化的方式而不是直接令W=0,b=0?
-
对称性破坏: 当所有的权重和偏置都被初始化为零时,神经网络中每个隐藏层的所有神经元将是对称的。这样一来,在反向传播过程中,梯度的更新会变得对称,导致每个隐藏层的神经元始终更新相同的梯度。结果是,无论网络有多少层,它们最终都会执行相同的功能,失去了多层网络的优势,这种现象称为对称权重现象。
-
防止陷入局部最优解: 如果所有的参数都初始化为零,那么所有的神经元在前向传播过程中将会计算相同的值,从而导致在反向传播过程中梯度也相等。这将使得神经网络更容易陷入局部最优解。通过随机初始化,我们可以给每个参数赋予一个随机的初始值,增加了网络发现全局最优解的可能性,并且能够更好地逃离局部最优解。
偷的学长的一个图(因为我跑了半天,没跑出来这个图,咳咳),很明确的指出,对称权重的危害!!!二分类准确率维持为50%左右,说明模型没有学到任何内容。反向更新毫无效果,训练和验证loss几乎没有怎么下降。
除了随机参数初始化,我们还可以怎样令网络避免对称权重现象?
Dropout正则化:Dropout是一种通过随机断开网络中某些神经元连接的方法,在网络的训练过程中起到随机删除部分神经元的作用。Dropout可以有效避免对称权重现象,因为它可以防止网络中某些神经元过于强调某些输入特征,从而保证了每个神经元都学习到不同的特征。同时,Dropout还可以有效地防止过拟合,提高了模型的泛化能力。
习题4-9 梯度消失问题是否可以通过增加学习率来缓解?
梯度消失问题是指。在深度神经网络中,随着反向传播算法向前传递梯度时,梯度逐渐变小到接近于零的现象
增加学习率在一定程度上可以缓解。适当增大学习率可以使学习率与导数相乘结果变大,缓解梯度消失;过大学习率可能梯度巨大,导致梯度爆炸。
为缓解梯度消失问题,可以考虑以下方法:
-
使用激活函数:选择合适的激活函数可以缓解梯度消失问题。例如,ReLU (Rectified Linear Unit) 激活函数能够有效地抑制梯度消失,并且在实际应用中被广泛使用。
-
权重初始化:合理的权重初始化可以减少梯度消失问题。通过选取适当的初始化方法,如Xavier或He初始化,可以使得权重具有合理的范围和分布,有助于梯度的传播和避免梯度消失。
-
使用批归一化(Batch Normalization):批归一化可以加速模型的训练过程,同时有助于缓解梯度消失问题。它通过对每一层的输入进行归一化操作,使得数据分布更加稳定,有利于梯度的传播。
-
调整网络结构:合理设计网络结构也可以减轻梯度消失问题。例如,使用残差连接(Residual Connections)可以使得信息更容易跨层传播,从而避免梯度逐渐消失。
总之,增加学习率并不是解决梯度消失问题的有效方法。合理选择激活函数、权重初始化,使用批归一化和调整网络结构等方法更为可靠。
总结
本次作业其实总体来说比较简单,很多东西好像在写实验的博客的时候都接触过,这次作业就像一个汇总,把零零碎碎之前写过的一些知识点合起来写一个博客,但是也是有新收获的,之前虽然考虑过为什么不对b做偏置,但是后来因为自己懒还是没有明确,这次作业也算是一个敲响自己的警钟了, 以后不能随便偷懒,万一面试等等环境遇到,岂不是亏死!!!fighting!
参考
4.3 正则化_哔哩哔哩_bilibili
【精选】NNDL 作业4:第四章课后题-CSDN博客