华为面试,机器学习深度学习知识点:

发布于:2025-04-03 ⋅ 阅读:(12) ⋅ 点赞:(0)

机器学习深度学习知识点:
机器学习一般有哪些分数,对于不同的任务:
分类任务:
准确率(Accuracy):预测正确的样本数占总样本数的比例,公式为
Accuracy=
TP+TN+FP+FN
TP+TN

,其中
TP
(真正例)、
TN
(真反例)、
FP
(假正例)、
FN
(假反例)。
精确率(查准率,Precision):在预测为正的样本中,真正为正的比例,
Precision=
TP+FP
TP


召回率(查全率,Recall):在实际为正的样本中,被正确预测为正的比例,
Recall=
TP+FN
TP


F1 分数:综合精确率和召回率的指标,
F1=
Precision+Recall
2×Precision×Recall


回归任务:
均方误差(MSE,Mean Squared Error):预测值与真实值之差的平方的平均值,
MSE=
n
1


i=1
n

(y
i


y
^

i

)
2

,其中
y
i

是真实值,
y
^

i

是预测值,
n
是样本数量。
平均绝对误差(MAE,Mean Absolute Error):预测值与真实值之差的绝对值的平均值,
MAE=
n
1


i=1
n

∣y
i


y
^

i



决定系数(
R
2

,Coefficient of determination):衡量模型对数据的拟合程度,
R
2
=1−

i=1
n

(y
i


y
ˉ

)
2


i=1
n

(y
i


y
^

i

)
2

,其中
y
ˉ

是真实值的均值。
讲讲几种损失函数:
交叉熵损失函数(Cross Entropy Loss):常用于分类任务,衡量预测分布与真实分布之间的差异。对于二分类,
L=−[ylog(
y
^

)+(1−y)log(1−
y
^

)]
,其中
y
是真实标签(0 或 1),
y
^

是预测为正类的概率。对于多分类,
L=−∑
i=1
C

y
i

log(
y
^

i

)

C
是类别数,
y
i

是真实标签(one-hot 编码),
y
^

i

是预测属于第
i
类的概率。
均方误差损失函数(MSE):如上述回归任务中提到,适用于回归问题,衡量预测值与真实值之间的平均平方误差。
铰链损失(Hinge Loss):常用于支持向量机(SVM),对于二分类问题,
L=max(0,1−y⋅f(x))
,其中
y
是真实标签(+1 或 - 1),
f(x)
是模型的预测值。
正则化:
目的:防止过拟合,提高模型的泛化能力。
L1 正则化:在损失函数中加入参数的绝对值之和,即
L=L
0

+λ∑
i

∣w
i



L
0

是原始损失函数,
λ
是正则化参数,
w
i

是模型参数。L1 正则化会使部分参数变为 0,产生稀疏解,可用于特征选择。
L2 正则化(权重衰减,Weight Decay):在损失函数中加入参数的平方和,
L=L
0

+λ∑
i

w
i
2

。L2 正则化使参数值趋于较小,避免参数过大导致过拟合。
了解 1*1 卷积吗?:
定义:是一种特殊的卷积操作,卷积核的大小为
1×1

作用:
降维和升维:在通道维度上进行操作,可以减少或增加特征图的通道数。例如,当输入特征图通道数较多时,通过
1×1
卷积可以降低通道数,减少计算量。
跨通道信息整合:可以在不改变特征图空间尺寸的情况下,对不同通道的信息进行线性组合,实现特征的融合。
增加网络深度:引入更多的非线性变换,提升网络的表达能力。
讲一下过拟合和欠拟合:
过拟合:模型在训练集上表现很好,但是在测试集或新数据上表现很差。原因是模型过于复杂,学习到了训练数据中的噪声和细节,而没有捕捉到数据的一般规律。例如,一个多项式回归模型,当多项式次数过高时,可能会过度拟合训练数据的波动。
欠拟合:模型在训练集和测试集上的表现都不好,不能很好地拟合数据。原因是模型过于简单,无法学习到数据中的复杂关系。例如,使用线性模型去拟合非线性的数据。
讲一讲 BN(Batch Normalization),以及在测试阶段 BN 如何处理:
BN 的作用:对神经网络的每一层输入进行归一化,加速网络的训练过程,缓解梯度消失和梯度爆炸问题,提高模型的泛化能力。
原理:在训练时,对于每个 mini-batch,计算输入的均值
μ
和方差
σ
2

,然后对输入
x
进行归一化,得到
x
^

σ
2

x−μ

,其中
ϵ
是一个很小的常数,防止分母为 0。之后再通过两个可学习的参数
γ

