def __init__(self, in_features, out_features, c=1.0): super().__init__() self.in_features = in_features self.out_features = out_features self.ball = ball = PoincareBall(c=c) self.sphere = sphere = geoopt.manifolds.Sphere() self.scale = torch.nn.Parameter(torch.zeros(out_features)) point = torch.randn(out_features, in_features) / 4 point = pmath.expmap0(point, c=c) tangent = torch.randn(out_features, in_features) self.point = ManifoldParameter(point, manifold=ball) with torch.no_grad(): self.tangent = ManifoldParameter(tangent, manifold=sphere).proj_()
def __init__(self, *args, hyperbolic_input=True, hyperbolic_bias=True, nonlin=None, c=1.0, **kwargs): super().__init__(*args, **kwargs) if self.bias is not None: if hyperbolic_bias: self.ball = manifold = PoincareBall(c=c) self.bias = ManifoldParameter(self.bias, manifold=manifold) with torch.no_grad(): self.bias.set_(pmath.expmap0(self.bias.normal_() / 4, c=c)) with torch.no_grad(): self.weight.normal_(std=1e-2) self.hyperbolic_bias = hyperbolic_bias self.hyperbolic_input = hyperbolic_input self.nonlin = nonlin
def __init__( self, input_size, hidden_size, num_layers=1, bias=True, nonlin=None, hyperbolic_input=True, hyperbolic_hidden_state0=True, c=1.0, ): super().__init__() self.ball = PoincareBall(c=c) self.input_size = input_size self.hidden_size = hidden_size self.num_layers = num_layers self.bias = bias self.weight_ih = torch.nn.ParameterList([ torch.nn.Parameter( torch.Tensor(3 * hidden_size, input_size if i == 0 else hidden_size)) for i in range(num_layers) ]) self.weight_hh = torch.nn.ParameterList([ torch.nn.Parameter(torch.Tensor(3 * hidden_size, hidden_size)) for _ in range(num_layers) ]) if bias: biases = [] for i in range(num_layers): bias = torch.randn(3, hidden_size) * 1e-5 bias = ManifoldParameter(pmath.expmap0(bias, c=self.ball.c), manifold=self.ball) biases.append(bias) self.bias = torch.nn.ParameterList(biases) else: self.register_buffer("bias", None) self.nonlin = nonlin self.hyperbolic_input = hyperbolic_input self.hyperbolic_hidden_state0 = hyperbolic_hidden_state0 self.reset_parameters()
def __init__( self, vocab_size, embedding_dim, hidden_dim, project_dim, cell_type="eucl_rnn", embedding_type="eucl", decision_type="eucl", use_distance_as_feature=True, device=None, num_layers=1, num_classes=1, c=1.0, ): super(RNNBase, self).__init__() (cell_type, embedding_type, decision_type) = map(str.lower, [cell_type, embedding_type, decision_type]) if embedding_type == "eucl": self.embedding = LookupEmbedding(vocab_size, embedding_dim, manifold=Euclidean()) with torch.no_grad(): self.embedding.weight.normal_() elif embedding_type == "hyp": self.embedding = LookupEmbedding( vocab_size, embedding_dim, manifold=PoincareBall(c=c), ) with torch.no_grad(): self.embedding.weight.set_( pmath.expmap0(self.embedding.weight.normal_() / 10, c=c) # Q ) else: raise NotImplementedError( "Unsuported embedding type: {0}".format(embedding_type)) self.embedding_type = embedding_type if decision_type == "eucl": self.projector = nn.Linear(hidden_dim * 2, project_dim) # Q self.logits = nn.Linear(project_dim, num_classes) elif decision_type == "hyp": self.projector_source = hyrnn.MobiusLinear( # Q hidden_dim, project_dim, c=c) self.projector_target = hyrnn.MobiusLinear( # Q hidden_dim, project_dim, c=c) self.logits = hyrnn.MobiusDist2Hyperplane(project_dim, num_classes) # Q else: raise NotImplementedError( "Unsuported decision type: {0}".format(decision_type)) self.ball = PoincareBall(c) if use_distance_as_feature: if decision_type == "eucl": self.dist_bias = nn.Parameter(torch.zeros(project_dim)) else: self.dist_bias = geoopt.ManifoldParameter( torch.zeros(project_dim), manifold=self.ball) else: self.register_buffer("dist_bias", None) self.decision_type = decision_type self.use_distance_as_feature = use_distance_as_feature self.device = device # declaring device here due to fact we are using catalyst self.num_layers = num_layers self.hidden_dim = hidden_dim self.c = c if cell_type == "eucl_rnn": self.cell = nn.RNN elif cell_type == "eucl_gru": self.cell = nn.GRU elif cell_type == "hyp_gru": self.cell = functools.partial(MobiusGRU, c=c) else: raise NotImplementedError( "Unsuported cell type: {0}".format(cell_type)) self.cell_type = cell_type self.cell_source = self.cell(embedding_dim, self.hidden_dim, self.num_layers) self.cell_target = self.cell(embedding_dim, self.hidden_dim, self.num_layers)