|
|
|
@ -281,9 +281,19 @@ tensor([-0.0288, -0.2724, -0.3007, 0.4584, -0.1438, 0.3389, -0.0454, -0.4382,
|
|
|
|
|
|
|
|
|
|
Transformer模型中的embedding层虽然只有一个模块,但它是通过整个模型的训练过程中与其他层一起学习和优化的。
|
|
|
|
|
|
|
|
|
|
在GPT这样的Transformer模型中,Token Embedding并没有使用一个单独的算法来形成,而是作为模型的初始参数随机初始化,然后在整个模型的训练过程中与其他参数一起学习和调整。这个过程涉及到将输入token转换为高维向量,并通过模型的自注意力和前馈网络层来不断优化这些向量,以便它们能够更好地捕捉和表示输入数据的语义特征。
|
|
|
|
|
> embedding的更新方法跟后面的神经网络是类似的(具体方法不同)。可以理解为更新w权重,想提前了解的点击跳转[神经网络demo](https://github.com/ben1234560/AiLearning-Theory-Applying/blob/master/%E4%BA%BA%E4%BA%BA%E9%83%BD%E8%83%BD%E7%9C%8B%E6%87%82%E7%9A%84Transformer/%E7%AC%AC%E4%B8%83%E7%AB%A0%E2%80%94%E2%80%94%E5%89%8D%E9%A6%88%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C.md#%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9Cdemo)
|
|
|
|
|
|
|
|
|
|
为了演示,我这里提供一个非常简化的模型过程(简化了一些位置编码等):
|
|
|
|
|
### GPT源码详解embedding
|
|
|
|
|
|
|
|
|
|
在GPT这样的Transformer模型中,Token Embedding并没有使用一个单独的算法来形成,而是作为模型的初始参数随机初始化,然后在整个模型的训练过程中与其他参数一起学习和调整。这个过程涉及到将输入token转换为高维向量,并通过模型的自注意力和前馈网络层来不断优化这些向量,以便它们能够更好地捕捉和表示输入数据的语义特征。源码如下:
|
|
|
|
|
|
|
|
|
|
~~~python
|
|
|
|
|
# wte(词嵌入,即embedding),可以看到random_normal_initializer,它是随机初始化的
|
|
|
|
|
wte = tf.get_variable('wte', [hparams.n_vocab, hparams.n_embd],
|
|
|
|
|
initializer=tf.random_normal_initializer(stddev=0.02))
|
|
|
|
|
~~~
|
|
|
|
|
|
|
|
|
|
但源码中没有提供embedding更新的部分,为了演示,我这里提供一个非常简化的模型过程(简化了一些位置编码等),反向传播更新的部分`optimizer.step()`:
|
|
|
|
|
|
|
|
|
|
~~~python
|
|
|
|
|
import torch
|
|
|
|
@ -324,7 +334,7 @@ for epoch in range(100): # 假设训练100个epoch
|
|
|
|
|
# 反向传播
|
|
|
|
|
optimizer.zero_grad()
|
|
|
|
|
loss.backward()
|
|
|
|
|
# 梯度下降
|
|
|
|
|
# 梯度下降,根据loss值去更新模型的参数,里面则包括embeddings
|
|
|
|
|
optimizer.step()
|
|
|
|
|
# 打印损失
|
|
|
|
|
if (epoch + 1) % 10 == 0:
|
|
|
|
|