2024年最全算法工程师面试八股(搜广推方向)_算法岗八股(1),关于大数据开发开发你必须要懂的APK瘦身知识

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

 + 
 
 
 ( 
 
 
 1 
 
 
 − 
 
 
 ν 
 
 
 ) 
 
 
 
 g 
 
 
 t 
 
 
 2 
 
 
 
 
 n\_t=νn\_{t−1}+(1−ν)g\_t^2 
 
 
 nt​=νnt−1​+(1−ν)gt2​
+ m 
 
 
 ^ 
 
 
 
 t 
 
 
 
 = 
 
 
 
 
 m 
 
 
 t 
 
 
 
 
 1 
 
 
 − 
 
 
 
 μ 
 
 
 t 
 
 
 
 
 
 
 \hat m\_t=\frac{m\_t}{1−μ^t} 
 
 
 m^t​=1−μtmt​​
+ n 
 
 
 ^ 
 
 
 
 t 
 
 
 
 = 
 
 
 
 
 n 
 
 
 t 
 
 
 
 
 1 
 
 
 − 
 
 
 
 ν 
 
 
 t 
 
 
 
 
 
 
 \hat n\_t=\frac{n\_t}{1−ν^t} 
 
 
 n^t​=1−νtnt​​
+ △ 
 
 
 
 θ 
 
 
 t 
 
 
 
 = 
 
 
 − 
 
 
 
 η 
 
 
 
 
 
 
 n 
 
 
 ^ 
 
 
 
 t 
 
 
 
 + 
 
 
 ϵ 
 
 
 
 
 
 
 △θ\_t=-\frac{η}{\sqrt{\hat n\_t+ϵ}} 
 
 
 △θt​=−n^t​+ϵ


​η​
  • AdamW:Adam的变种,主要用于解决权重衰减(weight decay)在Adam中的问题。在计算梯度更新时,将权重衰减的计算从梯度中分离出来,并将其应用于参数更新之前。使得权重衰减仅影响参数的更新方向,而不会降低参数的更新速度。优势在于更好地控制权重衰减的影响,减轻过度正则化的问题,使模型更易优化和训练。

残差连接

Residual Connection跳跃连接技术,在模型中将输入信号与输出信号进行直接连接。作用:

  • 促进信息传递:使模型更容易传递信息和梯度,避免梯度消失或梯度爆炸,特别是在处理深层网络时。
  • 简化优化问题:可以简化优化问题,使模型更易于优化和训练。
  • 提高模型表达能力:允许模型保留更多的低层特征信息,使模型更好地捕捉输入序列中的细节和上下文信息。

DNN,CNN,RNN对比

请添加图片描述

池化层反向传播

反向传播在经过池化层的时候梯度的数量发生了变化。如2*2的池化操作,第L+1层梯度数量是L层的1/4,所以每个梯度要对应回4个梯度。

  • mean_pooling:正向传播时取周围4个像素的均值,所以反向传播将梯度平均分成4分,再分给上一层。
  • max_pooling:正向传播时取周围4个像素的最大值保留,其余的值丢弃,所以反向传播时将梯度对应回最大值的位置,其他位置取0。一般来说,为了知道最大值的位置,深度学习框架在正向传播时就用max_id来记录4个像素中最大值的位置。

浅层、深层神经网络差别

神经网络中,权重参数是给数据做线性变换,而激活函数给数据带来的非线性变换。增加某一层神经元数量是在增加线性变换的复杂性,而增加网络层数是在增加非线性变换的复杂性。理论上,浅层神经网络就能模拟任何函数,但需要巨大的数据量,而深层神经网络可以用更少的数据量来学习到更好的拟合。

防止过拟合

过拟合是模型学习能力太强大,把部分数据的不太一般的特性都学到了,并当成了整个样本空间的特性。防过拟合方法:

  • L2正则化。原loss是

L

0

L_0

L0​,加入L2正则化后loss是

L

0

λ

2

n

W

2

L_0+\frac{\lambda}{2n}||W||^2

L0​+2nλ​∣∣W∣∣2,L的梯度是

L

W

=

L

0

W

λ

n

W

\frac{\partial{L}}{\partial{W}}=\frac{\partial{L_0}}{\partial{W}}+\frac{\lambda}{n}{W}

∂W∂L​=∂W∂L0​​+nλ​W,

L

b

=

L

0

b

\frac{\partial{L}}{\partial{b}}=\frac{\partial{L_0}}{\partial{b}}

∂b∂L​=∂b∂L0​​,可以看出,L2正则化只对W有影响,对b没有影响。而加入L2正则化后的梯度更新:

W

=

W

α

(

L

0

W

λ

n

W

)

