1. shape
简表:
名称
nn.
输入参数
输入shape
输出shape
激活函数
Relu
\
*
*
展平层
Flatten
[start_dim=1, end_dim=-1]
[batch_size, *]
[batch_size, ∏ ∗ \prod * ∏ ∗ ]
线性层
Linear
in_features, out_features
[*, in_features]
[*, out_features]
互相关
Conv2d
in_channels, out_channels, kernel_size
[N N N , in_channels, h h h , w]
[N N N , out_channels, h o u t h_{out} h o u t , w o u t w_{out} w o u t ]
汇聚层
Pool2d
kernel_size
[N N N , C C C , h h h , w w w ]
[N N N , C C C , h o u t h_{out} h o u t , w o u t w_{out} w o u t ]
归一化
BatchNorm2d
channels
[N N N , C C C , H H H , W W W ]
[N N N , C C C , H H H , W W W ]
表的一些约定 :
对于一个名称,如果存在多个对应链接,一般取最常用的那个。
维度变量的表示:一般输入维度都是[batch_size, channels, height, width],偶尔使用in_前缀来区分前后的维度名称,也会使用[N N N , C C C , H H H , W W W ],[N N N , C C C , h h h , w w w ]等简化表示。
符号:*代表代表任意数量的维度,输入参数里的[]用于表示可选参数。
计算:限于表格大小,公式在上文给出,表格内只给出大致流程。
还没填到表里的:深度可分离卷积、膨胀卷积
2. 激活函数
3. 损失函数
一般使用L L L 是我简化后的表达式,使用ℓ \ell ℓ 是pytorch官方的表达式。
CrossEntropyLoss
L = − ln e x t a r g e t ∑ c ∈ C e x c L = -\text{ln} \frac {e^{x_{target}}} {\sum_{c \in C} e^{x_c}} L = − ln ∑ c ∈ C e x c e x t a r g e t
ℓ ( x , y ) = L = { l 1 , … , l N } ⊤ , l n = − w y n log exp ( x n , y n ) ∑ c = 1 C exp ( x n , c ) ⋅ 1 { y n ≠ ignore index } \ell(x,y)=L=\{l_1,\ldots,l_N\}^\top,\quad l_n=-w_{y_n}\log\frac{\exp(x_{n,y_n})}{\sum_{c=1}^C\exp(x_{n,c})}\cdot1\{y_n\neq\text{ignore}_\text{index}\} ℓ ( x , y ) = L = { l 1 , … , l N } ⊤ , l n = − w y n log ∑ c = 1 C exp ( x n , c ) exp ( x n , y n ) ⋅ 1 { y n = ignore index }
y = torch. LongTensor( [ 0 ] )
z = torch. Tensor( [ [ 0.2 , 0.1 , - 0.1 ] ] )
criterion = torch. nn. CrossEntropyLoss( )
loss = criterion( z, y)
print ( loss)
p = torch. exp( z[ 0 , y] ) / torch. sum ( torch. exp( z[ 0 ] ) )
loss = - math. log( p. item( ) )
print ( loss)
4. 优化器
5. 正则化
6. 批标准化
7. 经典网络
7.1 AlexNet
7.2 VGG
7.3 GoogLeNet
7.4 ResNet
7.5 DenseNet
7.6 SENet
7.7 UNet
8. 深度学习模型
8.1. MLP
Multi-Layer Perceptron多层感知机
8.2. CNN
Convolutional Neural Network卷积神经网络
8.3. RNN
Recurrent Neural Network循环神经网络
1. 基本的RNN
之前都是默认数据来自于某种分布,并且所有样本都是独立同分布的。序列信息需要RNN来处理。
对于n n n 元语言模型 P ( x t ∣ x t − 1 , . . . , x 1 ) P(x_t\left|x_{t-1},...,x_1\right) P ( x t ∣ x t − 1 , ... , x 1 ) ,若词表大小是∣ V ∣ \left|V\right| ∣ V ∣ ,则其成本是∣ V ∣ n \left|V\right|^n ∣ V ∣ n ,所以需要简化为:P ( x t ∣ x t − 1 , … , x 1 ) ≈ P ( x t ∣ h t − 1 ) P(x_t\left|x_{t-1},\ldots,x_1\right)\approx P(x_t\left|h_{t-1}\right) P ( x t ∣ x t − 1 , … , x 1 ) ≈ P ( x t ∣ h t − 1 ) ,并使用h t = f ( x t , h t − 1 ) h_t=f(x_t,h_{t-1}) h t = f ( x t , h t − 1 ) 更新隐状态。
对于具体的RNN模型:
隐藏层输出H t ∈ R n × h H_t \in\mathbb{R}^{n\times h} H t ∈ R n × h 的计算公式如下:
H t = ϕ ( X t W x h + H t − 1 W h h + b h ) {H}_t=\phi({X}_t{W}_{xh}+{H}_{t-1}{W}_{hh}+{b}_h) H t = ϕ ( X t W x h + H t − 1 W hh + b h ) 式中,D D D 是输入维度,h h h 是隐状态维度,n n n 是批量大小,t t t 是时间步,X t ∈ R n × D X_t \in\mathbb{R}^{n\times D} X t ∈ R n × D 是输入,H t ∈ R n × h H_t \in\mathbb{R}^{n\times h} H t ∈ R n × h 是隐状态,W x h ∈ R D × h W_{xh} \in\mathbb{R}^{D\times h} W x h ∈ R D × h 和W h h ∈ R h × h W_{hh} \in\mathbb{R}^{h\times h} W hh ∈ R h × h 是权重,b h ∈ R 1 × h b_h \in\mathbb{R}^{1\times h} b h ∈ R 1 × h 是偏置(求和时使用广播机制),ϕ \phi ϕ 是激活函数。需要注意的是,不同时间步的权重是一样的,所以W x h , W h h , b h W_{xh},W_{hh},b_h W x h , W hh , b h 是共享的。
输出层的输出的计算公式如下:
O t = H t W h q + b q {O}_t={H}_t{W}_{hq}+{b}_q O t = H t W h q + b q 式中,O t ∈ R n × q O_t \in\mathbb{R}^{n\times q} O t ∈ R n × q 是输出,W h q ∈ R h × q W_{hq} \in\mathbb{R}^{h\times q} W h q ∈ R h × q 是权重,b q ∈ R 1 × q b_q \in\mathbb{R}^{1\times q} b q ∈ R 1 × q 是偏置(求和时使用广播机制)。同样的,W h q , b q W_{hq},b_q W h q , b q 是共享的。
网络结构如下:
评价语言模型的标准是困惑度 (perplexity),对于一篇长度为n n n 的文本W = ( x 1 , x 2 , … , x n ) W=(x_1,x_2,\ldots,x_n) W = ( x 1 , x 2 , … , x n ) ,困惑度的计算公式如下:
perplexity ( W ) = exp ( − 1 n ∑ t = 1 n log P ( x t ∣ x t − 1 , … , x 1 ) ) \text{perplexity}(W)=\exp\left(-\frac1n\sum_{t=1}^n\log P(x_t\mid x_{t-1},\ldots,x_1)\right) perplexity ( W ) = exp ( − n 1 t = 1 ∑ n log P ( x t ∣ x t − 1 , … , x 1 ) ) 当困惑度为k k k 时,表示有k k k 个等可能的词来预测下一个词。
RNN的不同变种:
2. GRU
gated recurrent unit门控循环单元
重置门R ∈ R n × h R\in \mathbb{R}^{n\times h} R ∈ R n × h 允许我们控制可能还想记住的过去状态的数量;更新门Z ∈ R n × h Z\in \mathbb{R}^{n\times h} Z ∈ R n × h 将允许我们控制新状态中有多少个是旧状态的副本。简而言之:
重置门 reset gate打开时,模型在这个时间步就像一个基本的RNN单元一样,会使用整个隐状态 H t − 1 H_{t-1} H t − 1 来计算新的状态,有助于捕获序列中的短期 依赖关系;
更新门 update gate打开时,模型在这个时间步几乎不更新隐状态H t H_t H t ,就像跳过 了这个时间步,有助于捕获序列中的长期 依赖关系。
(打开的意思就是其值接近1)
计算公式如下:
R t = σ ( X t W x r + H t − 1 W h r + b r ) ∈ ( 0 , 1 ) Z t = σ ( X t W x z + H t − 1 W h z + b z ) ∈ ( 0 , 1 ) \begin{aligned}
{R}_t&=\sigma({X}_t{W}_{xr}+{H}_{t-1}{W}_{hr}+{b}_r)\in (0,1)\\
{Z}_t&=\sigma({X}_t{W}_{xz}+{H}_{t-1}{W}_{hz}+{b}_z)\in (0,1)\end{aligned} R t Z t = σ ( X t W x r + H t − 1 W h r + b r ) ∈ ( 0 , 1 ) = σ ( X t W x z + H t − 1 W h z + b z ) ∈ ( 0 , 1 ) 其中,σ \sigma σ 是sigmoid函数,W x r , W h r , b r , W x z , W h z , b z W_{xr},W_{hr},b_r,W_{xz},W_{hz},b_z W x r , W h r , b r , W x z , W h z , b z 的维度是D × h , h × h , 1 × h D\times h,h\times h,1\times h D × h , h × h , 1 × h 并且参数共享。下面的H ~ t \tilde{H}_t H ~ t 公式里的W , b W,b W , b 也是如此。
候选隐状态H ~ t ∈ R n × h \tilde{H}_t\in \mathbb{R}^{n\times h} H ~ t ∈ R n × h 的计算公式如下:
H ~ t = tanh ( X t W x h + ( R t ⊙ H t − 1 ) W h h + b h ) ∈ ( − 1 , 1 ) \tilde{{H}}_t=\tanh({X}_t{W}_{xh}+({R}_t\odot{H}_{t-1}){W}_{hh}+{b}_h)\in (-1,1) H ~ t = tanh ( X t W x h + ( R t ⊙ H t − 1 ) W hh + b h ) ∈ ( − 1 , 1 ) 该式与RNN的隐状态计算公式基本一致,只是使用tanh \tanh tanh 激活函数(为了保证输出在( − 1 , 1 ) (-1,1) ( − 1 , 1 ) 之间)并且多了一个重置门(当R t R_t R t 接近1时与普通的RNN一致,当R t R_t R t 接近0时会忽略掉H t − 1 H_{t-1} H t − 1 )。
最终的隐状态H t ∈ R n × h H_t\in \mathbb{R}^{n\times h} H t ∈ R n × h 的计算公式如下:
H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t H_t=Z_t\odot{H}_{t-1}+(1-Z_t)\odot\tilde{H}_t H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t 这个式子的意思是,如果更新门Z t Z_t Z t 接近1,那么新的隐状态H t H_t H t 就会接近于旧的隐状态H t − 1 H_{t-1} H t − 1 ;如果更新门Z t Z_t Z t 接近于0,那么H t H_t H t 就会接近于候选隐状态H ~ t \tilde{H}_t H ~ t 。
3. LSTM
Long Short-Term Memory长短期记忆
输入门I ∈ R n × h I\in \mathbb{R}^{n\times h} I ∈ R n × h 允许我们控制新输入的数量;遗忘门F ∈ R n × h F\in \mathbb{R}^{n\times h} F ∈ R n × h 允许我们控制过去状态的数量;输出门O ∈ R n × h O\in \mathbb{R}^{n\times h} O ∈ R n × h 允许我们控制输出的数量。简而言之:
输入门 input gate打开时,模型允许当前输入X t X_t X t 影响新的记忆元 C t C_t C t ,有助于捕获序列中的短期依赖关系。
遗忘门 forget gate打开时,模型保留更多的过去状态信息 C t − 1 C_{t-1} C t − 1 ,有助于捕获序列中的长期依赖关系。
输出门 output gate打开时,模型允许当前记忆元 C t C_t C t 影响隐状态输出H t H_t H t ,有助于捕获短期和长期依赖关系。
计算公式如下:
I t = σ ( X t W x i + H t − 1 W h i + b i ) ∈ ( 0 , 1 ) F t = σ ( X t W x f + H t − 1 W h f + b f ) ∈ ( 0 , 1 ) O t = σ ( X t W x o + H t − 1 W h o + b o ) ∈ ( 0 , 1 ) \begin{aligned}
{I}_t&=\sigma({X}_t{W}_{xi}+{H}_{t-1}{W}_{hi}+{b}_i)\in (0,1)\\
{F}_t&=\sigma({X}_t{W}_{xf}+{H}_{t-1}{W}_{hf}+{b}_f)\in (0,1)\\
{O}_t&=\sigma({X}_t{W}_{xo}+{H}_{t-1}{W}_{ho}+{b}_o)\in (0,1)\end{aligned} I t F t O t = σ ( X t W x i + H t − 1 W hi + b i ) ∈ ( 0 , 1 ) = σ ( X t W x f + H t − 1 W h f + b f ) ∈ ( 0 , 1 ) = σ ( X t W x o + H t − 1 W h o + b o ) ∈ ( 0 , 1 ) 其中,σ \sigma σ 是sigmoid函数,W x i , W h i , b i , W x f , W h f , b f , W x o , W h o , b o W_{xi},W_{hi},b_i,W_{xf},W_{hf},b_f,W_{xo},W_{ho},b_o W x i , W hi , b i , W x f , W h f , b f , W x o , W h o , b o 的维度是D × h , h × h , 1 × h D\times h,h\times h,1\times h D × h , h × h , 1 × h 并且参数共享。下面的C ~ t \tilde{C}_t C ~ t 公式里的W , b W,b W , b 也是如此。
候选记忆元C ~ t ∈ R n × h \tilde{C}_t\in \mathbb{R}^{n\times h} C ~ t ∈ R n × h 的计算公式如下:
C ~ t = tanh ( X t W x c + H t − 1 W h c + b c ) \tilde{{C}}_t=\tanh({X}_t{W}_{xc}+{H}_{t-1}{W}_{hc}+{b}_c) C ~ t = tanh ( X t W x c + H t − 1 W h c + b c ) 该式与RNN的隐状态计算公式基本一致,只是使用tanh \tanh tanh 激活函数(为了保证输出在( − 1 , 1 ) (-1,1) ( − 1 , 1 ) 之间)。
记忆元C t ∈ R n × h C_t\in \mathbb{R}^{n\times h} C t ∈ R n × h 的计算公式如下:
C t = F t ⊙ C t − 1 + I t ⊙ C ~ t C_t=F_t\odot{C}_{t-1}+I_t\odot\tilde{C}_t C t = F t ⊙ C t − 1 + I t ⊙ C ~ t 这个式子的意思是,如果遗忘门F t F_t F t 接近1,那么新的记忆元C t C_t C t 就会接近于旧的记忆元C t − 1 C_{t-1} C t − 1 ;如果遗忘门F t F_t F t 接近于0,那么C t C_t C t 就会接近于候选记忆元C ~ t \tilde{C}_t C ~ t 。
最终的隐状态H t ∈ R n × h H_t\in \mathbb{R}^{n\times h} H t ∈ R n × h 的计算公式如下:
H t = O t ⊙ tanh ( C t ) H_t=O_t\odot\tanh(C_t) H t = O t ⊙ tanh ( C t ) 这个式子的意思是,输出门O t O_t O t 控制着细胞状态C t C_t C t 的信息流向隐状态H t H_t H t 。
4. 深度循环神经网络
深度循环神经网络的隐藏层输出H t ( l ) ∈ R n × h ( l ) H_t^{(l)}\in\mathbb{R}^{n\times h^{(l)}} H t ( l ) ∈ R n × h ( l ) 的计算公式如下:
H t ( l ) = ϕ l ( H t ( l − 1 ) W x h ( l ) + H t − 1 ( l ) W h h ( l ) + b h ( l ) ) {H}_t^{(l)}=\phi_l({H}_t^{(l-1)}{W}_{xh}^{(l)}+{H}_{t-1}^{(l)}{W}_{hh}^{(l)}+{b}_h^{(l)}) H t ( l ) = ϕ l ( H t ( l − 1 ) W x h ( l ) + H t − 1 ( l ) W hh ( l ) + b h ( l ) ) 其中H t ( l ) ∈ R n × h ( l ) H_t^{(l)}\in\mathbb{R}^{n\times h^{(l)}} H t ( l ) ∈ R n × h ( l ) 是第l l l 层的隐状态,W x h ( l ) ∈ R h ( l − 1 ) × h ( l ) W_{xh}^{(l)}\in\mathbb{R}^{h^{(l-1)}\times h^{(l)}} W x h ( l ) ∈ R h ( l − 1 ) × h ( l ) 和W h h ( l ) ∈ R h ( l ) × h ( l ) W_{hh}^{(l)}\in\mathbb{R}^{h^{(l)}\times h^{(l)}} W hh ( l ) ∈ R h ( l ) × h ( l ) 是第l l l 层的权重,b h ( l ) ∈ R 1 × h ( l ) b_h^{(l)}\in\mathbb{R}^{1\times h^{(l)}} b h ( l ) ∈ R 1 × h ( l ) 是第l l l 层的偏置,ϕ l \phi_l ϕ l 是第l l l 层的激活函数,H t ( 0 ) = X t ∈ R n × D H_t^{(0)}=X_t\in\mathbb{R}^{n\times D} H t ( 0 ) = X t ∈ R n × D 是输入,H t ( L ) ∈ R n × h ( L ) H_t^{(L)}\in\mathbb{R}^{n\times h^{(L)}} H t ( L ) ∈ R n × h ( L ) 是输出,L L L 是层数。
输出层的输出的计算公式如下:
O t = H t ( L ) W h q + b q {O}_t={H}_t^{(L)}{W}_{hq}+{b}_q O t = H t ( L ) W h q + b q 其中O t ∈ R n × q O_t\in\mathbb{R}^{n\times q} O t ∈ R n × q 是输出,W h q ∈ R h ( L ) × q W_{hq}\in\mathbb{R}^{h^{(L)}\times q} W h q ∈ R h ( L ) × q 是权重,b q ∈ R 1 × q b_q\in\mathbb{R}^{1\times q} b q ∈ R 1 × q 是偏置。
5. 双向循环神经网络
双向循环神经网络的隐藏层输出H t ( f ) ∈ R n × h H_t^{(f)}\in\mathbb{R}^{n\times h} H t ( f ) ∈ R n × h (正向,也记为H → t \overrightarrow{H}_t H t )和H t ( b ) ∈ R n × h H_t^{(b)}\in\mathbb{R}^{n\times h} H t ( b ) ∈ R n × h (反向,也记为H ← t \overleftarrow{H}_t H t )的计算公式如下:
H → t = ϕ ( X t W x h ( f ) + H → t − 1 W h h ( f ) + b h ( f ) ) H ← t = ϕ ( X t W x h ( b ) + H ← t + 1 W h h ( b ) + b h ( b ) ) \begin{aligned}
\overrightarrow{{H}}_{t}&=\phi({X}_t{W}_{xh}^{(f)}+\overrightarrow{{H}}_{t-1}{W}_{hh}^{(f)}+{b}_h^{(f)})\\
\overleftarrow{{H}}_{t}&=\phi({X}_t{W}_{xh}^{(b)}+\overleftarrow{{H}}_{t+1}{W}_{hh}^{(b)}+{b}_h^{(b)})\end{aligned} H t H t = ϕ ( X t W x h ( f ) + H t − 1 W hh ( f ) + b h ( f ) ) = ϕ ( X t W x h ( b ) + H t + 1 W hh ( b ) + b h ( b ) ) 其中W,b的shape和上面的一样,是D × h , h × h , 1 × h D\times h,h\times h,1\times h D × h , h × h , 1 × h ,ϕ \phi ϕ 是激活函数。最终的隐状态H t ∈ R n × 2 h H_t\in\mathbb{R}^{n\times 2h} H t ∈ R n × 2 h 的计算公式如下:
H t = [ H → t , H ← t ] H_t=[\overrightarrow{H}_t,\overleftarrow{H}_t] H t = [ H t , H t ] 输出层的输出的计算公式如下:
O t = H t W h q + b q {O}_t={H}_t{W}_{hq}+{b}_q O t = H t W h q + b q 其中O t ∈ R n × q O_t\in\mathbb{R}^{n\times q} O t ∈ R n × q 是输出,W h q ∈ R 2 h × q W_{hq}\in\mathbb{R}^{2h\times q} W h q ∈ R 2 h × q 是权重,b q ∈ R 1 × q b_q\in\mathbb{R}^{1\times q} b q ∈ R 1 × q 是偏置。
需要注意的是,实际使用中不一定能得到H ← t \overleftarrow{H}_t H t ,所以将不会得到很好的精度。并且训练速度很慢,梯度链过长。可以用于填充缺失的单词、词元注释等。
6. 编码器-解码器架构
输入序列 X = x 1 , x 2 , . . . , x T X = {x_1, x_2, ..., x_T} X = x 1 , x 2 , ... , x T ,其中 x t ∈ R d x_t \in \mathbb{R}^d x t ∈ R d 表示时间步 t t t 的输入向量,d d d 是输入向量的维度。
编码器 将输入序列映射到隐状态序列H = h 1 , h 2 , . . . , h T = Encoder ( X ) H={h_1, h_2, ..., h_T} = \text{Encoder}(X) H = h 1 , h 2 , ... , h T = Encoder ( X ) ,其中h t ∈ R h h_t \in \mathbb{R}^h h t ∈ R h 表示时间步t t t 的隐状态。
解码器 接收编码器的隐状态(解码器的初始隐状态通常是编码器最后一个时间步的隐状态,也可以是全部隐状态的函数c = q ( h 1 , . . . , h T ) c=q(h_1,...,h_T) c = q ( h 1 , ... , h T ) ),并生成目标序列y 1 , y 2 , . . . , y T ′ {y_1, y_2, ..., y_{T'}} y 1 , y 2 , ... , y T ′ ,其中y t ∈ R d y_t \in \mathbb{R}^d y t ∈ R d 表示时间步t t t 的输出向量。
输出序列 Y = y 1 , y 2 , . . . , y T ′ = Decoder ( H ) Y = {y_1, y_2, ..., y_{T'}} = \text{Decoder}(H) Y = y 1 , y 2 , ... , y T ′ = Decoder ( H ) ,其中T ′ T' T ′ 是输出序列的长度。
图中右侧的输入 指的是解码器在每个时间步接收的前一时间步的输出y t − 1 y_{t-1} y t − 1 。
7. seq2seq
eos表示序列结束词元,一旦输出序列生成此词元,模型就会停止预测。 bos表示序列开始词元,它是解码器的输入序列的第一个词元。
遵循编码器-解码器架构的设计原则,循环神经网络编码器 使用长度可变的序列作为输入,将其转换为固定形状的隐状态 。换言之,输入序列的信息被编码到循环神经网络编码器的隐状态中。
为了连续生成输出序列的词元,独立的循环神经网络解码器 是基于输入序列的编码信息和输出序列已经看见的或者生成的词元来预测下一个词元。可以使用循环神经网络编码器最终的隐状态来初始化 解码器的隐状态,也可以让编码器最终的隐状态在每一个时间步 都作为解码器的输入序列的一部分。
训练时解码器的输入是已知序列(强制教学teacher forcing),而预测时解码器的输入是模型生成的上一步输出。
在预测时,如果每次选择概率最大的词元,那么模型可能会陷入重复 或循环 的输出序列中,并且贪心本来就不能保证概率最大化。为了解决这个问题,可以使用束搜索 beam search,它在每个时间步都会保留k k k (束宽)个当前概率最大的备选输出序列,直到生成了eos词元。贪心搜索可以束宽为1的束搜索。
8.4. 注意力机制
分为:
由于突出性的非自主性 提示,如全连接层、汇聚层。
依赖于任务的意志提示,即自主性 提示,这将注意力机制与全连接层或汇聚层区别开来。
自主性提示被称为查询query。给定任何查询,注意力机制通过注意力汇聚attention pooling将选择引导至感官输入sensory inputs(例如中间特征表示)。在注意力机制中,这些感官输入被称为值value。更通俗的解释,每个值都与一个键key配对,这可以想象为感官输入的非自主提示:
1. 非参数注意力汇聚 Nadaraya-Watson核回归
f ( x ) = ∑ i = 1 n K ( x − x i ) ∑ j = 1 n K ( x − x j ) y i = ∑ i = 1 n α ( x , x i ) y i f(x)=\sum_{i=1}^n\frac{K(x-x_i)}{\sum_{j=1}^nK(x-x_j)}y_i=\sum_{i=1}^n\alpha(x,x_i)y_i f ( x ) = i = 1 ∑ n ∑ j = 1 n K ( x − x j ) K ( x − x i ) y i = i = 1 ∑ n α ( x , x i ) y i 式中,K K K 是核函数,α \alpha α 是注意力权重(x x x 和x i x_i x i 的相似度),x x x 是查询,( x i , y i ) (x_i,y_i) ( x i , y i ) 是键值对。查询x x x 的输出是值y i y_i y i 的加权和。
将高斯核K ( u ) = 1 2 π exp ( − u 2 2 ) K(u)=\frac1{\sqrt{2\pi}}\exp(-\frac{u^2}2) K ( u ) = 2 π 1 exp ( − 2 u 2 ) 代入可得:
f ( x ) = ∑ i = 1 n exp ( − ( x − x i ) 2 2 ) ∑ j = 1 n exp ( − ( x − x j ) 2 2 ) y i = ∑ i = 1 n softmax ( − 1 2 ( x − x i ) 2 ) y i \begin{aligned}
f(x)&=\sum_{i=1}^n\frac{\exp(-\frac{(x-x_i)^2}2)}{\sum_{j=1}^n\exp(-\frac{(x-x_j)^2}2)}y_i\\
&=\sum_{i=1}^n\text{softmax}\left(-\frac12(x-x_i)^2\right)y_i\end{aligned} f ( x ) = i = 1 ∑ n ∑ j = 1 n exp ( − 2 ( x − x j ) 2 ) exp ( − 2 ( x − x i ) 2 ) y i = i = 1 ∑ n softmax ( − 2 1 ( x − x i ) 2 ) y i
2. 带参数注意力汇聚
以高斯核为例,带参数的注意力汇聚的计算公式如下:
f ( x ) = ∑ i = 1 n softmax ( − 1 2 ( ( x − x i ) w ) 2 ) y i f(x)=\sum_{i=1}^n\text{softmax}\left(-\frac12\left((x-x_i)w\right)^2\right)y_i f ( x ) = i = 1 ∑ n softmax ( − 2 1 ( ( x − x i ) w ) 2 ) y i
为了与q , k , v q,k,v q , k , v 对应,将其改写为:
f ( q ) = ∑ i = 1 n softmax ( − 1 2 ( ( q − k i ) w ) 2 ) v i f(q)=\sum_{i=1}^n\text{softmax}\left(-\frac12\left((q-k_i)w\right)^2\right)v_i f ( q ) = i = 1 ∑ n softmax ( − 2 1 ( ( q − k i ) w ) 2 ) v i
3. 注意力评分函数
注意力评分函数 就是计算查询和键之间的相似度的函数。比如上文的− 1 2 ( ( q − k i ) w ) 2 -\frac12\left((q-k_i)w\right)^2 − 2 1 ( ( q − k i ) w ) 2 就是一个评分函数a ( q , k ) a(q,k) a ( q , k ) 。注意力权重α \alpha α 是由注意力评分函数a ( q , k ) a(q,k) a ( q , k ) 通过softmax操作得到的:
α ( q , k i ) = softmax ( a ( q , k i ) ) = exp ( a ( q , k i ) ) ∑ j = 1 n exp ( a ( q , k j ) ) \alpha(q,k_i)=\text{softmax}(a(q,k_i))=\frac{\exp(a(q,k_i))}{\sum_{j=1}^n\exp(a(q,k_j))} α ( q , k i ) = softmax ( a ( q , k i )) = ∑ j = 1 n exp ( a ( q , k j )) exp ( a ( q , k i ))
常用的评分函数有:
点积评分函数:a ( q , k ) = q ⊤ k a(q,k)=q^\top k a ( q , k ) = q ⊤ k
加性评分函数:a ( q , k ) = v ⊤ tanh ( W q q + W k k ) a(q,k)=v^\top\tanh(W_qq+W_kk) a ( q , k ) = v ⊤ tanh ( W q q + W k k )
缩放点积评分函数:a ( q , k ) = q ⊤ k d a(q,k)=\frac{q^\top k}{\sqrt{d}} a ( q , k ) = d q ⊤ k ,其中d d d 是查询和键的维度。
给定查询q ∈ R n × d q q\in\mathbb{R}^{n\times d_q} q ∈ R n × d q 、键k ∈ R m × d k k\in\mathbb{R}^{m\times d_k} k ∈ R m × d k 和值v ∈ R m × d v v\in\mathbb{R}^{m\times d_v} v ∈ R m × d v ,输出o ∈ R n × d o o\in\mathbb{R}^{n\times d_o} o ∈ R n × d o 的计算公式如下:
o = softmax ( q k ⊤ d k ) v o=\text{softmax}\left(\frac{qk^\top}{\sqrt{d_k}}\right)v o = softmax ( d k q k ⊤ ) v
在多头注意力机制中,我们可以计算h h h 个不同的输出o i o_i o i ,并将它们连接在一起并通过另一个线性变换得到最终的输出。具体来说,给定查询q ∈ R n × d q q\in\mathbb{R}^{n\times d_q} q ∈ R n × d q 、键k ∈ R m × d k k\in\mathbb{R}^{m\times d_k} k ∈ R m × d k 和值v ∈ R m × d v v\in\mathbb{R}^{m\times d_v} v ∈ R m × d v ,输出o ∈ R n × h × d o o\in\mathbb{R}^{n\times h\times d_o} o ∈ R n × h × d o 的计算公式如下:
o i = softmax ( q W i Q ( k W i K ) ⊤ d k ) W i V o_i=\text{softmax}\left(\frac{qW_i^Q(kW_i^K)^\top}{\sqrt{d_k}}\right)W_i^V o i = softmax ( d k q W i Q ( k W i K ) ⊤ ) W i V
其中W i Q ∈ R d q × d k , W i K ∈ R d q × d k , W i V ∈ R d q × d v W_i^Q\in\mathbb{R}^{d_q\times d_k},W_i^K\in\mathbb{R}^{d_q\times d_k},W_i^V\in\mathbb{R}^{d_q\times d_v} W i Q ∈ R d q × d k , W i K ∈ R d q × d k , W i V ∈ R d q × d v 是第i i i 个注意力头的权重参数。最终的输出o ∈ R n × h × d o o\in\mathbb{R}^{n\times h\times d_o} o ∈ R n × h × d o 是h h h 个头的输出连接在一起并通过另一个线性变换得到的。
9. 我的一些想法
1. 象形字->embedding
使用汉字的象形字图片转化为其embedding。