Deep learning: autoencoders and sparsity

背景

      稀疏模式自动编码是深度学习神经网络的一个拓展,也是深度学习常见的一个理论。学习稀疏模式自动编码首先需要了解神经网络的背景知识,包括网络结构,fp和bp。不同于常规的有监督神经网络,稀疏模式自动编码是一种不需要标记样本的算法,在算法中样本的标记设为其自身, y(i)=x(i)。换句话说,该算法尝试通过学习网络参数,使得最后的假设h(x)=x。


算法思想

       稀疏模式自动编码的目标在于希望能够通过添加一些限制条件发现网络中一些有趣的东西。这个限制条件可能有两种,第一,网络中隐含层的单元数很小,而且远远小于输入层,那么就需要对输入层做一个压缩,这看起来非常困难的。但是,如果输入的特征值是有关联的,那么就可以通过这些关联性来压缩输入值,这看起来跟PCA有点像。第二,在网络中加一个稀疏性约束。定义 隐含层的激活为:

我们的目标是使得其中 \textstyle \hat\rho_j 是稀疏参数,通常为0.05。可以看出这是一个很小的数,如果要达到这个目标那么隐含层的激活中大多数的神经单元的激活要接近于0。下一步是计算 \textstyle \hat\rho_j 和 \textstyle \rho的距离,该算法用的是KL距离,该距离可以用来度量两个伯努利随机变量的分布,这两个伯努利分布的均值分别为 \textstyle \hat\rho_j 和 \textstyle \rho


KL距离可以通过一下的公式计算

\textstyle \rho=0.2时,KL距离如下图所示,当\textstyle \hat\rho_j\textstyle \rho越近,KL距离越小。


在原来的损失函数的基础上添加一个稀疏惩罚项,损失函数可以表达为:
\textstyle \beta是稀疏惩罚项的权重。那么隐含层的残差可以计算为:



算法求解

最后还是通过梯度下降法求解系数:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个带有sparsity参数的稀疏Transformer的完整代码: ```python import torch import torch.nn as nn import torch.nn.functional as F from torch.autograd import Variable class SparseSelfAttention(nn.Module): def __init__(self, d_model, num_heads, sparsity, dropout=0.1): super(SparseSelfAttention, self).__init__() self.d_model = d_model self.num_heads = num_heads self.sparsity = sparsity self.dropout = nn.Dropout(dropout) assert d_model % num_heads == 0 self.depth = d_model // num_heads self.qkv = nn.Linear(d_model, 3 * d_model) self.proj = nn.Linear(d_model, d_model) self.softmax = nn.Softmax(dim=-1) def forward(self, x, mask=None): batch_size, seq_len, d_model = x.size() qkv = self.qkv(x).view(batch_size, seq_len, 3, self.num_heads, self.depth) qkv = qkv.permute(2, 0, 3, 1, 4) q, k, v = qkv[0], qkv[1], qkv[2] scores = torch.matmul(q, k.transpose(-2, -1)) scores = scores / (self.depth ** 0.5) if mask is not None: scores = scores.masked_fill(mask == 0, -1e9) if self.sparsity > 0: # Calculate sparsity pattern num_sparse_tokens = int(seq_len * self.sparsity) sparse_indices = torch.topk(scores.view(batch_size, self.num_heads, -1), num_sparse_tokens, dim=-1, largest=False)[1] # Create sparse mask mask = torch.ones_like(scores) mask.scatter_(-1, sparse_indices, 0) # Set sparse scores to -inf to exclude them from softmax scores = scores.masked_fill(mask == 0, -1e9) attn = self.softmax(scores) attn = self.dropout(attn) context = torch.matmul(attn, v) context = context.permute(1, 2, 0, 3).contiguous().view(batch_size, seq_len, -1) output = self.proj(context) return output class SparseTransformer(nn.Module): def __init__(self, d_model, num_heads, num_layers, sparsity, dropout=0.1): super(SparseTransformer, self).__init__() self.d_model = d_model self.num_heads = num_heads self.num_layers = num_layers self.sparsity = sparsity self.dropout = nn.Dropout(dropout) self.layers = nn.ModuleList([SparseSelfAttention(d_model, num_heads, sparsity, dropout) for _ in range(num_layers)]) def forward(self, x, mask=None): for layer in self.layers: x = x + layer(x, mask=mask) x = self.dropout(x) return x ``` 上述代码中,在SparseSelfAttention类的初始化函数中增加了一个sparsity参数,用于控制稀疏程度。在forward函数中,当sparsity大于0时,会根据scores计算出一个稀疏模式,然后创建一个稀疏掩码,并将稀疏位置的scores设置为负无穷以排除它们的影响。通过这种方式,可以实现带有稀疏控制的Transformer模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值