=

(

1

α

λ

n

)

W

α

L

0

W

W=W-\alpha(\frac{\partial{L_0}}{\partial{W}}+\frac{\lambda}{n}{W})=(1-\frac{\alpha\lambda}{n})W-\alpha\frac{\partial{L_0}}{\partial{W}}

W=W−α(∂W∂L0​​+nλ​W)=(1−nαλ​)W−α∂W∂L0​​,相比于原梯度更新公式,改变的是

(

1

2

α

λ

)

W

(1-2\alpha\lambda)W

(1−2αλ)W这里,而由于

α

λ

n

\alpha、\lambda、n

α、λ、n都是正数,所以

(

1

α

λ

n

)

<

1

(1-\frac{\alpha\lambda}{n})<1

(1−nαλ​)<1。因此,L2正则化使得反向传播更新参数时W参数比不添加正则项更小。在过拟合中,由于对每个数据都拟合得很好,所以函数的变化在小范围内往往很剧烈,而要使函数在小范围内剧烈变化,就是要W参数值很大。L2正则化抑制了这种小范围剧烈变化,使得拟合程度“刚刚好”。

  • L1正则化。原loss是

L

0

L_0

L0​,加入L1正则化后loss是

L

=

L

0

λ

n

W

L=L_0+\frac{\lambda}{n}|W|

L=L0​+nλ​∣W∣, L的梯度是

L

W

=

L

0

W

λ

n

W

\frac{\partial{L}}{\partial{W}}=\frac{\partial{L_0}}{\partial{W}}+\frac{\lambda}{n}|W|

∂W∂L​=∂W∂L0​​+nλ​∣W∣,

L

b

=

L

0

b

\frac{\partial{L}}{\partial{b}}=\frac{\partial{L_0}}{\partial{b}}

∂b∂L​=∂b∂L0​​, 可以看出,L1正则化只对W有影响,对b没有影响。而加入L1正则化后的梯度更新:

W

=

W

α

(

L

0

W

λ

n

W

)

=

W

λ

n

W

α

L

0

W

W=W-\alpha(\frac{\partial{L_0}}{\partial{W}}+\frac{\lambda}{n}{|W|})=W-\frac{\lambda}{n}|W|-\alpha\frac{\partial{L_0}}{\partial{W}}

W=W−α(∂W∂L0​​+nλ​∣W∣)=W−nλ​∣W∣−α∂W∂L0​​, 如果W为正,相对于原梯度就减小;如W为负,相对于原梯度就增大。所以,L1正则化使得参数W在更新时向0靠近使得参数W具有稀疏性。而权重趋近0,也就相当于减小了网络复杂度,防止过拟合。

  • Dropout。每次训练时,有一部分神经元不参与更新,而且每次不参与更新的神经元是随机的。随着训练的进行,每次用神经元就能拟合出较好的效果,少数拟合效果不好的也不会对结果造成太大的影响。
  • 增大数据量。过拟合是学习到了部分数据集的特有特征,那么增大数据集就能有效的防止这种情况出现。
  • Early stop。数据分为训练集、验证集和测试集,每个epoch后都用验证集验证一下,如果随着训练的进行训练集loss持续下降,而验证集loss先下降后上升,说明出现了过拟合,应该立即停止训练。
  • Batch Normalization。每次都用一个mini_batch的数据来计算均值和反差,这与整体的均值和方差存在一定偏差,从而带来了随机噪声,起到了与Dropout类似的效果,从而减轻过拟合。
  • L1 / L2对比:
    • L1(拉格朗日Lasso)正则假设参数先验分布是Laplace分布,可以使权重稀疏,保证模型的稀疏性,某些参数等于0,产生稀疏权值矩阵,用于特征选择;
    • L2(岭回归Ridge)正则假设参数先验分布是Gaussian分布,可以使权重平滑,保证模型的稳定性,也就是参数的值不会太大或太小。
    • 在实际使用中,如果特征是高维稀疏的,则使用L1正则;如果特征是低维稠密的,则使用L2正则

BN层的计算

神经网络反向传播后每一层的参数都会发生变化,在下一轮正向传播时第

l

l

l 层的输出值

Z

l

=

W

A

l

1

b

Zl=W\cdot{A}{l-1}+b

Zl=W⋅Al−1+b 也会发生变化,导致第

l

l

l 层的

A

l

=

r

e

l

u

(

Z

l

)

Al=relu(Zl)

Al=relu(Zl) 发生变化。而

A

l

A^l

Al 作为第

l

1

l+1

l+1 层的输入,

l

1

l+1

l+1 就需要去适应适应这种数据分布的变化,这就是神经网络难以训练的原因之一。
为此,Batch Normalization的做法是调整数据的分布来改变这一现象,具体做法如下:

  • 训练: 一般每次训练数据都是一个batch,假设

m

=

b

a

t

c

h

_

s

i

z

e

m=batch\_size

m=batch_size,则:
1. 计算各个特征均值

 μ 
 
 
 = 
 
 
 
 1 
 
 
 m 
 
 
 
 
 ∑ 
 
 
 
 i 
 
 
 = 
 
 
 1 
 
 
 
 m 
 
 
 
 
 z 
 
 
 i 
 
 
 
 
 \mu=\frac{1}{m}\sum\_{i=1}^{m}z^i 
 
 
 μ=m1​∑i=1m​zi,其中  
 
 
 
 
 
 z 
 
 
 i 
 
 
 
 
 z^i 
 
 
 zi 表示第  
 
 
 
 
 i 
 
 
 
 i 
 
 
 i 条数据
2. 计算方差  
 
 
 
 
 
 σ 
 
 
 2 
 
 
 
 = 
 
 
 
 1 
 
 
 m 
 
 
 
 
 ∑ 
 
 
 
 i 
 
 
 = 
 
 
 1 
 
 
 
 m 
 
 
 
 ( 
 
 
 
 z 
 
 
 i 
 
 
 
 − 
 
 
 μ 
 
 
 
 ) 
 
 
 2 
 
 
 
 
 \sigma^2=\frac{1}{m}\sum\_{i=1}^{m}(z^i-\mu)^2 
 
 
 σ2=m1​∑i=1m​(zi−μ)2
3. 归一化后的  
 
 
 
 
 
 Z 
 
 
 
 n 
 
 
 o 
 
 
 r 
 
 
 m 
 
 
 
 i 
 
 
 
 = 
 
 
 
 
 
 z 
 
 
 i 
 
 
 
 − 
 
 
 μ 
 
 
 
 
 
 
 σ 
 
 
 2 
 
 
 
 + 
 
 
 ϵ 
 
 
 
 
 
 
 Z\_{norm}^i=\frac{z^i-\mu}{\sqrt{\sigma^2+\epsilon}} 
 
 
 Znormi​=σ2+ϵ


​zi−μ​, 
 
 
 
 
 ϵ 
 
 
 
 \epsilon 
 
 
 ϵ 表示一个极小值,防止计算出现Nan
4. 这样调整分布后能加速训练,但之前层学习到的参数信息可能会丢失,所以加入参数  
 
 
 
 
 γ 
 
 
 
 \gamma 
 
 
 γ、 
 
 
 
 
 β 
 
 
 
 \beta 
 
 
 β 调整:  
 
 
 
 
 
 
 Z 
 
 
 ~ 
 
 
 
 i 
 
 
 
 = 
 
 
 γ 
 
 
 
 Z 
 
 
 
 n 
 
 
 o 
 
 
 r 
 
 
 m 
 
 
 
 i 
 
 
 
 + 
 
 
 β 
 
 
 
 \widetilde{Z}^i=\gamma{Z\_{norm}^i}+\beta 
 
 
 Z


i=γZnormi​+β
  • 反向传播:

L

Z

n

o

r

m

i

=

L

Z

~

i

λ

\frac{\partial{L}}{\partial{Z_{norm}i}}=\frac{\partial{L}}{\partial{\widetilde{Z}i}}\lambda

∂Znormi​∂L​=∂Z

i∂L​λ

L

λ

=

L

Z

~

i

Z

n

o

r

m

i

\frac{\partial{L}}{\partial\lambda}=\frac{\partial{L}}{\partial{\widetilde{Z}i}}Z_{norm}i

∂λ∂L​=∂Z

i∂L​Znormi​

L

β

=

L

Z

~

i

\frac{\partial{L}}{\partial\beta}=\frac{\partial{L}}{\partial{\widetilde{Z}^i}}

∂β∂L​=∂Z

i∂L​

L

σ

2

=

L

Z

n

o

r

m

i

Z

n

o

r

m

i

σ

2

=

L

Z

n

o

r

m

i

(

1

2

)

(

σ

2

ϵ

)

3

2

\frac{\partial{L}}{\partial\sigma2}=\frac{\partial{L}}{\partial{Z_{norm}i}}\frac{\partial{Z_{norm}i}}{\partial\sigma2}=\frac{\partial{L}}{\partial{Z_{norm}i}}(-\frac{1}{2})(\sigma2+\epsilon)^{\frac{-3}{2}}

∂σ2∂L​=∂Znormi​∂L​∂σ2∂Znormi​​=∂Znormi​∂L​(−21​)(σ2+ϵ)2−3​

