深度学习八股

一、优化器

1.SGD是什么?

  • 批梯度下降:遍历全部数据集算一次损失函数,计算量开销大,计算速度慢,不适合在线学习。
  • 随机梯度下降(SGD):每次随机选择一个数据计算损失函数,求梯度并更新参数,计算速度快,但收敛性可能不太好。
  • 批量随机梯度下降(Mini-batch SGD):用小批量样本来近似全部,将样本分为m个mini-batch,每个mini-batch包含n个样本。
  • 使用动量(Momentum)的随机梯度下降法(SGD):在随机梯度算法中,每一步的步幅是固定的,而在动量学习算法中,每一步走多远不仅依赖于本次的梯度大小还取决于过去的速度。速度是累计各轮训练参数的梯度。动量主要解决SGD的两个问题:一是随机梯度引入的噪声;二是hessian矩阵病态问题,可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题。

2.简单介绍下Adam算法

RMSprop将学习率分解成一个平方梯度的指数衰减的平均。Adam中动量直接并入梯度的一阶矩估计。其次,相比缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSprop,Adam还包括偏置修正,修正从原点初始化的一阶矩估计和二阶矩估计。本质上是带有动量的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要是经过偏置校正后,每一次迭代学习率都有一个确定范围,使得参数比较平稳。

3.Adam和SGD的区别?

  • SGD缺点是更新方向完全依赖于当前batch计算出的梯度,因此十分不稳定。
  • Adam的优点在于:1.考虑历史步中的梯度更新信息,能够降低梯度更新噪声.2.此外经过偏差和校正后,每一次迭代学习率都有个确定单位,使得参数比较平稳。
  • 但Adam可能对前期出现的特征过拟合,后期才出现的特征很难纠正前期的拟合效果。且SGD和Adam没法很好的避免局部最优问题。

二、过拟合

1.过拟合指什么?造成的原因是什么?解决方法有哪些?

  • 定义:模型在训练集上表现很好,但在测试集合新数据上表现很差
  • 出现的原因:1.模型的复杂度过高、参数过多 2.训练数据比较小 3.训练集合测试集的分布不一致 4.样本里的噪声数据过大,导致模型过分记住了
  • 解决方法:降低模型复杂度;数据增强;正则化(L1,L2,dropout);早停

2.过拟合和欠拟合的比较

过拟合:模型在训练集上表现的很好,但是在测试集合新的数据上表现的很差。输出结果高方差,模型很好的适配训练样本,但在测试集上表现的很糟糕,有一个很大的方差。

欠拟合:模型在训练集和测试集上的性能都比较差,输出结果高偏差bias,模型不能适配训练样本,有很大的偏差。

3.偏差和方差的区别

  • 偏差:度量了学习算法的期望预测和真实结果的偏离程度,刻画了学习算法本身的拟合能力
  • 方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。

三、归一化

1.批量归一化是什么?有什么作用?

作用:加快网络的训练和收敛速度;控制梯度爆炸,防止梯度消失

2.训练与推理时BN中的均值、方差计算差异是什么?

  • 训练时,均值、方差分别是该批次内数据相应维度的均值和方差。
  • 推理时,均值方差是基于所有批次的期望计算得到的。其中在推理中所用的均值和方差是通过移动平均计算得到的,可以减少存储每个batch均值方差的内存。

3.LN和BN的区别

LN只考虑单个样本内的统计变量,完全不考虑输入批次的问题。

4.transformer中为什么不适用BN归一化?

cv和nlp数据特性不同,对于nlp数据,前向和反向传播中,batch统计量及其梯度都不太稳定,一个batch中每个句子对应位置分量不一定有意义。

要能在某个维度做独立同分布假设,才能合理归一化。对于cv来说,batch之间的图像是独立的,但nlp的文本本质上可以看成一个时间序列,时间序列是不定长的,长度不同的序列原则上属于不同的统计对象,所以很难得到稳定的统计量,得不到稳定的统计量,BN就无法成立,因为BN依靠滑动平均来获得一组预测用的统计量。

5.梯度消失和梯度爆炸的主要原因

  • 梯度消失:网络层较深,采用了不合适的损失函数,会使得靠近输入层的参数更新缓慢。导致在训练时,只等价后面几层的浅层网络的学习。
  • 梯度爆炸:一般出现在深层网络和权值初始化太大的情况下。在深层神经网络或循环神经网络中,误差的梯度可在更新中累计相乘。如果网络层间的梯度大于1.0,重复相乘会导致梯度呈指数级增长,梯度会变得非常大,然后导致网络权重的大幅更新,并因此导致网络不稳定。梯度爆炸会使得训练过程中,权重的值会变得非常大,以至于溢出,导致模型损失变成NaN等。
  • 解决方法:梯度裁剪、对梯度设定阈值、权重正则化、BN、残差网络的捷径(shortcut)

