九天猎人 发表于 3 小时前

搜广推校招面经六十九

瓴岳科技:风控算法练习生

一、先容GBDT

见【搜广推校招面经二十七】
二、有哪些位置编码的情势

位置编码(Positional Encoding)是Transformer等模子中用于引入序列中位置信息的一种机制,由于Transformer本身是没有位置信息的(不像RNN那样是按序次处置惩罚的)。
2.1. 正弦-余弦位置编码(Sinusoidal Positional Encoding)

这是 Transformer 原论文中使用的情势。
对于位置 pos 和维度 i:
                                    P                         E                         (                         p                         o                         s                         ,                         2                         i                         )                         =                         s                         i                         n                         (                         p                         o                         s                         /                         1000                                 0                            (                                  2                         i                         /                                 d                            m                                  o                         d                         e                         l                         )                         )                                                                   P                         E                         (                         p                         o                         s                         ,                         2                         i                         +                         1                         )                         =                         c                         o                         s                         (                         p                         o                         s                         /                         1000                                 0                            (                                  2                         i                         /                                 d                            m                                  o                         d                         e                         l                         )                         )                              PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) \\ \ \\ PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))                  PE(pos,2i)=sin(pos/10000(2i/dm​odel)) PE(pos,2i+1)=cos(pos/10000(2i/dm​odel))


[*]pos:表现位置
[*]i:表现维度的索引
[*]d_model:词向量维度
特点:


[*]不必要学习参数(固定的)
[*]恣意长度可扩展
[*]可以捕获相对位置关系
2.2. 可学习的位置编码(Learnable Positional Embedding)

每个位置都有一个可练习的向量:
PositionEmbedding = Embedding(position_id)
特点:


[*]简单高效,通常结果不错
[*]无法外推到未见过的位置(比方练习最多512,测试用1024就不可)
2.3. 相对位置编码(Relative Positional Encoding)

重点建模“位置之间的相对关系”,比方 Transformer-XL、T5、DeBERTa 中使用。
特点:


[*]更强的泛化本事
[*]更适当语言使命(明白“前后”关系)
2.4. 旋转位置编码(RoPE, Rotary Positional Encoding)

应用于 GPT-NeoX、LLaMA、ChatGLM 等。
思绪是:将位置信息嵌入到 Self-Attention 中的 q 和 k 中,通过旋转操纵。
特点:


[*]易于实现
[*]支持更长的上下文扩展
2.5. 2D 或高维位置编码

用于图像(ViT)、音频或视频等使命。


[*]2D Sinusoidal Encoding:分别对行、列使用正弦编码再拼接
[*]2D Learnable Embedding:行和列方向各自 embedding,再拼接或相加
2.6. 总结

编码方式是否可学习是否支持恣意长度是否捕获相对位置实用场景Sinusoidal❌✅⚠️间接NLP根本使命Learnable✅❌❌短文本、通例分类使命Relative✅✅✅文本天生、问答等RoPE✅✅✅大模子、长文本2D/3D Pos Encoding✅/❌✅✅/❌图像、音频、视频三、旋转位置编码和三角函数位置编码的详细区别?

位置编码的目标是给序列中的每个位置引入位置信息。而,RoPE 和 Sinusoidal 都基于三角函数,但实现思绪和应用方式差异。
3.1. 三角函数位置编码(Sinusoidal Positional Encoding)

原理:

对每个位置 pos 和维度 i,用如下公式天生编码:
                                    P                         E                         (                         p                         o                         s                         ,                         2                         i                         )                         =                         s                         i                         n                         (                         p                         o                         s                         /                         1000                                 0                            (                                  2                         i                         /                                 d                            m                                  o                         d                         e                         l                         )                         )                                                                   P                         E                         (                         p                         o                         s                         ,                         2                         i                         +                         1                         )                         =                         c                         o                         s                         (                         p                         o                         s                         /                         1000                                 0                            (                                  2                         i                         /                                 d                            m                                  o                         d                         e                         l                         )                         )                              PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) \\ \ \\ PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))                   PE(pos,2i)=sin(pos/10000(2i/dm​odel)) PE(pos,2i+1)=cos(pos/10000(2i/dm​odel))
特点:



[*]编码是 固定的,不可学习
[*]通过差异频率的三角函数编码差异位置
[*]编码到场方式:加到输入 token embedding 上
优点:



[*]可推广到恣意长度
[*]生存位置间的隔断信息
缺点:



[*]不易直接捕获相对位置关系
[*]加法情势限定了表达本事
3.2. 旋转位置编码(Rotary Positional Encoding, RoPE)

原理:

将三角函数的位置编码融入 Attention 盘算中的 q 和 k,通过将其旋转肯定角度来表达差异位置。
令二维向量 通过如下旋转矩阵得到位置编码后的值:
                                    R                         o                         P                         E                         (                                 x                            1                                  ,                                 x                            2                                  ,                         θ                         )                         =                         [                                 x                            1                                  ∗                         c                         o                         s                         (                         θ                         )                         −                                 x                            2                                  ∗                         s                         i                         n                         (                         θ                         )                         ,                                 x                            1                                  ∗                         s                         i                         n                         (                         θ                         )                         +                                 x                            2                                  ∗                         c                         o                         s                         (                         θ                         )                         ]                              RoPE(x₁, x₂, θ) =                   RoPE(x1​,x2​,θ)=
即把三角函数用作向量旋转操纵。
应用方式:



[*]不再是加到输入 embedding 上
[*]而是作用在 self-attention 的 q 和 k 上,编码随位置旋转
特点:



[*]编码是可推广的
[*]可以天然地表达相对位置差异
[*]更适当大模子、长文本
3.3. 对比总结

对比维度Sinusoidal Position EncodingRotary Position Encoding (RoPE)底子原理差异频率的 sin/cos 函数编码三角函数表现向量旋转是否可学习否否(但可与可学习联合)应用位置加到 token embedding 上应用于 attention 中的 q 和 k相对位置表达间接表达直接编码相对位置扩展性恣意长度恣意长度(RoPE 在 GPT 系列中表现精良)使用场景原始 Transformer, ViT 等GPT-NeoX, LLaMA, ChatGLM 等大模子四、3. 无重复字符的最宗子串(力扣hot100_滑动窗口)

https://i-blog.csdnimg.cn/direct/0d0b3872e4864c70abb98b4d2e23aab5.png


[*]思绪1:
滑动窗口,站在每个右端点,如果当前串内有重复的字符。依次移除左端点的
[*]代码:
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
      ans = left = 0
      cnt = defaultdict(int)# 维护从下标 left 到下标 right 的字符及其出现次数
      for right, c in enumerate(s):
            cnt += 1
            while cnt > 1:# 窗口内有重复字母
                cnt] -= 1# 移除窗口左端点字母
                left += 1# 缩小窗口
            ans = max(ans, right - left + 1)# 更新窗口长度最大值
      return ans


[*]思绪2:
依次遍历s,不是重复字符直接到场并盘算长度,遇到重复字符,那么当前字符要退出到上一个重复位置。列表可接纳 list.index(i),找到i字符在列表中的位置。
[*]代码:
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
      tmp_s = []
      max_len = 0
      for i in s:
            if i not in tmp_s:
                tmp_s.append(i)
                max_len = max(max_len, len(tmp_s))
            else:
                index = tmp_s.index(i)               
                tmp_s = tmp_s
                tmp_s.append(i)
      return max_len

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 搜广推校招面经六十九