L

μ

=

L

Z

n

o

r

m

i

Z

n

o

r

m

i

μ

L

σ

2

σ

2

μ

=

L

Z

n

o

r

m

i

1

σ

2

ϵ

L

σ

2

2

i

=

1

m

(

z

i

μ

)

m

\frac{\partial{L}}{\partial\mu}=\frac{\partial{L}}{\partial{Z_{norm}i}}\frac{\partial{Z_{norm}i}}{\partial\mu}+\frac{\partial{L}}{\partial\sigma2}\frac{\partial{\sigma2}}{\partial{\mu}}=\frac{\partial{L}}{\partial{Z_{norm}i}}\frac{-1}{\sqrt{\sigma2+\epsilon}}+\frac{\partial{L}}{\partial\sigma2}\frac{-2\sum_{i=1}{m}(z^i-\mu)}{m}

∂μ∂L​=∂Znormi​∂L​∂μ∂Znormi​​+∂σ2∂L​∂μ∂σ2​=∂Znormi​∂L​σ2+ϵ

​−1​+∂σ2∂L​m−2∑i=1m​(zi−μ)​

L

Z

i

=

L

Z

n

o

r

m

i

Z

n

o

r

m

i

Z

i

L

σ

2

σ

2

Z

i

L

μ

μ

Z

i

=

L

Z

n

o

r

m

i

1

σ

2

ϵ

L

σ

2

2

(

Z

i

μ

)

m

L

μ

1

m

\frac{\partial{L}}{\partial{Zi}}=\frac{\partial{L}}{\partial{Z_{norm}i}}\frac{\partial{Z_{norm}i}}{\partial{Zi}}+\frac{\partial{L}}{\partial\sigma2}\frac{\partial{\sigma2}}{\partial{Zi}}+\frac{\partial{L}}{\partial\mu}\frac{\partial\mu}{\partial{Zi}}=\frac{\partial{L}}{\partial{Z_{norm}i}}\frac{1}{\sqrt{\sigma2+\epsilon}}+\frac{\partial{L}}{\partial\sigma2}\frac{2(Zi-\mu)}{m}+\frac{\partial{L}}{\partial\mu}\frac{1}{m}

∂Zi∂L​=∂Znormi​∂L​∂Zi∂Znormi​​+∂σ2∂L​∂Zi∂σ2​+∂μ∂L​∂Zi∂μ​=∂Znormi​∂L​σ2+ϵ

​1​+∂σ2∂L​m2(Zi−μ)​+∂μ∂L​m1​

  • 测试: 测试时一般每次只送入一个数据,计算其均值和方差都是有偏估计,但训练过程中保存了每一组batch每一层的均值和方差,则对每一层都可以使用均值和方差的无偏估计:

μ

t

e

s

t

=

E

(

μ

b

a

t

c

h

)

\mu_{test}=E(\mu_{batch})

μtest​=E(μbatch​)

σ

t

e

s

t

2

=

m

m

1

E

(

σ

b

a

t

c

h

2

)

\sigma2_{test}=\frac{m}{m-1}E(\sigma2_{batch})

σtest2​=m−1m​E(σbatch2​)
然后计算该层的输出:

Z

~

i

=

γ

Z

t

e

s

t

i

μ

σ

t

e

s

t

2

ϵ

β

\widetilde{Z}i=\gamma{\frac{Zi_{test}-\mu}{\sqrt{\sigma_{test}^2+\epsilon}}}+\beta

Z

i=γσtest2​+ϵ

​Ztesti​−μ​+β

  • 加在哪里: 原始论文中加在激活函数前面,但改论文部分作者主张加在激活函数后面,从实践上来说也是加在激活函数后面效果更好。
  • 局限: 实验表明,当batch_size小于8时,BN反而会带来负面作用;不适用于RNN

负梯度方向是函数局部值最快的方向

假设存在函数f(x),l是任意方向的单位向量,要现在的目的就是要找到一个l使得f(x+l)−f(x)的变化值最大。根据公式有

f

(

x

l

)

f

(

x

)

=

<

g

r

a

d

f

,

l

f(x+l)-f(x)=<grad_f, l>

f(x+l)−f(x)=<gradf​,l>,所以原问题变为找到l使得

g

r

a

d

f

l

c

o

s

(

θ

)

|grad_f|*|l|*cos(\theta)

∣gradf​∣∗∣l∣∗cos(θ)最大,其中θ是 l与

g

r

a

d

f

grad_f

gradf​的夹角),很明显

θ

=

0

\theta=0

θ=0时该值最大,也就是说l方向就是

g

r

a

d

f

grad_f

