#这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
1.GBDT原理
参考答案:
GBDT是梯度提升决策树,是一种基于Boosting的算法,采用以决策树为基学习器的加法模型,通过不断拟合上一个弱学习器的残差,最终实现分类或回归的模型。关键在于利用损失函数的负梯度在当前模型的值作为残差的近似值,从而拟合一个回归树。
对于分类问题:常使用指数损失函数;对于回归问题:常使用平方误差损失函数(此时,其负梯度就是通常意义的残差),对于一般损失函数来说就是残差的近似。
更多请看七月在线题库里的这题:www.julyedu.com/questions/i…
2.连续数组最大和(DP)
参考答案:
本题为剑指offer42题,和Leetcode第53题相同。
题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解析:本题在面试时要求使用动态规划的方法,因此需要找到对应的状态定义(子问题)和状态转移方程(子问题之间的关系)
状态定义:dp[i]:表示以 nums[i] 结尾的连续子数组的最大和。
状态转移方程:
分两种情况考虑:dp[i-1] <= 0 和 dp[i-1] > 0
如果 dp[i - 1] > 0,那么可以把 nums[i] 直接接在 dp[i - 1] 表示的那个数组的后面,得到和更大的连续子数组;
如果 dp[i - 1] <= 0,那么 nums[i] 加上前面的数 dp[i - 1] 以后值不会变大。于是 dp[i] 「另起炉灶」,此时单独的一个 nums[i] 的值,就是 dp[i]。
得到状态转移方程如下:
整理可得:
代码如下:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
size = len(nums)
pre = 0
res = nums[0]
for i in range(size):
pre = max(nums[i], pre + nums[i])
res = max(res, pre)
return res
3.ROC含义、AUC含义
参考答案:
ROC曲线是基于样本的真实类别和预测概率来画的,具体来说,ROC曲线的x轴是伪阳性率(false positive rate),y轴是真阳性率(true positive rate)。
其中:真阳性率=(真阳性的数量)/(真阳性的数量+伪阴性的数量)
伪阳性率=(伪阳性的数量)/(伪阳性的数量+真阴性的数量)
AUC是ROC曲线下面的面积,AUC可以解读为从所有正例中随机选取一个样本A,再从所有负例中随机选取一个样本B,分类器将A判为正例的概率比将B判为正例的概率大的可能性。AUC反映的是分类器对样本的排序能力。AUC越大,自然排序能力越好,即分类器将越多的正例排在负例之前。
更多题目,请看七月在线题库里的这题:www.julyedu.com/question/bi…
4.XGB原理,正则化操作
参考答案:
XGB原理:
首先需要说一说GBDT,它是一种基于boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差。
XGBoost对GBDT进行了一系列优化,比如损失函数进行了二阶泰勒展开、目标函数加入正则项、支持并行和默认缺失值处理等,在可扩展性和训练速度上有了巨大的提升,但其核心思想没有大的变化。
xgboost使用了如下的正则化项:
γ和λ,这是xgboost自己定义的,在使用xgboost时,可以设定它们的值,显然,γ越大,表示越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大。λ越大也是越希望获得结构简单的树。
5.L1与L2区别,效果差异
参考答案:
L1范数(L1 norm)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。
比如 向量A=[1,-1,3], 那么A的L1范数为 |1|+|-1|+|3|.
简单总结一下就是:
L1范数: 为x向量各个元素绝对值之和。
L2范数: 为x向量各个元素平方和的1/2次方,L2范数又称Euclidean范数或者Frobenius范数
Lp范数: 为x向量各个元素绝对值p次方和的1/p次方.
在支持向量机学习过程中,L1范数实际是一种对于成本函数求解最优的过程,因此,L1范数正则化通过向成本函数中添加L1范数,使得学习得到的结果满足稀疏化,从而方便人类提取特征,即L1范数可以使权值稀疏,方便特征提取。
L2范数可以防止过拟合,提升模型的泛化能力。
L1和L2的差别,为什么一个让绝对值最小,一个让平方最小,会有那么大的差别呢?看导数一个是1一个是w便知, 在靠进零附近, L1以匀速下降到零, 而L2则完全停下来了. 这说明L1是将不重要的特征(或者说, 重要性不在一个数量级上)尽快剔除, L2则是把特征贡献尽量压缩最小但不至于为零. 两者一起作用, 就是把重要性在一个数量级(重要性最高的)的那些特征一起平等共事(简言之, 不养闲人也不要超人)。
更多请看七月在线题库里的这题:www.julyedu.com/questions/i…
6.卷积计算过程
参考答案:
普通卷积计算:
(图像来源:zhuanlan.zhihu.com/p/29119239)
定义:输入图像大小:H_{in}*W_{in}*C_{in}; 输出图像大小:H_oW_oC_o
卷积核大小:kkD_{k}*C_{o}其中:D_{k}为卷积核的厚度等于C_{in},C_{o}为卷积
核的个数, 也是输出特征图的通道数。
标准卷积计算过程如上图所示,其中
输出图像大小计算公式为:
[H_{o}=W_{o}=[(W-F+2P)/S]+ 1=[8-3+20]/1]+1 = 6](zhuanlan.zhihu.com/write#)
参数量(不考虑偏置项):
参数量即可训练的参数数量,卷积计算过程中参数共享,而且不同通道的卷积核参数也不一样,所以每个卷积核的参数量为kkC_{in},共有C_{o}个卷积核。
计算量:
Cal=[kkC_{in} + (k*k-1)*C_{in} + (C_{in} -1 )]H_{o}W_{o}C_{o} =(2kkC_{in}-1)*H_{o}*W_{o}*C_{o}
计算量包括加减乘除操作次数,其中1个卷积核1次卷积的计算量为kkC_{in} + (k*k-1)*C_{in} + (C_{in} -1 ):
第1部分是卷积核在各通道进行1次乘法操作,
第2部分是乘法之后卷积核内部的加合操作,
第3部分是各通道间的加合操作;一个卷积核在一个输出通道上共进行H_{o}*W{o}次卷积操作,共有C_{o}各卷积核。
7.session与graph区别
参考答案:
graph即tf.Graph(),session即tf.Session(),是两个完全独立的概念。一个graph可以供多个session使用,而一个session不一定需要使用graph的全部,可以只使用其中的一部分。
graph定义了计算方式,是一些加减乘除等运算的组合。它本身不会进行任何计算,也不保存任何中间计算结果。
session用来运行一个graph,或者运行graph的一部分。它类似于一个执行者,给graph灌入输入数据,得到输出,并保存中间的计算结果。同时它也给graph分配计算资源(如内存、显卡等)。
8.最长不重复连续字符长度(DP)
参考答案:
方法:双指针 + 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:
def lengthOfLongestSubstring(self, s: str) -> int:
record = {}
start,res = 0,0
for end in range(len(s)):
if s[end] in record:
start = max(start, record[s[end]] + 1)
record[s[end]] = end
res = max(res, end - start + 1)
return res
时间复杂度:O(n)
空间复杂度:O(1)
1分钱新课【2021大厂最新AI面试题】 ,主要更新大厂最新面试题,AI干货资料,会持续无限期更新,也就是1分钱购买此课终生享有此课的使用权,目前干货组汇总了今年3月-6月份,大厂面试题。
需要的小伙伴1分秒杀吧>>>2021大厂最新AI面试题 [含答案和解析, 更新到前105题] - 七月在线 (julyedu.com)
部分目录展示如下: