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

机器学习深度学习知识点:

机器学习一般有哪些分数,对于不同的任务:

分类任务:

准确率(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 在学术界和工业界都有广泛的应用,特别是在自然语言处理和计算机视觉领域。

相关推荐
uhakadotcom22 分钟前
Mars与PyODPS DataFrame:功能、区别和使用场景
后端·面试·github
uhakadotcom26 分钟前
PyTorch 分布式训练入门指南
算法·面试·github
uhakadotcom30 分钟前
PyTorch 与 Amazon SageMaker 配合使用:基础知识与实践
算法·面试·github
Moment40 分钟前
多人协同编辑算法 —— CRDT 算法 🐂🐂🐂
前端·javascript·面试
uhakadotcom1 小时前
在Google Cloud上使用PyTorch:如何在Vertex AI上训练和调优PyTorch模型
算法·面试·github
鸿蒙布道师1 小时前
鸿蒙NEXT开发数值工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
程序员清风3 小时前
Redis Pipeline 和 MGET,如果报错了,他们的异常机制是什么样的?
java·后端·面试
摆烂仙君3 小时前
基于α-β剪枝的含禁手AI五子棋
人工智能·机器学习·剪枝
雷渊4 小时前
深入分析学习 Arthas 在项目中的应用
java·后端·面试
uhakadotcom4 小时前
量化交易中的Barra模型:风险管理的利器
后端·面试·github