“
Transformer是大模型GPT的核心,GPT中的T指的就是Transformer。
Transformer究竟有什么神奇的魔法,能诞生GPT这样伟大的通用人工智能?
下面和大家一起一探究竟~ 文末有惊喜哈~
Transformer模型主要由编码器(Encoder)和解码器(Decoder)组成,每部分包含多个相同的层。
编码器负责将输入序列转换为抽象的特征表示,而解码器则根据编码器的输出和已生成的部分目标序列,逐步生成完整的输出序列。
(一)编码器
编码器由多个相同的编码层堆叠而成,每一层包含两个主要的子层:多头自注意力层和前馈神经网络。
此外,每个子层后接有残差连接和层归一化,以增强模型的训练稳定性和信息流动。
(二)解码器
解码器也由多个解码层组成,每个解码层包含三大子层:掩码多头自注意力层、编码器-解码器多头注意力层和前馈神经网络。
掩码多头自注意力机制确保解码器在生成每个词时只能关注当前词及之前的词,避免看到未来信息。编码器-解码器多头注意力则让解码器能够访问编码器的输出,从而生成与输入序列相关的输出。
(一)自注意力机制
自注意力机制是Transformer的核心,其目的是让每个位置的词关注序列中的其他词,以捕捉全局依赖关系。
具体步骤如下:
线性变换:通过线性变换生成查询矩阵(Query)、键矩阵(Key)和值矩阵(Value)。
计算注意力权重:使用点积计算查询和键之间的相似度,然后进行缩放处理,以避免数值过大。缩放因子通常为键矩阵维度的平方根。
归一化注意力得分:对注意力得分矩阵应用Softmax函数,将其转换为注意力权重。
计算加权值表示:将注意力权重应用于值矩阵,得到自注意力层的输出。
**注意力计算公式****
这里, 是键矩阵 的维度。
(二)多头注意力机制
多头自注意力机制通过多个并行的注意力头在不同的子空间中学习不同的关系模式,从而丰富模型的表达能力。
具体而言,输入被分成多个头,每个头独立进行注意力计算,然后将所有头的输出拼接起来,并通过一个线性变换进行整合。
假设有 个头,每个头的维度为 :
每个头独立计算注意力:
将所有头的输出拼接起来:
其中 是可训练的投影矩阵。
(三)位置编码
由于Transformer模型没有RNN的顺序结构,无法直接捕捉序列中的位置信息,因此需要额外添加位置编码来提供位置信息。
计算位置编码PE,对于输入位置 和维度 :
(四)前馈神经网络
在每个编码器和解码器层中,多头自注意力层的输出会通过一个全连接的前馈神经网络(也叫多层感知机MLPs)进一步处理。MLPs 通常采用ReLU作为激活函数,捕获输入数据中的复杂模式。
****MLPs在Transformer中的作用******
**
**
(五)残差连接和层归一化
每个子层(多头注意力和前馈网络)之后都添加了残差连接和层归一化。残差连接将输入直接与子层输出相加,以跳跃式传递信息,缓解深层网络的梯度消失问题。层归一化则稳定数据分布,使模型更容易训练。
下面把Transformer基本的框架和一些关键代码分享给大家。
首先,导入必要的库和数据集。
这里使用的情感分析的IMDB电影评论数据集。
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
df = pd.read_csv('IMDB Dataset.csv')
# 数据预处理
df['text'] = df['review'].str.lower() # 将文本转换为小写
df['text'] = df['text'].str.replace('
', ' ') # 清洗HTML标签
# 划分训练集和测试集
train_texts, val_texts, train_labels, val_labels = train_test_split(df['text'], df['sentiment'], test_size=0.2, random_state=42)
数据处理
在Transformer模型中,文本数据需要转换为数字序列。这里使用Tokenizer来进行文本向量化。
# 设定参数
max_len = 200 # 句子的最大长度
vocab_size = 10000 # 词汇表的大小
embedding_dim = 128 # 词嵌入的维度
# 实例化和拟合Tokenizer
tokenizer = Tokenizer(num_words=vocab_size, oov_token='')
tokenizer.fit_on_texts(train_texts)
# 序列化文本
train_sequences = tokenizer.texts_to_sequences(train_texts)
val_sequences = tokenizer.texts_to_sequences(val_texts)
# 填充序列
train_padded = pad_sequences(train_sequences, maxlen=max_len, padding='post', truncating='post')
val_padded = pad_sequences(val_sequences, maxlen=max_len, padding='post', truncating='post')
构建Transformer模型
以下是一个简化的Transformer模型示例,包含Self-Attention层、Feedforward层和残差连接。
from tensorflow.keras.layers import Input, Dense, Embedding, GlobalAveragePooling1D, Dropout
from tensorflow.keras.layers import LayerNormalization, MultiHeadAttention, Dense, GlobalAveragePooling1D
from tensorflow.keras.models import Model
class MultiHeadSelfAttention(tf.keras.layers.Layer):
def __init__(self, embed_dim, num_heads=8):
super(MultiHeadSelfAttention, self).__init__()
self.embed_dim = embed_dim
self.num_heads = num_heads
self.head_dim = embed_dim // num_heads
assert embed_dim % num_heads == 0
self.query_dense = Dense(embed_dim)
self.key_dense = Dense(embed_dim)
self.value_dense = Dense(embed_dim)
self.combine_heads = Dense(embed_dim)
def call(self, inputs):
query = self.query_dense(inputs)
key = self.key_dense(inputs)
value = self.value_dense(inputs)
query = self.split_heads(query)
key = self.split_heads(key)
value = self.split_heads(value)
scaled_attention = self.self_attention(query, key, value)
scaled_attention = tf.transpose(scaled_attention, perm=[0, 2, 1, 3])
original_shape = tf.shape(scaled_attention)
scaled_attention = tf.reshape(scaled_attention,
(original_shape[0], original_shape[1], self.embed_dim))
outputs = self.combine_heads(scaled_attention)
return outputs
def split_heads(self, x):
batch_size = tf.shape(x)[0]
x = tf.reshape(x, (batch_size, -1, self.num_heads, self.head_dim))
return tf.transpose(x, perm=[0, 2, 1, 3])
def self_attention(self, query, key, value):
matmul_qk = tf.matmul(query, key, transpose_b=True)
depth = tf.cast(tf.shape(key)[-1], tf.float32)
logits = matmul_qk / tf.math.sqrt(depth)
attention_weights = tf.nn.softmax(logits, axis=-1)
output = tf.matmul(attention_weights, value)
return output
class TransformerBlock(tf.keras.layers.Layer):
def __init__(self, embed_dim, num_heads, ff_dim, rate=0.1):
super(TransformerBlock, self).__init__()
self.att = MultiHeadSelfAttention(embed_dim, num_heads)
self.ffn = tf.keras.Sequential([
Dense(ff_dim, activation='relu'),
Dense(embed_dim)
])
self.layernorm1 = LayerNormalization(epsilon=1e-6)
self.layernorm2 = LayerNormalization(epsilon=1e-6)
self.dropout1 = Dropout(rate)
self.dropout2 = Dropout(rate)
def call(self, inputs, training=None):
attn_output = self.att(inputs)
attn_output = self.dropout1(attn_output, training=training)
out1 = self.layernorm1(inputs + attn_output)
ffn_output = self.ffn(out1)
ffn_output = self.dropout2(ffn_output, training=training)
return self.layernorm2(out1 + ffn_output)
# 构建Transformer模型
embed_dim = embedding_dim
num_heads = 8
ff_dim = 128
inputs = Input(shape=(max_len,))
embedding_layer = Embedding(vocab_size, embed_dim)(inputs)
transformer_block = TransformerBlock(embed_dim, num_heads, ff_dim)(embedding_layer)
pooling_layer = GlobalAveragePooling1D()(transformer_block)
outputs = Dense(1, activation='sigmoid')(pooling_layer)
model = Model(inputs=inputs, outputs=outputs)
训练和评估模型
import tensorflow as tf
from tensorflow.keras.callbacks import ModelCheckpoint
# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 定义回调函数
callbacks = [
tf.keras.callbacks.EarlyStopping(patience=3, monitor='val_loss'),
ModelCheckpoint('./transformer_model.weights.h5', save_best_only=True, save_weights_only=True)
]
# 训练模型时使用这些回调函数
history = model.fit(train_padded, train_labels, epochs=20, batch_size=32,
validation_data=(val_padded, val_labels), callbacks=callbacks)
# 评估模型
model.evaluate(val_padded, val_labels)
可视化训练过程
import matplotlib.pyplot as plt
# 绘制训练 & 验证的准确率值
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper left')
plt.show()
# 绘制训练 & 验证的损失值
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper left')
plt.show()
上面构建了一个简单的Transformer模型,并用IMDB数据集进行了文本分类。
大家可以根据实际需要进行进一步的调整和优化,比如调整超参数、增加层数、使用更复杂的数据集等等。
今天贴心为大家准备好了一系列AI大模型资源,包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
有需要的小伙伴,可以点击下方链接免费领取【保证100%免费
】
点击领取 《AI大模型&人工智能&入门进阶学习资源包》
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
(都打包成一块的了,不能一一展开,总共300多集)
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
学会后的收获:
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码或者点击以下链接都可以免费领取【保证100%免费】
点击领取 《AI大模型&人工智能&入门进阶学习资源包》