微信公众号:小白算法
关注可了解更多算法,并领取免费学习资料。问题或建议,请公众号留言;
小白算法,一个人人都能懂的知识公众平台。
写在前面:“小白带你刷面试”是我们在“小白带你学算法”之后又新开的第二个主题板块,在这我们将主要围绕机器学习/深度学习,算法知识,图像处理,编程语言方面的内容,以一问一答形式展示面试题目内容:这里我们开始第一篇,8个问答题目。
目录
1. CNN问题
CNN最成功的应用是在CV(计算机视觉),那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性?
答:CV(计算机视觉),NLP和Speech,AlphaGo的围棋问题,几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。如下图:低层次的直线/曲线等特征,组合成为不同的形状,最后得到汽车的表示。
CNN抓住此共性的手段主要有四个:局部连接/权值共享/池化操作/多层次结构。
局部连接使网络可以提取数据的局部特征;
权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积;
池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。
如下图所示,为卷积神经网络的运算示意图:
略---见微信公众号内附图
2. 卷积核操作维度问题
假设输入一个维度为224x224x3的数据,然后采用5个大小为7x7、边界值为0的卷积核进行数据操作,那么神经网络下一层所接收到的数据维度是多少?
A、218x218x5
B、217x217x8
C、217x217x3
D、220x220x5
解析:选A,
首先,输入数据,经过5个卷积核操作,输出的channel肯定等于5,排除BC;
法一:其次,边界值为0,不采用padding形式进行填补,故经过7x7的卷积之后,上下左右均少了3个数据,故224-3x2=218,所以是218x218x5。
法二:
3. Dropout处理问题
假设我们有一个5层的神经网络,这个神经网络在使用一个4GB显存显卡时需要花费3个小时来完成训练。而在测试过程中,单个数据需要花费2秒的时间。 如果我们现在把架构变换一下,当评分是0.2和0.3时,分别在第2层和第4层添加Dropout,那么新架构的测试所用时间会变为多少?
A、少于2s
B、大于2s
C、不变
D、说不准
解析:选C,Dropout在网络训练阶段,采用随机失活的方式,避免过拟合,增强网络的鲁棒性;
在预测阶段,Dropout并不存在失活现象,故在架构中添加Dropout这一改动仅会影响训练过程,而并不影响测试过程,测试时间不变。
4. 过拟合问题
下列的哪种方法可以用来降低深度学习模型的过拟合问题?
(1) 增加更多的数据或data augmentation
(2) Dropout
(3) 正规化数据
(4) 降低架构的复杂度
解析:全选,
(1)数据就好比考试的卷子,过拟合就是把卷子背会了,不知道有没有学到知识的精髓,这个时候增加数据量,就能够让模型学到更多,从而提炼出更加准确的内容;
(2)Dropout前面也说过一次,模仿人学习时而会忘记这样的情况;
(3)在原始的代价函数后面加上一个L1,L2正则化项 ,通过约束参数的范数使其不要太大,使得权重衰减,所以可以在一定程度上减少过拟合情况;
(4)降低模型复杂度,复杂度越高,越容易把知识背下来,在训练集上变现异常优异,在测试集上表现异常的差。
5. 机器学习三要素
数据、算法、模型
-
略---见微信公众号内附图
-
数据:输入数据包括:用户对商品的浏览、点击历史行为数据以及相应的用户商品特征数据。这些历史数据记录了什么样的用户点击了什么样的商品,什么样的用户对什么样的商品看了没有点击。我们认为这些历史数据中蕴含了某种规律,希望机器学习能把这种规律挖掘出来,在将来面对新的用户和商品时,就能预测是否会点击。
-
算法:机器学习算法有很多,逻辑回归、随机森林都适用于这个场景,但这里我们先不对具体的算法作展开,暂时读者只需要概念性的知道,基于输入数据执行“算法”便可产生模型(模型就代表了学习算法从数据中挖掘出的规律)。
-
模型:学得模型之后,面对新的用户和商品,模型就能作出相应的判断,用户会点击还是不会点击。利用模型的这个“技能”,我们便可以做到给每个用户推荐他最感兴趣的商品了。
6. Softmax公式推导
7. KNN问题
KNN(K-Nearest Neighbor,译作 K-近邻居)算法是:
通过测试不同特征值之间的距离进行分类的算法;
是一种既可以用于分类,又可以用于回归的非参数统计方法;
有监督学习。
描述算法思路:
描述算法步骤:
代码块实战:对一组数据分类
from numpy import *
def creatDataSet():
group=array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
labels=['A','A','B','B']
return group,labels
def classify(input,dataSet,label,k):
dataSize=dataSet.shape[0]
##欧式距离
diff=tile(input,(dataSize,1))-dataSet #tile功能是重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组
sqdiff=diff**2
squareDist=sum(sqdiff,axis=1)###行向量分别相加,从而得到新的一个行向量
dist=squareDist**0.5
#print(dist)
sortedDistIndex=argsort(dist)#argsort()从大到小进行排序,返回下标
print("排序结果下标:",sortedDistIndex)
classCount={}
for i in range(k):
voteLabel=label[sortedDistIndex[i]]
classCount[voteLabel]=classCount.get(voteLabel,0)+1
print("K分类的类别和投票数:",classCount)
maxCount=0
for key,value in classCount.items():
if value>maxCount:
maxCount=value
classes=key
return classes
if __name__=='__main__':
dataSet,labels=creatDataSet()
testData=array([1.1,0.3])
K=3
output=classify(testData,dataSet,labels,K)
print("测试数据为:",testData,"分类结果为:",output)
输出结果
8. K-means
K-means 是一种聚类方法;
k 是一个常数值,由使用者指定,这种算法负责将特征空间中的 n 个向量聚集到 k 个簇中;
在机器学习领域,聚类属于一种无监督式学习算法。
K=3时的聚类举例:
略---见微信公众号内附图
算法步骤
其算法运行过程大致如下:
Step 0:用户确定 k 值,并将 n 个样本投射为特征空间(一般为欧氏空间)中的 n 个点(k⩽nk⩽n);
Step 1:算法在这 n 个点中随机选取 k 个点,作为初始的“簇核心”;
Step 2:分别计算每个样本点到 k 个簇核心的距离(这里的距离一般取欧氏距离或余弦距离),找到离该点最近的簇核心,将它归属到对应的簇;
Step 3:所有点都归属到簇之后,n 个点就分为了 k 个簇。之后重新计算每个簇的重心(平均距离中心),将其定为新的“簇核心”;
Step 4:反复迭代 Step 2 - Step 3,直到簇核心不再移动为止。
小白带你刷面试的1-8题的内容理解到了吗?该系列持续更新中,想get更多有趣的算法知识,或者提出宝贵意见,请关注微信公众号“小白算法”并联系我们,谢谢!!!