(多选题部分整理在题库里,加微信获取:jackwwang8)
1、在信故障诊断RAG系统中,使用领域微调Embedding模型将用户查询与历史障案例转换为768维向量。为提升检索精度,系统对所有向量执行L2归一化,向量模长为1。下列关于相似度计算的工程实践选择,最优的是
A.采用欧氏距离计算相似度,距离越小表示故障案例与查询匹配度越高
B.采用点积相似度计算,其结果与余弦相似度等价,且计算效率更高
C.采用曼哈顿距离计算,更适合高维稀疏的故障文本向量场景
D.采用余弦相似度计算,需额外对向量模长进行归一化处理
答案:B
解析:向量已做L2归一化,点积和余弦相似度结果一致,且点积计算效率更高
2、在分析工具调用风险时,发现Agent具有写文件权限和执行脚本权限。若攻击利用接注入让Agent执行以下操作序列:1.Base64负载写入temp.sh;2.运行chmod+x;3.执行该脚本。这种攻击组合在权限风险矩阵中属于
A.权限提权
B.权限收敛
C.职责分离缺失
D.跨站脚本
答案:B
解析:Write与Exec单独风险有限,组合后可写入并执行恶意脚本,形成高危权限汇聚
3、当前主流多模态模型,如LLaVA、Qwen-VL与原生多模态模型,如Gemini、GPT-4o的核心架构差异是
A.当前模型使用Transformer,原生多模态使用CNN+RNN混合架构
B.当前模型冻结视觉编码器+训练投影层,原生多模态端到端联合训练视觉和语言组件
C.当前模型参数量小,原生多模态参数量大,这是唯一区别
D.当前模型只支持文本输出,原生多模态支持图像生成
答案:B
解析:LLaVA、Qwen-VL常用视觉编码器和投影层连接LLM;原生多模态模型更强视觉与语言的联合建模
4、在随机梯度下降中,使用小批量梯度代替全梯度,关于噪声对数值稳定性的影响,正确的是
A.噪声可通过增大学习率来完全消除
B.噪声方差与批量大小成正比,增大m可增加噪声
C.噪声在接近最优解时帮助逃离鞍点,但可能导致在最优解附近波动
D.噪声导致目标函数值单调下降,但收敛点随机波动
答案:C
解析:小批量梯度噪声可增强探索能力,在最优点附近会带来震荡,影响数值稳定性
5、电影院放映厅可以容纳150名观众,第一位观众进入放映厅前丢了票,不知道自己的座位号,就随机选择一个位置坐下。剩余观众均没有丢票,首选自己的位置坐,但是如果发现自己的位置已经被占了,就从剩下的空位中随机选一个位置坐。则最后一位进入的观众恰好坐在自己座位上的概率是多少
A.113/150
B.49/150
C.77/150
D.1/2
答案:D
解析:经典飞机座位问题,最后一人坐自己座位的概率始终为1/2
6、关于贪婪搜索的描述,正确的是
A.它在每一步都选择当前概率最高的Token,容易陷入局部最优或重复循环
B.它通过引入随机性来提高文本的创造力
C.它会考虑所有可能的序列路径,寻找全局最优解
D.它的计算量远大于束搜索
答案:A
解析:贪婪搜索每步取当前最优,不考虑后续全局路径,容易重复或陷入局部最优
7、在CLIP的对比学习中,假设batchsize为N,对于某个正样本对,其梯度对图像特征的贡献包含哪些部分,不考虑温度参数
A.仅来自对角线位置的梯度,非对角线位置梯度为0
B.仅来自图像→文本方向的正样本梯度
C.来自图像→文本的正样本梯度,以及作为其他样本负样本时的梯度
D.来自两个方向:图像→文本的正样本梯度+文本→图像的正样本梯度
答案:D
解析:CLIP使用双向对比损失,正样本对在两个方向都贡献梯度,完整梯度还包含负样本项
8、与K-Means不同,DBSCAN算法的一个显著优点是能够识别并处理哪种类型的数据点
A.噪声点
B.核心点
C.中心点
D.边界点
答案:A
解析:DBSCAN能将低密度区域中的点识别为噪声点,K-Means通常会强制分配到某个簇
9、自适应数值积分的基本策略是
A.在整个区间上均匀加密节点
B.在估计误差较大的子区间上局部加密,误差较小的子区间保持不变
C.随机选择加密位置
D.先用高阶公式再用低阶公式
答案:B
解析:自适应积分核心是根据局部误差动态细分区间,提升计算效率
10、在评估一个二分类模型的性能时,如果关注的是模型预测为正类的样本中真正为正的比例,应该使用以下哪个指标
A.精确率
B.F1分数
C.准确率
D.召回率
答案:A
解析:精确率衡量预测为正的样本中真正为正的比例
11、激活函数的主要作用是
A.加快训练
B.提高模型精度
C.增加模型参数
D.引入非线性
答案:D
解析:激活函数核心作用是引入非线性,让神经网络能拟合复杂函数
12、在目标检测或极度不平衡的分类任务中,研究人员提出了Focal Loss。Focal Loss主要是通过引入下列哪种机制来调节不同样本对总损失的贡献
A.动态权重衰减,根据训练轮数自动衰减样本的权重
B.调制因子,引入参数,pt是预测概率,使模型对已预测准确的简单样本降权
C.硬采样,每轮训练直接丢弃损失值低于阈值的简单样本,只计算困难样本损失
D.标签平滑,将硬标签转换为软概率分布,减少模型对预测的过度自信
答案:B
解析:Focal Loss通过调制因子降低简单样本损失权重,突出困难样本
13、某模型推理时,Decode阶段逐token生成,已知Prefix阶段缓存的KVCache为10个token的K/V向量,当前已生成5个token,若采用KVCache复用策略,则第6个token生成时,自注意力计算需新增计算的K/V向量数量为
A.1个
B.6个
C.5个
D.15个
答案:A
解析:KVCache会复用已有token的K/V,第6个token只需新增当前token的K/V向量
14、ZeRO技术通过显存状态进行切片来打破数据并行的显存墙。关于ZeRO的不同阶段,ZeRO-2具体对哪些状态进行了分片来降低显存占用
A.优化器状态、模型参数做切片
B.对梯度、模型参数做切片
C.对优化器状态、梯度做切片
D.对优化器状态、模型参数、梯度做切片
答案:C
解析:ZeRO-2分片优化器状态和梯度,ZeRO-3才进一步分片模型参数
15、在基于n-gram的语言模型中,我们将句子看作是词的序列,假设当前词出现的概率只依赖于前一个词。这种假设对应的数学模型是
A.泊松过程
B.独立同分布序列
C.隐马尔可夫模型
D.一阶马尔可夫链
答案:D
解析:当前词只依赖前一个词,满足一阶马尔可夫假设
第1题:LLM 分词基石:BPE 算法模拟
大语言模型无法直接理解文本,需要将文本切分成 Token。
BPE (Byte Pair Encoding) 算法的核心思想是:迭代合并最高频的相邻字符对。
给定一个由小写字母组成的初始字符串和最大合并次数 K,模拟 BPE 算法的迭代过程。
题目描述
大模型理解文本的第一步是将字符序列转换为 Token 序列。BPE 算法通过不断合并高频词对来构建词表。
迭代规则
在每一轮迭代中:
统计频率:统计当前序列中所有相邻 Token 对的出现频率。
如果存在多个频率相同的最高频对,选择字典序最小的那一对。
终止条件:如果最高频率为 1,或者没有相邻对,则提前终止。
输入描述
第一行包含一个整数 K,表示最大合并次数。
第二行包含一个字符串 S。
输出描述
输出一行表示经过合并后的序列,Token 之间用空格分隔。
样例 1
输入
5aaabdaaabac
输出
aaab d aaab a c
样例 2
输入
2ababac
输出
ab ab a c
解题思路
初始时将字符串中的每个字符视为独立的 Token。每一轮统计所有相邻对的频率,选出出现次数最多且字典序最小的一对。然后从左到右扫描序列,如果遇到该对则合并,并跳过已被合并的 Token。
更加详细解题思路和CPP、Java代码加我微信获取)
# 题目 1: BPE 分词算法模拟
def simulate_bpe(max_merges, text):
# 初始状态,每个字符都是一个独立的 Token
token_list = list(text)
# 开始迭代合并,最多执行 max_merges 次
for _ in range(max_merges):
# 如果 Token 数量不足 2,无法继续合并
if len(token_list) < 2:
break
pair_counts = {}
# 统计所有相邻 Token 对出现的频率
for i in range(len(token_list) - 1):
pair = (token_list[i], token_list[i + 1])
pair_counts[pair] = pair_counts.get(pair, 0) + 1
target_pair = None
max_frequency = 0
# 寻找出现次数最多且字典序最小的相邻对
for pair in pair_counts:
if pair_counts[pair] > max_frequency:
max_frequency = pair_counts[pair]
target_pair = pair
elif pair_counts[pair] == max_frequency:
if pair < target_pair:
target_pair = pair
# 如果最高频率仅为 1,说明没有重复的对,提前结束
if max_frequency <= 1:
break
merged_tokens = []
idx = 0
# 按照从左到右的贪心原则进行合并
while idx < len(token_list):
# 检查当前位置和下一个位置是否匹配目标对
if idx + 1 < len(token_list) and token_list[idx] target_pair[0] and token_list[idx + 1] target_pair[1]:
# 合并成一个新 Token
merged_tokens.append(token_list[idx] + token_list[idx + 1])
# 跳过已合并的两个 Token
idx += 2
else:
# 保持原样
merged_tokens.append(token_list[idx])
idx += 1
token_list = merged_tokens
return token_list
def run_task():
import sys
# 获取输入流中的所有内容
input_data = sys.stdin.read().split()
if not input_data:
return
# 读取最大合并次数
merge_limit = int(input_data[0])
# 读取初始字符串
source_string = input_data[1]
# 执行 BPE 模拟
result_tokens = simulate_bpe(merge_limit, source_string)
# 打印合并后的 Token 序列,以空格分隔
print(" ".join(result_tokens))
if __name__ == "__main__":
run_task()
第2题:深度学习底层:2D 空洞卷积实现
空洞卷积(膨胀卷积)是卷积神经网络中扩大特征感受野的核心操作。本题要求手动实现单通道 2D 空洞卷积。
题目描述
空洞卷积通过在卷积核元素之间插入空洞(不增加参数),使得相同的卷积核可以覆盖更大的感受野。
计算步骤
输入填充:对二维特征图进行 Padding 填充,上下左右各填充 P 层 0。
输出尺寸:根据输入尺寸 N * M、卷积核尺寸 K * K、步长 S、填充 P 和膨胀率 D 计算输出的高和宽。
有效卷积核尺寸:E = K + (K - 1) * (D - 1)
输出高度:OH = (N + 2 * P - E) // S + 1
输出宽度:OW = (M + 2 * P - E) // S + 1
卷积计算:以步长 S 为间隔滑动窗口。按膨胀率 D 间隔选取窗口内的元素与卷积核逐元素相乘并累加。输入描述
输入特征图的大小。
输入特征图的元素。
卷积核的大小。
卷积核的元素。
步长、填充和膨胀率。
输出描述
逐行返回卷积后的二维特征图。
样例 1
输入
4 61 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2431 0 -1 1 0 -1 1 0 -11 1 2
输出
-32 -8 -8 30-20 -8 -8 18
解题思路
直接模拟二维空洞卷积。遍历输出矩阵的每个位置,计算其在原图(带填充)中的窗口起始坐标。对于卷积核中的每一个位置,通过膨胀率映射到窗口中的具体元素进行乘加。若坐标落在填充区域,则视为 0。
更加详细解题思路和CPP、Java代码加我微信获取)
# 题目 2: 2D 单通道空洞卷积底层实现
import sys
def perform_dilated_convolution():
# 从标准输入读取所有数据并按空格切分
raw_input = sys.stdin.read().split()
if not raw_input:
return
ptr = 0
# 1. 读取输入特征图的尺寸
height = int(raw_input[ptr])
width = int(raw_input[ptr + 1])
ptr += 2
# 2. 读取特征图元素并构建二维列表
feature_map = []
for r in range(height):
row_data = [int(x) for x in raw_input[ptr : ptr + width]]
feature_map.append(row_data)
ptr += width
# 3. 读取卷积核的尺寸
kernel_size = int(raw_input[ptr])
ptr += 1
# 4. 读取卷积核元素并构建二维列表
kernel = []
for r in range(kernel_size):
row_data = [int(x) for x in raw_input[ptr : ptr + kernel_size]]
kernel.append(row_data)
ptr += kernel_size
# 5. 读取卷积参数:步长、填充、膨胀率
stride = int(raw_input[ptr])
padding = int(raw_input[ptr + 1])
dilation = int(raw_input[ptr + 2])
# 6. 计算有效核尺寸(膨胀后的覆盖范围)
effective_k = kernel_size + (kernel_size - 1) * (dilation - 1)
# 7. 计算输出特征图的尺寸
out_h = (height + 2 * padding - effective_k) // stride + 1
out_w = (width + 2 * padding - effective_k) // stride + 1
# 初始化输出结果矩阵
output_map = [[0] * out_w for _ in range(out_h)]
# 8. 模拟卷积过程:遍历输出图的每一个像素位置
for i in range(out_h):
for j in range(out_w):
total_sum = 0
# 计算当前滑动窗口在填充后矩阵中的起始坐标
start_x = i * stride
start_y = j * stride
# 遍历原始卷积核的每一个元素
for kr in range(kernel_size):
for kc in range(kernel_size):
# 根据膨胀率计算其在填充后特征图中对应的坐标
# 这里减去 padding 是为了直接在原 feature_map 中查找,避免显式构建补零矩阵
actual_x = start_x + kr * dilation - padding
actual_y = start_y + kc * dilation - padding
# 检查坐标是否在原始输入特征图范围内
if 0 <= actual_x < height and 0 <= actual_y < width:
val = feature_map[actual_x][actual_y]
total_sum += val * kernel[kr][kc]
output_map[i][j] = total_sum
# 9. 按照格式打印输出结果
for row in output_map:
print(" ".join(map(str, row)))
if __name__ == "__main__":
perform_dilated_convolution()