基于PyTorch的Transformer与RandWireNN模型构建
立即解锁
发布时间: 2025-09-05 01:57:03 阅读量: 7 订阅数: 29 AIGC 


精通PyTorch深度学习实战
### 基于PyTorch的Transformer与RandWireNN模型构建
#### 1. Transformer模型详解
##### 1.1 Transformer模型结构
在训练过程中,解码器有两种输入。一方面,它接收来自最终编码器的查询和键向量,作为其(未掩码)多头注意力层的输入,这些查询和键向量是最终编码器输出的矩阵变换。另一方面,解码器接收前一时间步的自身预测结果,作为其掩码多头注意力层的顺序输入。
Transformer模型还包含以下几个重要部分:
- **加法和层归一化**:通过将输入词嵌入向量直接添加到多头注意力层的输出向量来建立残差连接,有助于网络中梯度的顺畅流动,避免梯度爆炸和消失问题,还能帮助跨层高效学习恒等函数。层归一化则独立归一化每个特征,使所有特征具有统一的均值和标准差。
- **前馈层**:序列中所有单词的归一化残差输出向量通过一个公共前馈层,有助于学习序列中的更广泛模式。
- **线性和Softmax层**:线性层将向量序列转换为一个大小等于词汇表长度的单个向量,Softmax层将该输出转换为概率和为1的向量,这些概率表示词汇表中各个单词作为序列中下一个单词出现的概率。
##### 1.2 PyTorch中定义Transformer模型
以下是使用PyTorch定义Transformer模型的代码:
```python
class Transformer(nn.Module):
def __init__(self, num_token, num_inputs, num_heads, num_hidden,
num_layers, dropout=0.3):
self.position_enc = PosEnc(num_inputs, dropout)
layers_enc = TransformerEncoderLayer(
num_inputs, num_heads, num_hidden, dropout)
self.enc_transformer = TransformerEncoder(
layers_enc, num_layers)
self.enc = nn.Embedding(num_token, num_inputs)
self.num_inputs = num_inputs
self.dec = nn.Linear(num_inputs, num_token)
def forward(self, source):
source = self.enc(source) * torch.sqrt(self.num_inputs)
source = self.position_enc(source)
op = self.enc_transformer(source, self.mask_source)
op = self.dec(op)
return op
```
##### 1.3 加载和处理数据集
使用Penn Treebank数据集进行语言建模任务,具体步骤如下:
1. **下载和分词**:使用torchtext下载训练数据集并对其词汇进行分词。
```python
tr_iter = PennTreebank(split='train')
tkzer = get_tokenizer('basic_english')
vocabulary = build_vocab_from_iterator(
map(tkzer, tr_iter), specials=['<unk>'])
vocabulary.set_default_index(vocabulary['<unk>'])
```
2. **数据转换**:将原始文本转换为训练、验证和测试数据集的张量。
```python
def process_data(raw_text):
numericalised_text = [
torch.tensor(vocabulary(tkzer(text)),
dtype=torch.long) for text in raw_text]
return torch.cat(
tuple(filter(lambda t: t.numel() > 0,
numericalised_text)))
tr_iter, val_iter, te_iter = PennTreebank()
training_text = process_data(tr_iter)
validation_text = process_data(val_iter)
testing_text = process_data(te_iter)
```
3. **批量生成**:定义训练和评估的批量大小,并声明批量生成函数。
```python
def gen_batches(text_dataset, batch_size):
num_batches = text_dataset.size(0) // batch_size
text_dataset = text_dataset[:num_batches * batch_size]
text_dataset = text_dataset.view(
batch_size, num_batches).t().contiguous()
return text_dataset.to(device)
training_batch_size = 32
evaluation_batch_size = 16
training_data = gen_batches(training_text, training_batch_size)
```
4. **生成输入序列和目标**:定义最大序列长度,并编写函数为每个批量生成输入序列和输出目标。
```python
max_seq_len = 64
def return_batch(src, k):
sequence_length = min(max_seq_len, len(src) - 1 - k)
sequence_data = src[k:k+sequence_length]
sequence_label = src[k+1:k+1+sequence_length].reshape(-1)
return sequence_data, sequence_label
```
##### 1.4 训练Transformer模型
1. **定义超参数和实例化模型**:
```
```
0
0
复制全文
相关推荐