gradf​的方向,从而证明梯度方向是使得函数局布值变化最快的方向。

softmax loss和cross entropy

输入数据经过神经网络后得到的logits是一个[n, 1]向量(n表示进行n分类),此时向量中的数字可以是负无穷到正无穷的任意数字,经过softmax函数后才转换为概率。交叉熵函数形式与softmax loss函数几乎一样,当cross entropy的输入是softmax函数函数的输出时,二者就完全一样。将网络输出的预测值logit先用使用Softmax转换为预测概率值再传入 Cross Entropy Loss,就得到了最终的Softmax Loss。

  • softmax:

P

i

=

e

i

k

=

1

n

e

k

P_i=\frac{ei}{\sum_{k=1}{n}e^k}

Pi​=∑k=1n​ekei​

  • softmax loss:

L

=

i

=

1

n

y

i

l

o

g

p

i

L=-\sum_{i=1}^{n}y_ilogp_i

L=−∑i=1n​yi​logpi​

  • cross entropy:

L

=

i

=

1

n

y

i

l

o

g

p

i

L=-\sum_{i=1}^{n}y_ilogp_i

L=−∑i=1n​yi​logpi​

  • logistic regression:

L

=

y

i

l

o

g

p

i

(

1

y

i

)

l

o

g

(

1

p

i

)

L=-y_ilogp_i-(1-y_i)log(1-p_i)

L=−yi​logpi​−(1−yi​)log(1−pi​)

全连接层作用

  1. “分类”,将卷积层提取到的特征进行维数调整,同时融合各通道之间的信息。
  2. 在迁移学习的过程中,有全连接层的模型比没有全连接层的表现更好。

RNN和LSTM

RNN的优缺点:

  • 优点:
    • 参数共享: RNN在每个时间步都使用相同的参数,因此在训练和预测时具有较小的计算负担。
    • 灵活性: RNN可以处理各种长度的序列输入,并且可以用于不同的任务,如语言模型、时间序列预测等。
  • 缺点:
    • 梯度消失或爆炸: RNN在处理长期依赖关系时容易出现梯度消失或爆炸的问题,导致难以捕捉远距离的依赖关系。
    • 短期记忆限制: RNN的短期记忆相对较弱,难以有效地记住较长的历史信息。

LSTM的优缺点:

  • 优点:
    • 长期依赖关系: LSTM通过门控机制(遗忘门、输入门、输出门)有效地解决了长期依赖问题,能够更好地捕捉长距离的序列依赖关系。
    • 记忆单元: LSTM引入了记忆单元,可以保留和更新信息,有助于记住长序列中的重要信息。
    • 防止梯度消失: LSTM通过门控机制可以更有效地控制梯度的流动,减少了梯度消失或爆炸的问题。
  • 缺点:
    • 计算复杂度高: LSTM相对于普通的RNN计算量更大,因为它包含更多的门控单元和参数。
    • 可能出现过拟合: LSTM模型相对复杂,可能在小样本数据上容易出现过拟合的情况。

Transformer相对LSTM的优势

  • Transformer更快,对较长的序列建模效果更好,减少了对顺序信息的依赖性,不需要前面的信息来更新后面的隐状态。Transformer能更好的处理长期依赖问题,使得它在生成式任务中的表现尤为突出。
  • Transformer需要更多的数据来训练。但是transformer并行训练,速度更快;用更多的数据训练lstm,表现却不会再提升,上限低;很多efficient transformer减少了计算复杂度,或者加入一些先验信息来减少对预训练的依赖,都取得了很好的performance。

RNN不用Relu要用tanh函数?

CNN中用ReLU函数能解决梯度消失的问题是因为Relu函数梯度为1,能解决梯度爆炸的问题是因为反向传播时W互不相同,它们连乘很大程度上能抵消梯度爆炸的效果;而RNN中用Relu是若干个W连乘,不能解决梯度爆炸的问题。所以想要解决RNN中的梯度消失问题,一般都是用LSTM。

Transformer

一种基于自注意力机制的序列到序列(Sequence-to-Sequence)模型,用于处理NLP任务,解决长依赖问题和并行计算效率的平衡。相比于RNN模型Transformer使用全局的自注意力机制,使模型可以同时关注输入序列的所有位置,更好地捕捉长距离依赖关系。Transformer引入多头注意力机制提高了模型的表达能力。Transformer两个关键组件组成:Encoder和Decoder。编码器将输入序列编码为一系列上下文相关的表示,解码器用这些表示生成目标序列。

  • 编码器,输入序列经过多层自注意力层和前馈神经网络层处理。自注意力层中输入序列的每个位置都与其他位置进行注意力计算,以获取位置之间的相关性。使得模型能够在不同位置之间建立上下文关联,能够处理长距离的依赖关系。
  • 解码器,除自注意力层和前馈神经网络层,还包含一个编码器-解码器注意力层。交叉注意力层将编码器中的信息与解码器的当前位置关联,在生成目标序列时获得更好的上下文信息。
  • Transformer端到端训练,最大化目标序列的条件概率来进行模型优化。训练中使用掩码注意力(Masked Attention)确保解码器只能看到当前位置之前输入,避免信息泄露。

