关于Position Encoding 的理解
2024-10-20 18:55:13
encoding
Sinusoidal Position Encoding
\[\begin{aligned}
P E_{(p o s, 2 i)} &=\sin \left(\frac{p o s}{10000^{\frac{2 i}{d_{\text {model}}}}}\right) \\
P E_{(p o s, 2 i+1)} &=\cos \left(\frac{p o s}{10000^{\frac{2 i}{d_{\text {model}}}}}\right)
\end{aligned}
\]
P E_{(p o s, 2 i)} &=\sin \left(\frac{p o s}{10000^{\frac{2 i}{d_{\text {model}}}}}\right) \\
P E_{(p o s, 2 i+1)} &=\cos \left(\frac{p o s}{10000^{\frac{2 i}{d_{\text {model}}}}}\right)
\end{aligned}
\]
pos + k 位置的encoding可以通过pos位置的encoding线性表示。它们的关系可以通过三角函数公式体现:
\[\begin{array}{l}
\sin (\alpha+\beta)=\sin \alpha \cdot \cos \beta+\cos \alpha \cdot \sin \beta \\
\cos (\alpha+\beta)=\cos \alpha \cdot \cos \beta-\sin \alpha \cdot \sin \beta
\end{array}
\]
\sin (\alpha+\beta)=\sin \alpha \cdot \cos \beta+\cos \alpha \cdot \sin \beta \\
\cos (\alpha+\beta)=\cos \alpha \cdot \cos \beta-\sin \alpha \cdot \sin \beta
\end{array}
\]
位置为 pos + k 的positional encoding 可以表示如下:
\[\begin{array}{l}
P E_{(p o s+k, 2 i)}=\sin \left(w_{i} \cdot(p o s+k)\right)=\sin \left(w_{i} p o s\right) \cos \left(w_{i} k\right)+\cos \left(w_{i} p o s\right) \sin \left(w_{i} k\right) \\
P E_{(p o s+k, 2 i+1)}=\cos \left(w_{i} \cdot(p o s+k)\right)=\cos \left(w_{i} p o s\right) \cos \left(w_{i} k\right)-\sin \left(w_{i} p o s\right) \sin \left(w_{i} k\right)
\end{array} \\
w_{i}=\frac{1}{10000^{2 i / d_{\text {model}}}}
\]
P E_{(p o s+k, 2 i)}=\sin \left(w_{i} \cdot(p o s+k)\right)=\sin \left(w_{i} p o s\right) \cos \left(w_{i} k\right)+\cos \left(w_{i} p o s\right) \sin \left(w_{i} k\right) \\
P E_{(p o s+k, 2 i+1)}=\cos \left(w_{i} \cdot(p o s+k)\right)=\cos \left(w_{i} p o s\right) \cos \left(w_{i} k\right)-\sin \left(w_{i} p o s\right) \sin \left(w_{i} k\right)
\end{array} \\
w_{i}=\frac{1}{10000^{2 i / d_{\text {model}}}}
\]
化简如下:
\[\begin{aligned}
P E_{(p o s+k, 2 i)} &=\cos \left(w_{i} k\right) P E_{(p o s, 2 i)}+\sin \left(w_{i} k\right) P E_{(p o s, 2 i+1)} \\
P E_{(p o s+k, 2 i+1)} &\left.=\cos \left(w_{i} k\right) P E_{(p o s, 2 i+1)}-\sin \left(w_{i} k\right) P E_{(p o s, 2 i)}\right)
\end{aligned}
\]
P E_{(p o s+k, 2 i)} &=\cos \left(w_{i} k\right) P E_{(p o s, 2 i)}+\sin \left(w_{i} k\right) P E_{(p o s, 2 i+1)} \\
P E_{(p o s+k, 2 i+1)} &\left.=\cos \left(w_{i} k\right) P E_{(p o s, 2 i+1)}-\sin \left(w_{i} k\right) P E_{(p o s, 2 i)}\right)
\end{aligned}
\]
其中与k相关的项都是常数,所以 \(PE_{pos+k}\) 可以被 \(PE_{pos}\) 线性表示。
由于
\[P E_{(p o s, 2 i)} =\sin \left(pos \cdot \frac{1}{10000^{\frac{2 i}{d_{\text {model}}}}}\right) \\
T = 2 \pi \cdot 10000^{\frac{2i}{d_model}}
\]
T = 2 \pi \cdot 10000^{\frac{2i}{d_model}}
\]
所以i越大,周期就越大。周期的范围从 \(2 \pi\) 到 \(2 \pi \cdot 10000\)
Bert 中的 positional encoding
源码:
class BertEmbeddings(nn.Module):
def __init__(self, config):
super().__init__()
self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id) # (vocab_size, hidden_size)
self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size) # (512, hidden_size)
self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size) # (2, hidden_size)
# self.LayerNorm is not snake-cased to stick with TensorFlow model variable name and be able to load
# any TensorFlow checkpoint file
self.LayerNorm = BertLayerNorm(config.hidden_size, eps=config.layer_norm_eps)
self.dropout = nn.Dropout(config.hidden_dropout_prob)
Bert 中的embedding是用三个embedding加起来的, positional encoding 也没有采用transformer中的三角函数,而是通过Embedding层训练得到。
最新文章
- Basic Tutorials of Redis(7) -Publish and Subscribe
- Android -- 时间轴(ListView)
- 火狐和ie下获取javascript 获取event
- 使用tomcat的jndi方式连接mysql的字符编码设置
- 人人API 分享到人人功能 修改版
- UE4中的集合:TSet容器
- (三)设置mysql允许外部IP连接的解决方法及遇到的坑说明
- 基于Python3的漏洞检测工具 ( Python3 插件式框架 )
- Testing - 软件测试知识梳理 - 测试用例
- java多线程系列六、线程池
- ActiveReports 报表控件V12新特性 -- 新增矩表的RepeatToFill属性
- slf4j和log4j源代码解析以及详解
- ACM2647拓扑排序逆运算
- AC日记——红色的幻想乡 洛谷 P3801
- Chromium学习笔记
- C#范型实例化对象
- Java -- 利用反射 操作任意数组,包括对象数组 和 基本数据类型的数组
- 详细解析ASP.NET中Request接收参数乱码原理
- 1.4 如何防止sql注入
- BZOJ 1634 [Usaco2007 Jan]Protecting the Flowers 护花:贪心【局部分析法】
热门文章
- Java-文件File简单实用
- APT 安装 MySQL 提示错误:dpkg: error: dpkg frontend lock is locked by another process
- 四连测总结(XYX)
- KingbaseES 与Oracle 函数稳定性对于性能影响差异比较
- Java访问Scala中的Int类型
- day37-IO流04
- Windows LDAP加固之替换LDAP加密证书
- 微信小程序-坑,wxml里wx:if 判断 数字 是否在一个数组中。
- MySQL数据库中配置文件 read_only 参数的有关说明
- Elasticsearch:Java 运用示例