未添加噪声的原代码:
emb = torch.sparse.mm(mat, emb)
emb_list.append(emb)
我们的目标是向矩阵相乘后的结果emb添加随即均匀噪声,并添加到emb_ist中保存。
具体实现如下:
pytorch:
emb = torch.sparse.mm(mat, emb)
random_noise=torch.empty(emb.shape).uniform_().to(self.device)
emb+=torch.mul(torch.sign(emb),torch.nn.functional.normalize(random_noise,p=2,dim=1))* self.eps
emb_list.append(emb)
其中的random_noise就是生成的噪声,self.eps是噪声占比,是一个超参数,可以任意调节,
uniform_代表的是torch中的内置均匀分布函数,参数解释如下:
torch.nn.functional.normalize(input, p=2.0, dim=1, eps=1e-12, out=None)
input: 输入。
shape: 计算p范数。
dim: 计算范数的维度。
eps: 很小的数,防止分母为0。
out: 输出。
Tensorflow:
emb = tf.sparse_tensor_dense_matmul(adj, emb)
random_noise = tf.random.uniform(emb.shape)
emb += tf.multiply(tf.sign(emb),tf.nn.l2_normalize(random_noise, 1)) * self.eps
all_embs.append(emb)
其中的random_noise就是生成的噪声,self.eps是噪声占比,是一个超参数,可以任意调节,uniform代表的是tensorflow中的内置均匀分布函数,其参数解释如下:
random_uniform(
shape,
minval=0,
maxval=None,
dtype=tf.float32,
seed=None,
name=None
)
shape:一维整数张量或 Python 数组.输出张量的形状。
minval:dtype 类型的 0-D 张量或 Python 值;生成的随机值范围的下限;默认为0。
maxval:dtype 类型的 0-D 张量或 Python 值。
要生成的随机值范围的上限。如果 dtype 是浮点,则默认为1 。
dtype:输出的类型:float16、float32、float64、int32、orint64。
seed:一个 Python 整数。用于为分布创建一个随机种子。查看 tf.set_random_seed 行为。
name:操作的名称(可选)。
l2_normalize是functional中的内置L2正则化或者说归一化函数,其中重要的参数是前两个,x是数据张量,axis是指定要在哪一维度上进行归一化,这里axis=1表示在行上操作。
参考链接:
Pytorch/Tensorflow:产生某个范围内均匀分布的随机tensor_道纪书生的博客-CSDN博客_tensorflow 随机tensor