6.pytorch的乘法

  • 数乘运算:torch.mul
  • 向量点积:torch.dot,计算两个张量的点乘积(内积),两个张量都为一维向量
  • 矩阵乘运算:torch.mm,输入n*c,c*m,输出n*m
  • torch.matmul,对二维张量执行的操作就是torch.mm,此外还可以用于高维张量运算
  • @符号乘法相当于矩阵乘torch.mm,严格按照第一个参数的列数要等于第二个参数的行数。

四、神经网络

1.什么是卷积网络

对图像和滤波矩阵做内积的操作就是卷积操作

其中图像是指不同的数据窗口数据;滤波矩阵是一组固定的权重,因为每个神经元多个权重固定,所以又可以看做是一个恒定的滤波器filter;内积是指逐个元素相乘再求和的操作。

2.什么是CNN的池化pooling层?

池化是指区域平均或最大,即平均池化或最大池化

3.如何确定卷积核通道数和卷积输出层通道数?

CNN的卷积核通道数=卷积输入层的通道数

CNN的卷积输出层通道数=卷积核个数

4.简述GAN

5.介绍TensorFlow计算图

6.有哪些深度学习调参经验

CNN的调参主要是优化函数、embeding的维度、以及残差网络的层数几个方面。

  • 优化函数方面有两个选择SGD/Adam,Adam要简单很多不需要设置参数,效果也不错
  • embeding随着维度的增大会出现一个最大值点,开始时随维度增加效果逐渐变好,到达一个点后,而后随维度增加,效果会变差。
  • 残差网络的层数与embeding的维度有关系,随层数增加,效果变化也是一个凸函数。
  • 可能包含激活函数、dropout层和BN层的使用。激活函数推荐用relu,dropout层数不宜设置过大,过大会不收敛,调节步长可以是0.05,一般调整到0.5可以找到最佳值。

7.为什么不同领域都可以使用CNN,解决了哪些共性问题?是如何解决的?

CNN的关键是卷积运算,卷积核和卷积输入层进行局部连接可以获得整个输入的局部信息或者说是每个输入特征的组合特征。所以CNN本质是完成了特征提取,增加模型的表达能力,不同领域的机器学习都是通过数据的特征进行建模,从而解决该领域的问题。故CNN解决不同领域的特征提取问题,所用的方法是基于局部连接、权值共享、池化操作、多层次结构。

8.LSTM为什么比RNN好

LSTM有进有出,当前的cell 信息是通过input gate控制之后叠加的,RNN是叠乘,因此LSTM可以防止梯度消失者爆炸。

9.Sigmoid、relu、tanh优缺点?

  • sigmoid:优点:输出范围0-1,适合二分类问题,可以将输出解释为概率;具有平滑的导数,可以利用梯度下降等优化算法进行训练。缺点:sigmoid函数存在梯度饱和问题,当输入很大或者很小时,梯度接近于0,导致梯度消失,训练速度慢;且sigmoid输出不是以0为中心,可能导致训练不稳定,计算sigmoid函数的指数运算昂贵
  • Tanh:优点:-1- 1,相对于sigmoid,均值更接近0,有助于减轻梯度消失问题;具有平滑的导数,可用于梯度下降等优化算法。缺点:仍存在梯度饱和问题,当输入很大或很小,梯度消失。计算Tanh的指数也很贵
  • Relu:优点:计算简单,只需要比较是否大于0,训练速度快。relu不会饱和,避免了梯度消失问题。缺点:部分神经元会死亡(输出始终为0,不更新),这会导致网格的稀疏性,Relu对于负数输入的梯度为0,导致梯度爆炸问题,输出不受限制的,导致梯度爆炸。

为克服以上缺点:Leakey relu,ELU ,Swish,一定程度解决了梯度饱和,梯度爆炸和神经死亡等问题。

10.为什么引入非线性激励函数?

深度学习的前提是神经网络的隐层加上了非线性激活函数,提升了模型的非线性表达能力,使得神经网络可以逼近任意复杂的函数。

11.LSTM既存在sigmoid又存在tanh函数,而不是选择统一的sigmoid或者tanh?

sigmoid函数用了各种门上,产生0-1,这个最直接

tanh用在状态和输出上,是对数据的处理,这个用其他激活函数或许可以

12.如何解决RNN梯度爆炸和弥散的问题?

当梯度大于阈值时,将它截断为个较小的数。

