CodeByMySelf-RL

所有之前:CodeByMySelf 系列之 RL(深度强化学习)的实现记录,只有标题没有内容的是TODO。 RL强化学习(深度强化学习) TODO

September 24, 2025 · 1 min

CodeByMySelf-Transformer

所有之前:CodeByMySelf 系列之 Transformer 的实现记录,只有标题没有内容的是TODO,针对经典算法的变体和改进算法在其他文章。 Transformer 下面是一个最基本的Transformer实现,主要包含以下几个部分: 基本模块 多头注意力模块 Token和位置嵌入模块 LayerNorm 前馈神经网络FFN $EncoderLayer -> Encoder$ $DecoderLayer -> Decoder$ $Encoder+Decoder -> Transformer$ 多头注意力MHA 多头注意力机制的公式如下: $$ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)W^O $$其中,每一个头的计算分别为: $$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V $$对于图像数据和序列数据,多头注意力机制的实现是不同,但是核心原理是相同的。对于序列数据,每个位置对应一个token;对于图像数据,每个位置对应一个patch块或者一个像素块,如果是$patch$块,需要展开到一维向量。这里实现的为序列数据的多头注意力机制,初始$shape$为$(batch,time,d_model)$ import torch from torch import nn import torch.functional as F import math class MultiHeadAttention(nn.Module): def __init__(self,d_model,n_head): super(MultiHeadAttention, self).__init__() assert d_model % n_head == 0 self.d_model = d_model self.n_head = n_head self.w_k = nn.Linear(d_model,d_model) self.w_q = nn.Linear(d_model,d_model) self.w_v = nn.Linear(d_model,d_model) self.w_conbine = nn.Linear(d_model,d_model,bias=False) # 对应W^O self.softmax = nn.Softmax(dim=-1) def forward(self,q,k,v,mask=None): batch,time,dimension = q.shape() # q,k,v shape: (batch,time,d_model) n_d = self.d_model // self.n_head q,k,v = self.w_q(q),self.w_k(k),self.w_v(v) print(q.shape, batch, time, self.n_head, n_d) q = q.view(batch,time,self.n_head,n_d).transpose(1,2) # self.n_head * n_d = d_model k = k.view(batch,time,self.n_head,n_d).transpose(1,2) # shape: (batch,n_head,time,n_d) v = v.view(batch,time,self.n_head,n_d).transpose(1,2) # compute attention by the formula score = q @ k.transpose(-2,-1) / math.sqrt(n_d) # (batch,n_head,time,time) if mask is not None: score = score.masked_fill(mask==0,float('-inf')) attn = self.softmax(score) @ v # (batch,n_head,time,n_d) attn = attn.transpose(1,2).contiguous().view(batch,time,dimension) # (batch,time,dimension) attn = self.w_conbine(attn) # (batch,time,dimension) return attn d_model = 512 n_head = 8 mha = MultiHeadAttention(d_model,n_head) x = torch.randn(2,10,d_model) y = mha(x,x,x) # self-multi-head-attention print(f"shape: {y.shape}\n输出:{y}") # torch.Size([2, 10, 512]) Token和位置嵌入模块 Token Embedding 是将离散的词(token)转换为连续的向量表示的过程。通常通过查找表(如 nn.Embedding)将每个词的索引映射为一个高维向量,使模型能够处理和学习词之间的语义关系。 公式表示: ...

September 24, 2025 · 5 min

CodeByMySelf-VAE

所有之前:CodeByMySelf 系列之 VAE(变分自编码器)的实现记录,只有标题没有内容的是TODO。 VAE(变分自编码器) VAE也是一个非常经典的生成模型,虽然现在主流已经是Diffusion模型,但是它的原理和思想还是非常有启发性的,尤其是对于理解diffusion中的一些概念(如潜在空间、重参数化技巧等)非常有帮助。 TODO

September 24, 2025 · 1 min

并行训练实践

Accelerate Accelerate 是 Hugging Face 开发的深度学习多卡并行训练库,构建在 torch_xla 和 torch.distributed 之上。它提供了一个简单的 API,将与多 GPU、TPU、混合精度训练相关的样板代码抽离了出来,让用户可以在不同设备上轻松地进行分布式训练和混合精度训练,而无需重复编写大量样板代码。 另外,Accelerate 还提供了很多性能优化的功能,使得大规模训练和推理变得简单、高效且适应性强。 在学习如何使用 Accelerate 之前,首先回顾一下并行训练的其他方法。 DataParallel (DP) DP 是最常见的并行训练方式,通过将数据拆分(split)到各个 workers 中(每个 worker 拥有完整模型)进行并行计算,以解决 Batch Size 过大的问题。因为求导以及加和都是线性的,所以数据并行在数学上是等价的。 DataParallel 是 PyTorch 中最容易实现的并行方案,只需要增加一行代码:model = nn.DataParallel(model)。 代码示例 import torch import torch.nn as nn from torch.utils.data import DataLoader, Dataset # 数据集的长度为 100,batch size 为 32 # 模型是一个简单的 fc 层,输入长度是 5,输出是 2 input_size, output_size = 5, 2 batch_size, data_size = 32, 100 model = Model(input_size, output_size) if torch.cuda.device_count() > 1: print(f"Detected {torch.cuda.device_count()} GPUs!") model = nn.DataParallel(model) device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model.to(device) rand_loader = DataLoader( dataset=RandomDataset(input_size, data_size), batch_size=batch_size, shuffle=True ) for data in rand_loader: input = data.to(device) output = model(input) 在上述代码中,batch_size=32。由于使用了 DataParallel,在有 2 个 GPU 时,一个 batch 被划分成了 2 份,即 tensor.split(16),分别送往两个 GPU。 ...

July 24, 2025 · 2 min