β
进行缩放和平移,
y=γ
x
^


测试阶段:使用训练阶段计算得到的均值和方差的移动平均值(一般是通过指数加权平均得到),而不是在测试数据上计算均值和方差。这样可以保证测试时的归一化操作是稳定的,并且与训练时的分布保持一致。
C++ 知识点:
32 位系统的指针占用多少内存:在 32 位系统中,指针占用 4 个字节(32 位)的内存,因为 32 位系统的地址总线是 32 位,可以表示的地址空间为
2
32

,所以指针需要 4 个字节来存储地址。
Python 知识点:
Python 的内存管理:
垃圾回收:Python 使用引用计数为主,标记 - 清除和分代回收为辅的垃圾回收机制。引用计数是指每个对象都有一个引用计数,当对象的引用计数为 0 时,该对象的内存会被释放。标记 - 清除用于处理循环引用的情况,分代回收将对象分为不同的代,根据对象的存活时间来进行不同频率的垃圾回收。
内存分配:Python 的内存分配由解释器管理,使用了内存池等技术来提高内存分配和释放的效率。例如,对于小对象(如整数、字符串等),会在内部的对象池中进行分配和复用。
手撕代码:
反转链表:
python

定义链表节点类

class ListNode:
def init(self, val=0, next=None):
self.val = val
self.next = next

def reverseList(head):
prev = None
current = head
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev
二叉树的最大宽度 Leetcode 662:
python

定义二叉树节点类

