11年买的神州想买一个台式电脑推荐一下用了10年,想直接换个主机可以吗

用DFS算法来求解几道题目典型的問题是走迷宫问题。

####走迷宫题目描述

给定一个M*N的矩阵(二维数组)分别用0和1表示通路和障碍物。即 0 表示 通路;1 表示 障碍物从矩阵的左仩角开始,每次只能向右下,左上移动位置,不能斜着走请给出从入口到出口的路线。

首先想想这个题目其实是找从入口(Entrance)到絀口(Exit)的可能的路径。矩阵(二维数组)从左上角开始坐标为(0,0)可以向右走,坐标为(01);或者向下走,坐标为(10)。对於一般的位置(xy),可以有4个搜索方向:右(xy+1),下(x+1y),左(xy-1),上(x-1y)。

如何设计DFS搜索函数呢

二维数组(M行,N列)的右丅角出口位置可以表示为:(m-1, n-1)
路径表示为path ; 但是路径可能有很多条其中最短的路径表示为:shortestPath。

至少这个函数需要三个参数dfs(x坐标,y坐標搜索矩阵即二维数组)

然后设计搜索结束返回的判断条件

对于任意位置(二维数组的某一个位置)因为0代表通路,1代表障碍物如果走過了可以到达的位置,将其设定一个标记为1

maze[x][y] = 1; // 将走过的路标记当改路线搜索完成时,再清除此标记为0 

它表示从上一个位置开始,向下一個位置搜索的坐标

* DFS算法解决走迷宫问题 // 将路线和标记恢复成上一次的状态 // 初始化一个迷宫地图 * 从矩阵的左上角位置开始搜索

这里有一个問题,如果最短的路线不只一条怎么处理?这个算法中并没有考虑这个问题
所以这个算法还是有一定的瑕疵的。

假设给定3个数:12,3求出其所有的排列组合情况。

这个问题也可以使用DFS算法求解

那么该如何开始思考这个问题呢?

这个数组代表搜索的开始从array[0]开始,第┅种情况组合就是:11,1

设计DFS搜索函数的原型为:

其中:参数的含义是从目标数组中依次取出第几个元素index代表数组元素的下标。

这两个題目的求解结果并不重要重要的是需要整理清楚在使用DFS算法思想求解问题时,该如何入手思考问题
有一些思路还需要在继续思考。
(還没有完全思考清楚)

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

  看到有两个相等的回文的时候,第一的想法就是去用后缀数组加上回文树维护一下但是推了很久,被"aaaaa"这样的例子给卡住了然后就去想可不可以魔改一下回文树的跳转指针呢?

  这里我用了贪心的办法来更改指针也就昰我们既然需要两个由相同回文串构成的回文(双倍回文),那么它长度为它的一半所在的后缀的位置也一定要求是回文了所以,在这裏引进“小于等于当前回文长度一半的回文后缀”指针——trans指针

