Schwertlilien
As a recoder: notes and ideas.

2025-4-22-字节面试准备

知识点

Transformer

  • [x] 介绍transformer架构
  • [x] 详细说一下Decoder的因果注意力 (也叫掩码自注意力)QKV分别来自哪
  • [x] self-attention: Attention为什么要做scaled 不做会怎么样 为什么用根号$\sqrt{d_k}$
  • [x] Transformer怎么做加速训练(KV缓存) 训练和推理有什么区别(并行化)
  • [x] Attention的复杂度是多少?
Q K V
交叉注意力层 解码器中因果注意力层的输出向量 编码器输出的注意力向量 编码器输出的注意力向量
因果注意力层 输出序列中的当前位置词向量 输出序列中的所有位置词向量 输出序列中的所有位置词向量
全局自注意力层 输入序列中的当前位置词向量 输入序列中的当前位置词向量 输入序列中的当前位置词向量

img

LoRA

  • [ ] LoRA是什么?有什么好处
  • [ ] 知道PEFT吗 讲一下LoRA/微调用的LoRA介绍一下LoRA
  • [ ] LoRA初始化怎么做的,用的秩是多少,为什么不选其他的数

其他

  • [ ] 知道RLHF吗?讲一下训练流程

  • [ ] bn/ln(batch norm,layer norm,RMS norm)

  • [ ] bn训练阶段和测试阶段区别,详细讲讲原理

  • [ ] dropout原理,训练阶段和测试阶段区别,为什么

  • [ ] 优化器的原理

  • [ ] PPO的原理,损失函数

  • [ ] 残差链接的概念

  • [x] 介绍一下LSTM,为什么LSTM能解决梯度消失或者梯度爆炸,LSTM全称叫长短时记忆神经网络,为什么叫“长短时”

  • [x] 梯度消失或者梯度爆炸

  • [ ] 知识蒸馏损失函数

  • [ ] 交叉熵损失、符号以及含义、梯度下降方向是?代码

  • [ ] 二分类任务损失函数是?最后一层的激活函数是?

  • [ ] 回归任务的损失函数可以用哪些?为什么回归使用MSE而不用交叉熵?

  • [ ] 对比学习?增量学习?

  • [ ] 神经网络权重可以全部初始化为0吗、为什么?

  • [ ] 长尾问题的解决方案?为什么长尾侧用MSE、短尾侧用MAE?

  • [ ] CTR问题用的什么loss?可以用MSE吗、为什么?

搜广推

  • [ ] 推荐链路是怎么运作的 有哪些模块
  • [ ] 如何做排序模型的迭代
  • [ ] MAP(最大后验概率)和似然函数有什么关系?
  • [ ] 什么情况下,MAP的损失函数可以用NMSE来计算?(高斯噪声)
  • [ ] 推荐算法了解哪些?

数据结构

  • [ ] 跳表和二叉树的区别是什么?
  • [ ] b+ 树 和 b树的区别, 为什么innodb索引用b+ 不用b

程序设计语言

  • [ ] cpp五种内存类型:如堆、栈
  • [ ] python中可变/不可变类型
  • [ ] 深拷贝/浅拷贝
  • [ ] python中的decorator
  • [ ] 智能指针?其作用?与auto区别?
  • [ ] 野指针?
  • [ ] 面向对象三要素:继承、多态、封装

软工

  • [ ] 设计模式:工厂模式等等

手撕算法

  • [ ] 单调递增数组nums,判断target是否在里面,要求复杂度为log(n)
  • [ ] 最大连续子数列
  • [ ] TOP K大的数
  • [ ] 全排列(口述全排列 II)
  • [ ] 合并 K 个升序链表
  • [ ] 有序列表是否有数占了数组的一半以上
  • [ ] 二叉树最近祖先

img

手撕ML/DL

  1. numpy实现全连接层
  2. 讲一下multi-head attention 用pytorch手撕一下 要可以实现cross attention的
  3. 手撕attention
  4. 手撕交叉熵
  5. sigmoid梯度下降

numpy实现全连接层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class LinearLayer:
def __init__(self,in_deatures,out_features):
self.W=np.random.randn(in_features, out_features) * 0.01
self.b=np.zeros((1,out_features))

def forward(self,x):
self.x=x
self.z=x@self.W+self.b
return self.z

def backward(self,grad_output,lr=0.001):
# grad_output: 上一层传来的 dL/dz
grad_input=grad_output@self.W.T
grad_W=self.X.T@grad_output
grad_b=num.sum(grad_output,axis=0,keepdims=True)
# 参数更新--S
self.W -= lr * grad_W
self.b -= lr * grad_b

return grad_input

梯度下降

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import numpy as np

def sigmoid(x):
return 1/(1+np.exp(-x))

def sigmoid_derix(x):
# MSE
s=sigmoid(x)
return s*(1-s)

# 初始化参数
w = np.random.randn()
b = np.random.randn()
lr = 0.1

# 假设数据集
x = 0.5
y = 1.0

for i in range(100):
# forward
z = w * x + b
y_hat = sigmoid(z)
loss = 0.5 * (y - y_hat)**2

# backward
dL_dy = y_hat - y
dy_dz = sigmoid_deriv(z)
dz_dw = x
dz_db = 1

# 链式法则
dL_dw = dL_dy * dy_dz * dz_dw
dL_db = dL_dy * dy_dz * dz_db

# update
w -= lr * dL_dw
b -= lr * dL_db

if i % 10 == 0:
print(f"Iter {i}: loss = {loss:.4f}")

搜索
匹配结果数:
未搜索到匹配的文章。