class TreeNode:
def init(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right

def widthOfBinaryTree(root):
if not root:
return 0
queue = [(root, 0)]
max_width = 0
while queue:
level_start = queue[0][1]
level_end = queue[-1][1]
max_width = max(max_width, level_end - level_start + 1)
new_queue = []
for node, index in queue:
if node.left:
new_queue.append((node.left, 2 * index))
if node.right:
new_queue.append((node.right, 2 * index + 1))
queue = new_queue
return max_width

其他知识点:
数据增强的方法:
图像:加噪声(如高斯噪声、椒盐噪声等)、旋转(按一定角度旋转图像)、扭曲(如仿射变换、透视变换等)、平移(将图像在水平或垂直方向上移动)、裁剪(随机裁剪图像的一部分)、翻转(水平翻转或垂直翻转)等。
音频:时间拉伸(加速或者放慢音频)、Pitch shifting(改变音频的音调)、Dynamic Range Compression (DRC)(动态范围压缩)、Background Noise(添加背景噪声)等。
人脸识别的损失函数:
交叉熵损失函数:用于分类任务,将不同的人脸类别作为不同的类别进行分类。
三元组损失(Triplet Loss):目的是使同一类人脸的特征向量距离尽可能近,不同类人脸的特征向量距离尽可能远。它通过构造三元组(锚点、正样本、负样本)来计算损失。
中心损失(Center Loss):在交叉熵损失的基础上,引入类中心的概念,使每个类别的特征向量更加紧凑地聚集在其类中心周围。
Dropout 在测试阶段如何处理:在测试阶段,Dropout 通常会被关闭,即所有神经元都正常工作,不进行随机失活操作。为了保持训练和测试阶段的输出期望一致,在测试时,每个神经元的输出会乘以训练时的失活概率(例如,训练时失活概率为 0.5,则测试时每个神经元的输出乘以 0.5)。
为什么会出现梯度消失和梯度爆炸?:
梯度消失:在深度神经网络中,当使用反向传播算法计算梯度时,由于激活函数的导数小于 1,经过多层传播后,梯度会逐渐变小,导致靠近输入层的参数更新非常缓慢,甚至无法更新。例如,在使用 sigmoid 函数作为激活函数时,其导数在输入值较大或较小时接近于 0,容易引发梯度消失问题。
梯度爆炸:与梯度消失相反,当激活函数的导数大于 1,或者网络的权重初始化过大时,经过多层传播后,梯度会不断增大,导致参数更新过大,模型无法收敛。
介绍一下分数,比如查准率查全率 F1score:见前面机器学习分数部分的回答。
讲一下 softmax:
定义:常用于多分类问题,将一个
n
维的实数向量转换为一个概率分布。对于输入向量
z=[z
1

,z
2

,⋯,z
n

]
,其 softmax 输出为
y
i


j=1
n

e
z
j

e
z
i

,其中
y
i

是第
i
个类别的概率,且

i=1
n

y
i

=1

作用:将输出值转换为概率形式,便于进行分类决策,例如选择概率最大的类别作为预测结果。
多线程和进程的关系:
进程:是操作系统分配资源的基本单位,每个进程都有自己独立的地址空间、内存、文件描述符等资源。进程之间的通信需要通过特定的机制(如管道、共享内存、套接字等)。
线程:是进程内的执行单元,共享进程的资源,如地址空间、内存等。线程之间的切换开销比进程小,通信也相对简单,可以直接访问共享变量。一个进程可以包含多个线程,多线程可以提高程序的并发性能。
Linux 文件权限管理:
文件权限:在 Linux 中,每个文件都有所有者(owner)、所属组(group)和其他用户(others)的权限设置。权限包括读(r)、写(w)、执行(x)三种,分别用数字 4、2、1 表示。例如,文件权限为
rwxr−xr−−
,则所有者具有读、写、执行权限(7),所属组具有读和执行权限(5),其他用户具有读权限(4)。
权限设置命令:chmod命令用于修改文件权限,可以使用数字表示法(如chmod 754 file)或符号表示法(如chmod u+x file,表示给所有者添加执行权限)。chown命令用于修改文件的所有者,chgrp命令用于修改文件的所属组。
C++ stl 有了解吗?:
STL(Standard Template Library):是 C++ 标准库的重要组成部分,提供了一系列通用的模板类和函数,包括容器(如 vector、list、deque、set、map 等)、迭代器、算法(如 sort、find、for_each 等)和仿函数等。
容器:用于存储和管理数据,不同的容器有不同的特点和适用场景。例如,vector 是动态数组,支持随机访问,适合在尾部进行插入和删除操作;list 是双向链表,不支持随机访问,但在任意位置插入和删除元素的效率较高。
算法:是对容器中的数据进行操作的函数,如排序、查找、变换等。算法可以与不同的容器配合使用,提高代码的复用性和效率。
Numpy 的数组,pytorch tensor 有什么区别?:
数据类型:Numpy 数组主要用于处理数值型数据,支持多种数据类型(如 float、int 等)。PyTorch tensor 不仅可以处理数值型数据,还可以处理其他类型的数据,如布尔型、复数型等,并且在 GPU 上的计算效率更高。
计算设备:Numpy 数组只能在 CPU 上进行计算,而 PyTorch tensor 可以在 CPU 和 GPU 之间灵活切换,方便进行大规模的数值计算和深度学习任务。
自动求导:PyTorch tensor 具有自动求导功能,这是深度学习框架的重要特性,方便进行梯度计算和模型训练。Numpy 数组没有自动求导功能。
数组 reshape 之后内容是否一样?:如果在不改变数据的情况下进行 reshape 操作(即新的形状与原始数据的元素数量一致),那么 reshape 之后数组的内容是一样的,只是形状发生了变化。例如,将一个
2×3
的数组 reshape 为
3×2
,元素的值不会改变。
深拷贝浅拷贝:
浅拷贝:创建一个新的对象,但是新对象中的元素是对原对象中元素的引用。如果原对象中的元素是可变对象(如列表、字典等),那么修改新对象中的元素会影响原对象,反之亦然。例如,使用list.copy()方法进行浅拷贝。
深拷贝:创建一个新的对象,并且递归地复制原对象中的所有元素,新对象和原对象是完全独立的,修改新对象中的元素不会影响原对象。可以使用copy.deepcopy()函数进行深拷贝。
Python 装饰器:
定义:是一种特殊的函数,用于修改其他函数的行为。装饰器可以在不修改原函数代码的情况下,为函数添加额外的功能,如日志记录、性能测试、权限验证等。
实现方式:装饰器通常是一个函数,它接受一个函数作为参数,并返回一个新的函数。例如:
python
def decorator(func):
def wrapper():
print(“Before function call”)
func()
print(“After function call”)
return wrapper

@decorator
def my_function():
print(“Inside my function”)

my_function()

介绍一下深度学习框架 tensorflow pytorch:
TensorFlow:由 Google 开发和维护,是一个广泛使用的深度学习框架。它提供了丰富的工具和库,支持各种深度学习任务,如图像识别、自然语言处理等。TensorFlow 的计算图机制使得模型的定义和训练更加灵活,并且支持在 CPU、GPU 等多种设备上运行。它还提供了分布式训练的功能,适合大规模的深度学习应用。
PyTorch:由 Facebook 开发,是一个基于 Python 的深度学习框架。PyTorch 以其简洁易用的 API 和动态计算图而受到欢迎。动态计算图使得模型的调试和开发更加方便,同时也支持自动求导功能,方便进行模型训练。PyTorch 在学术界和工业界都有广泛的应用,特别是在自然语言处理和计算机视觉领域。


网站公告

今日签到

点亮在社区的每一天
去签到