那么,怎样处理trans指针呢首先,如果目前串的长度是小于等于2的那么咜肯定直接就是它的fail了,因为fail肯定是小于等于它的一半的然后,如果目前点所代表的串的长度是大于2的时候我们就是需要去找了,我們先找到当前串的结点的父亲的trans的点tmp然后如果说它“+2”(因为是两头都要加进一个字符)并且乘以两倍的长度大于目前串的长度了,我們就需要跳转fail了来做到找小于等于长度一半的;但是不止是这点需要改,如果说我们没有找到他的next仍然是需要去跳转fail的(这点和普通嘚fail没有差别)。

  所以我们这里只需要找到对应的后缀长度是目前串长度的一半的串,并且目前串的长度为4的倍数的串来更新答案在这裏的trans是保证了后缀的相等(并且回文长度为总长度的一半),然后找对应的以它为最右边结点的回文长度是否也是目前回文串的一半我們就可以确定答案了。

 int last ;//指向上一个字符所在的节点方便下一次add
 S[n] = -1 ;//开头放一个字符集中没有的字符,减少特判
 
 {//和KMP一样失配后找一个尽量最長的
 
 {//如果这个回文串没有出现过,说明出现了一个新的本质不同的回文串
 //父亲累加儿子的cnt因为如果fail[v]=u,则u一定是v的子回文串!

毕业季找工作了如果想应聘机器学习工程师岗位,你可能会遇到技术面试这是面试官掂量你对技术的真正理解的时候,所以还是相当重要的近日,JP Tech 发表了一篇文章介绍了他们面试新人时可能会提出的 12 个面试问题。问题很基础但却值得一看。

这些问题是我在面试 AI 工程师岗位时常问到的问题事实仩,并非所有面试都需要用到所有这些问题因为这取决于面试者的经验以及之前做过的项目。经过很多面试(尤其是与学生的面试)之後我收集了 12 个深度学习领域的面试问题。我将在本文中将其分享给你

问题1:阐述批归一化的意义

这是一个非常好的问题,因为这涵盖叻面试者在操作神经网络模型时所需知道的大部分知识你的回答方式可以不同,但都需要说明以下主要思想:

算法 1:批归一化变换在┅个 mini-batch 上应用于激活 x。

批归一化是一种用于训练神经网络模型的有效方法这种方法的目标是对特征进行归一化处理(使每层网络的输出都經过激活),得到标准差为 1 的零均值状态所以其相反的现象是非零均值。这将如何影响模型的训练:

首先这可以被理解成非零均值是數据不围绕 0 值分布的现象,而是数据的大多数值大于 0 或小于 0结合高方差问题,数据会变得非常大或非常小在训练层数很多的神经网络時,这个问题很常见如果特征不是分布在稳定的区间(从小到大的值)里,那么就会对网络的优化过程产生影响我们都知道,优化神經网络将需要用到导数计算

假设一个简单的层计算公式 y = (Wx + b),y 在 W 上的导数就是这样:dy=dWx因此,x 的值会直接影响导数的值(当然神经网络模型的梯度概念不会如此之简单,但理论上x 会影响导数)。因此如果 x 引入了不稳定的变化,则这个导数要么过大要么就过小,最终导致学习到的模型不稳定而这也意味着当使用批归一化时,我们可以在训练中使用更高的学习率

批归一化可帮助我们避免 x 的值在经过非線性激活函数之后陷入饱和的现象。也就是说批归一化能够确保激活都不会过高或过低。这有助于权重学习——如果不使用这一方案某些权重可能永远不会学习。这还能帮助我们降低对参数的初始值的依赖

批归一化也可用作正则化(regularization)的一种形式,有助于实现过拟合嘚最小化使用批归一化时,我们无需再使用过多的 dropout;这是很有助益的因为我们无需担心再执行 dropout 时丢失太多信息。但是仍然建议组合使用这两种技术。

问题2:阐述偏置和方差的概念以及它们之间的权衡关系

偏置(bias)是什么这很好理解,偏置是当前模型的平均预测结果與我们需要预测的实际结果之间的差异当模型的偏置较高时,说明其不够关注训练数据这会使得模型过于简单,无法在训练和测试上哃时实现优良的准确度这个现象也被称为「欠拟合」。

方差(variance)可以简单理解为是模型输出在一个数据点上的分布(或聚类)方差越夶,模型越有可能更密切关注训练数据而无法提供在从未见过的数据上的泛化能力。由此造成的结果是模型可在训练数据集上取得非瑺好的结果,但在测试数据集上的表现却非常差这个现象被称为过拟合。

这两个概念的关系可通过下图说明:

上图中圆圈中心是能够唍美预测精准值的模型。事实上你永远无法找到这样好的模型。随着我们离圆圈中心越来越远模型的预测也越来越差。

我们可以改变模型使得我们可以增大模型猜测的数量,使其尽可能多地落在圆圈中心偏置和方差之间需要保持平衡。如果我们的模型过于简单有非常少的参数,那么它就可能有较高的偏置和较低的方差

另一方面,如果我们的模型有大量参数则其将有较高的方差和较低的偏置。這是我们在设计算法时计算模型复杂度的基础

问题3:假设深度学习模型已经找到了 1000 万个人脸向量,如何通过查询以最快速度找到一张新囚脸

这个问题涉及到深度学习算法的实际应用,关键点在于索引数据的方法这是将 One Shot Learning 应用于人脸识别的最后一步,但这也是最重要的步驟让该应用易于实际部署。

基本上来说对于这个问题,你首先应该通过 One Shot Learning 给出人脸识别方法的整体概况这可以简单地理解成将每张脸轉换成一个向量,然后识别新的人脸是寻找最接近(最相似)于输入人脸的向量通常来说,人们会使用有三元组损失(triplet loss)的定制损失函數的深度学习模型来完成这一任务

但是,如果有文章开头那样的图像数量增长那么在每次识别中都计算与 1000 万个向量的距离可不是个聪奣的解决方案,这会使得系统的速度非常慢我们需要思考在真实向量空间上索引数据的方法,以便让查询更加便捷

这些方法的主要思想是将数据划分成简单的结构,以便查询新数据(可能类似于树结构)当有新数据时,在树中查询有助于快速找到距离最近的向量

问題4:对于分类问题,准确度指数完全可靠吗你通常使用哪些指标来评估你的模型?

针对分类问题的评估方法有很多准确度是一种很简單的指标,也就是用正确的预测数据除以总的数据这听起来很合理,但现实情况是这种度量方式对不平衡的数据问题来说并不够显著。假设我们正在构建用于预测网络攻击的预测模型(假设攻击请求大约占请求总数的 1/100000)

如果该模型预测所有请求都是正常的,那么其准確率也高达 99.9999%但在这个分类模型中,这个数字通常是不可靠的上面的准确度计算得到的结果通常是被正确预测的数据的百分比,但没有詳细说明每个类别的分类细节相反,我们可以使用混淆矩阵基本上来说,混淆矩阵展示了数据点实际属于的类别以及模型预测的类別。其形式如下:

除了表达真正例和假正例指标对应于定义了该分类的每个阈值的变化之外我们还有名为受试者工作特征(ROC)的图表。基于 ROC我们可以知道该模型是否有效。

理想的 ROC 越接近左上角的橙色线(即真正例较高假正例较低),结果就越好

问题5:你怎么理解反姠传播?请解释动作(action)的机制

这个问题的目标是测试参加面试的人是否理解神经网络的工作方式。你需要说明以下几点:

前向过程(湔向计算)是帮助模型计算每层的权重的过程所得到的计算会得到一个结果 yp。这时候会计算损失函数的值;损失函数的这个值能体现模型的优劣程度如果这个损失函数不够好,我们就需要找到一种能够降低这个损失函数的值的方法神经网络的训练目标实际上就是最小囮某个损失函数。损失函数 L(yp,yt) 表示 yp 模型的输出值与 yt 数据标签的实际值之间的差异程度

为了降低损失函数的值,我们需要使用导数反向传播能帮助我们计算网络每一层的导数。基于每一层上导数的值优化器(Adam、SGD、AdaDelta 等)可通过梯度下降来更新网络的权重。

反向传播会使用链式法则机制或导数函数从最后一层到第一层计算每一层的梯度值。

问题6:激活函数有什么含义激活函数的饱和点是什么?

激活函数的目的是突破神经网络的线性性质我们可以将这些函数简单理解成是一种过滤器,作用是决定信息是否可以通过神经元在神经网络训练期间,激活函数在调整导数斜率方面具有非常重要的作用

相比于使用线性函数,使用非线性激活函数能让神经网络学习更复杂的函数表征;但为了有效地使用它们我们需要理解这些非线性函数的性质。大多数激活函数都是连续可微的函数

这些函数是连续函数,也就是說如果输入有较小的可微分的变化(在其定义域中的每个点上都有导数)那么输出也会有较小的变化。当然如前面提到的那样,导数嘚计算是非常重要的而且决定了我们的神经元是否可以训练。值得提及的几种激活函数有 Sigmoid、Softmax 和 ReLU

2. 激活函数的饱和范围

很容易理解,激活函数的饱和范围就是当输入值变化时输出值不再变化的区间这个变化区间存在两个问题。

第一个问题是在神经网络的前向方向上落在噭活函数的饱和范围内的层的值将会逐渐得到许多同样的输出值。这会导致整个模型出现同样的数据流这个现象被称为协方差偏移(covariance shifting)。

第二个问题是在反向方向上饱和范围内的导数为零,由此导致网络几乎无法再学习到任何东西这就是我们在批归一化问题中提到的偠将值的范围设定为零均值的原因。

问题7:模型的超参数是什么超参数与参数有何不同?

1. 模型参数是什么

先稍微回顾一下机器学习的夲质,要做机器学习我们需要有一个数据集。没有数据我们怎么学习呢一旦有了数据,机器需要找到数据之间的关联

假设我们的数據是温度和湿度等天气信息,我们希望机器执行的任务是找到这些因素与我们的爱人是否生气之间的关联这听起来似乎并无关联,但机器学习的待办事项有时候确实很可笑现在,我们用变量 y 表示我们的爱人是否生气变量 x_1、x_2、x_3……表示天气元素。我们用下面的函数 f(x) 表示這些变量之间的关系:

看到系数 w_1、w_2、w_3 了吗这就代表了数据和结果之间的关系,这就是所谓的模型参数因此,我们可以这样定义「模型參数」:

模型参数是模型基于训练数据生成的值有助于展示数据中数据量之间的关系。

所以当我们说要为某问题找到最佳的模型时我們的意思是要基于已有的数据集为该问题找到最合适的模型参数。模型参数有如下特性:

  • 能展现我们使用的模型的能力通常通过准确度等指标表示;

  • 是直接从训练数据集学习到的;

  • 不是由人类人工设置的。

模型参数也有不同的形式比如在神经网络中是权重、在支持向量機中是支持向量、在线性回归和 logistic 回归算法中是系数。

2. 什么是模型超参数

可能有人认为模型超参数就是或者像是模型参数,但事实并非如此实际上这两个概念是完全不同的。模型参数是从训练数据集建模的而模型超参数却完全不是这样,其完全位于模型之外而且不依赖於训练数据所以模型超参数的作用是什么?实际上它们有以下任务:

  • 在训练过程中使用帮助模型寻找最合适的参数;

  • 通常是在模型设計时由人工选择的;

  • 可基于几种启发式策略来定义。

对于某个具体问题我们完全不知道最佳的超参数模型是怎样的。因此实际上我们需要使用某些技术(比如网格搜索)来估计这些值的最佳范围(比如, k 最近邻模型中的 k 系数)。下面是模型超参数的一些示例:

  • 训练人工神經网络时的学习率指数;

  • 训练支持向量机时的 C 和 σ 参数;

  • k 最近邻模型中的 k 系数

问题8:当学习率过高或过低时会怎样?

当模型的学习率过低时模型的训练速度会变得非常慢,因为其每次对权重的更新会变得非常小模型将需要大量更新才能到达局部最优点。

如果学习率过高模型很可能无法收敛,因为权重的更新过大在加权的步骤中,模型有可能无法实现局部优化然后使模型难以更新到最优点(因为烸步更新都跳得过远,导致模型在局部最优点附近摇摆)

问题9:当输入图像的尺寸加倍时,CNN 参数的数量会增加多少倍为什么?

对于参加面试的人来说这个问题很有误导性,因为大部分人思考这个问题的方向都是 CNN 的参数数量会增加多少倍但是,我们看看 CNN 的架构:

可以看到CNN 模型的参数数量取决于过滤器的数量和大小,而非输入图像因此,将输入图像的尺寸加倍不会改变模型的参数数量

问题10:处理數据不平衡问题的方法有哪些?

这个问题检验的是面试者是否知道处理有真实数据的问题的方法通常来说,实际数据和样本数据(无需調整的标准数据集)在性质和数据量上都有很大的不同使用真实数据集时,数据有可能是不平衡的也就是说不同类别的数据不平衡。針对这个问题我们可以考虑使用以下技术:

为模型的评估选择适当的指标:当使用的数据集不平衡时,使用准确度来进行评估是很不合適的(前面已经提到过)而应该选择精确度、召回率、F1 分数、AUC 等评估指标。

对训练数据集进行重新采样:除了使用不同的评估指标外囚们还可以通过某些技术来获得不同的数据集。基于不平衡的数据集创建平衡的数据集的方法有两种:欠采样和过采样具体技术包括重複、自举或 SMOTE(合成少数过采样技术)。

集成多个不同模型:通过创建更多数据来实现模型的通用性在实践中是不可取的举个例子,假设伱有两个类别:一个有 1000 个数据样本的罕见类别以及一个有 10000 个数据样本的常见类别我们可以不必努力为罕见类别寻找 9000 个数据样本来进行模型训练,而是可以采用一种 10 个模型的训练方案其中每个模型都使用 1000 个罕见数据样本和 1000 个常见数据样本进行训练。然后使用集成技术得到朂佳结果

重新设计模型——成本函数:在成本函数中使用惩罚技术来严厉惩罚数据丰富的类别,以帮助模型自身更好地学习罕见类别的數据这能使损失函数的值更全面地覆盖所有类别。

问题11:在训练深度学习模型时epoch、batch(批)和 iteration(迭代)这些概念都6w视频是什么意思思?

這些是训练神经网络时非常基本的概念但实际上很多面试者在区分这些概念时常常搞混淆。具体来说你应该这样回答:

  • epoch:代表在整个數据集上的一次迭代(所有一切都包含在训练模型中);

  • batch:是指当我们无法一次性将整个数据集输入神经网络时,将数据集分割成的一些哽小的数据集批次;

问题12:数据生成器的概念是什么使用数据生成器需要什么?

生成函数在编程中也非常重要数据生成函数可帮助我們在每个训练 batch 中生成能直接拟合模型的数据。

使用生成函数在训练大数据时大有助益因此数据集并不是需要全部都载入 RAM,这是浪费内存;此外如果数据集过大,还可能导致内存溢出对输入数据的处理时间也会变得更长。

上面就是我常在面试过程中向参加面试的人提出嘚 12 个有关深度学习的面试问题但是,根据每个面试者的情况不同提问的方式可以也会各不相同,另外也会有其它一些根据面试者的经曆而提出的问题

尽管这篇文章只涉及技术问题,但也是与面试相关的在我个人看来,态度是面试成功的一半所以除了让你自己积累知识和技能之外,一定要用真正、进取又谦虚的态度展现你自己这样能让你在对话中取得很大的成功。

我要回帖

更多关于 想买一个台式电脑推荐一下 的文章

 

随机推荐