爆火GPT - 聊聊transformer

聊聊语言模型transformer

通常语言模型是用来预测一段文本序列的下一个词或句子的概率分布的模型。计算概率是语言模型的核心任务之一,因为语言模型需要根据历史文本序列来预测下一个词的概率。通过计算每个可能的下一个词的概率,语言模型可以选择最可能的词作为预测结果。计算概率密切相关的是词嵌入(embedding)技术。词嵌入是将词语映射到低维稠密向量空间的技术,可以将词语之间的语义和语法信息编码为向量表示。在语言模型中,词嵌入可以帮助模型更好地理解词语之间的关系,从而提高模型的预测准确性。

Transformer是一种基于注意力机制的深度学习模型,最初由Google提出用于自然语言处理任务。它在处理序列数据时表现出色,特别适用于机器翻译、文本生成和语言建模等任务。Transformer模型的核心是自注意力机制(self-attention),它能够在输入语言序列中的每个位置上计算注意力权重,从而捕捉输入序列中不同位置之间的依赖关系。


详细介绍transformer的模型结构

Transformer是一种基于注意力机制的深度学习模型。Transformer模型结构主要包括编码器(Encoder)和解码器(Decoder)两部分。而编码器喝解码器都是包涵多个相同的层。Encoder的输出是一个包含输入序列信息的上下文向量,Decoder的输出的也是一个包含输出序列信息的上下文向量。

编码器(Encoder): 编码器由多个相同的层堆叠而成,每个层包括两个子层:

多头自注意力机制(Multi-Head Self-Attention):通过计算输入序列中每个位置的注意力权重,使模型能够关注输入序列中不同位置之间的依赖关系。

前馈神经网络(Feed-Forward Neural Network):对每个位置的隐藏表示进行线性变换和激活函数处理,从而学习位置之间的非线性关系。


解码器(Decoder): 解码器也由多个相同的层堆叠而成,每个层包括三个子层:

多头自注意力机制(Multi-Head Self-Attention):与编码器中的自注意力机制类似,但在解码器中需要避免未来信息泄露,因此在计算注意力权重时需要屏蔽未来位置的信息。

编码器-解码器注意力机制(Encoder-Decoder Attention):将编码器的输出作为查询向量,解码器的自注意力输出作为键值对,计算解码器每个位置对编码器输出的注意力权重。

前馈神经网络(Feed-Forward Neural Network):与编码器中的前馈神经网络相同。

在训练过程中,Transformer模型通过最小化损失函数(如交叉熵损失)来优化模型参数,使模型能够更好地学习输入序列和输出序列之间的对应关系。在推理过程中,解码器通过贪婪搜索或束搜索等方法生成输出序列。

总的来说,Transformer模型结构的创新之处在于引入了自注意力机制和位置编码,使得模型能够更好地处理长距离依赖关系和位置信息,从而在自然语言处理任务中取得了很好的效果。

自注意力的计算详情大家可以参考我附在后面的论文地址。我们show一些code来实践以下模型。这段代码实现了一个简单的情感分类任务,使用了一个包含两个Transformer block的Transformer模型。代码架构设计模型在训练集上进行了训练,并在测试集上进行了评估。

# code using pytorch

import torch

import torch.nn as nn

import torch.optim as optim

import torchtext

from torchtext.data.utils import get_tokenizer

from torchtext.vocab import build_vocab_from_iterator

from torchtext.datasets import AG_NEWS

from torchtext.data.utils import get_tokenizer

from torchtext.vocab import Vocab

from torchtext.data.functional import to_map_style_dataset

# 定义Transformer block

class TransformerBlock(nn.Module):

    def __init__(self, input_dim, hidden_dim, num_heads, feedforward_dim, dropout):

        super(TransformerBlock, self).__init__()

        self.attention = nn.MultiheadAttention(input_dim, num_heads, dropout=dropout)

        self.norm1 = nn.LayerNorm(input_dim)

        self.feedforward = nn.Sequential(

            nn.Linear(input_dim, feedforward_dim),

            nn.ReLU(),

            nn.Linear(feedforward_dim, input_dim)

        )

        self.norm2 = nn.LayerNorm(input_dim)

        self.dropout = nn.Dropout(dropout)

    def forward(self, x):

        x = x + self.dropout(self.attention(x, x, x)[0])

        x = self.norm1(x)

        x = x + self.dropout(self.feedforward(x))

        x = self.norm2(x)

        return x

# 定义Transformer模型

class Transformer(nn.Module):

    def __init__(self, vocab_size, embedding_dim, num_classes, num_layers, hidden_dim, num_heads, feedforward_dim, dropout):

        super(Transformer, self).__init__()

        self.embedding = nn.Embedding(vocab_size, embedding_dim)

        self.transformer_blocks = nn.ModuleList([

            TransformerBlock(embedding_dim, hidden_dim, num_heads, feedforward_dim, dropout) for _ in range(num_layers)

        ])

        self.fc = nn.Linear(embedding_dim, num_classes)

    def forward(self, x):

        x = self.embedding(x)

        for transformer_block in self.transformer_blocks:

            x = transformer_block(x)

        x = x.mean(dim=1)

        x = self.fc(x)

        return x

# 数据预处理

tokenizer = get_tokenizer("basic_english")

train_iter = AG_NEWS(split='train')

vocab = build_vocab_from_iterator(map(tokenizer, train_iter), specials=["<unk>"])

vocab.set_default_index(vocab["<unk>"])

def collate_batch(batch):

    label = torch.tensor([entry[0] for entry in batch])

    text = [entry[1] for entry in batch]

    text = [torch.tensor([vocab[token] for token in tokenizer(entry)]) for entry in text]

    text = nn.utils.rnn.pad_sequence(text, padding_value=vocab["<pad>"])

    return label, text

train_iter = AG_NEWS(split='train')

train_dataset = to_map_style_dataset(train_iter)

train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True, collate_fn=collate_batch)

# 训练模型

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model = Transformer(len(vocab), 128, 4, 2, 256, 8, 512, 0.1).to(device)

criterion = nn.CrossEntropyLoss()

optimizer = optim.Adam(model.parameters(), lr=0.001)

for epoch in range(5):

    model.train()

    for i, (label, text) in enumerate(train_dataloader):

        label, text = label.to(device), text.to(device)

        optimizer.zero_grad()

        output = model(text)

        loss = criterion(output, label)

        loss.backward()

        optimizer.step()

        if i % 100 == 0:

            print(f"Epoch {epoch}, Iteration {i}, Loss: {loss.item()}")

# 测试模型

test_iter = AG_NEWS(split='test')

test_dataset = to_map_style_dataset(test_iter)

test_dataloader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False, collate_fn=collate_batch)

model.eval()

correct = 0

total = 0

with torch.no_grad():

    for label, text in test_dataloader:

        label, text = label.to(device), text.to(device)

        output = model(text)

        _, predicted = torch.max(output, 1)

        total += label.size(0)

        correct += (predicted == label).sum().item()

print(f"Accuracy: {100 * correct / total}%")



推荐几个link

尝试:http://boxes.box.devops-link.online/similarities

Transformer官方论文:https://arxiv.org/abs/1706.03762

Transformer代码实现:https://github.com/tensorflow/tensor2tensor

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容