\[f'(z)=1-(f(z))^2
\[f(z)=\max(0,z)
\]
对应的导函数为:
\[f'(z)=
\begin{cases}
1,z>0 \\
0,z \leq 0
\end{cases}
\]
73 为什么sigmoid和tanh激活函数会导致梯度消失的现象?
sigmoid激活曲线可以看出:当z很大时,f(z)趋近于1;当z很小时,f(z)趋近于0。其导数在z很大或很小都会趋近于0,造成梯度消失的现象。
sigmoid激活曲线可以看出:当z很大时,f(z)趋近于1;当z很小时,f(z)趋近于-1。其导数在z很大或很小都会趋近于0,造成梯度消失的现象。实际上,tanh激活函数相当于sigmoid的平移。
74 Relu系列的激活函数相对于Sigmoid和Tanh激活函数的优点是什么?它们有什么局限性以及如何改进?
从计算上,sigmoid和tanh激活函数均需要计算指数,复杂度高,而Relu只需要一个阈值就可以得到激活值。
relu的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
relu的单侧拟制提供了网络的稀疏表达能力。
其训练过程中会导致神经元死亡的问题。这是由于relu函数导致负梯度在经过该relu单元时被置为0,且在之后也不被任何数据激活,导致梯度永远为0。在实际训练中,如果学习率设置过大,会导致一定比率的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。
所以,有relu的变种Leaky Relu,既实现了单侧拟制,又保留了部分负梯度信息以致不完全丢失,但另一方面,a值的选择增加了问题难度,又有参数化的PReLU,LReLU,Random ReLU等。
75 relu为什么不能根治梯度消失?
梯度反向传播不是只和激活函数有关
76 写出多层感知机的平方误差和交叉熵损失函数。推导各层参数更新的梯度计算公式。
多层感知机中,输入信号通过各个网络层的隐节点产生输出的过程称为前向传播。我们定义低(l)层的输入为\(x^{(l)}\),输出为\(a^{(l)}\);在每一层中\(z^{(l)}=w^{(l)}x^{(l)}+b^{(l)}\),,然后利用激活函数\(f\)得到\(a^{(l)}=f(z^{(l)})\);\(a^{(l)}\)直接作为下一层输入,即\(x^{(l+1)}\)。设\(z^{(l)}\)和\(a^{(l)}\)为\(s_l\)的向量,则\(W_l\)为\(s_l*s_{l+1}\)维的矩阵。
平方误差的整体代价函数为:
\[J(W,b)=[\frac{1}{m}\sum_{i=1}^m J(W,b;x^{(i)},y^{(i)})]+\frac{\lambda}{2} \sum_{l=1}^N \sum_{i=1}^{S_{l-1}} \sum_{j=1}^{S_l}(W_{ji}^{(l)})^2 \\
=[\frac{1}{m}\sum_{i=1}^m \frac{1}{2}||y^{(i)}-o^{(i)}||^2]+\frac{\lambda}{2} \sum_{l=1}^N \sum_{i=1}^{S_{l-1}} \sum_{j=1}^{S_l}(W_{ji}^{(l)})^2
\]
在二分类中,交叉熵的整体代价函数为:
\[J(W,b)=[\frac{1}{m}\sum_{i=1}^m J(W,b;x^{(i)},y^{(i)})]+\frac{\lambda}{2} \sum_{l=1}^N \sum_{i=1}^{S_{l-1}} \sum_{j=1}^{S_l}(W_{ji}^{(l)})^2 \\
=-[\frac{1}{m}\sum_{i=1}^m {y^{(i)}\ln o^{(i)} + (1-y^{(i)}) \ln (1-o^{(i)}})]+\frac{\lambda}{2} \sum_{l=1}^N \sum_{i=1}^{S_{l-1}} \sum_{j=1}^{S_l}(W_{ji}^{(l)})^2
\]
在多分类下,
\[J(W,b)=-[\frac{1}{m}\sum_{i=1}^m \sum_{k=1}^n y_k^{(i)} \ln o_k^{(i)}]+\frac{\lambda}{2} \sum_{l=1}^N \sum_{i=1}^{S_{l-1}} \sum_{j=1}^{S_l}(W_{ji}^{(l)})^2
\]
梯度下降法中每次迭代对参数\(W\)(网络连接权重)和\(b\)(偏置)进行更新:
\[W_{ji}^{(l)}=W_{ji}^{(l)}-\alpha \frac{\partial}{\partial W_{ji}^{(l)}}J(w,b) \\
b_{j}^{(l)}=b_{j}^{(l)}-\alpha \frac{\partial}{\partial b_{j}^{(l)}}J(w,b)
\]
其中,\(\alpha\)为学习率。
\[\frac{\partial}{\partial W_{ji}^{(l)}}J(w,b) = \frac{\partial J(w,b)}{\partial z_{j}^{(l)}} \frac{\partial z_{j}^{(l)}}{\partial W_{ji}^{(l)}}
\]
先计算损失函数对隐含层的偏导
\[\frac{\partial J(w,b)}{\partial z_{j}^{(l)}}=\sum_{k=1}^{S_{l+1}} (\frac{\partial J(w,b)}{\partial z_{k}^{(l+1)}} \frac{\partial z_{k}^{(l+1)}}{\partial z_{j}^{(l)}})
\]
\[\frac{\partial z_{k}^{(l+1)}}{\partial z_{j}^{(l)}} = \frac{\partial (\sum_{j=1}^{S_l}(W_{kj}^{(l+1)} x_j^{(l+1)}+b_k^{(l+1)}))}{\partial z_{j}^{(l)}}
\]
其中\(b_k^{(l+1)}\)与\(z_j^{(l)}\)无关可以省去,\(x^{(l+1)}=a^{(l)}=f(z^{(l)})\),因此
\[\frac{\partial z_{k}^{(l+1)}}{\partial z_{j}^{(l)}} = W_{kj}^{(l+1)} f'(z_{j}^{(l)})
\]
\(\frac{\partial J(w,b)}{\partial z_{j}^{(l)}}\)可以看做损失函数在第l层第i个节点产生的残差量,记为\(\delta_{j}^{(l)}\),从而递推公式可以表示为:
\[\delta_{j}^{(l)}=(\sum_{k=1}^{S_{l+1}} W_{kj}^{(l+1)} \delta_{k}^{(l+1)}) f'(z_{j}^{(l)})
\]
损失对参数函数的梯度可以写为:
\[\frac{\partial}{\partial W_{ji}^{(l)}}J(W,b) = \frac{\partial J(w,b)}{\partial z_{j}^{(l)}} \frac{\partial z_{j}^{(l)}}{\partial W_{ji}^{(l)}} = \delta_{j}^{(l)} x_i^{(l)} a_i^{(l-1)}
\]
\[\frac{\partial}{\partial b_{j}^{(l)}}J(W,b) = \delta_{j}^{(l)}
\]
下面针对不同的损失函数计算最后一层的残差\(\delta^{(L)}\);得到\(\delta^{(L)}\)之后其他层的残差可以根据递推公式计算。
平方误差损失:
\[J(W,b)=\frac{1}{2}||y^{(i)}-o^{(i)}||^2 \\
\delta^{(L)} = -(y-a^{(L)})f'(z^{(L)})
\]
交叉熵损失:
\[J(W,b)=- \sum_{k=1}^{n}y_k \ln o_k^{(L)} \\
\delta^{(L)} = a_k^{(L)}-y_k
\]
77 平方误差和交叉熵损失函数分别适合什么场景?
一般来说,平方损失函数更适合输出为连续,并且最后一层不含Sigmoid或Softmax激活函数的神经网络;交叉熵损失则更适合二分类或多分类的场景。
因为平方损失函数相对于输出层的导数为:
\[\delta^{(L)} = -(y-a^{(L)})f'(z^{(L)})
\]
当激活函数为sigmoid时,如果z的绝对值较大,函数的梯度会趋于饱和,即导数绝对值非常小,导致残差也小,使得基于梯度的学习速度非常缓慢。当使用交叉熵损失函数时,相对于输出层的导数(残差)为
\[\delta^{(L)} = a_k^{(L)}-y_k
\]
此时的导数是线性的,因此不会存在学习速度过慢的问题。
78 卷积操作的本质特性包括稀疏交互和参数共享,具体解释这两种特性及其作用。
稀疏交互(Sparse Interaction)
在卷积神经网络中,卷积核尺度远小于输入的维度,使得每个输出神经元仅与前一层局部区域内的神经元存在连接权重。
它的物理意义是,通常图像、文本、语言等现实世界中的数据都具有局部的特征结构,可以先学习局部的特征,再将局部的特征组合起来形成更复杂和抽象的特征。
参数共享(Parameter sharing)
参数共享是指在同一个模型中的不同模块中使用相同的参数。在卷积神经网络中,卷积核中的每一个元素将作用于每一次局部输入的特定位置上。根据参数共享的思想,我们只需要学习一组参数组合,而不需要针对每个位置的每个参数都进行优化,从而大大降低了模型的存储需求。
它的物理意义是使得卷积层具有平移不变性,也就是说神经网络的输出对于平移变换来说应当是等变的。
79 常见的池化操作有哪些?池化的作用是什么?
对邻域内特征数值求平均,能够拟制由于邻域大小受限造成估计值方差增大的现象,特点是对背景的保留效果好。
通过取邻域内特征的最大值来实现,能够拟制网络参数误差造成估计均值偏移的现象,特点是更好地提取纹理信息。
相邻重叠区域的池化
是采用比窗口宽度更小的步长,使得窗口在每次滑动时存在重叠的区域。
金字塔池化
考虑了多尺度信息的描述,例如同时计算1x1,2x2,4x4的矩阵的池化并将结果拼接在一起作为下一网络层的输入。
池化操作能显著降低参数量,并且能保持对平移、伸缩、旋转操作的不变性。
80 卷积神经网络如何用于文本分类任务?
卷积神经网络的核心思想是捕捉局部特征,能够自动地对N-gram特征进行组合和筛选,获得不同抽象层次的语义信息。
卷积神经网络有输入层、卷积层、池化层、输出层。
(1)输入层是一个NxK的矩阵,其中N为文章所对应的单词总数,K是每个词对应的表示向量的维度。每个词的K维向量可以是预先在其他语料库中训练好的,也可以作为未知的参数有网络训练得到。这两种方法各有优势,一方面,预先训练的词嵌入可以利用其他语料库得到更多的先验知识;另一方面,由当前网络训练的词向量能够更好地抓住与当前任务相关联的特征。
(2)第二次维卷积层,定义不同大小的滑动窗口进行卷积操作
(3)第三层为池化层
(4)接入一个全连接层,使用softmax激活函数输出每个类别的概率。
81 ResNet的提出背景和核心理论是什么?
ResNet的提出背景是解决或缓解生成的神经网络训练中的梯度消失问题。
根据误差传播公式:
\[\delta_{i}^{(l)}=(\sum_{j=1}^{S_{l+1}} W_{ji}^{(l+1)} \delta_{j}^{(l+1)}) f'(z_{i}^{(l)})
\]
将式再展开一层,可以得到;
\[\delta_{i}^{(l)}=(\sum_{j=1}^{S_{l+1}} W_{ji}^{(l+1)} (\sum_{k=1}^{S_{l+2}} W_{kj}^{(l+2)} \delta_{k}^{(l+2)} f'(z_{j}^{(l+1)}) ) f'(z_{i}^{(l)})
\]
可以看到误差传播可以写成参数\(W_{ji}^{(l+1)}\)、\(W_{kj}^{(l+2)}\)以及导数\(f'(z_{j}^{(l+1)})\)、\(f'(z_{i}^{(l)})\)连乘的形式,当误差由L层传播到除输入以外的第一个隐含层的时候,会涉及到非常多的参数和导数的连乘,这时候误差很容易产生消失或者膨胀,影响该层参数的正确学习,因此深层神经网络的拟合和泛化能力较差。
ResNet通过调整网络结构来解决上述问题。将输入短接到两层之后,可以直接学习一个恒等映射,可以有效改善深层的神经网络学习问题。
第10章 循环神经网络
82 处理文本数据时,循环神经网络与前馈神经网络相比有什么特点?
传统文本处理任务的方法中一般讲TF-IDF向量作为特征输入,这样的表示实际上丢失了输入的文本序列中每个单词的顺序。卷积神经网络对文本建模时,输入变长的字符串或者单词串,然后通过滑动窗口加池化的方式将原先的输入转换成一个固定长度的向量表示,这样做可以捕捉到原文本中的一些局部特征,但是两个单词之间的长距离依赖关系还是很难被学习到。
一个长度为T的序列用循环神经网络建模,展开之后可以看做是一个T层的前馈神经网络。其中第t层的隐含状态h(t)编码了序列中前t个输入的信息,可以通过当前的输入x(t)和上一层神经网络状态h(t-1)计算得到;最后一层的状态h(T)编码了整个序列的信息,因此可以作为整篇文档的压缩表示,以此为基础的结构可以应用于多种具体任务。例如,在h(T)后面直接接一个Softmax层,输出文本所属类别的预测概率y,就可以实现文本分类。
83 循环神经网络为什么会出现梯度消失或梯度爆炸?有哪些改进方案?