Transformer优点:

  • 能处理长距离依赖关系,适用于处理包含长序列的任务。
  • 并行计算效率高,使得模型在GPU上能够进行高效训练和推理。
  • 具有较好的表示能力和泛化能力,在多个NLP任务上取得了优异的性能。
    Transformer对大规模数据和计算资源的需求较高,对某些任务可能需要更多的参数调优和数据预处理。
位置编码

单词在句子中的位置以及排列顺序是非常重要的,引入词序信息有助于理解语义。循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention取而代之,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此有必要把词序信号加到词向量上帮助模型学习这些信息,位置编码(Positional Encoding)就是用来解决这种问题的方法。

好的位置编码方案需满足:

  1. 能为每个时间步输出一个独一无二的编码;
  2. 不同长度的句子之间,任何两个时间步之间的距离应该保持一致;
  3. 模型应该能毫不费力地泛化到更长的句子。它的值应该是有界的;
  4. 必须是确定性的。

Transformer位置编码不是单一的一个数值,而是包含句子中特定位置信息的d维向量(非常像词向量)。编码没有整合进模型,而是用这个向量让每个词具有它在句子中的位置的信息。换句话说,通过注入词的顺序信息来增强模型输入。
把512维的向量两两一组,每组都是一个sin和一个cos,这两个函数共享同一个频率

w

i

w_i

wi​,共256组,从0开始编号,最后一组编号是255。sin/cos函数的波长(由

w

i

w_i

wi​决定)则从 2π 增长到 2π * 10000。位置编码性质:

  • 两个位置编码的点积(dot product)仅取决于偏移量 △t,也即两个位置编码的点积可以反应出两个位置编码间的距离。
  • 位置编码的点积是无向的,即KaTeX parse error: Undefined control sequence: \* at position 7: PE_tT\̲*̲PE_{t+△t}=PE_t

Transformer学习笔记一:Positional Encoding(位置编码)
一文读懂Transformer模型的位置编码

head降维

Transformer的多头注意力看上去是借鉴了CNN中同一卷积层内使用多个卷积核的思想,原文中使用 8 个“scaled dot-product attention”,在同一“multi-head attention”层中,输入均为“KQV”,同时进行注意力的计算,彼此之前参数不共享,最终将结果拼接起来,这样可以允许模型在不同的表示子空间里学习到相关的信息。即希望每个注意力头只关注最终输出序列中一个子空间,互相独立。核心思想在于抽取到更加丰富的特征信息。如果只使用 one head 并且维度为

d

m

o

d

e

l

d_{model}

dmodel​ ,相较于 8 head 并且维度为

d

m

o

d

e

l

/

8

d_{model} / 8

dmodel​/8,存在高维空间下学习难度较大的问题,文中实验也证实了这一点,于是将原有的高维空间转化为多个低维子空间并再最后进行拼接,取得了更好的效果,十分巧妙。

transformer中multi-head attention中每个head为什么要进行降维?

自注意力比例系数

d

k

d_k

dk​是词向量/隐藏层的维度,Q*K的维度也是

d

k

d_k

dk​,Q*K越大,相乘后的varience越大,除以

d

k

d_k

dk​来平衡。

  1. 除以根号

d

k

d_k

dk​防止输入softmax的值过大,导致偏导数趋近于0
2. 选择根号

d

k

d_k

dk​可以使得Q*K的结果满足期望为0,方差为1的分布,类似于归一化。

预测与推理阶段都使用mask原因
  • 训练阶段:训练时计算loss,是用当前decoder输入所有单词对应位置的输出

y

1

,

y

2

,

.

.

.

,

y

t

y_1,y_2,…,y_t

y1​,y2​,…,yt​与真实的翻译结果ground truth去分别算cross entropy loss,然后把t个loss加起来,如果使用self-attention,那么

y

1

y_1

y1​这个输出里包含了

x

1

x_1

x1​右侧单词信息(包含要预测下一个单词

x

2

x_2

x2​的信息),用到了未来信息,属于信息泄露。

  • 预测阶段:预测阶段要保持重复单词预测结果是一样的,这样不仅合理,而且可以增量更新(预测时会选择性忽略重复的预测词,只摘取最新预测的单词拼接到输入序列中),如果关掉dropout,那么当预测序列是

