8.30携程笔试

试卷:算法工程师(NLP方向)

选择里面涉及了Transformer,tree,神经网络参数计算等。这些还算正常。

编程4个题。
1. q次询问,每次输入一个数,要求把这个数重新排列称为偶数。全过了贴一下代码。
def change(num):
    x = int(num)
    if x % 2 == 0:
        return x
    else:
        flag = False
        arr = list(num)
        n = len(arr)
        for i in range(n):
            if int(arr[i]) % 2 == 0:
                arr[i], arr[-1] = arr[-1], arr[i]
                flag = True
                break
        if flag:
            return int("".join(arr))
        else:
            return -1


q = int(input())
for i in range(q):
    x = input()
    res = change(x)
    print(res)


2. n次输入每次输入三个数分别代表y\o\u的个数,you算两分,oo一分,问排列最多多少分。
思路:最先排列you然后把o都连起来,有多少连接就算多少分。全过了贴一下代码。
def spell(a,b,c):
    mini = min(a,b,c)
    you = 2*mini
    a,b,c = a-mini,b-mini,c-mini
    if b == 0:
        return you
    else:
        return you+b-1

q = int(input())
for i in range(q):
    a,b,c = map(int,input().split())
    res = spell(a,b,c)
    print(res)

3. 第三题有点难度了,想了半天不知道要用bfs还是拓扑,问题是n个结点,每个结点为red,green,blue三种颜色,问如果删除边可以使两部分中均有rgb,输出合法边的个数,这题让我想到了BST。。。
好像是没有a,贴一下代码,如果有大佬请赐教!!!
n = int(input())
s = input()
dic = {}
for i in range(n-1):
    u,v = map(int,input().split())
    if u not in dic:
        dic[u] = [v]
    else:
        dic[u].append(v)
queue = [[1]]
color = set()
res = 0
while queue:
    lst = queue.pop(0)
    while lst:
        node = lst.pop(0)
        if node in dic:
            queue.append(dic[node])
        if s[node-1] not in color:
            color.add(s[node-1])
        if len(color) == 3:
            res+=1
            color.clear()
print(res)

4. 输入一个数组。平滑值为相邻数直接的差的最大值,求修改数组中一个数字或者不修改,平滑值最小为多少。
思路:找到相差最大的数的index与差,然后根据大小去修改原arr数组。
n = int(input())
arr = list(map(int,input().split()))
dif = [0]*(n-1)
maxdis = 0
maxidx = -1
for i in range(n-1):
    dif[i] = arr[i+1]-arr[i]
    if dif[i]>maxdis:
        maxdis = dif[i]
        maxidx = i
if maxidx == 0:
    arr[0] = arr[1]
elif maxidx == n-2:
    arr[-1] = arr[-2]
else:
    left,right = arr[maxidx-1],arr[maxidx+1]
    arr[maxidx] = (right+left)//2
res = 0
for i in range(n-1):
    dis = arr[i+1]-arr[i]
    if dif[i]>res:
        res = dis
print(res)




#携程笔试##携程#
全部评论
老哥,笔试是晚上7点吗
点赞 回复 分享
发布于 2022-09-13 13:44 陕西

相关推荐

翻遍各种大模型的实现,虽然结构上可能保留了 dropout 的实现,但是采样概率都设置为 0 了。唯一一个比较新的,还用 Dropout 的模型是 Meta 训练的 Galactica 模型。那为什么现在不用了呢?核心还是要弄清楚 Dropout 的使用场景。Dropout 之前在深度学习当中是一个特别好用的方法,可以防止过拟合,提高泛化。所以说,当模型较大,数据较少的时候,使用 Dropout 是比较合适的。现在大模型处在什么状态呢?✅预训练在预训练阶段,目前可能还是处于欠拟合的状态。之所以说可能,是基于目前公开的一些论文的出的结论。但是现在闭源的公司在采用大量数据合成的情况下,已经训练足够充分或者接近充分也说不定。以 llama 一系列论文为例,训练 llama 1 的时候,龙猫 Scaling law 里面提到 GPT3 是一个训练很不充分的模型。然后给出的数据配比的建议是,10B 的模型要采用 200B 的 token 来训练。但是 llama 1 采用了 7B 的模型,训练量 1T 的 token 发现性能依然有提升。而且预训练所有的语料一般只过一个 epoch,某些特定的领域可能过 2个 epoch,可以认为样本的重复率很低。所以,在数据足够多,多样性足够而且没有太多重复的情况下,大模型在预训练阶段仍然没有过拟合的风险。也就完全不需要采用 dropout。✅Dropout 就完全不需要了么?如果上面的条件不能满足,Dropout 还是有用武之地的。比如前面提到的 Galactica 模型。这个模型和其他大模型不太一样的地方是训练了 4.25 个 epoch,因为他们认为高质量的数据更重要一些,但是又没有那么多,所以就 repeat 数据了。在论文《To Repeat or Not To Repeat: Insights from Scaling LLM under Token-Crisis》 中,详细列举了数据 Repeat 对训练 LLM 的影响,并且证明了 Dropout 可以缓解数据重复带来的性能损失。在文章《Can LLMs learn from a single example?》中,也提到了在 SFT 的时候,少量的重复数据就会降低模型的性能。这也符合常理,SFT 的数据分布和预训练的通常是不太一样的,重复的数据会让模型拟合新的分布,从而忘掉旧的分布。文中同样也提到 Dropout 可以缓解数据重复带来的影响。所以 Dropout 在数据量较少,多样性不高,需要 repeat 的场景下,依然是一个减少过拟合的很方便的手段。比如现在已经有一些在 LoRA 微调的时候采用 Dropout 的研究了。      
点赞 评论 收藏
分享
评论
6
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务