华为2026.6.12机考选择题+编程题【速刷敲黑板】

华为2026.6.12机考选择题+编程题【速刷敲黑板】
下面进行华为2026年6月12日AI岗机考题的复盘和关键知识点重点深度剖析笔者7月9-10日刷完选择题和2道算法题。选择题考到图像匹配、线性代数、PCA主成分分析法、MLE估计、梯度计算、CNN卷积、训练优化器、嵌入层与注意力机制、MHA与GQA/MQA和训推优化、优化理论凸函数、大模并行训练等知识点。编程题有机器学习和传统的数据结构与算法的考点一个是K-Means无监督聚类算法机器学习自动驾驶点云聚类-物体识别场景的题目评级中等一个是大模型MoE混合专家架构Transformer Block内部的MLP拥有更多的数量和更低的维度相关的优化算法Expert Choice RoutingECR的模拟考点的题目评级困难。说明文章内选择题证明和论述部分的绿色字体是AI生成内容红色字体是人工增添或重要修改内容。目录第一题第十九题代码题1 中等代码题2困难总答题用时1小时30分钟选择题用时24分钟第一题图像匹配正确答案A。需要先说明哈这里说余弦相似度“适合度量亮度差异较大的两张图片的内容的相似度”针对的是乘性亮度变化对于加入一个常量的加性亮度变化一般使用NCC归一化互相关系数或者Pearson系数可以规避余弦相似度或者归一化后计算欧氏距离的短板单调负相关其实就是零均值化预处理加强版的余弦相似度计算。学术界和产业界主要有五种图像匹配的方法按鲁棒性抗干扰能力从低到高排序如下1. 像素级数值度量对亮度、噪声极其敏感这类指标直接计算像素值的绝对误差不适合你题目中的亮度差异场景。MSE均方误差计算对应像素点差的平方。亮度整体提升50MSE会瞬间暴增导致误判为“完全不像”PSNR峰值信噪比PSNR10⋅log10​()曼哈顿距离 / 欧氏距离同样受数值绝对值影响极大通常只用于图像压缩或去噪算法的质量评估而非内容相似度。2. 相关性/线性不变度量这类指标通过归一化或角度计算能自动屏蔽亮度和对比度的线性变化。余弦相似度如上所述屏蔽整体亮度缩放。在实际图像检索CBIR系统中如果遇到亮度差异大的情况常规做法是先对图像做直方图均衡化Histogram Equalization或归一化处理然后再提取特征计算余弦相似度。关于直方图均衡化的数字图像处理DIP方法大家可以类比参考随机过程里面非固定λ参数非齐次泊松过程和齐次泊松过程的积分转化原则。两个累积分布函数之间形成一对一的单调正相关映射。从而实现颜色亮度分布的重塑。对于彩色图像RGB三个通道可以设置相同的直方图均衡CDF函数也可以设置不同的CDF函数。NCC归一化互相关Normalized Cross-Correlation这是模板匹配中的经典算法。它不仅去除了均值加性亮度偏移还去除了方差乘性对比度拉伸比余弦相似度更强大是工业界解决“光照不均”问题的常用手段。3. 结构感知度量模仿人眼视觉这类指标认为像素是有关联的更看重纹理和结构。SSIM结构相似性指数它将相似度分解为亮度L、对比度C和结构S三个分量进行比对。虽然它也能处理一定的亮度变化但它是非线性函数如果亮度差异极大SSIM依然会下降本题语境下不如余弦相似度纯粹。4. 局部特征点匹配应对旋转、裁剪、遮挡当图片发生了旋转、缩放或部分遮挡时上面的全局指标全部失效。SIFT / SURF / ORB这些算法提取图像中的关键点如角点、边缘生成局部特征描述子然后进行特征点配对。它们对亮度、旋转、尺度都具有极强的鲁棒性常用于全景拼接、物体空间运动轨迹估计和3D重建比如Structure From Motion、图像匹配和检索等领域。5. 深度学习语义度量应对“内容相同、表象迥异”这是目前最前沿的方法适合判断两张图是否属于同一类物体或场景。LPIPS学习感知图像块相似度利用预训练的深度神经网络如VGG提取高层语义特征在特征空间计算距离。它更关注“猫长什么样”而非“像素颜色”对亮度、纹理变化的容忍度极高。DreamSim /CLIP这类多模态模型甚至能判断“一只狗在草地上的照片”和“一只狗在雪地里的简笔画”是相似的达到了语义级别的理解。第十九题二分类问题正类和负类混淆矩阵相关衡量指标正确答案ABC一般情况下召回率和TPR真阳性率是一个指标。所以B和C都正确。准确率把正负类样本同时纳入计算正确答案约为0.94。关于相关指标主要有准确率Accuracy、精确率Precision/P、召回率Recall/R、真阳性率TPR、假阳性率FPR、特异性性比率阴性检测率TNR、F1-Score或Dice系数、适用于多类别分类的宏平均召回率Macro-Recall和微平均召回率Micro-Recall等。TPR召回率 分母是所有真实正样本FPR假阳性率 分母是所有真实负样本FPR1−特异性比率TNR宏平均召回率和微平均召回率都和各类别本类别和非本类别按照二分类处理的TPR相关。微平均召回率的计算容易受到数据分布中大样本数量的类别的TPR的影响而宏平均召回率在多个类别中算术平均和类别信息丰富度无关。具体说明如下假设有 A、B、C 三类样本模型预测结果如下三分类混淆矩阵真实 \ 预测A类B类C类A类(100个)90 (TP)55 (FN10)B类(10个)01 (TP)9 (FN9)C类(20个)0020 (TP, FN0)首先分别计算每个类别的 TPR召回率A类的 TPR 90 / (9010) 0.90B类的 TPR 1 / (19) 0.10C类的 TPR 20 / (200) 1.001. Micro-Recall微平均召回率——看“总数”它先把所有类别的 TP 加起来所有类别的 FN 加起来最后只算一次除法。公式总 TP 90 1 20 111总真实样本 100 10 20 130Micro-Recall 111 / 130 ≈ 0.852. Macro-Recall宏平均召回率——看“平均”它先把每个类别的 TPR 单独算出来最后对所有类别的 TPR 取算术平均值。公式Macro-Recall (0.90 0.10 1.00) / 3 ≈ 0.67代码题1 中等用时23分钟单考点K-means聚类自动驾驶场景全部ACdef code(): import copy N, K map(int, input().split()) data [] for i in range(N): data.append(list(map(float, input().split()))) initial_centers list(range(K)) centers [data[ic][:] for ic in initial_centers] clusters {i: [] for i in range(K)} for e in range(100): clusters {i: [] for i in range(K)} last_centers copy.deepcopy(centers) for n in range(N): dists [] min_id 0 for c in centers: dists.append(sum([(c[k] - data[n][k]) ** 2 for k in range(3)]) ** 0.5) if dists[-1] dists[min_id]: min_id len(dists) - 1 clusters[min_id].append(n) for k, v in clusters.items(): if len(v) 0: for t in range(3): centers[k][t] sum(data[ve][t] for ve in v) / len(v) flag True for k in range(K): if max([abs(last_centers[k][t] - centers[k][t]) for t in range(3)]) 1e-6: flag False break if flag: break results {} for k, v in clusters.items(): for ve in v: results[ve] k for n in range(N): print(results[n])代码题2困难用时43分钟单考点模拟全部ACdef code2(): try: N, d, E, S map(int, input().split()) except: print(0) else: if min([N, d, E, S]) 0 or S N: print(0) else: import math tokens [] Wg [] We [] for n in range(N): tokens.append(list(map(float, input().split()))) for di in range(d): Wg.append(list(map(float, input().split()))) for e in range(E): Wei [] for di in range(d): Wei.append(list(map(float, input().split()))) We.append(Wei) # token对专家注意力分配处理 scores [] for t in tokens: att_score [] for e in range(E): att_score.append(sum([t[di] * Wg[di][e] for di in range(d)])) att_score [math.exp(ats) for ats in att_score] total sum(att_score) att_score [ats / total for ats in att_score] scores.append(att_score) # top-s选择 scores2 [[0 for i in range(N)] for j in range(E)] for i in range(N): for j in range(E): scores2[j][i] scores[i][j] expert_tops [] for e in range(E): # 确保序号小的排前面 inds list(range(N - 1, -1, -1)) inds.sort(keylambda x: scores2[e][x], reverseTrue) tops [] for f in range(N): if f in inds[:S]: tops.append(1) else: tops.append(0) expert_tops.append(tops) # print(expert_tops) # MoE计算 res [] for n in range(N): s [0 for i in range(d)] for e in range(E): for t in range(d): s[t] expert_tops[e][n] * scores[n][e] * sum( [tokens[n][di] * We[e][di][t] for di in range(d)]) res.append(s) # 输出处理 res [[{:.2f}.format(si) for si in s] for s in res] for s in res: print( .join(s))