x

1

,

x

2

,

x

3

x_1, x_2, x_3

x1​,x2​,x3​时的输出结果,应该是和预测序列是

x

1

,

x

2

,

x

3

,

x

4

x_1, x_2, x_3, x_4

x1​,x2​,x3​,x4​的前3个位置结果是一样的(增量更新);同时与训练时的模型架构保持一致,前向传播的方式是一致的。

从训练和预测角度来理解Transformer中Masked Self-Attention的原理

代码

通过pytorch深入理解transformer中的自注意力(self attention)

BERT和GPT区别

二者都是采用「预训练+微调」的范式,

  • BERT:几乎就是为「无监督预训练+下游任务微调」的范式量身定制的模型。BERT使用的掩码语言模型任务没有生成文本的能力,但换来的是双向编码的能力,这让模型拥有了更强的文本编码性能。主要用于解决语言理解相关的任务,如问答、语义关系抽取等。BERT更适用于在已有标注数据上微调的场景。
  • GPT:基于生成式预训练的思想开发,为了保留生成文本的能力,只能采用单向编码。主要用于解决语言生成相关的任务,如文本生成、机器翻译等。GPT更适用于在大量未标注数据上预训练的场景。

深度学习模型和树模型的优缺点

深度学习模型的优缺点:

  • 优点:
    • 擅长处理复杂数据: 对于大规模数据、高维数据和非线性关系,深度学习模型通常能够提供更好的拟合能力。
    • 特征学习能力强: 能够自动学习和提取数据的特征,减少对特征工程的需求。
    • 泛化能力强: 在大数据集上训练时,深度学习模型可能会产生更好的泛化效果,适用于更广泛的场景。
  • 缺点:
    • 需要大量数据和计算资源: 深度学习模型对于大规模数据集和复杂模型的训练需要大量的数据和高性能计算资源。
    • 需要调参和调优: 模型架构复杂,需要仔细调整超参数和优化模型结构。
    • 可解释性差

树模型的优缺点:

  • 优点:
    • 易解释性强:能够直观地展示特征重要性和决策过程。
    • 对少量数据处理得当: 在数据较少或者数据质量较差的情况下,树模型表现通常较好。
    • 训练和预测速度快: 相对于深度学习模型,树模型的训练速度快,适合于处理中小规模的数据集。
  • 缺点:
    • 容易过拟合: 在某些情况下,树模型容易过拟合,尤其是当树的深度较大或没有采用适当的剪枝措施时。
    • 不擅长处理复杂关系: 对于复杂的非线性关系,树模型可能不如深度学习模型表现得好。
    • 需要人工特征工程: 对于传统的决策树模型,通常需要手动进行特征工程,挑选和构建合适的特征。

计算机视觉

图像处理中一般用最大池化而不用平均池化

池化的主要目的:

  1. 保持主要特征不变的同时减小了参数
  2. 保持平移、旋转、尺度不变性,增强了神经网络的鲁棒性

最大池化更能捕捉图像上的变化、梯度的变化,带来更大的局部信息差异化,从而更好地捕捉边缘、纹理等特征。

计算感受野

卷积层(conv)和池化层(pooling)都会影响感受野,激活函数层通常对于感受野没有影响,当前层的步长并不影响当前层的感受野,感受野和填补(padding)没有关系, 计算当层感受野的公式如下:

R

F

i

1

=

R

F

i

(

k

1

)

×

S

i

RF_{i+1}=RF_i+(k-1) \times S_i

RFi+1​=RFi​+(k−1)×Si​
其中,

R

F

i

1

RF_{i+1}

RFi+1​ 表示当前层的感受野,

R

F

i

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

head 并且维度为

d

m

o

d

e

l

/

8

d_{model} / 8

dmodel​/8,存在高维空间下学习难度较大的问题,文中实验也证实了这一点,于是将原有的高维空间转化为多个低维子空间并再最后进行拼接,取得了更好的效果,十分巧妙。

transformer中multi-head attention中每个head为什么要进行降维?

自注意力比例系数

d

k

d_k

dk​是词向量/隐藏层的维度,Q*K的维度也是

d

k

d_k

dk​,Q*K越大,相乘后的varience越大,除以

d

k

d_k

dk​来平衡。

  1. 除以根号

d

k

d_k

dk​防止输入softmax的值过大,导致偏导数趋近于0
2. 选择根号

d

k

d_k

dk​可以使得Q*K的结果满足期望为0,方差为1的分布,类似于归一化。

