字节算法工程师一面凉经

1.针对实习提问: 数据分析内容?清洗数据的步骤?缺失值怎么处理?异常值的判断方式?箱型图原则和3σ原则有什么区别?异常值怎么处理?怎么替代?

2.针对项目提问: Le-Net 5和VGG-16有什么区别?dropout效果如何,在测试阶段怎么处理?还有什么其他正则化方法?什么是感知域(没听懂,跳过去了)? 你了解1*1的卷积块有什么作用吗(bottleneck layer)?VGG-16过于复杂,是否尝试更简单的模型,效果如何?

Le-Net5和VGG-16主要有以下区别:

Le-Net5: 5层网络、average pooling、没有padding、针对32*32的黑白图片、激活函数为sigmoid或者tanh、共有60K左右的参数

VGG-16: 16层网络、max pooling、有padding、针对224*224*3的RGB图片、激活函数为Relu、共有138M左右的参数

②dropout随机以概率p丢弃该层的神经元,可以让一些神经元感觉自己出错了,从而让网络不再那么依赖于前一层的输入,从而防止过拟合。 在测试阶段,dropout需要关闭,同时将各层参数按比例缩小。

③加入L1 L2正则项、数据增强(将一个数据扩展.例如将图片翻转)、早停法、加入噪声

④bottleneck layer是论文ResNet提出的,使用一个1*1的卷积核,不会改变输入的长和宽,因此bottleneck layer的作用是改变channel的数目。论文 Going Deeper with Convolutions的内容:1x1 convolutions are used to compute reductions before the expensive 3x3 and 5x5 convolutions. Besides being used as reductions, they also include the use of rectified linear activation which makes them dual-purpose.即使是一个很小的卷积核(例如5*5)在channel/dimension数目很多的时候,也会导致参数太多,因此先用bottleneck layer减少dimension,再应用更大的卷积核。

3.针对项目提问: 聊聊sklearn的vectorizer函数,怎么生成一组feature,具体怎么实现向量化?有没有其他的vectorizer函数? 你的文本数据有什么尝试什么其他sklearn之外的预处理(stem lemma stopwords)?讲讲LR的损失函数怎么计算? 这个损失函数有什么优点,为什么这么计算?假设训练LR模型,但是数据有一组feature完全重复了,对结果有什么影响?

①sklearn有两种Vectorizer函数CountVectorizer和TfidfVectorizer, 前者可以设置binary来决定是01还是raw count。实例化以后(feature_nums, stop_words, tokenizer)用实例化后的vectorizer.fit_transform函数将数据转换成向量。这两种类生成feature的方式是一样的,都是统计出现频率最高的那部分词。其中TF-IDF将数据的对每个feature的TF-IDF值作为该feature的值。TF是该feature在sample中出现的次数,只与当前转化的sample和feature有关。IDF为Inverse Document Frequency,由下式决定

IDF(corpus, t) = \ln\frac{(No. of samples)}{(No. of samples with feature t)+1}

即总的sample数越多,拥有该feature的sample越少,IDF越大。TF-IDF的效果还是很好的,因为不仅考虑了一个feature在该sample中出现的次数,同时考虑了该feature在sample中的频率,如果大多数sample都有此feature,则说明该feature没啥区分度,对应的TF-IDF值很低。要注意的是,IDF值与sample无关,只与整个数据集和feature有关,因此一旦数据集确定,每个feature的IDF就已经确定,区分度小的feature被弱化,区分度大的被强化。

4.编程题:输入一个字符串,输出所有可能的IP地址。没思路,提示我用递归,还是没思路。换了一个简单的: 整数数组,只有一个数只出现一次,其他都出现两次,输出只出现一次的数。我说用哈希表记录一下每个数次数,面试官说空间复杂度太大,让我用O(1).我没想出来,提示我用异或,即按第二个数向前异或,直到最后,得到的结果就是答案。编程题的表现过于糟糕,感觉基本凉了。

第一题面试完想了一下,只会用三重循环粗暴求解,但是面试官当时提示说让用递归,所以完全没有思路,现在想起来,因为字符串的长度不可能超过12,因此即使是三重循环也只是O(1)时间复杂度问题,而面试的时候想到三重循环立马否决掉因为下意识的认为时间复杂度太高。具体代码如下

add="1542054149"
k = len(add)
result = []
for i in range(0,min(3,k-3)):
    for j in range(i+1,min(i+4,k-2)):
        for l in range(j+1,min(j+4,k-1)):
            #如果任意一个数>255,继续下一次循环
            if int(add[i+1:j+1])>255 or int(add[j+1:l+1])>255 or int(add[l+1:])>255 or int(add[0:i+1])>255:
                continue
            #如果任意一个数长度是2或3,并且开头是0,则必须是全0,否则舍弃
            if len(add[0:i+1])>1 and add[0]=='0' and int(add[1:])>0:
                continue
            if len(add[i+1:j+1])>1 and add[i+1]=='0' and int(add[i+2:])>0:
                continue
            if len(add[j+1:l+1])>1 and add[j+1]=='0' and int(add[j+2:])>0:
                continue
            if len(add[l+1:])>1 and add[l+1]=='0' and int(add[1+2:])>0:
                continue
            result.append(".".join([add[0:i+1],add[i+1:j+1],add[j+1:l+1],add[l+1:]]))
print(result)   

第二题异或思路: 相同的数异或是0,0和任何数异或还是本身,同时异或满足交换律和结合律,因此将所有数全部异或,得到的结果是只有一个的那个数。刚刚查了一下发现是leetcode的题,唉,没刷到,所以完全不知道异或这个思路。现在学习到了异或是python中常用的解决重复问题的方法。在python中,实现异或的方式:a^b

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值