公众号福利
回复【100题】领取《名企AI面试100题》PDF
回复【干货资料】领取NLP、CV、ML等AI方向干货资料
问题1:遗传算法原理
遗传算法原理是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。
问题2:粒子群算法原理
粒子群优化算法,缩写为PSO,属于进化算法的一种。和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解。它也是通过适应度来评价解的品质,但它比遗传算法规则更简单,它没有遗传算法的“交叉”和“变异”操作,它通过追随当前搜索到的最优值来寻找全局最优。
问题3:线性规划单纯形法原理
线性规划单纯形法就是通过设置不同的基向量,经过矩阵的线性变换,求得基可行解(可行域顶点),并判断该解是否最优,否则继续设置另一组基向量,重复执行以上步骤,直到找到最优解。所以,单纯形法的求解过程是一个循环迭代的过程。
问题4:CNN结构
CNN就是卷积神经网络模型,CNN是一种前馈神经网络,通常包含5层,输入层,卷积层,激活层,池化层,全连接FC层,其中核心部分是卷积层和池化层。
优点:共享卷积核,对高维数据处理无压力;无需手动选取特征。
缺点:需要调参;需要大量样本。
问题5:RNN结构
RNN是循环神经网络,由输入层、隐藏层、输出层组成。激活函数使用的是tanh函数。
LSTM是循环神经网络RNN的变种,包含三个门,分别是输入门,遗忘门和输出门。
sigmoid函数主要是决定什么值需要更新;
tanh函数:创建一个新的候选值向量,生成候选记忆。
问题6:激活函数及适用场景
常见的激活函数有:Sigmoid、Tanh、ReLU、Leaky ReLU
Sigmoid函数:
特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
缺点:
缺点1:在深度神经网络中梯度反向传递时导致梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
缺点2:Sigmoid 的 output不是0均值(即zero-centered)。
缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
Tanh函数:
特点:它解决了Sigmoid函数的不是zero-centered输出问题,收敛速度比sigmoid要快,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
ReLU函数:
特点:
1.ReLu函数是利用阈值来进行因变量的输出,因此其计算复杂度会比剩下两个函数低(后两个函数都是进行指数运算)
2.ReLu函数的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
3.ReLU的单侧抑制提供了网络的稀疏表达能力。
ReLU的局限性:在于其训练过程中会导致神经元死亡的问题。
这是由于函数f(x)=max(0,x)导致负梯度在经过该ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,如果学习率(Learning Rate)设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。
Leaky ReLu函数:
LReLU与ReLU的区别在于, 当z<0时其值不为0,而是一个斜率为a的线性函数,一般a为一个很小的正常数, 这样既实现了单侧抑制,又保留了部分负梯度信息以致不完全丢失。但另一方面,a值的选择增加了问题难度,需要较强的人工先验或多次重复训练以确定合适的参数值。
基于此,参数化的PReLU(Parametric ReLU)应运而生。它与LReLU的主要区别是将负轴部分斜率a作为网络中一个可学习的参数,进行反向传播训练,与其他含参数网络层联合优化。而另一个LReLU的变种增加了“随机化”机制,具体地,在训练过程中,斜率a作为一个满足某种分布的随机采样;测试时再固定下来。Random ReLU(RReLU)在一定程度上能起到正则化的作用。
ELU函数:
ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱和和指数运算的问题。
问题7:防止过拟合的方法
数据的角度:获取和使用更多的数据(数据集增强);
模型角度:降低模型复杂度、L1\L2\Dropout正则化、Early stopping(提前终止)
模型融合的角度:使用bagging等模型融合方法。
问题8:手撕代码LC003,无重复字符的最长字串
方法:双指针 + sliding window
定义两个指针 start 和 end 得到 sliding window
start 初始为0,用end线性遍历每个字符,用 recod 记录下每个字母最新出现的下标
两种情况:一种是新字符没有在 record 中出现过,表示没有重复,一种是新字符 char 在 record 中出现过,说明 start 需要更新,取 start 和 record[char]+1 中的最大值作为新的 start。
需要注意的是:两种情况都要对record进行更新,因为是新字符没在record出现过的时候需要添加到record中,而对于出现过的情况,也需要把record中对应的value值更新为新的下标。
class Solution(object):
def lengthOfLongestSubstring(self, s):
:type s: str
:rtype: int
start = 0
dic = {}
res = 0
for end in range(len(s)):
if s[end] in dic:
start = max(start, dic[s[end]] + 1)
dic[s[end]] = end
res = max(res, end - start + 1)
return res
↓以下8本书电子版免费领,直接送↓
扫码回复【888】免费领8本电子书
(或找七月在线任一老师领取)
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.