任务调节(Task Conditioning)就是GPT-2模型在学习多个任务时如何修改学习目标
总的来说,任务调节是一种技术策略,通过修改语言模型的学习目标,使其能够适应并执行多个任务,而无需为每个任务重新训练一个独立的模型。这有助于提高模型的灵活性和泛化能力。
零样本学习(Zero Shot Learning):
零样本任务迁移(Zero Shot Task Transfer):
GPT-2的零样本任务迁移能力:
示例:
总体而言,GPT-2通过设计输入格式,使模型在没有看到具体任务样本的情况下能够理解任务要求,这展示了其在零样本学习和任务迁移方面的强大能力。
模型层数和词嵌入维度:
更大的词汇表:
更大的批处理大小和上下文窗口:
**这些特征使得GPT-2成为一个非常强大的语言模型,能够处理大规模的语料库,捕捉丰富的语义信息,并生成高质量的文本。**然而,也需要注意到这样的大型模型在训练和推理时需要更多的计算资源。
import numpy as np
import mindspore
from mindspore import nn, ops, Tensor
batch_size = 1
seq_len = 10
embed_dim = 768
x = Tensor(np.random.randn(batch_size, seq_len, embed_dim), mindspore.float32)
from mindnlp._legacy.functional import split
from mindnlp.models.utils.utils import Conv1D
c_attn = Conv1D(3 * embed_dim, embed_dim)
query, key, value = split(c_attn(x), embed_dim, axis=2)
query.shape, key.shape, value.shape
def split_heads(tensor, num_heads, attn_head_size):
"""
Splits hidden_size dim into attn_head_size and num_heads
"""
new_shape = tensor.shape[:-1] + (num_heads, attn_head_size)
tensor = tensor.view(new_shape)
return ops.transpose(tensor, (0, 2, 1, 3)) # (batch, head, seq_length, head_features)
num_heads = 12
head_dim = embed_dim // num_heads
query = split_heads(query, num_heads, head_dim)
key = split_heads(key, num_heads, head_dim)
value = split_heads(value, num_heads, head_dim)
query.shape, key.shape, value.shape
attn_weights = ops.matmul(query, key.swapaxes(-1, -2))
attn_weights.shape
max_positions = seq_len
bias = Tensor(np.tril(np.ones((max_positions, max_positions))).reshape(
(1, 1, max_positions, max_positions)), mindspore.bool_)
bias
from mindnlp._legacy.functional import where, softmax
attn_weights = attn_weights / ops.sqrt(ops.scalar_to_tensor(value.shape[-1]))
query_length, key_length = query.shape[-2], key.shape[-2]
causal_mask = bias[:, :, key_length - query_length: key_length, :key_length].bool()
mask_value = Tensor(np.finfo(np.float32).min, dtype=attn_weights.dtype)
attn_weights = where(causal_mask, attn_weights, mask_value)
np.finfo(np.float32).min
attn_weights[0, 0]
attn_weights = softmax(attn_weights, axis=-1)
attn_weights.shape
attn_weights[0, 0]
attn_output = ops.matmul(attn_weights, value)
attn_output.shape
def merge_heads(tensor, num_heads, attn_head_size):
"""
Merges attn_head_size dim and num_attn_heads dim into hidden_size
"""
tensor = ops.transpose(tensor, (0, 2, 1, 3))
new_shape = tensor.shape[:-2] + (num_heads * attn_head_size,)
return tensor.view(new_shape)
attn_output = merge_heads(attn_output, num_heads, head_dim)
attn_output.shape
c_proj = Conv1D(embed_dim, embed_dim)
attn_output = c_proj(attn_output)
attn_output.shape
github地址(网络不好的可以访问下面我克隆到gitee上的地址):GPT2
gitee地址:GPT2
通过本次学习,熟悉了华为Mindspore这个国产深度学习框架,也对GPT2的基本技术原理有所了解,同时也学会了如何通过微调GPT2完成一个文本生成的任务,还是比较有成就感的!!!另外就是峰哥讲课的互动也比较多,还介绍了许多课程之外的一些知识,让人眼前一亮,受益匪浅!
在启智openI上的npu跑时记得使用mindspore1.7的镜像,同时安装对应mindnlp的版本,不然可能会因为版本不兼容而报错。另外就是微调GPT2完成一个文本生成的练习一定要做,这样能比较get到整个微调的全流程是怎样的,后面再去学习llama等其他大模型的微调时就会更加得心应手。
本次课程中的代码串讲我觉得是做的最好的地方,没有照着ppt一直念,而是在jupyter lab上把代码和原理结合到一块进行讲解,让学习者对代码的理解更加深入。我觉得内容的最后可以稍微推荐一下与Mindspore大模型相关的套件,让学习者在相关套件上可以开发出更多好玩和有趣的东西!
MindSpore昇思的优点和喜欢的方面:
一些建议和改进方面:
大模型的内容还是很多的,希望自己能坚持打卡,将后面的内容都学习完,并做出一些有趣好玩的东西来!