前言:若需获取本文全部的手书版原稿资料,扫码关注公众号,回复: 深度学习问答 即可获取。
原创不易,转载请告知并注明出处!扫码关注公众号【机器学习与自然语言处理】,定期发布知识图谱,自然语言处理、机器学习等知识,添加微信号【17865190919】进讨论群,加好友时备注来自CSDN。
一、谈如何划分训练集、验证集和测试集
高质量验证集、测试集、训练集对于神经网络至关重要,验证集目的:在多个算法中选出最有效的算法,测试集目的:正确评估分类器的性能
那如何划分训练集、验证集、测试集,在小数据量时,例如1000,10000时划分标准可参考(70%,30%)(无验证集)、(60%,20%,20%),当百万数据及以上时,如100万,我们可能只需要10000个作为验证集,10000作为测试集,划分比例(98%,1%,1%),当数据量很大时,有时候训练集可高大99.5%
常见问题:训练数据和验证,测试数据分布不匹配的问题,例如:训练集是非常高清标准的图片,测试集是用户随意拍照上传的不清楚模糊的图片
建议:保证验证集和测试集是来自同一个分布,有的时候验证集和测试集被看成同一概念
二、谈梯度消失和梯度爆炸原因及解决方法
首先清楚深度学习中使用梯度更新参数,梯度消失和梯度爆炸自然和梯度有密切联系
梯度消失原因:1、网络层数太深,2、采用了不合适的激活函数
梯度爆炸原因:1、网络层数太深,2、权重初始化值太大
激活函数选择的好会降低梯度消失和梯度爆炸的可能,但并不是说线性的激活函数就不会出现梯度消失和梯度爆炸
梯度消失和梯度爆炸解决办法
1、预训练+微调:逐层预训练,对整个网络进行微调
2、梯度剪切和正则,梯度剪切是针对梯度爆炸的,正则化通过对网络权重正则防止过拟合
3、relu、leakrelu、elu等激活函数使用,线性激活函数不会出现梯度消失,梯度爆炸
4、Batch Normalization:规范化操作将输出规范化保证网络稳定性
5、残差结构:残差网络可以跨层直接连接,很多层也不用担心梯度消失、梯度爆炸
6、LSTM:长短期记忆网络通过复杂的门结构,输入门、输出门、遗忘门使得可以选择性记住或遗忘网络中的信息
三、谈为什么正则化可以防止过拟合
1、正则化降低了参数w的值,参数w值降低便降低了许多隐藏神经元权重,降低了隐藏神经元的影响,这样模型复杂度降低了,不会把数据误差特征学习到,防止过拟合
2、正则化使得参数变小,导致激活函数传入的z=wa+b变小,如果是tanh函数,便使得激活函数tanh(z)在0附近趋向于是线性函数,既是对于多层神经网络,如果激活函数是线性函数则也将大大降低过拟合的风险
四、谈dropout函数的原理和实现方式
在神经网络中使用Dropout会使得网络变小,和使用正则化有类似的效果,因此有防止过拟合效果,Dropout和L2正则化效果相似,dropout函数的工作流程:
1、遍历神经网络的每一层节点,设置节点保留概率keep_prob,keep_prob表示保留一个神经元的概率
2、删除神经网络的节点,并删除网络与移除节点之间的连接
3、输入样本,使用简化后的网络进行训练,每次输入样本的时候都要重复这三步
Dropout中节点失活算法:反向随机失活,以下图神经网络的第三层使用反向随机失活过程:
1、第三层网络的权重参数用a3表示,使用a3的shape来产生一个0到1的随机矩阵
2、设置keep_prob(0到1)的大小,keep_prob表示该层节点保留的概率。对于第一步产生的随机矩阵与keep_prob进行比较,小于为1,大于为0。1表示保留该节点,0表示删除矩阵
3、将a3与0和1的矩阵相乘(这里是普通的乘法,不是矩阵相乘),的到新权重参数矩阵a3
4、对输出的a3矩阵除以keep_prob,即a3 =keep_prob,这一步是最关键的。将a3除以keep_prob的目的是保证a3的期望值(均值)不变,从而保证第三层的输出不变。
注意:dropout在测试阶段不需要使用,因为如果在测试阶段使用dropout可能会导致预测值产生随机变化(因为dropout使节点随机失活)。而且,在训练阶段已经将权重参数除以keep_prob来保证输出的期望值不变,所以在测试阶段没必要再使用dropout。
五、谈如何归一化样本输入基归一化好处
对于输入数据,数据特征可能在在不同的范围内,因此需要归一化输入,归一化输入可以加快神经网络的训练速度
1、归一化均值
2、归一化方差
实际应用中需要同时对:训练数据、测试数据做归一化处理,看下图1是原始数据点,下图二是做了归一化均值之后的数据点,下图二是做了归一化方差后的数据点
为什么需要对数据特征做归一化处理,从损失函数J的角度来看,特征归一化之后无论初始点在哪里都能很快梯度下降到最值点,如下图来看,左边两幅图是未作归一化处理数据的损失函数图像,右边两幅是做了归一化处理数据的损失函数图像,损失函数用的既是均方误差损失函数
六、谈反向梯度传播中如何进行梯度校验
反向传播算法很难调试得到正确结果,尤其是当实现程序存在很多难于发现的bug时。举例来说,索引的缺位错误(off-by-oneerror)会导致只有部分层的权重得到训练,忘记计算偏置项。这些错误会使你得到一个看似十分合理的结果,但实际偏差很差,因此梯度校验显得至关重要。梯度校验方式如下:
1、利用双边误差计算梯度近似值gradapprox,计算公式如下:
f ( θ + ε ) − f ( θ − ε ) 2 ε ≈ ∇ f ( θ ) \frac{f\left( \theta + \varepsilon \right) - f(\theta - \varepsilon)}{2\varepsilon}\ \approx \ \nabla f(\theta) 2εf(θ+ε)−f(θ−ε) ≈ ∇f(θ)
2、网络中反向传播得到梯度值grad
3、按照如下公式进行计算,当difference足够小,如 10-7,认为很好,校验通过
d
i
f
f
e
r
e
n
c
e
=
∣
∣
g
r
a
d
−
g
r
a
d
a
p
p
r
o
x
∣
∣
2
∣
∣
g
r
a
d
∣
∣
2
+
∣
∣
g
r
a
d
a
p
p
r
o
x
∣
∣
2
difference = \ \frac{{||grad - gradapprox||}_{2}}{{||grad||}_{2} + \ {||gradapprox||}_{2}}
difference= ∣∣grad∣∣2+ ∣∣gradapprox∣∣2∣∣grad−gradapprox∣∣2
七、谈神经网络中常用的损失函数
1、均方误差损失函数
MSE ( y , y ) = ∑ i = 1 n ( y − y − ) 2 n \text{MSE}\left( y_{,}y \right) = \ \frac{\sum_{i = 1}^{n}{(y - y_{-})}^{2}}{n} MSE(y,y)= n∑i=1n(y−y−)2
2、交叉熵损失函数,表征两个概率分布之间的距离
H ( y − , y ) = − ∑ y − ∗ l o g y H\left( y_{-},\ y \right) = \ - \sum_{}^{}{y_{-}*logy} H(y−, y)= −∑y−∗logy
3、Softmax损失函数,当n分类的n个输出(y1,y2,…,yn)通过softmax函数,便满足了概率分布的要求:
∀ x P ( X = x ) ϵ [ 0 , 1 ] and ∑ x P ( X = x ) = 1 \forall x\ \ \ \ P\left( X = x \right)\epsilon\left\lbrack 0,1 \right\rbrack\text{\ \ and\ }\sum_{x}^{}{P\left( X = x \right) = 1} ∀x P(X=x)ϵ[0,1] and x∑P(X=x)=1
softmax ( y i ) = e y i ∑ j = 1 n e y i \text{softmax}\left( y_{i} \right) = \ \frac{e^{y_{i}}}{\sum_{j = 1}^{n}e^{y_{i}}} softmax(yi)= ∑j=1neyieyi
4、CTC损失函数(connectionist temporal classification)
CTC在神经网络中计算一种损失值,主要是用于可以对没有对齐的数据进行自动对齐,即主要是用在没有事先对齐的序列化数据训练上,应用领域如:语音识别、ocr识别,CTC损失函数定义为:
L ( S ) = − ∑ ( x , z ) ϵ S l n p ( z ∣ x ) L\left( S \right) = \ - \sum_{(x,z)\epsilon S}^{}{lnp(z|x)} L(S)= −(x,z)ϵS∑lnp(z∣x)
训练集S={(x1,z1),(x2,z2),…,},对于其中每一个样本(x,z)其中x=(x1,x2,…,xT)表示一个长度为时间T的向量,z=(z1,z2,…,zu)如果在语音识别中表示语音对应的音素信息,如果在OCR识别中可以看成是文本对应的一连串的单个字符信息 ykt 表示t时刻对应的音素为k的概率, P(z|x)输入为x,输出序列为z的概率
P ( z | x ) = ∏ t = 1 T y k t P\left( z \middle| x \right) = \ \prod_{t = 1}^{T}y_{k}^{t} P(z∣x)= t=1∏Tykt
CTC优化过程计算量大,因此采用的是HMM中的向前向后算法进行计算
5、自定义损失函数,背景:如果预测商品销量,预测多了则损失成本,如果预测少了则损失利润
f
(
y
,
y
)
=
{
P
r
o
f
i
t
∗
(
y
−
−
y
)
y
<
y
−
Cost
(
y
−
y
−
)
y
≥
y
−
f\left( y_{,}y \right) = \ \left\{ \begin{matrix} Profit*\left( y_{-} - y \right)\ \ \ \ \ \ y < y_{-} \\ \text{Cost}\left( y - y_{-} \right)\ \ \ \ \ \ \ \ \ \ \ \ \ \ y \geq y_{-} \\ \end{matrix} \right.\
f(y,y)= {Profit∗(y−−y) y<y−Cost(y−y−) y≥y−
八、谈static_rnn、dynamic_rnn以及bidirectional_dynamic_rnn的区别
下面首先给出函数定义:
1、tf.contrib.rnn.static_rnn 单层rnn
tf.nn.static_rnn(
cell,
input,
initial_state=None,
dtype=None,
sequence_length=None,
scope=None
)
参数解释:
cell:用于神经网络的RNN神经元,如BasicRNNCell,BasicLSTMCell
inputs:一个长度为T的list,list中的每个元素为一个Tensor
initial_state:RNN的初始状态
dtype:初始状态和预期输出的数据类型,可选参数
sequence_length:指定每个输入的序列的长度,大小为batch_size的向量
scope:变量范围
返回值元组(outpuss, state)
2、tf.nn.dynamic_rnn 多层rnn
tf.nn.dynamic_rnn(
cell,
inputs,
sequence_length=None,
initial_state=None,
dtype=None,
parallel_iterations=None,
swap_memory=False,
time_major=False,
scope=None
)
参数和返回值解释可参照bidirectional_dynamic_rnn函数
3、tensorflow.nn.bidirectional_dynamic_rnn()函数 双向RNN
def bidirectional_dynamic_rnn(
cell_fw,
cell_bw,
inputs,
sequence_length=None,
initial_state_fw=None,
initial_state_bw=None,
dtype=None,
parallel_iterations=None,
swap_memory=False,
time_major=False,
scope=None
)
常用参数解释:
cell_fw:前向RNN
cell_bw:后向RNN
inputs: 输入
sequence_length=None:输入序列的实际长度(可选,默认为输入序列的最大长度)
initial_state_fw=None:前向的初始化状态(可选)
initial_state_bw=None:后向的初始化状态(可选)
dtype=None:初始化和输出的数据类型(可选)
返回值元组:(outputs, output_states)
outputs:(output_fw, output_bw),一个包含前向cell输出tensor和后向cell输出tensor组成的元组;
output_states:(output_state_fw,output_state_bw),包含了前向和后向最后的隐藏状态的组成的元组
4、三者区别
static_rnn输入数据形式为:[步长, batch, input],输出:[n_steps, batch, n_hidden]
dynamic_rnn输入数据形式为:[batch,步长,input],输出:[batch,n_steps,n_hidden]
static_rnn每次往网络中传入批量数据时都要指定seq_length,即指定序列的大小,rnn要求每一次迭代传入的batch数据是[batch_size,max_seq],每一次迭代都不改变;
dynamic_rnn实现的功能是可以让不同迭代传入的batch的数据的长度可以是不同的,但同一次迭代batch内部所有数据的长度仍然是固定的
bidirectional_dynamic_rnn双向RNN,当cell使用LSTM时,便是双向LSTM,单项rnn只考虑上文的信息对下文信息的影响,双向RNN即考虑当前信息不仅受到上文的影响,同时也考虑下文的影响,前向rnn和dynamic_rnn完全一致,后向rnn输入的序列经过了反转
九、谈变量常假设符合的离散性概率分布有哪些
1、伯努利分布,0-1分布,随机变量取值为0或1,数学公式定义:
p ( x ) = p x ∗ ( 1 − p ) 1 − x p\left( x \right) = \ p^{x}*\left( 1 - p \right)^{1 - x} p(x)= px∗(1−p)1−x
期望:
E ( x ) = ∑ x ∗ p ( x ) = p E\left( x \right) = \sum_{}^{}{x*p\left( x \right)} = p E(x)=∑x∗p(x)=p
方差:
D ( x ) = E ( x 2 ) − E 2 ( x ) = p ( 1 − p ) D\left( x \right) = E\left( x^{2} \right) - E^{2}\left( x \right) = p(1 - p) D(x)=E(x2)−E2(x)=p(1−p)
2、二项分布,假设进行n次独立实验,每次实验成功概率为p,失败概率为1-p,若进行n次实验共成功k次数学公式定义:
p ( k ) = ( n k ) p k ( 1 − p ) n − k p\left( k \right) = \left( \frac{n}{k} \right)p^{k}{(1 - p)}^{n - k} p(k)=(kn)pk(1−p)n−k
二项分布相当于进行了n次伯努利分布,若 Xi 表示一次标准的伯努利分布,则二项分布为:
X = ∑ 1 n X i X = \ \sum_{1}^{n}X_{i} X= 1∑nXi
期望:
E ( x ) = ∑ 1 n E ( x i ) = n ∗ p E\left( x \right) = \ \sum_{1}^{n}{E(x_{i})} = n*p E(x)= 1∑nE(xi)=n∗p
方差:
D ( x ) = ∑ 1 n D ( x i ) = n ∗ p ∗ ( 1 − p ) D\left( x \right) = \sum_{1}^{n}{D\left( x_{i} \right)} = n*p*(1 - p) D(x)=1∑nD(xi)=n∗p∗(1−p)
3、几何分布和负二项分布
几何分布也是由多次伯努利实验构成,随机变量X表示的是第一次成功所进行的实验的次数,若共进行k次,成功概率为p,则数学公式定义为:
p ( k ) = p ( X = k ) = p ∗ ( 1 − p ) k − 1 p\left( k \right) = p\left( X = k \right) = p*{(1 - p)}^{k - 1} p(k)=p(X=k)=p∗(1−p)k−1
负二项分布表示直到成功r次停止,当r=1时便是几何分布(公式为什么?):
P ( X = k ) = ( k − 1 r − 1 ) p r ∗ ( 1 − p ) k − r P\left( X = k \right) = \left( \frac{k - 1}{r - 1} \right)p^{r}*{(1 - p)}^{k - r} P(X=k)=(r−1k−1)pr∗(1−p)k−r
几何分布期望:
E ( x ) = 1 p E\left( x \right) = \ \frac{1}{p} E(x)= p1
几何分布方差:
D ( x ) = 1 − p p 2 D\left( x \right) = \ \frac{1 - p}{p^{2}} D(x)= p21−p
4、超几何分布
超几何分布即从N个商品中指定M个,
不放回抽取n个,抽中指定商品数量的个数,即随机变量X~H(N,n,M),若抽中指定商品k件则表示成数学公式为:
p ( k ) = P ( X = k ) = ( M k ) ( N − M n − k ) ( N n ) p\left( k \right) = P\left( X = k \right) = \frac{\left( \frac{M}{k} \right)\left( \frac{N - M}{n - k} \right)}{\left( \frac{N}{n} \right)} p(k)=P(X=k)=(nN)(kM)(n−kN−M)
N个商品总共抽取n件,从指定商品M中抽取了k件,从N-M件商品中抽取了n-k件
5、泊松分布
泊松分布是二项分布的极限形式,当n趋向于无穷大时,可由二项分布推导出泊松分布,泊松分布数学公式定义为:
P ( x = k ) = λ k e − λ k ! P\left( x = k \right) = \ \frac{\lambda^{k}e^{- \lambda}}{k!} P(x=k)= k!λke−λ
清楚如何通过二项分布推导出泊松分布,另外大概 λ = 20时泊松分布基本可以近似于正态分布函数处理
十、谈变量常假设符合的连续性概率分布有哪些
1、均匀分布
均匀分布概率密度函数,随机变量X满足:
p ( x ) = { 1 b − a a < x < b 0 p\left( x \right) = \ \left\{ \begin{matrix} \frac{1}{b - a}\ \ \ \ a < x < b \\ 0\ \ \ \ \ \\ \end{matrix} \right.\ \text{\ \ } p(x)= {b−a1 a<x<b0
2、指数分布
指数分布概率密度函数:
p ( x ) = { λ e − λ x x > 0 0 x < = 0 p\left( x \right) = \ \left\{ \begin{matrix} \lambda e^{- \lambda x}\ \ \ \ x > 0 \\ 0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ x < = 0 \\ \end{matrix} \right.\ p(x)= {λe−λx x>00 x<=0
均值:1/λ,方差:1/λ2
3、正态分布
随机变量X为一维时,概率密度函数为:
p ( x ) = 1 2 π σ e x p ( − ( x − μ ) 2 2 σ 2 ) p\left( x \right) = \ \frac{1}{\sqrt{2\pi}\sigma}exp( - \frac{{(x - \mu)}^{2}}{2\sigma^{2}}) p(x)= 2πσ1exp(−2σ2(x−μ)2)
随机变量X多维时,则d维概率密度函数为:
p ( x ) = 1 ( 2 π ) d 2 ∣ Σ ∣ 1 2 e x p ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) p\left( x \right) = \frac{1}{\left( 2\pi \right)^{\frac{d}{2}}\left| \Sigma \right|^{\frac{1}{2}}}exp( - \frac{1}{2}{(x - \mu)}^{T}\Sigma^{- 1}(x - \mu)) p(x)=(2π)2d∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))