最近在学习《动手学深度学习》,结合百度和课后的大家的讨论(侵删),整理出这一份可能并不完全正确的参考答案(菜鸡的做题记录),因为个人水平有限,有错误的地方欢迎在 公众号 联系我,后面我对错误进行更正时候,会在文章末尾鸣谢,在这里先感谢大家了。
在我的 公众号 中会有 清晰的pdf版本 给到大家,pdf中 代码 可以直接复制实践 ,欢迎大家关注我的 公众号 ,发送神秘代码:d2l4,即可获得本章的pdf版本。(求大佬们关注下吧,公众号关注者人丁稀少,嘤嘤嘤)
求求关注下我的CSDN吧,后面会继续更新答案的,然后还有最近读的一些文章的里面一些创新点和自己的想法都会整理出来的。(求大佬们关注下吧,嘤嘤嘤)
1.计算pReLU激活函数的导数。
①当x>0时
p R e L U ( x ) = x pReLU(x)=x pReLU(x)=x
d d x p R e L U ( x ) = 1 \frac{d}{dx}pReLU(x)=1 dxdpReLU(x)=1
①当x<0时
p R e L U ( x ) = α x pReLU(x)=\alpha x pReLU(x)=αx
d d x p R e L U ( x ) = α \frac{d}{dx}pReLU(x)=\alpha dxdpReLU(x)=α
2.证明一个仅使用ReLU(或pReLU)的多层感知机构造了一个连续的分段线性函数。
ReLU的神经网络可以严格等于任何(有限段)分段线性函数。任何(有限区间上)连续函数,总可以在任给定的误差下,用(有限段)分段线性函数近似。对于有限个间断点的函数,可以在间断点附近挖掉任意小的小区间,在外面用连续函数近似。参考文献:UNDERSTANDING DEEP NEURAL NETWORKS WITH RECTIFIED LINEAR UNITS。
3.证明 tanh(x)+1=2sigmoid(2x) 。
t a n h ( x ) + 1 = 1 − e x p ( − 2 x ) 1 + e x p ( − 2 x ) + 1 = 2 1 + e x p ( − 2 x ) = 2 s i g m o i d ( 2 x ) \begin{aligned} tanh(x)+1&=\frac{1-exp(-2x)}{1+exp(-2x)}+1\\ &=\frac{2}{1+exp(-2x)}\\ &=2sigmoid(2x) \end{aligned} tanh(x)+1=1+exp(−2x)1−exp(−2x)+1=1+exp(−2x)2=2sigmoid(2x)
4.假设我们有一个非线性单元,将它一次应用于一个小批量的数据。你认为这会导致什么样的问题?
数据可能会被剧烈的拉伸或者压缩,可能会导致分布的偏移,并且与后面的神经元对接后可能会损失一定的特征。
6.如果要构建多个超参数的搜索方法,你能想到的最聪明的策略是什么?
启发式搜索?
1.尝试添加不同数量的隐藏层(也可以修改学习率),怎么样设置效果最好?
。。。
2.尝试不同的激活函数,哪个效果最好?
一般情况下,在不知道选择什么的情况下,选用ReLU一族的激活函数不会让你失望。
3.尝试不同的方案来初始化权重,什么方法效果最好?
可以在torch.nn.init中查看一下,平常kaiming_normal_用的比较顺手。
1.你能准确地解出这个多项式回归问题吗?提示:使用线性代数。
令 Y ^ = X W , 其 中 X = ( 1 , x , x 2 2 ! , x 2 3 ! ) 令\hat Y=XW,其中X=(1,x,\frac{x^2}{2!},\frac{x^2}{3!}) 令Y^=XW,其中X=(1,x,2!x2,3!x2)
W 解 析 解 使 得 L o s s = ∣ ∣ Y − Y ^ ∣ ∣ 2 最 小 W解析解使得Loss=||Y-\hat Y||_2最小 W解析解使得Loss=∣∣Y−Y^∣∣2最小
L o s s = ( Y − X W ) T ( Y − X W ) = Y T Y − W T X T Y − Y T X W + W T X T X W = Y T Y − 2 Y T X W + W T X T X W \begin{aligned} Loss&=(Y-XW)^T(Y-XW)\\ &=Y^TY-W^TX^TY-Y^TXW+W^TX^TXW\\ &=Y^TY-2Y^TXW+W^TX^TXW \end{aligned} Loss=(Y−XW)T(Y−XW)=YTY−WTXTY−YTXW+WTXTXW=YTY−2YTXW+WTXTXW
则 δ L δ W = − 2 X T Y + 2 X T X W 则\frac{δL}{δW}=-2X^TY+2X^TXW 则δWδL=−2XTY+2XTXW
令 δ L δ W = 0 , 得 W = ( X T X ) − 1 X T Y 令\frac{δL}{δW}=0,得W=(X^TX)^{-1}X^TY 令δWδL=0,得W=(XTX)−1XTY
则 y = w 1 ∗ 1 + w 2 ∗ x + w 3 ∗ x 2 2 ! + w 4 ∗ x 2 3 ! 则y=w_1*1+w_2*x+w_3*\frac{x^2}{2!}+w_4*\frac{x^2}{3!} 则y=w1∗1+w2∗x+w3∗2!x2+w4∗3!x2
2.略
3.如果你不对多项式特征xi进行标准化(1/i!),会发生什么事情?你能用其他方法解决这个问题吗?
这样可以避免很大的i带来的特别大的指数值,如果不对此进行标准化,在优化的时候可能会带来特别大的非常大的梯度值或损失值;
对数据先取对数,对次数高的数据进行压缩,其实也是可以的。
4.你能期待看到泛化误差为零吗?
这个是不行的,因为数据带有一定的噪声,不可能完全的拟合。
1.在本节的估计问题中使用λ的值进行实验。绘制训练和测试精度关于λ的函数。你观察到了什么?
λ 增加的时候,即惩罚项在目标函数中的权重随之提高,体现在训练集上面精度会略微降低,在测试集上面训练的精度会提高,这是因为过程中的过拟合现象会随着 λ 的提升会有明显的改善,所以训练精度有减低,测试集上面精度上升。
但也不是 λ 越大越好,当 λ 过大时,会对训练误差产生很严重的扰动。
2.使用验证集来找到最佳值λ。它真的是最优值吗?这有关系吗?
并不是的,其实验证集上面的分布和真实分布都是会有一定的区别的,但是相近,只能说找出来的 λ 会是一个较优解,寻找较优的参数 λ 可以参考下面的链接:利器中的利器:深度学习的实战要点。
3.如果我们使用 ∑i|wi| 作为我们选择的惩罚 (L1 正则化),那么更新方程会是什么样子?
δ ∑ i ∣ w i ∣ δ w i = s g n ( w i ) \frac{δ\sum_i|w_i|}{δw_i}=sgn(w_i) δwiδ∑i∣wi∣=sgn(wi)
则 w ← ( 1 − η λ s g n ( w ) ) w − η ∣ β ∣ ∑ i ∈ β x ( i ) ( w T x ( i ) + b − y ( i ) ) 则w\leftarrow (1-\eta \lambda sgn(w))w-\frac {\eta}{|\beta|}\sum_{i\in \beta}x^{(i)}(w^Tx^{(i)}+b-y^{(i)}) 则w←(1−ηλsgn(w))w−∣β∣ηi∈β∑x(i)(wTx(i)+b−y(i))
4.我们知道 ∥w∥2=w⊤w 。你能找到类似的矩阵方程吗(见 2.3.10节 中的Frobenius范数)?
Frobenius范数相当于开方的∥w∥2
5.回顾训练误差和泛化误差之间的关系。除了权重衰减、增加训练数据、使用适当复杂度的模型之外,你还能想出其他什么方法来处理过拟合?
Dropout,或者先用PCA处理减少一定的次要特征,或者加大数据量。
6.在贝叶斯统计中,我们使用先验和似然的乘积,通过公式P(w∣x)∝P(x∣w)P(w)得到后验。如何得到带正则化的P(w)?
私以为这里中文翻译有点奇怪,英文原文是:In Bayesian statistics we use the product of prior and likelihood to arrive at a posterior via P(w∣x)∝P(x∣w)P(w) . How can you identify P(w) with regularization?
翻译过来感觉应该是 P(w) 与 正则化(regularization) 的联系。
那么可以解释为,优化w的过程其实是一个argmax后验概率P(w∣x)的过程
a r g m a x P ( w ∣ x ) ⟺ a r g m a x P ( x ∣ w ) P ( w ) ⟺ a r g m i n ∑ − l n P ( x i ∣ w ) − l n P ( w ) argmaxP(w|x)\iff argmaxP(x∣w)P(w)\iff argmin\sum-lnP(x_i|w)-lnP(w) argmaxP(w∣x)⟺argmaxP(x∣w)P(w)⟺argmin∑−lnP(xi∣w)−lnP(w)
假 设 P ( w ) 服 从 一 定 的 分 布 , 化 简 出 来 就 是 正 则 化 项 了 假设P(w)服从一定的分布,化简出来就是正则化项了 假设P(w)服从一定的分布,化简出来就是正则化项了
例 : 若 w ∼ N ( 0 , σ 2 ) , 则 P ( w ) ∼ e x p ( ∣ ∣ w i ∣ ∣ 2 2 σ 2 ) 例:若w∼N(0,\sigma^2),则P(w)∼exp(\frac{||w_i||_2}{2\sigma^2}) 例:若w∼N(0,σ2),则P(w)∼exp(2σ2∣∣wi∣∣2)
则 − l n P ( w ) ∼ − ∣ ∣ w i ∣ ∣ 2 2 σ 2 , 令 λ = 1 2 σ 2 , 则 − l n P ( w ) ∼ λ ∣ ∣ w i ∣ ∣ 2 则-lnP(w)∼-\frac{||w_i||_2}{2\sigma^2},令\lambda=\frac{1}{2\sigma^2},则-lnP(w)∼\lambda||w_i||_2 则−lnP(w)∼−2σ2∣∣wi∣∣2,令λ=2σ21,则−lnP(w)∼λ∣∣wi∣∣2
这其实就是 P(w) 与 正则化(regularization) 的联系。
同样的,还有一些很有趣的分布和他们的正则化项(参考链接):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sp8of1C9-1651919001181)(E:\d2l\4\1.png)]
1.如果更改第一层和第二层的暂退法概率,会发生什么情况?具体地说,如果交换这两个层,会发生什么情况?设计一个实验来回答这些问题,定量描述你的结果,并总结定性的结论。
在实验中发现,在误差允许的范围内其实差别不大,第一层暂退法概率大点,第二层暂退法概率小点效果会略微优一点。猜测原因可能有:①前面层抽取的是比较底层的语义信息,有较多的无用信息冗余通过强神经元,从而使得网络记住这些冗余信息而学不到关键信息(导致过拟合),用较大Dropout较好,后面层主管高层抽象语义信息,较为关键,是把握识别整体的关键部分,用较小Dropout较好;②一般前面层全连接数目比较大,抽取信息量比较多,自然带来冗余信息较多,那么多的数目连接,可以通过较大Dropout丢弃掉大部分的全连接,实际上因为基数大,剩下的没有置0的连接数目还是很多的。
具体实验过程可看下面这个链接:参考链接
2.增加训练轮数,并将使用暂退法和不使用暂退法时获得的结果进行比较。
随着训练轮数的增加,使用Dropout的loss将会逐渐趋于一个稳定值并有小幅度的波动,不使用Dropout的loss将会一直小幅度的下降,最后在训练集上,可以看到不使用Dropout的会比使用Dropout的loss小,但是在测试集上面,前者的准确率会比后者小。这明显发生了过拟合。
3.当应用或不应用暂退法时,每个隐藏层中激活值的方差是多少?绘制一个曲线图,以显示这两个模型的每个隐藏层中激活值的方差是如何随时间变化的。
Dropout会减少对强神经元的依赖,因此强神经元的激活值会降低(在本轮训练中被置零,梯度更新不会更新),但激活弱神经元的值会增加,这样强、弱神经元之间方差变小了。
4.为什么在测试时通常不使用暂退法?
因为测试的时候网络模型是固定的,可以认为是一种已知的先验,那当然是不用Dropout加入噪声的。
5.以本节中的模型为例,比较使用暂退法和权重衰减的效果。如果同时使用暂退法和权重衰减,会发生什么情况?结果是累加的吗?收益是否减少(或者说更糟)?它们互相抵消了吗?
结果会更好,因为它们防止过拟合的思考点不同,暂退法思考点引入一定的噪声,增加模型对输入数据的扰动鲁棒,从而增强泛化性;权重衰减在于约束模型参数来防止模型过拟合。
6.如果我们将暂退法应用到权重矩阵的各个权重,而不是激活值,会发生什么?
我感觉这个题的题目意思应该是:“Dropout应该放在激活函数之前还是之后”。
目前代码上面Dropout都是用在激活函数之后的,因为有些激活函数在0处的梯度并不是0,这样的话先用Dropout置零后再经过激活函数,这样那个神经元就会有梯度了(我们一般把神经层+Batchnorm层+激活函数为一层,所以把Dropout放在激活函数之后也是有道理的),起不到了Dropout的作用了,应该在激活函数之后用Dropout。
7.发明另一种用于在每一层注入随机噪声的技术,该技术不同于标准的暂退法技术。尝试开发一种在Fashion-MNIST数据集(对于固定架构)上性能优于暂退法的方法。
可以尝试下把每一层算它的方差和均值,然后作一个高斯噪声叠加上去。
1.假设一些标量函数X的输入X是n*m矩阵。f相对于X的梯度维数是多少?
仍然是n*m,直接f对每个x求导即可。
2.向本节中描述的模型的隐藏层添加偏置项(不需要在正则化项中包含偏置项)。
①.画出相应的计算图。
②.推导正向和反向传播方程。
参考链接:参考链接
3.计算本节所描述的模型,用于训练和预测的内存占用。
训练需要的:x,z,h,o,y,W(1),W(2),dl/dW(1),dl/dW(2)
预测需要的:x,z,h,o,y,W(1),W(2)
4.假设你想计算二阶导数。计算图发生了什么?你预计计算需要多长时间?
需要保存并用到一阶导数的计算图,预计需要的时间应该是之前的两倍吧。
5.假设计算图对于你的GPU来说太大了。
①.你能把它划分到多个GPU上吗?
②.与小批量训练相比,有哪些优点和缺点?
①.使用MPI来进行并行节点之间的消息传递,将一个庞大的计算任务分解为多个小任务,来让集群GPU上的多个计算节点处理任务的一部分。
②.优点是多个GPU集群可以训练较大的模型,但是缺点是可能会因为节点间通信的限制导致速度不够快。
1.除了多层感知机的排列对称性之外,你能设计出其他神经网络可能会表现出对称性且需要被打破的情况吗?
卷积神经网络初始化参数一样的时候,也是会出现对称性的,解决方法可以说随机初始化,当然ResNet结构也是破除对称性的一种方法。
2. 我们是否可以将线性回归或softmax回归中的所有权重参数初始化为相同的值?
当然是不行的,因为对称性的存在,反向传播期间得到的梯度,其元素取相同的值,导致表达能力下降。这个时候可能你会想到是使用下面这条式子,然后采用mini-batch去更新参数的,既然X是带特征的,为什么会导致梯度更新后,输出结果不带特征呢。我们可以认为虽然X是带特征的,但是在更新梯度后,相当于在W上对不同特征进行特征性的更新,最后在预测时候,前向传播X的特征与参数W相乘反而使得特征被抹平了。
δ L δ W = − 2 X T Y + 2 X T X W \frac{δL}{δW}=-2X^TY+2X^TXW δWδL=−2XTY+2XTXW
有点类似矩阵A是有自己特征的,然后A*A-1=E使得特征抹平了(这里可以把X看作A,W看作A-1)。
3.在相关资料中查找两个矩阵乘积特征值的解析界。这对确保梯度条件合适有什么启示?
∣ A B ∣ = ∣ A ∣ ∣ B ∣ = λ 1 a × λ 2 a × . . . × λ k a × λ 1 b × λ 2 b . . . × λ k b |AB|=|A||B|=\lambda_{1a}\times\lambda_{2a}\times...\times\lambda_{ka}\times\lambda_{1b}\times\lambda_{2b}...\times\lambda_{kb} ∣AB∣=∣A∣∣B∣=λ1a×λ2a×...×λka×λ1b×λ2b...×λkb
其 中 λ i a 、 λ i b 为 A 、 B 的 特 征 值 且 从 大 到 小 排 序 其中\lambda_{ia}、\lambda_{ib}为A、B的特征值且从大到小排序 其中λia、λib为A、B的特征值且从大到小排序
假 如 λ m a < 1 , λ n b < 1 假如\lambda_{ma}<1,\lambda_{nb}<1 假如λma<1,λnb<1
那 么 , ∣ A B ∣ < λ 1 a × λ 2 a × . . . × λ ( m − 1 ) a × λ 1 b × λ 2 b . . . × λ ( n − 1 ) b 那么,|AB|<\lambda_{1a}\times\lambda_{2a}\times...\times\lambda_{(m-1)a}\times\lambda_{1b}\times\lambda_{2b}...\times\lambda_{(n-1)b} 那么,∣AB∣<λ1a×λ2a×...×λ(m−1)a×λ1b×λ2b...×λ(n−1)b
假如规范化(norm)了,那么就更好判断了,容易给出|AB|的上下界
M I N ( λ i a ) M I N ( λ i b ) < ∣ A B ∣ < M A X ( λ i a ) M A X ( λ i b ) MIN(\lambda_{ia})MIN(\lambda_{ib})<|AB|
找到特征值的解析界,可以判断矩阵是否病态,这样可以很好的判断会不会产生梯度爆炸。(病态矩阵的输入进行较小的扰动,则得出的结果具有很大波动,梯度回传时候会产生梯度巨大的波动,可能会引发梯度爆炸)
4.如果我们知道某些项是发散的,我们能在事后修正吗?
感觉翻译有所问题,英文为:If we know that some terms diverge, can we fix this after the fact,感觉问的问题应该是:如果我们知道某些层是偏离(diverge)的,我们能在事后修正吗。
增加批处理的大小,并动态调整每个层的学习速率(根据偏离程度)。
1.当我们改变搜索引擎的行为时会发生什么?用户可能会做什么?广告商呢?
用户可能会改变他们的搜索引擎,以一个更好的适合,广告商会试图适应新的引擎。
2.实现一个协变量偏移检测器。提示:构建一个分类器。
参考链接:参考链接
3.实现协变量偏移纠正。
参考链接:参考链接
4.除了分布偏移,还有什么会影响经验风险接近真实风险的程度?
文化、地理、偏见