1、描述下Transformer的结构
Transformer是一种深度学习模型架构,特别适用于序列到序列的任务,如机器翻译。其主要结构包括以下几个部分:
- 编码器(Encoder): 由多个相同的层组成,每个层包含两个子层,即多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feedforward Neural Network)。
- 解码器(Decoder): 同样由多个相同的层组成,每个层包含三个子层,分别是多头自注意力机制、多头注意力机制(用于处理编码器输出的信息)和前馈神经网络。
- 嵌入层(Embedding): 将输入序列的词嵌入到连续的向量空间中。
- 位置编码(Positional Encoding): 为输入序列的每个位置添加一个表示其位置的向量,以保留序列的顺序信息。
- Layer Normalization和残差连接: 在每个子层的输出上应用Layer Normalization,并使用残差连接将输入添加到子层的输出。
Transformer之所以能够处理多种模态的数据,是因为其核心操作——自注意力机制(Attention Mechanism)是通用的,不依赖于数据的特定结构。自注意力机制能够在输入序列中动态地关注不同位置的信息,从而适应不同模态的输入。
对于多模态数据,例如图像和文本,可以通过将每个模态的数据分别表示为输入序列,然后将这些序列送入Transformer模型。这样,模型可以通过自注意力机制在不同模态之间建立关联,捕捉模态间的复杂关系。
3、BN的作用和好处- 作用: BN主要用于加速神经网络的训练过程。它在每个批次的数据上进行标准化,即将输入数据减去均值并除以标准差,然后通过缩放和平移进行线性变换。这有助于维持每个神经元激活的分布稳定,防止梯度消失或爆炸问题。
- 好处:
加速训练: BN有助于减小训练过程中的内部协变量转移(Internal Covariate Shift),从而提高网络训练的稳定性和速度。
降低对初始参数的敏感性: BN使网络对初始权重的选择不那么敏感,减少了需要进行精细调整的依赖。
正则化效果: BN在一定程度上具有正则化效果,可以减轻过拟合问题。
Dropout通过随机地将一部分神经元的输出置零,强制模型去学习更健壮和泛化的特征,从而降低过拟合风险。
5、梯度消失的原因梯度消失是指在深度神经网络中,梯度逐渐变得极小,导致底层网络参数几乎无法更新。主要原因包括:
- 链式法则: 在链式法则中,每个乘法项都会缩小梯度,多层网络中这些项的连续相乘导致梯度指数级地减小。
- 激活函数的选择: 一些传统的激活函数,如sigmoid和tanh,具有饱和区域,梯度在这些区域非常小,使得反向传播时梯度减小。
- 深度网络结构: 随着网络深度增加,梯度经过多次连续的权重矩阵相乘,导致梯度逐渐衰减。
ResNet采用了残差连接(Residual Connection),通过将输入直接添加到网络层的输出,形成了一个“跳跃连接”。这种结构有助于缓解梯度消失问题的原因有:
- 梯度直达: 在反向传播中,由于有了跳跃连接,梯度能够直接通过残差块传播到较早的层,减轻了梯度逐层衰减的问题。
- 易于学习恒等映射: 残差连接使得网络可以更容易地学习恒等映射,即将输入直接映射到输出,这有助于减轻梯度消失问题。
使用前缀和+二分的方法,具体代码如下:
def search(s, k, n, t): if t > s[n]: return -1 l, r = k, n res = n while l < r: mid = (l + r) >> 1 if s[mid] >= t: res = mid r = mid - 1 else: l = mid + 1 return resdef func(targets, nums): if targets > sum(nums): return 0 n = len(nums) s = [0] * (n + 1) for i in range(1, n+1): s[i] = s[i - 1] + nums[i-1] res = n for i in range(1, n+1): t = targets + s[i - 1] d = search(s, i, n, t) if d > i and d - i + 1 < res: res = d - i + 1 return restarget = 7nums = [2,3,1,2,4,3]print(func(target, nums))8、求一个数的N次幂代码如下:
def pow(k, n): if k == 0 and n == 0: return None flag = 1 if n < 0: flag = 0 res = 1 while n > 0: if (n & 1) == 1: res = res * k k *= k n >>= 1 if flag == 1: return res return 1.0 / res9、全排列输入为两个整数n和m,输出从1到n中选取m个数的所有组合,代码如下:
免责声明:本站内容来源于互联网公开信息,仅供学习和参考使用。如涉及版权问题,请联系我们,我们将在核实后第一时间删除相关内容。