大模型,多模态大模型面试问题【代码题,DDPM,损失函数,激活函数,3DGS,Nerf,SH】
- 代码题:
- 问题一:DDPM加噪公式为什么是根号形式,时间步T为啥这么大,通常是1000。
- 问题二:介绍常见的损失函数
- 问题三:介绍常见的激活函数
- 问题四:DDIM为什么有效?
- 问题五:3DGS,Nerf,为什么3DGS效率高,但现在很多还是用Nerf,介绍各自的优缺点。
- 问题六:视频理解视频生成最新工作了解。
- 问题七:球谐函数SH012阶?分别是什么,在什么时候用?
时间:2024-10-29 19:30 商汤二面
代码题:
1. 区间最小数乘区间最大和的最大值
- 例如:
[1,2,3,4,5]
输出
36
说明:
- 输入:
[1,1,1,1,1]
输出:
5
说明
算法:
本题要求计算:区间和 * 区间最小数,针对这两点,我们分别处理。
1. 对于区间和,我们构造前缀和列表dp。设dp[i]表示以a[i]结尾的前缀和
初始化:
dp[0] = a[0]
状态转移方程:
dp[i] = dp[i - 1] + a[i]
有了前缀和区间之后,对于任意闭区间[i, j],区间和为dp[j] - dp[i]
2. 对于区间最小数,我们维护一个单调递增的栈stack,栈内存储的是元素下标
遍历列表a:
如果当前元素小于栈顶元素,入栈;
否则,出栈,计算当前 区间和 * 区间最小数,更新res
class Solution:
def mintimessum(self, a):
n = len(a)
dp = [0] * n
dp[0] = a[0]
for i in range(1, n): # 建立列表a的前缀和
dp[i] = dp[i - 1] + a[i]
stack, res = [], 0
for i in range(n):
while stack and a[i] < a[stack[-1]]:
idx = stack.pop()
winSum = dp[stack[-1]] if stack else 0
res = max(res, a[idx] * (dp[i - 1] - winSum)) # 当前区间为[idx, right], right = i - 1,区间和为:dp[right] - dp[stack[-1]],这里需要注意当stack为空
stack.append(i)
while stack:
idx = stack.pop()
winSum = dp[stack[-1]] if stack else 0
res = max(res, a[idx] * (dp[n - 1] - winSum))
return res
if __name__ == "__main__":
sol = Solution()
# a = [1, 2, 3, 4, 5]
a = [1, 1, 1, 1, 1]
res = sol.mintimessum(a)
print res
时间复杂度:O(n)
空间复杂度:O(n)
2. 二叉树中的最大路径和
参考LeetCode-124. 二叉树中的最大路径和【树 深度优先搜索 动态规划 二叉树】商汤二面真题
问题一:DDPM加噪公式为什么是根号形式,时间步T为啥这么大,通常是1000。
DDPM(Denoising Diffusion Probabilistic Models)中的加噪公式通常以根号形式出现,是由于在扩散过程中的噪声控制。以下是对此的详细解释:
加噪公式的根号形式
DDPM通过逐步向数据中添加噪声来实现生成过程。加噪公式通常表示为:
x t = α t x t − 1 + 1 − α t ϵ x_t = \sqrt{\alpha_t} x_{t-1} + \sqrt{1 - \alpha_t} \epsilon xt=αt xt−1+1−αt ϵ
其中:
- x t x_t xt是在时间步 t t t的样本。
- x t − 1 x_{t-1} xt−1是在前一个时间步的样本。
- ϵ \epsilon ϵ是标准正态分布的噪声。
- α t \alpha_t αt是控制噪声比例的参数,通常满足 0 < α t < 1 0 < \alpha_t < 1 0<αt<1。
这个公式中的根号形式是为了保持数据的尺度和数值稳定性。通过使用平方根,模型可以平滑地控制每个时间步的噪声强度,从而在整个扩散过程中保持一致性。
时间步 T T T的设置
在DDPM中,时间步 T T T的设置通常很大,例如1000,主要是为了实现高质量的生成效果。具体原因包括:
-
细致的噪声控制:较大的时间步数允许模型在生成过程中逐步地添加和去除噪声,从而使生成结果更为精细。每个时间步的噪声添加是相对较小的,这样可以更好地保留原始数据的结构。
-
生成的多样性:增加时间步数使模型在生成过程中拥有更多的控制点,能够生成多样性更高的样本。
-
理论基础:DDPM基于扩散过程的理论框架,较大的时间步数可以更好地模拟随机过程中的连续性。
总之,根号形式确保了在扩散过程中噪声的合理控制,而较大的时间步 T T T则是为了实现高质量的生成。
问题二:介绍常见的损失函数
参考:
https://blog.csdn.net/BIgHAo1/article/details/121783011
softmax loss损失函数详解
损失函数是机器学习和深度学习中用于衡量模型预测结果与真实结果之间差异的函数。以下是一些常见的损失函数:
-
均方误差 (Mean Squared Error, MSE):
- 公式: MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1∑i=1n(yi−y^i)2
- 用途:常用于回归问题,适合于数值型目标。
-
平均绝对误差 (Mean Absolute Error, MAE):
- 公式: MAE = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ \text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| MAE=n1∑i=1n∣yi−y^i∣
- 用途:同样用于回归问题,对异常值的敏感性低于MSE。
-
交叉熵损失 (Cross-Entropy Loss):
- 公式:对于二分类问题: Loss = − 1 n ∑ i = 1 n [ y i log ( y ^ i ) + ( 1 − y i ) log ( 1 − y ^ i ) ] \text{Loss} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] Loss=−n1∑i=1n[yilog(y^i)+(1−yi)log(1−y^i)]
- 用途:广泛用于分类问题,特别是多类分类和二分类任务。
-
对比损失 (Contrastive Loss):
- 公式: Loss = 1 2 N ∑ i = 1 N ( y i ) D 2 + ( 1 − y i ) max ( 0 , m − D ) 2 \text{Loss} = \frac{1}{2N} \sum_{i=1}^{N} (y_i) D^2 + (1 - y_i) \max(0, m - D)^2 Loss=2N1∑i=1N(yi)D2+(1−yi)max(0,m−D)2
- 用途:用于度量学习和生成对抗网络 (GAN) 中,评估样本对的相似性。
-
Hinge损失 (Hinge Loss):
- 公式: Loss = 1 n ∑ i = 1 n max ( 0 , 1 − y i ⋅ y ^ i ) \text{Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i) Loss=n1∑i=1nmax(0,1−yi⋅y^i)
- 用途:主要用于支持向量机 (SVM),适用于二分类问题。
-
KL散度 (Kullback-Leibler Divergence):
- 公式: D K L ( P ∣ ∣ Q ) = ∑ i P ( i ) log ( P ( i ) Q ( i ) ) D_{KL}(P || Q) = \sum_{i} P(i) \log\left(\frac{P(i)}{Q(i)}\right) DKL(P∣∣Q)=∑iP(i)log(Q(i)P(i))
- 用途:用于衡量两个概率分布之间的差异,常用于生成模型中。
这些损失函数在不同的任务和场景中具有不同的优势,选择合适的损失函数对于模型的性能至关重要。
问题三:介绍常见的激活函数
激活函数是神经网络中用于引入非线性的关键组件。以下是一些常见的激活函数:
-
Sigmoid:
- 公式: σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1
- 特点:输出范围在(0, 1)之间,适用于二分类问题。
- 缺点:在极端值时梯度接近于零,导致梯度消失。
-
Tanh (双曲正切):
- 公式: tanh ( x ) = e x − e − x e x + e − x \text{tanh}(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} tanh(x)=ex+e−xex−e−x
- 特点:输出范围在(-1, 1)之间,通常比Sigmoid收敛更快。
- 缺点:同样存在梯度消失的问题。
-
ReLU (修正线性单元):
- 公式: ReLU ( x ) = max ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
- 特点:简单易计算,计算效率高,适用于大多数深度学习模型。
- 缺点:在训练中可能会出现“死亡ReLU”现象,部分神经元永远不被激活。
-
Leaky ReLU:
- 公式: Leaky ReLU ( x ) = max ( 0.01 x , x ) \text{Leaky ReLU}(x) = \max(0.01x, x) Leaky ReLU(x)=max(0.01x,x)
- 特点:在输入为负时仍然有小的梯度,解决了死亡ReLU问题。
- 缺点:在某些情况下性能不如ReLU。
-
Parametric ReLU (PReLU):
- 公式: PReLU ( x ) = { x if x ≥ 0 a x if x < 0 \text{PReLU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ a x & \text{if } x < 0 \end{cases} PReLU(x)={xaxif x≥0if x<0(其中a为可学习参数)
- 特点:可以学习负部分的斜率,提供了更大的灵活性。
-
Softmax:
- 公式: Softmax ( x i ) = e x i ∑ j e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} Softmax(xi)=∑jexjexi
- 特点:将输出转化为概率分布,适用于多分类问题的输出层。
-
Swish:SiLU
- 公式: Swish ( x ) = x ⋅ σ ( x ) \text{Swish}(x) = x \cdot \sigma(x) Swish(x)=x⋅σ(x)
- 特点:可以缓解梯度消失问题,表现良好,尤其在深层网络中。
这些激活函数在不同的网络架构和应用场景中各有优劣,选择合适的激活函数有助于提高模型的性能。
问题四:DDIM为什么有效?
DDIM(Denoising Diffusion Implicit Models)之所以有效,主要有以下几个原因:
原理与有效性
-
潜在变量建模:
- DDIM在生成模型中使用隐式的噪声预测,允许生成更高质量的样本。它通过在潜在空间中建模生成过程,减少了对显式噪声模型的依赖。
-
去噪过程的改进:
- DDIM利用了去噪扩散过程,采用逐步去噪的方式,有效地在每一步生成过程中减少噪声,从而提高了样本的质量。
-
低采样步骤:
- 通过将采样过程参数化,DDIM可以在较少的步骤内实现生成。这是通过控制每一步生成的噪声量和调整采样策略来实现的,使得生成的样本在质量上接近于使用更多步骤的结果。
-
梯度传播:
- DDIM的反向扩散过程可以在每个步骤中更有效地传播梯度,从而使模型在较少的步骤中仍然能够保持较好的收敛性能。
结论
DDIM通过改进的去噪过程和潜在变量建模,能够有效减少采样步数,同时保持生成样本的高质量。这种方法在处理扩散模型时展示了其灵活性和效率,使其成为现代生成模型中的重要技术之一。
问题五:3DGS,Nerf,为什么3DGS效率高,但现在很多还是用Nerf,介绍各自的优缺点。
3DGS(3D Generative Synthesis)和NeRF(Neural Radiance Fields)各自有不同的优缺点,适用于不同的应用场景。以下是对这两者的比较:
3DGS(3D Generative Synthesis)
优点:
-
高效性:
- 3DGS在渲染和生成3D场景时通常比NeRF更快,因为它不依赖于逐像素的计算,而是通过直接合成3D几何和纹理信息来实现高效渲染。
-
适应性强:
- 可以很好地处理复杂场景和对象的多样性,尤其是在生成新视角的3D对象时,效率明显提升。
-
简化的训练过程:
- 相比于NeRF,3DGS在训练时可能不需要处理大量的视角和光线条件,因此在数据准备和训练时间上通常更短。
缺点:
-
质量受限:
- 在一些高细节或光照变化大的场景中,生成的质量可能不如NeRF,尤其是在需要准确渲染光照和材质细节的情况下。
-
复杂性:
- 3DGS的实现可能需要更复杂的模型设计和参数调整,尤其是在生成高质量的几何形状时。
NeRF(Neural Radiance Fields)
优点:
-
高质量渲染:
- NeRF能够生成非常细致和真实的图像,尤其在光照和反射等复杂场景中表现优秀,能捕捉到细微的细节。
-
视角一致性:
- NeRF通过学习不同视角的光线分布,能够保持高质量的视角一致性,使得在不同角度观察时图像质量一致。
-
灵活性:
- NeRF可以很容易地扩展到不同的场景和对象类型,适用于多种应用,如虚拟现实和增强现实。
缺点:
-
效率低:
- 渲染速度较慢,因为NeRF需要逐像素计算辐射场,对计算资源的需求较高,特别是在实时应用中表现不佳。
-
数据需求高:
- NeRF通常需要大量的训练数据(多视角图像),对于数据准备和采集的要求比较高。
总结
3DGS在效率上表现更佳,适用于快速生成和渲染3D场景,而NeRF则在细节和图像质量上具有优势,适合需要高真实感的应用场景。选择使用哪种方法取决于具体的应用需求和资源限制。
问题六:视频理解视频生成最新工作了解。
参考https://video-mme.github.io/home_page.html#leaderboard
问题七:球谐函数SH012阶?分别是什么,在什么时候用?
球谐函数(Spherical Harmonics,SH)是一类用于在球面上表示函数的正交基函数。它们广泛应用于计算机图形学、物理学、信号处理等领域。具体到123阶的球谐函数,以下是它们的定义和用途:
1. 球谐函数的阶数
-
0阶(SH0):
- 只有一个常数项,表示为 Y 00 ( θ , ϕ ) = 1 4 π Y_{00}(\theta, \phi) = \sqrt{\frac{1}{4\pi}} Y00(θ,ϕ)=4π1 。
- 用途:用于表示球体上的均匀光照或常数函数。
-
1阶(SH1):
- 包含3个函数:
- Y 1 , − 1 = 3 8 π sin ( θ ) e − i ϕ Y_{1,-1} = \sqrt{\frac{3}{8\pi}} \sin(\theta) e^{-i\phi} Y1,−1=8π3 sin(θ)e−iϕ
- Y 10 = 3 4 π cos ( θ ) Y_{10} = \sqrt{\frac{3}{4\pi}} \cos(\theta) Y10=4π3 cos(θ)
- Y 1 , 1 = 3 8 π sin ( θ ) e i ϕ Y_{1,1} = \sqrt{\frac{3}{8\pi}} \sin(\theta) e^{i\phi} Y1,1=8π3 sin(θ)eiϕ
- 用途:用于表示简单的方向性变化,如光源的方向。
- 包含3个函数:
-
2阶(SH2):
- 包含5个函数:
- Y 2 , − 2 = 15 32 π sin 2 ( θ ) e − 2 i ϕ Y_{2,-2} = \sqrt{\frac{15}{32\pi}} \sin^2(\theta) e^{-2i\phi} Y2,−2=32π15 sin2(θ)e−2iϕ
- Y 2 , − 1 = 15 16 π sin ( θ ) cos ( θ ) e − i ϕ Y_{2,-1} = \sqrt{\frac{15}{16\pi}} \sin(\theta) \cos(\theta) e^{-i\phi} Y2,−1=16π15 sin(θ)cos(θ)e−iϕ
- Y 20 = 5 16 π ( 3 cos 2 ( θ ) − 1 ) Y_{20} = \sqrt{\frac{5}{16\pi}} (3\cos^2(\theta) - 1) Y20=16π5 (3cos2(θ)−1)
- Y 2 , 1 = 15 16 π sin ( θ ) cos ( θ ) e i ϕ Y_{2,1} = \sqrt{\frac{15}{16\pi}} \sin(\theta) \cos(\theta) e^{i\phi} Y2,1=16π15 sin(θ)cos(θ)eiϕ
- Y 2 , 2 = 15 32 π sin 2 ( θ ) e 2 i ϕ Y_{2,2} = \sqrt{\frac{15}{32\pi}} \sin^2(\theta) e^{2i\phi} Y2,2=32π15 sin2(θ)e2iϕ
- 用途:用于表示更复杂的光照模型和环境反射,特别是在三维图形渲染中。
- 包含5个函数:
2. 何时使用球谐函数
-
光照模型:
- 在计算机图形学中,球谐函数常用于表示环境光照,以简化复杂场景中的光照计算。
-
物体表面表示:
- 在物体的表面法线、纹理映射等方面,SH能够高效表示和处理球面数据。
-
信号处理:
- 在处理与方向性相关的信号(如音频信号的空间特征)时,球谐函数提供了一种有效的表示方式。
-
物理模拟:
- 在天文学和物理学中,SH用于描述引力场、电场等的分布。
总结
球谐函数通过不同的阶数提供了对球面上函数的灵活表示,SH0、SH1和SH2分别适用于不同复杂度的光照和表面表示任务,广泛应用于计算机图形学、物理建模和信号处理等领域。
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