pytorch默认初始化_Pytorch的默认初始化分布 nn.Embedding.weight初始化分布

PyTorch中的nn.Embedding默认使用标准正态分布(均值0,方差1)来初始化weight。通过查看源代码和简单的验证,可以确认weight的初始化分布符合$N(0, 1)$。此外,讨论了torch.Tensor、torch.randn等其他初始化方法。" 78107008,1510383,解决Android UnsatisfiedLinkError崩溃问题,"['Android开发', 'Java.lang.UnsatisfiedLinkError', 'JNI']
摘要由CSDN通过智能技术生成

一、nn.Embedding.weight初始化分布

nn.Embedding.weight随机初始化方式是标准正态分布

 ,即均值$\mu=0$,方差$\sigma=1$的正态分布。

论据1——查看源代码

## class Embedding具体实现(在此只展示部分代码)

import torch

from torch.nn.parameter import Parameter

from .module import Module

from .. import functional as F

class Embedding(Module):

def __init__(self, num_embeddings, embedding_dim, padding_idx=None,

max_norm=None, norm_type=2, scale_grad_by_freq=False,

sparse=False, _weight=None):

if _weight is None:

self.weight = Parameter(torch.Tensor(num_embeddings, embedding_dim))

self.reset_parameters()

else:

assert list(_weight.shape) == [num_embeddings, embedding_dim], \

'Shape of weight does not match num_embeddings and embedding_dim'

self.weight = Parameter(_weight)

def reset_parameters(self):

self.weight.data.normal_(0, 1)

if self.padding_idx is not None:

self.weight.data[self.padding_idx].fill_(0)

Embedding这个类有个属性weight,它是torch.nn.parameter.Parameter类型的,作用就是存储真正的word embeddings。如果不给weight赋值,Embedding类会自动给他初始化,看上述代码第6~8行,如果属性weight没有手动赋值,则会定义一个torch.nn.parameter.Parameter对象,然后对该对象进行reset_parameters(),看第21行,对self.weight先转为Tensor在对其进行normal_(0, 1)(调整为$N(0, 1)$正态分布)。所以nn.Embeddig.weight默认初始化方式就是N(0, 1)分布,即均值$\mu=0$,方差$\sigma=1$的标准正态分布。

论据2——简单验证nn.Embeddig.weight的分布

下面将做的是验证nn.Embeddig.weight某一行词向量的均值和方差,以便验证是否为标准正态分布。

注意:验证一行数字的均值为0,方差为1,显然不能说明该分布就是标准正态分布,只能是其必要条件,而不是充分条件,要想真正检测这行数字是不是正态分布,在概率论上有专门的较为复杂的方法,请查看概率论之假设检验。

import torch.nn as nn

# dim越大,均值、方差越接近0和1

dim = 800000

# 定义了一个(5, dim)的二维embdding

# 对于NLP来说,相当于是5个词,每个词的词向量维数是dim

# 每个词向量初始化为正态分布 N(0,1)(待验证)

embd = nn.Embedding(5, dim)

# type(embd.weight) is Parameter

# type(embd.weight.data) is Tensor

# embd.weight.data[0]是指(5, dim)的word embeddings中取第1个词的词向量,是dim维行向量

weight = embd.weight.data[0].numpy()

print("weight: {}".format(weight))

weight_sum = 0

for w in weight:

weight_sum += w

mean = weight_sum / dim

print("均值: {}".format(mean))

square_sum = 0

for w in weight:

square_sum += (mean - w) ** 2

print("方差: {}".format(square_sum / dim))

代码输出:

weight: [-0.65507996 0.11627434 -1.6705967 ... 0.78397447 ... -0.13477565]

均值: 0.0006973597864689242

方差: 1.0019535550544454

可见,均值接近0,方差接近1,从这里也可以反映出nn.Embeddig.weight是标准正态分布$N(0, 1)$。

二、torch.Tensor、torch.tensor、torch.randn初始化分布

1、torch.rand

返回$[0,1)$上的均匀分布(uniform distribution)。

2、torch.randn

返回$N(0, 1)$,即标准正态分布(standard normal distribution)。

3、torch.Tensor

torch.Tensor是Tensor class,torch.Tensor(2, 3)是调用Tensor的构造函数,构造了$2\times3$矩阵,但是没有分配空间,未初始化。

不推荐使用torch.Tensor创建Tensor,应使用torch.tenstor、torch.ones、torch.zeros、torch.rand、torch.randn等,原因:

t = torch.Tensor(2,3)

# 容易出现下述错误,因为t中的值取决当前内存中的随机值

# 如果当前内存中随机值特别大会溢出

RuntimeError: Overflow when unpacking long

PyTorch 中,可以使用预训练的词向量作为初始化参数来初始化 `nn.Embedding`。具体步骤如下: 1. 下载预训练的词向量文件,比如 GloVe、Word2Vec 等。 2. 加载词向量文件,将每个词和其对应的向量存储到一个字典中。 3. 创建一个 `nn.Embedding` 模块,将其权重初始化为预训练的词向量。 4. 将这个 `nn.Embedding` 模块作为神经网络的一部分,用于将输入的词转换为对应的词向量。 下面是一个示例代码: ```python import torch.nn as nn import torch # 加载预训练的词向量文件 word_vectors = {} with open('path/to/word_vectors.txt', 'r', encoding='utf-8') as f: for line in f: word, vector = line.split(' ', 1) word_vectors[word] = torch.from_numpy(np.array(vector.split(), dtype='float32')) # 创建 nn.Embedding 模块,并将其权重初始化为预训练的词向量 embedding = nn.Embedding(num_embeddings=len(word_vectors.keys()), embedding_dim=len(word_vectors['the'])) weights = torch.zeros(len(word_vectors.keys()), len(word_vectors['the'])) for i, word in enumerate(word_vectors.keys()): weights[i] = word_vectors[word] embedding.weight.data.copy_(weights) # 将 nn.Embedding 模块作为神经网络的一部分,用于将输入的词转换为对应的词向量 class MyModel(nn.Module): def __init__(self, vocab_size, embedding_dim): super(MyModel, self).__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.fc = nn.Linear(embedding_dim, 1) def forward(self, x): x = self.embedding(x) x = x.mean(dim=1) x = self.fc(x) return x model = MyModel(len(word_vectors.keys()), len(word_vectors['the'])) ``` 这里的 `word_vectors.txt` 文件是预训练的词向量文件,每一行表示一个词及其对应的向量,用空格分隔。`embedding_dim` 参数表示词向量的维度。在这个示例中,我们创建了一个简单的神经网络模型,其中输入为一个词的索引,输出为一个标量。在模型中,我们使用了预训练的词向量来初始化 `nn.Embedding` 模块,并将其作为模型的第一层,用于将输入的词转换为对应的词向量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值