天天看点

SHEIN算法工程师暑期实习面试题8道|含解析

10本电子书放文末,自取~

1、如何理解交叉熵的物理意义

交叉熵是一种用于比较两个概率分布之间的差异的指标。在机器学习中,它通常用于比较真实标签分布与模型预测分布之间的差异。

2、过拟合如何去解决?L1正则为什么能够使得参数稀疏,从求导的角度阐述。

过拟合的解决方法有很多:

数据的角度:获取和使用更多的数据(数据集增强);

模型角度:降低模型复杂度、L1\L2\Dropout正则化、Early stopping(提前终止)

模型融合的角度:使用bagging等模型融合方法。

L1正则化在损失函数中加入参数的绝对值之和,可以使得一些参数变得非常小或者为零,从而使得模型更加稀疏,减少过拟合的风险。从求导的角度上看,L1正则化的导数在某些点处为零,从而使得参数变得非常小或者为零,达到了稀疏的效果。

3、类别不平衡是如何去处理的?如果进行采样,策略是什么?

类别不平衡可以通过对数据进行采样来处理。一种常用的采样策略是欠采样,即随机从多数类中选择一部分样本使得样本平衡。另一种常用的采样策略是过采样,即从少数类中复制一些样本使得样本平衡。还有一种策略是生成新的少数类样本,比如SMOTE算法,其中通过对少数类样本进行随机插值来生成新的样本。

4、介绍一下attention,做过哪些尝试和改进。

Attention是一种机器学习中的技术,主要用于提取输入序列中的关键信息。在自然语言处理和图像处理中,Attention机制已经成为了重要的技术。对于Attention的一些实现方法和改进,一种常见的Attention实现方法是Soft Attention,它可以用于提取序列数据中的重要信息。另外,还有一些改进方法,比如Multi-Head Attention和Self-Attention等,可以进一步提高Attention的性能。

5、对于一个时间顺序的推荐数据,如何划分训练集和验证集,能不能随机?

对于时间顺序的推荐数据,通常可以使用时间轴来划分训练集和验证集。具体地,可以选取一段时间作为训练集,另一段时间作为验证集。如果数据量足够大,也可以将数据随机划分为训练集和验证集。但是,需要注意的是,在时间序列数据中,训练集和验证集应该按照时间顺序进行划分,以保证模型的泛化能力。

6、欠拟合如何去解决,训练过程不收敛如何去解决?

欠拟合的解决方法有很多,其中一个是增加模型的复杂度。可以增加模型的参数数量、增加网络层数、使用更复杂的模型结构等来提高模型的拟合能力。另外,还可以尝试调整学习率、修改损失函数、增加训练数据等方法。如果训练过程不收敛,可能是学习率过大或者网络结构不合理导致的。可以尝试减小学习率、使用不同的优化器、增加网络层数等方法来解决这个问题。

7、正则化和最大似然的关系。

正则化和最大似然有一定的关系。最大似然是一种用于估计模型参数的方法,其目标是找到使得观测数据出现的概率最大的模型参数。正则化是一种对模型参数进行限制的方法,可以使得模型参数更加稳定和泛化能力更强。在最大似然估计中,通过添加正则化项可以达到类似的目的,即防止模型过拟合。常见的正则化方法包括L1正则化和L2正则化。

8、Leetcode:数组中第K大的元素。

难度:【中等】

三种思路:一种是直接使用sorted函数进行排序,一种是使用小顶堆,一种是使用快排(双指针 + 分治)。

方法一:直接使用sorted函数进行排序

代码如下:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        return sorted(nums, reverse = True)[k-1]           

方法二:使用堆

维护一个size为 k 的小顶堆,把每个数丢进去,如果堆的 size > k,就把堆顶pop掉(因为它是最小的),这样可以保证堆顶元素一定是第 k 大的数。

代码如下:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        heap = []
        for num in nums:
            heappush(heap,num)
            if len(heap) > k:
                heappop(heap)
        return heap[0]           

时间复杂度:O(nlogk)

空间复杂度:O(k)

方法三:双指针 + 分治

partition部分

定义两个指针left 和 right,还要指定一个中心pivot(这里直接取最左边的元素为中心,即 nums[i])

不断将两个指针向中间移动,使得大于pivot的元素都在pivot的右边,小于pivot的元素都在pivot的左边,注意最后满足时,left是和right相等的,因此需要将pivot赋给此时的left或right。

然后再将中心点的索引和 k - 1 进行比较,通过不断更新left和right找到最终的第 k 个位置。

代码如下:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        left, right, target = 0, len(nums)-1, k-1
        while True:
            pos = self.partition(nums, left, right)
            if pos == target:
                return nums[pos]
            elif pos > target:
                right = pos -1
            else:
                left = pos + 1


    def partition(self, nums, left, right):
        pivot = nums[left]
        while left < right:
            while nums[right] <= pivot and left < right:
                right -=1
            nums[left] = nums[right]
            while nums[left] >= pivot and left < right:
                left +=1
            nums[right] = nums[left]
        nums[left] = pivot
        return left           

看完本篇如果对你有用请三连,你的支持是我持续输出的动力,感谢,笔芯~

↓ ↓ ↓以下10本书电子版免费领,直接送 ,想要哪本私我下说声,我发你↓ ↓ ↓

SHEIN算法工程师暑期实习面试题8道|含解析
SHEIN算法工程师暑期实习面试题8道|含解析

以上8本+《2022年Q3最新大厂面试题》+《2022年Q4最新大厂面试题》电子书,部分截图如下:

SHEIN算法工程师暑期实习面试题8道|含解析

继续阅读