预测与推理阶段都使用mask原因
  • 训练阶段:训练时计算loss,是用当前decoder输入所有单词对应位置的输出

y

1

,

y

2

,

.

.

.

,

y

t

y_1,y_2,…,y_t

y1​,y2​,…,yt​与真实的翻译结果ground truth去分别算cross entropy loss,然后把t个loss加起来,如果使用self-attention,那么

y

1

y_1

y1​这个输出里包含了

x

1

x_1

x1​右侧单词信息(包含要预测下一个单词

x

2

x_2

x2​的信息),用到了未来信息,属于信息泄露。

  • 预测阶段:预测阶段要保持重复单词预测结果是一样的,这样不仅合理,而且可以增量更新(预测时会选择性忽略重复的预测词,只摘取最新预测的单词拼接到输入序列中),如果关掉dropout,那么当预测序列是

x

1

,

x

2

,

x

3

x_1, x_2, x_3

x1​,x2​,x3​时的输出结果,应该是和预测序列是

x

1

,

x

2

,

x

3

,

x

4

x_1, x_2, x_3, x_4

x1​,x2​,x3​,x4​的前3个位置结果是一样的(增量更新);同时与训练时的模型架构保持一致,前向传播的方式是一致的。

从训练和预测角度来理解Transformer中Masked Self-Attention的原理

代码

通过pytorch深入理解transformer中的自注意力(self attention)

BERT和GPT区别

二者都是采用「预训练+微调」的范式,

  • BERT:几乎就是为「无监督预训练+下游任务微调」的范式量身定制的模型。BERT使用的掩码语言模型任务没有生成文本的能力,但换来的是双向编码的能力,这让模型拥有了更强的文本编码性能。主要用于解决语言理解相关的任务,如问答、语义关系抽取等。BERT更适用于在已有标注数据上微调的场景。
  • GPT:基于生成式预训练的思想开发,为了保留生成文本的能力,只能采用单向编码。主要用于解决语言生成相关的任务,如文本生成、机器翻译等。GPT更适用于在大量未标注数据上预训练的场景。

深度学习模型和树模型的优缺点

深度学习模型的优缺点:

  • 优点:
    • 擅长处理复杂数据: 对于大规模数据、高维数据和非线性关系,深度学习模型通常能够提供更好的拟合能力。
    • 特征学习能力强: 能够自动学习和提取数据的特征,减少对特征工程的需求。
    • 泛化能力强: 在大数据集上训练时,深度学习模型可能会产生更好的泛化效果,适用于更广泛的场景。
  • 缺点:
    • 需要大量数据和计算资源: 深度学习模型对于大规模数据集和复杂模型的训练需要大量的数据和高性能计算资源。
    • 需要调参和调优: 模型架构复杂,需要仔细调整超参数和优化模型结构。
    • 可解释性差

树模型的优缺点:

  • 优点:
    • 易解释性强:能够直观地展示特征重要性和决策过程。
    • 对少量数据处理得当: 在数据较少或者数据质量较差的情况下,树模型表现通常较好。
    • 训练和预测速度快: 相对于深度学习模型,树模型的训练速度快,适合于处理中小规模的数据集。
  • 缺点:
    • 容易过拟合: 在某些情况下,树模型容易过拟合,尤其是当树的深度较大或没有采用适当的剪枝措施时。
    • 不擅长处理复杂关系: 对于复杂的非线性关系,树模型可能不如深度学习模型表现得好。
    • 需要人工特征工程: 对于传统的决策树模型,通常需要手动进行特征工程,挑选和构建合适的特征。

计算机视觉

图像处理中一般用最大池化而不用平均池化

池化的主要目的:

  1. 保持主要特征不变的同时减小了参数
  2. 保持平移、旋转、尺度不变性,增强了神经网络的鲁棒性

最大池化更能捕捉图像上的变化、梯度的变化,带来更大的局部信息差异化,从而更好地捕捉边缘、纹理等特征。

计算感受野

卷积层(conv)和池化层(pooling)都会影响感受野,激活函数层通常对于感受野没有影响,当前层的步长并不影响当前层的感受野,感受野和填补(padding)没有关系, 计算当层感受野的公式如下:

R

F

i

1

=

R

F

i

(

k

1

)

×

S

i

RF_{i+1}=RF_i+(k-1) \times S_i

RFi+1​=RFi​+(k−1)×Si​
其中,

R

F

i

1

RF_{i+1}

RFi+1​ 表示当前层的感受野,

R

F

i

[外链图片转存中…(img-Tv59eRd2-1715294012022)]
[外链图片转存中…(img-3HLI0KMW-1715294012022)]
[外链图片转存中…(img-E8innq6y-1715294012023)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值