13.什么样的数据集不适合深度学习?

  • 数据集太小,数据集样本不足
  • 数据集没有局部相关特性,目前表现好的领域是图像、语音、自然语言处理,这些领域都有局部相关特性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义也同时发生改变。一个人的健康状况,相关参数有年龄职业收入家庭等因素,打乱不影响。因此不适合。

14.广义线性模型是怎样应用在深度学习中的?

深度学习从统计学角度,可以看做是递归的广义线性模型。广义线性模型相当于经典的线性模型,核心在于引入了连接函数。

15.神经元的简单发展史

  • sigmoid会饱和,造成梯度消失,因此有了relu
  • relu负半轴是死区,造成梯度为0,于是有了LeakyReLU,PReLU
  • 强调梯度和权值分布的稳定性,由此有了ELU,以及较新的SELU。
  • 太深了,梯度传递不下去,于是有了highway。
  • 干脆练highway 的参数都不要,直接变残差,于是有了ResNet

16.神经网络中激活函数的真正意义?

非线性:即导数不是常数,这个条件是多层神经网络的基础,保证不退化成单层神经网络。也是激活函数的意义所在。

几乎处处可微:可微性保证了在优化中梯度的可计算性。传统的激活函数如sigmoid等满足处处可微。对于分段线性函数ReLU,只满足几乎处处可微。对于SGD算法来说,由于不可能收敛到梯度接近0的位置,有限的不可微点不影响。

计算简单:非线性函数有很多。激活函数在神经网络前向的计算次数与神经元的个数成正比,因此简单的非线性函数自然更适合用做激活函数。也是ReLU更受欢迎的原因。

17.深度神经网络容易收敛到局部最优,为什么应用广泛?

这很可能是一种假象,实际情况是,我们可能从来没找见过局部最优,更别说全局最优了。局部最优难点来源于一维优化问题的直观想象,单变量情况下,优化问题最直观的困难是有很多局部极值。

18.如何确定是否出现梯度爆炸?

  • 模型无法从训练数据中获得更新,如低损失。
  • 模型不稳定,导致更新过程中损失出现显著变化。
  • 训练过程中,模型损失为NaN。

19.GRU和LSTM的区别?

GRU是循环神经网络的一种

GRU只有两个门(update和reset),GRU直接将hidden state传给下一单元

LSTM有三个门(forget,input,ouput),LSTM用memory cell把hidden state包装起来。

遗忘门:通过x和ht的操作,并经过sigmoid函数,得到0,1的向量,0对应的就代表之前的记忆某一部分要忘记,1对应的就代表之前的记忆需要留下的部分 ===>代表复习上一门线性代数所包含的记忆,通过遗忘门,忘记掉和下一门高等数学无关的内容(比如矩阵的秩)

输入门:通过将之前的需要留下的信息和现在需要记住的信息相加,也就是得到了新的记忆状态。===>代表复习下一门科目高等数学的时候输入的一些记忆(比如洛必达法则等等),那么已经线性代数残余且和高数相关的部分(比如数学运算)+高数的知识=新的记忆状态

输出门:整合,得到一个输出===>代表高数所需要的记忆,但是在实际的考试不一定全都发挥出来考到100分。因此,则代表实际的考试分数

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python深度学习八股文是指在进行深度学习任务时,经常要涉及的一些基本步骤和常用技术。下面是一个通用的Python深度学习八股文的示例: 1. 导入所需的库: ```python import numpy as np import pandas as pd import tensorflow as tf from tensorflow.keras import layers, models ``` 2. 准备数据: ```python X_train = ... # 输入特征训练集 y_train = ... # 标签训练集 X_test = ... # 输入特征测试集 y_test = ... # 标签测试集 ``` 3. 数据预处理: ```python # 特征归一化 X_train = (X_train - X_train.mean()) / X_train.std() X_test = (X_test - X_train.mean()) / X_train.std() # 标签转换为独热编码 y_train = tf.keras.utils.to_categorical(y_train) y_test = tf.keras.utils.to_categorical(y_test) ``` 4. 构建模型: ```python model = models.Sequential() model.add(layers.Dense(units=64, activation='relu', input_shape=(input_shape,))) model.add(layers.Dense(units=num_classes, activation='softmax')) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 5. 模型训练: ```python model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(X_test, y_test)) ``` 6. 模型评估: ```python test_loss, test_accuracy = model.evaluate(X_test, y_test) ``` 7. 模型预测: ```python predictions = model.predict(X_test) ``` 这只是一个简单的示例,实际应用中可能涉及到更多的技巧和步骤。深度学习八股文可以作为一个起点,帮助快速入门和理解深度学习的基本流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值