天天看點

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道|含解析

繼續閱讀